Clifford Algebras for Rotating, Scaling, and Translating the Plane June 8th, 2009
Patrick Stein

In my previous post, I reviewed how the complex numbers can be used to represent coordinates in the plane and how, once you’ve done that, complex arithmetic leads naturally to rotations, scalings, and translations of the plane. Today, we’re going to do the same with the Clifford algebra \mathcal{C}\ell_2.

What are Clifford Algebras

In our previous post, we used two different ways to represent coordinates in the plane. We used an ordered pair of real numbers like (3,5) and we used the real and imaginary parts of a complex number like 3 + 5i. Another way we could have written the coordinates in the plane is as a vector. Typically, to express a vector, we pick an axis (say, the x-axis) and then pick a second axis perpendicular to it (say, the y-axis). Most physics books would call these \hat{i} and \hat{j}. I am going to use e_1 and e_2 instead so that there is no confusion with i = \sqrt{-1} and because it is a notation that we will continue throughout Clifford algebras. We could then express (3,5) as 3e_1 + 5e_2. Here, e_1 and e_2 are called unit vectors. We assume they have length one so that when we take three of them, we get something with length three (for arbitrary values of three).

Having done that, we can easily multiply any vector by a real number using the normal distributive law: s \cdot \left(xe_1 + ye_2\right) = (sx)e_1 + (sy)e_2. And, we can add vectors just like we added complex numbers: summing like parts. So, (ae_1 + be_2) + (ce_1 + de_2) = (a+c)e_1 + (b+d)e_2. Of course, subtraction goes the same way: (ae_1 + be_2) - (ce_1 + de_2) = (a-c)e_1 + (b-d)e_2.

Great. We can add and subtract vectors. We can multiply vectors by real numbers. But, what about multiplying a vector by a vector? Well, let’s try it: (ae_1 + be_2)\cdot(ce_1 + de_2). Again, we’re going to use the F.O.I.L. method. We end up with: ace_1^2 + ade_1e_2 + bce_2e_1 + bde_2^2. So far, I have assumed that we can multiply real numbers by our unit vectors in any order, but that maybe multiplying e_1e_2 would be different than e_2e_1. Well, to get anywhere from here, we need to be able to evaluate things like e_1^2 and e_1e_2.

[Note: the F.O.I.L. method is nothing magical. It is simply the distributive law applied three times:

(a + b)(c + d) = a(c+d) + b(c+d) = ac + ad + bc + bd

Actually, this leaves me a good place to mention… if you’re better at hearing someone speak while doing math than you are reading along on your own, then you can review the complex arithmetic we did in the last post with these videos at KhanAcademy.org: i and Imaginary numbers, Complex Numbers (part 1), and Complex Numbers (part 2).]

So, where are we? If we want to multiply two vectors together, we need to decide how to multiply things like e_1^2 or e_1e_2. Well, there are probably lots of ways we could do this. But, we’re going to be trying to do geometric things with our vectors. What are some geometrically useful possibilities?

We could say that any vector multiplied by itself is just itself so that e_1^2 = e_1. This doesn’t really help us figure out anything about e_1e_2 and how it relates to e_2e_1.

Another possibility is that parallel vectors annihilate each other so that e_1^2 = 0 while perpendicular vectors do not. If that were the case, then (e_1 + e_2)^2 = 0. And, (e_1 + e_2)^2 = e_1^2 + e_1e_2 + e_2e_1 + e_2^2 = e_1e_2 + e_2e_1. so that e_1e_2 = -\left(e_2e_1\right). This has some merits. This results in what is called the Exterior (or Grassmann) algebra. There is lots of interesting stuff to learn there, but Clifford algebras take a slightly different tack.

Another natural choice might be then that if we take some vector r and multiply it by itself, maybe we should get a real number that is the square of the length of r. So, if we have a vector xe_1 + ye_2, its length is \sqrt{x^2 + y^2}. If we want the square of the vector to be x^2 + y^2, then we need to have the following:

(xe_1 + ye_2)^2 = x^2 + y^2

x^2e_1^2 + xye_1e_2 + xye_2e_1 + y^2e_2^2 = x^2 + y^2

To make this equation work out for every x and y, we need to have e_1e_2 = - \left(e_2e_1\right) and e_1^2 = e_2^2 = 1. This is the essence of Clifford algebra. All of the rest is deducible from here. But, we’re going to be a bit more explicit on some of the things this implies.

