Previously, I alluded to the fact that the multiplication of two rotors looks like the Hamilton product, except the signs of the last two coefficients for each basis is flipped.

Using the same coefficients as the Wikipedia entry, if we have two quaternions:

a1+b1ı^+c1ȷ^+d1k^a2+b2ı^+c2ȷ^+d2k^a_1 + b_1\hat{\imath} + c_1\hat{\jmath} + d_1{\hat{k}} \\ a_2 + b_2\hat{\imath} + c_2\hat{\jmath} + d_2{\hat{k}}

Then, the Hamilton product is:

a1a2b1b2c1c2d1d2+ (a1b2+b1a2+c1d2d1c2)ı^+ (a1c2b1d2+c1a2+d1b2)ȷ^+ (a1d2+b1c2c1b2+d1a2)k^\begin{align*} & a_1 a_2 - b_1 b_2 - c_1 c_2 - d_1 d_2 \\ +\ (&a_1 b_2 + b_1 a_2 + c_1 d_2 - d_1 c_2)\hat{\imath} \\ +\ (&a_1 c_2 - b_1 d_2 + c_1 a_2 + d_1 b_2)\hat{\jmath} \\ +\ (&a_1 d_2 + b_1 c_2 - c_1 b_2 + d_1 a_2)\hat{k} \end{align*}

However, the rotor multiplication, using the quaternion representation (ı^\hat{\imath}, ȷ^\hat{\jmath} and k^\hat{k}) we derived looked more like:

a1a2b1b2c1c2d1d2+ (a1b2+b1a2c1d2+d1c2)ı^+ (a1c2b1d2+c1a2d1b2)ȷ^+ (a1d2+b1c2c1b2+d1a2)k^\begin{align*} & a_{1}a_{2} - b_{1}b_{2} - c_{1}c_{2} - d_{1}d_{2} \\ +\ (&a_{1}b_{2} + b_{1}a_{2} \textcolor{red}{-} c_{1}d_{2} \textcolor{red}{+} d_{1}c_{2})\hat{\imath} \\ +\ (&a_{1}c_{2} - b_{1}d_{2} + c_{1}a_{2} \textcolor{red}{-} d_{1}b_{2})\hat{\jmath} \\ +\ (&a_{1}d_{2} + b_{1}c_{2} - c_{1}b_{2} + d_{1}a_{2})\hat{k} \end{align*}

I’ve highlighted the differences in red. This difference is only because of my choice of convention for the bivectors. Recall that we have the fundamental bivectors, yz^\widehat{yz}, zx^\widehat{zx}, and xy^\widehat{xy}. Also, recall that I chose the middle basis, representing the yy-plane, as z^\hat{z} first, then x^\hat{x}. This has the effect of ordering the bases in a cycle.

It additionally impacts the wedge (or cross) product’s direction, enforcing that the “front” of the plane points towards the remaining axis (in 3D). In other words, if you conventionally have a left-handed coordinated system then all bivectors follow the left-hand rule. Recall that these bivectors are anti-commutative, so the order does matter! Let’s derive the rotor multiplication if we just defined the bases in lexicographical order. This means we have the bivectors, yz^\widehat{yz}, xz^\textcolor{red}{\widehat{xz}}, and xy^\widehat{xy}.

For this derivation, I’ll use the same coefficients as the Wikipedia entry, but with the bivectors above, so we have:

a1+b1yz^+c1xz^+d1xy^a2+b2yz^+c2xz^+d2xy^a_1 + b_1\widehat{yz} + c_1\widehat{xz} + d_1{\widehat{xy}} \\ a_2 + b_2\widehat{yz} + c_2\widehat{xz} + d_2{\widehat{xy}}

Just a refresher on some results obtained from the previous post on Geometric Algebra, for any two unit-length vectors, a^\hat{a} and b^\hat{b} such that a^b^\hat{a} \ne \hat{b}, we have:

