FUNCTION Q_prod,q1in,q2in
s1 = size(q1in)
s2 = size(q2in)
n1 = (s1(0) eq 1) + (s1(0) eq 2)*s1(2)
n2 = (s2(0) eq 1) + (s2(0) eq 2)*s2(2)
err = bytarr(3)
err(0) = s1(1) ne 4 or n1 eq 0
err(1) = s2(1) ne 4 or n2 eq 0
err(2) = not (n1 eq 1 or n2 eq 1 or (n1 eq n2 and n1 ne 1 and n2 ne 1) )
err = err mod 2
if (where(err ne 0))(0) ne -1 then begin
print,"Q_PROD : error, wrong argument size..."
print," Use : Q_PROD,q1in,q2in"
if err(0) then print," > q1in must be a quaternion (4) or a vector of quaternions (4,n)"
if err(1) then print," > q2in must be a quaternion (4) or a vector of quaternions (4,n)"
if err(2) then print," > in case of vector of quaternions (4,n1) and (4,n2), n1=n2 is required"
return,-1
endif
n3 = max([n1,n2])
q3 = dblarr(4,n3)
q1 = rebin(reform(double(q1in),4,n1),4,n3)
q2 = rebin(reform(double(q2in),4,n2),4,n3)
q3(0,*) = q1(0,*)*q2(0,*) - q1(1,*)*q2(1,*) - q1(2,*)*q2(2,*) - q1(3,*)*q2(3,*)
q3(1,*) = q1(0,*)*q2(1,*) + q2(0,*)*q1(1,*) + q1(2,*)*q2(3,*) - q1(3,*)*q2(2,*)
q3(2,*) = q1(0,*)*q2(2,*) + q2(0,*)*q1(2,*) + q1(3,*)*q2(1,*) - q1(1,*)*q2(3,*)
q3(3,*) = q1(0,*)*q2(3,*) + q2(0,*)*q1(3,*) + q1(1,*)*q2(2,*) - q1(2,*)*q2(1,*)
return,reform(q3)
end