We can reduce (ae_1 + be_2)\cdot(ce_1+de_2) further, now. When we multiplied it all out, we got: ace_1^2 + ade_1e_2 + bce_2e_1 + bde_2^2. Knowing now that e_1^2 = e_2^2 = 1 and e_1e_2 = -\left(e_2e_1\right), we can rewrite this: (ac + bd) + (ad - bc)e_1e_2. So, we multiplied two vectors and got a real number plus a real number times this other thing: e_1e_2. We’re going to call this other thing a bivector.

A bivector?

Let’s explore bivectors a little more. In particular, what is (e_1e_2)^2 = e_1e_2e_1e_2? Well, we’ve already decided that e_1e_2 = -e_2e_1. So, we know that e_1e_2e_1e_2 = -e_2e_1e_1e_2. And, we already decided that e_1^2 = 1, so -e_2e_1^2e_2 = -e_2e_2. And, we already decided that e_2^2 = 1. So, (e_1e_2)^2 = -1. When we square our unit bivector, we get -1. Our bivector is exactly like our i from the complex numbers!

Recall that (a + bi)\cdot(c+di) = (ac - bd) + (ad + bc)i. Now, let’s multiply out (a + be_1e_2)\cdot(c + de_1e_2). We get ac + ade_1e_2 + bce_1e_2 + bd(e_1e_2)^2 which is (ac - bd) + (ad + bc)e_1e_2.

So, we could stop right here if we wanted. We could represent our points in the plane as a real number plus a real number times e_1e_2 and do everything we did with the complex numbers. But, if we did that, then we’ve totally skipped over using the vector part of our Clifford algebra. We are only using the bivector part.

Now we’ve got real numbers and vectors and bivectors. What if we multiply e_1\cdot(e_1e_2)? Well, since e_1^2 = 1, we are just left with e_2. How about if we multiply (e_1e_2)\cdot e_1? Here, we have to make use of e_1e_2 = -e_2e_1, so we end up with e_1e_2e_1 = -e_2e_1e_1 = -e_2. So, our vectors and bivectors are a little weird compared to what we’re used to. We’re used to having ab = ba for real numbers (and even complex numbers). But, this doesn’t work out for vectors times vectors or vectors times bivectors. And, it turns out, that will be a good thing later. In two-dimensions, it isn’t quite as big a deal. [Well, if you’re familiar with vector cross-products, then maybe it is a big deal to you since you already know that a \times b = - b \times a.]

Anyhow, an arbitrary element of the two-dimensional Clifford algebra \mathcal{C}\ell_2 is of the form a + be_1 + ce_2 + de_1e_2 for real numbers a, b, c, and d. It is a real number a plus a two-dimensional vector with real coordinates be_1 + ce_2 plus a real number times our bivector e_1e_2.

Transforming the Plane

It is common/natural/intuitive?/easy? to think of the coordinates of a point in the plane as a two-dimensional vector from the origin to the point. As such, we’re just going to use the coordinates as the coefficients of the unit vectors of our general element a + be_1 + ce_2 + de_1e_2. So, the point (3,5) would be represented in our algebra as 3e_1 + 5e_2. This is called a pure vector since it has zero for its real part and zero for its bivector part.

Now, what if we had a whole list of points (x_1,y_1), (x_2,y_2), \ldots, (x_k,y_k)? We can represent these as elements of our Clifford algebra as z_1 = x_1e_1 + y_1e_2, z_2 = x_2e_1 + y_2e_2, \ldots, z_k = x_ke_1 + y_ke_2. If we want to translate all of them by two units along the x-axis and seven units along the y-axis, then we can let t = 2e_1 + 7e_2 and just add t to each of our points: z_j^\prime = z_j + t.

Now, what if we want to scale the whole plane up by a factor of six radiating from the origin? We can just let s = 6 and multiply it by each of our points: z_j^\prime = s \cdot z_j.

How about rotation by an angle \theta around the origin? Well, drawing on what we did with complex numbers, let’s see if we can just get away with multiplying by \cos\theta + \sin\theta e_1e_2. Recall that we want a point xe_1 + ye_2 to go to a point (x\cos\theta - y\sin\theta)e_1 + (x\sin\theta + y\cos\theta)e_2 when rotated.

Let’s try multiplying (\cos\theta + \sin\theta e_1e_2)\cdot(xe_1 + ye_2). Remember, we have to be careful to keep the e_1‘s and e_2‘s in the order they appear because every time we swap places on them, we need to swap the sign. When we multiply this out, we get:

x\cos\theta e_1 + y\sin\theta e_1e_2e_2 + x\sin\theta e_1e_2e_1 + y\cos\theta e_2

x\cos\theta e_1 + y\sin\theta e_1 - x\sin\theta e_2e_1e_1 + y\cos\theta e_2