aa^=1ab^=ba^ab^2=ab^ab^=ab^ba^=a^a^=1ab^ba^=a^a^=1\begin{align*} \widehat{aa} &= 1 \tag{1} \\ \widehat{ab} &= -\widehat{ba} \tag{2} \\ \widehat{ab}^2 &= \widehat{ab}\widehat{ab} \\ &= -\widehat{ab}\widehat{ba} \tag{from 2} \\ &= -\hat{a}\hat{a} \tag{from 1} \\ &= -1 \tag{3, from 1} \\ \widehat{ab}\widehat{ba} &= \hat{a}\hat{a} \tag{from 1} \\ &= 1 \tag{4, from 1} \end{align*}

Multiplying this out:

 (a1+b1yz^+c1xz^+d1xy^)× (a2+b2yz^+c2xz^+d2xy^)= a1a2+b1b2yz^yz^+c1c2xz^xz^+d1d2xy^xy^+a1b2yz^+a1c2xz^+a1d2xy^+b1a2yz^+b1c2yz^xz^+b1d2yz^xy^+c1a2xz^+c1b2xz^yz^+c1d2xz^xy^+d1a2xy^+d1b2xy^yz^+d1c2xy^xz^= a1a2b1b2c1c2d1d2+a1b2yz^+a1c2xz^+a1d2xy^+b1a2yz^+b1c2yz^zx^+b1d2zy^yx^+c1a2xz^c1b2xz^zy^c1d2zx^xy^+d1a2xy^+d1b2xy^yz^d1c2yx^xz^\begin{align*} &\ (a_1 + b_1\widehat{yz} + c_1\widehat{xz} + d_1{\widehat{xy}}) \\ \times&\ (a_2 + b_2\widehat{yz} + c_2\widehat{xz} + d_2{\widehat{xy}}) \\ =&\ a_{1}a_{2} \\ &+ b_1 b_2 \widehat{yz}\widehat{yz} + c_1 c_2 \widehat{xz}\widehat{xz} + d_1 d_2 {\widehat{xy}}{\widehat{xy}} \\ &+ a_1 b_2\widehat{yz} + a_1 c_2\widehat{xz} + a_1 d_2{\widehat{xy}} \\ &+ b_1 a_2 \widehat{yz} + b_1 c_2\widehat{yz}\widehat{xz} + b_1 d_2\widehat{yz}{\widehat{xy}} \\ &+ c_1 a_2 \widehat{xz} + c_1 b_2\widehat{xz}\widehat{yz} + c_1 d_2\widehat{xz}{\widehat{xy}} \\ &+ d_1 a_2 \widehat{xy} + d_1 b_2\widehat{xy}\widehat{yz} + d_1 c_2\widehat{xy}\widehat{xz} \\ =&\ a_{1}a_{2} \\ &- b_1 b_2 - c_1 c_2 - d_1 d_2 \tag{from 3} \\ &+ a_1 b_2\widehat{yz} + a_1 c_2\widehat{xz} + a_1 d_2{\widehat{xy}} \\ &+ b_1 a_2 \widehat{yz} + b_1 c_2\widehat{yz}\widehat{zx} + b_1 d_2\widehat{zy}{\widehat{yx}} \tag{from 2, 3} \\ &+ c_1 a_2 \widehat{xz} - c_1 b_2\widehat{xz}\widehat{zy} - c_1 d_2\widehat{zx}{\widehat{xy}} \tag{from 2, 3} \\ &+ d_1 a_2 \widehat{xy} + d_1 b_2\widehat{xy}\widehat{yz} - d_1 c_2\widehat{yx}\widehat{xz} \tag{from 2} \\ \end{align*}

Now, simplifying what we have left:

= a1a2b1b2c1c2d1d2+a1b2yz^+a1c2xz^+a1d2xy^+b1a2yz^+b1c2yx^+b1d2zx^+c1a2xz^c1b2xy^c1d2zy^+d1a2xy^+d1b2xz^d1c2yz^\begin{align*} =&\ a_{1}a_{2} \\ &- b_1 b_2 - c_1 c_2 - d_1 d_2 \\ &+ a_1 b_2\widehat{yz} + a_1 c_2\widehat{xz} + a_1 d_2\widehat{xy} \\ &+ b_1 a_2\widehat{yz} + b_1 c_2\widehat{yx} + b_1 d_2\widehat{zx} \tag{from 1} \\ &+ c_1 a_2\widehat{xz} - c_1 b_2\widehat{xy} - c_1 d_2\widehat{zy} \tag{from 1} \\ &+ d_1 a_2\widehat{xy} + d_1 b_2\widehat{xz} - d_1 c_2\widehat{yz} \tag{from 1} \\ \end{align*}

And normalizing back into our defined bases (swapping the vector order in the bivector):

= a1a2b1b2c1c2d1d2+a1b2yz^+a1c2xz^+a1d2xy^+b1a2yz^b1c2xy^b1d2xz^+c1a2xz^c1b2xy^+c1d2yz^+d1a2xy^+d1b2xz^d1c2yz^\begin{align*} =&\ a_{1}a_{2} \\ &- b_1 b_2 - c_1 c_2 - d_1 d_2 \\ &+ a_1 b_2\widehat{yz} + a_1 c_2\widehat{xz} + a_1 d_2\widehat{xy} \\ &+ b_1 a_2\widehat{yz} - b_1 c_2\widehat{xy} - b_1 d_2\widehat{xz} \tag{from 2} \\ &+ c_1 a_2\widehat{xz} - c_1 b_2\widehat{xy} + c_1 d_2\widehat{yz} \tag{from 2} \\ &+ d_1 a_2\widehat{xy} + d_1 b_2\widehat{xz} - d_1 c_2\widehat{yz} \\ \end{align*}

Factoring out the bases:

= a1a2b1b2c1c2d1d2+(a1b2+b1a2+c1d2d1c2)yz^+(a1c2b1d2+c1a2+d1b2)xz^+(a1d2b1c2c1b2+d1a2)xy^\begin{align*} =&\ a_{1}a_{2} \\ &- b_1 b_2 - c_1 c_2 - d_1 d_2 \\ &+ (a_1 b_2 + b_1 a_2 + c_1 d_2 - d_1 c_2) \widehat{yz} \\ &+ (a_1 c_2 - b_1 d_2 + c_1 a_2 + d_1 b_2) \widehat{xz} \\ &+ (a_1 d_2 - b_1 c_2 - c_1 b_2 + d_1 a_2) \widehat{xy} \\ \end{align*}

This matches the Hamilton product! I’d argue that the non-lexicographic bivector approach, which differs from quaternions, is more grounded in the geometric interpretation. As such, I’ll continue to use zx^\widehat{zx} over xz^\widehat{xz} (or kı^\widehat{k\imath}, or e31^\widehat{e_{31}}, depending on your preferred representation for the bases).

Furthermore, this explains why the identity,

i2=j2=k2=ijk=1i^2 = j^2 = k^2 = ijk = -1

differs from the equivalent for bivectors, which is true for the basis (and, in fact, all unit-sized vectors which are not the same vector):

yz^2=zx^2=xy^2=1\widehat{yz}^2 = \widehat{zx}^2 = \widehat{xy}^2 = -1

But, the product of all of them is just the unit:

yz^zx^xy^=y^(1)(1)y^=yy^=1\begin{align*} \widehat{yz}\widehat{zx}\widehat{xy} &= \hat{y}(1)(1)\hat{y} \\ &= \widehat{yy} \\ &= 1 \end{align*}

If we use the swapped definition for the yy-plane (xz^\widehat{xz}), we’d get the result as in quaternions:

yz^xz^xy^=yz^zx^xy^=yy^=1\begin{align*} \widehat{yz}\widehat{xz}\widehat{xy} &= -\widehat{yz}\widehat{zx}\widehat{xy} \\ &= -\widehat{yy} \\ &= -1 \end{align*}

If I can avoid conventional quaternions for some computation, I will, since I find the cycle-based bivectors more intuitive. But, at least I can now bridge the gap, if I need to.