quaternions, second plea for help
- To: mathgroup at yoda.physics.unc.edu
 - Subject: quaternions, second plea for help
 - From: Jack K. Cohen <jkc at dix.mines.colorado.edu>
 - Date: Sun, 11 Oct 92 09:19:43 -0600
 
This is a followup to my request for a non-List implementation of
quaternions.  Someone suggested that I show my feeble attempts and
let people see if they can boost me over the hill.
First I tried a straight forward entry of the multiplication table:
i i ^= -1;
j j ^= -1;
k k ^= -1;
i j ^= k;
j k ^= i;
k i ^= j;
j i ^= -k;
k j ^= -i;
i k ^= -j;
i/: i^2 = -1;
j/: j^2 = -1;
k/: k^2 = -1;
Some rules work OK: 
i i
    -1
i j
    k
But the non-commutative ones won't, because Mma follows the earlier
rules first and "knows" that Times is commutative:
j i
    k
So next I tried using NonCommutativeMultiply, which would seem
"made" for the job:
i ** i ^= -1;
j ** j ^= -1;
k ** k ^= -1;
i ** j ^= k;
j ** k ^= i;
k ** i ^= j;
j ** i ^= -k;
k ** j ^= -i;
i ** k ^= -j;
Now *all* the rules indeed work:
i ** i
    -1
i ** j
    k
j ** i
    -k
But when I "go for the gold":
q = q0 + q1 i + q2 j + q3 k;
p = p0 + p1 i + p2 j + p3 k;
p ** q
    (p0 + i p1 + j p2 + k p3) ** (q0 + i q1 + j q2 + k q3)
Mma doesn't apply the distributative law by default with the **
operator.  In fact, some reflection/trials reveal that at a more
basic level, I also have to give simplification rules for things like:
	i p1 ** j q2
(because how can Mma know that p1, q2, etc. are "intended" to be reals?).
I am hoping that someone out there has some experience with using **
or with constructing other abstract data types, because it is clear
to me that running around plugging one gap after the other in a
non-systematic way is the road to ugliness.