(x\cos\theta + y\sin\theta)e_1 + (-x\sin\theta + y\cos\theta)e_2

This is really close. We just don’t have the sign right on the sine terms. Well, we could just use the fact that \cos\theta = \cos(-\theta) and \sin\theta = -\sin(-\theta). But, that would be funky weird to use -\theta when you want to rotate by \theta. But, we’ve seen before how switching the order of multiplying things can change the sign. Let’s try this here. Instead of multiplying with the vector on the right, let’s multiply with the vector on the left:

(xe_1 + ye_2)\cdot(\cos\theta + \sin\theta e_1e_2)

x\cos\theta e_1 + x\sin\theta e_1e_1e_2 + y\cos\theta e_2 + y\sin\theta e_2e_1e_2

(x\cos\theta - y\sin\theta)e_1 + (x\sin\theta + y\cos\theta)e_2

There we have it. So, if we let r = \cos\theta + \sin\theta e_1e_2, then we can rotate all of our points by angle \theta around the origin using: z_j^\prime = z_j \cdot r.

And, of course, if we want to scale or rotate around different points, we can translate, scale or rotate, and translate back again like we did with the complex numbers.

Not so fast

It turns out that just multiplying with the vector on the left isn’t going to serve us well as we go up in dimensions. We’re going to do something that might look really awkward now, and will be somewhat awkward for this two-dimensional case, but it’s going to prepare us to do better things in three or more dimensions.

Let’s let r = \cos\phi + \sin\phi e_1e_2. And, let’s let \overline{r} = \cos\phi - \sin\phi e_1e_2. You might recognize this as just like the complex conjugate of r.

Let’s see what we get if we multiply xe_1 + ye_2 by r on the left and by \overline{r} on the right.

(\cos\phi + \sin\phi e_1e_2)(xe_1 + ye_2)(\cos\phi - \sin\phi e_1e_2)

(x\cos\phi e_1 + x\sin\phi e_1e_2e_1 + y\cos\phi e_2 + y\sin\phi e_1e_2e_2)(\cos\phi - \sin\phi e_1e_2)

(x\cos\phi e_1 - x\sin\phi e_2 + y\cos\phi e_2 + y\sin\phi e_1)(\cos\phi - \sin\phi e_1e_2)

[(x\cos\phi + y\sin\phi)e_1 + (-x\sin\phi + y\cos\phi)e_2)](\cos\phi - \sin\phi e_1e_2)

This is getting a bit large, so let’s just concentrate for a moment on the terms that are going to contribute to e_1 in the end: namely, the e_1 term in the first factor times the real part in the second factor and the e_2 term in the first factor times the bivector part in the second factor.

(x\cos^2\phi + y\sin\phi\cos\phi)e_1 + (x\sin^2\phi - y\sin\phi\cos\phi)e_2e_1e_2

(x\cos^2\phi + y\sin\phi\cos\phi)e_1 - (x\sin^2\phi - y\sin\phi\cos\phi)e_1

[x(\cos^2\phi - sin^2\phi) - y(2\sin\phi\cos\phi)]e_1

We can do a similar thing with the portions that contribute to e_2:

(-x\sin\phi\cos\phi + y\cos^2\phi)e_2 - (x\sin\phi\cos\phi + y\sin^2\phi)e_1e_1e_2

(-x\sin\phi\cos\phi + y\cos^2\phi)e_2 - (x\sin\phi\cos\phi  + y\sin^2\phi)e_2

[x(2\sin\phi\cos\phi) + y(\cos^2\phi - sin^2\phi)]e_2

Now, we have to remember some trigonometric identities. In particular, we need to remember the double angle identities: cos^2\phi - sin^2\phi = \cos(2\phi) and 2\sin\phi\cos\phi = \sin(2\phi). Taking advantage of those, we have our whole product:

[x\cos(2\phi) - y\sin(2\phi)]e_1 + [x\sin(2\phi) + y\cos(2\phi)]e_2

So, if we want to rotate by an angle \theta around the origin, we can let r = \cos\frac{\theta}{2} + \sin\frac{\theta}{2}e_1e_2. Then, we can let z_j^\prime = r\cdot z_j \cdot \overline{r}. And, of course, if we want to rotate around a point t instead, we can translate by -t, do this rotation, and translate t back so that z_j^\prime = r \cdot (z_j - t) \cdot \overline{r} + t.

Now, we’ve used Clifford algebras to represent rotating, translating, and scaling the plane. In our next installment, we will move on to use quaternions to rotate three-dimensional space. From there, we will move to the Clifford algebra for three-dimensional vectors \mathcal{C}\ell_3.

l