- The one idea: oriented area
- The rules of the game
- Components of a bivector
- Physical intuition: angular momentum is really a bivector
- Climbing the grades: vectors โ bivectors โ trivectors โ โฆ
- The grown-up definition (tensor algebra รท a rule)
- Where this is heading: differential forms, and a cameo in QFT
- Recap
Grassmann Algebra: Multiplying with Area and Orientation
This is Part 1 of a little mini-series. Here we build Grassmann algebra (a.k.a. exterior algebra) โ the gentle stepping stone. In Part 2 we upgrade it to Clifford (geometric) algebra, the machinery behind spinors in any dimension.
Hi again!
You already know how to add vectors. You know two ways to multiply them โ the dot product (which eats two vectors and spits out a number) and the cross product (which... only works in 3D, and secretly lies to you about being a vector).
What if there were a single, honest multiplication of vectors that worked in every dimension, remembered orientation, and built up areas, volumes, and beyond? That is the wedge product, and the algebra it generates is Grassmann algebra.
Grassmann algebra is what you get when you teach vectors to multiply into oriented areas.Let's build it from one idea.
The one idea: oriented area
Take two vectors \(\mathbf{u}\) and \(\mathbf{v}\). Their wedge product
\[ \mathbf{u} \wedge \mathbf{v} \]is not a number and not a vector. It is a bivector: the oriented plane segment (think: parallelogram) spanned by \(\mathbf{u}\) and \(\mathbf{v}\), with an orientation that circulates from \(\mathbf{u}\) to \(\mathbf{v}\).
If you swap the order, you sweep the other way around the parallelogram โ same area, opposite orientation:
\[ \mathbf{v}\wedge\mathbf{u} = -\,\mathbf{u}\wedge\mathbf{v}. \]The same parallelogram in 3D space (note the x, y, z axes) โ only the circulation reverses when you swap the order. That's why u โง v = โ(v โง u).
This anticommutativity has an immediate, almost cheeky consequence. A vector wedged with itself spans a parallelogram of zero area:
\[ \mathbf{u}\wedge\mathbf{u} = 0. \]And these two facts โ antisymmetry and self-wedge = 0 โ are actually the same fact in disguise. Watch:
Antisymmetry \(\Rightarrow\) self-wedge \(=0\): set \(\mathbf v = \mathbf u\) in \(\mathbf u\wedge\mathbf v=-\mathbf v\wedge\mathbf u\). Then \(\mathbf u\wedge\mathbf u = -\mathbf u\wedge\mathbf u\), so it must be \(0\).
Self-wedge \(=0\Rightarrow\) antisymmetry: expand \((\mathbf u+\mathbf v)\wedge(\mathbf u+\mathbf v)=0\). The two "square" terms vanish, leaving \(\mathbf u\wedge\mathbf v+\mathbf v\wedge\mathbf u=0\).
That little equivalence is the whole personality of Grassmann algebra.
The rules of the game
The wedge product obeys exactly what you'd hope a "multiplication" should, plus the twist above:
| Property | Statement |
|---|---|
| Antisymmetry | \(\mathbf u\wedge\mathbf v = -\,\mathbf v\wedge\mathbf u\) |
| Self-annihilation | \(\mathbf u\wedge\mathbf u = 0\) |
| Distributivity | \(\mathbf u\wedge(\mathbf v+\mathbf w)=\mathbf u\wedge\mathbf v+\mathbf u\wedge\mathbf w\) |
| Scalar pull-through | \((\lambda\mathbf u)\wedge\mathbf v=\lambda(\mathbf u\wedge\mathbf v)=\mathbf u\wedge(\lambda\mathbf v)\) |
| Associativity | \((\mathbf u\wedge\mathbf v)\wedge\mathbf w=\mathbf u\wedge(\mathbf v\wedge\mathbf w)\) |
Two bivectors are equal whenever they have the same area and the same orientation โ it does not matter whether you draw them as a square, a rectangle, a parallelogram, or a blob. Only oriented area counts. (This is worth pausing on: a "\(3\)-by-\(2\)" bivector and a "\(1\)-by-\(6\)" one are the same algebraic object if their orientations match โ area is the only invariant.)
The distributive law has a lovely picture: gluing \(\mathbf u_1\) and \(\mathbf u_2\) head-to-tail and wedging with \(\mathbf v\) gives the same oriented region as wedging each piece separately and adding the areas:
\[ (\mathbf u_1+\mathbf u_2)\wedge\mathbf v \;=\; \mathbf u_1\wedge\mathbf v \;+\; \mathbf u_2\wedge\mathbf v. \]Distributivity = areas add. The two parallelograms tile the big one. (A clean three-step build for a slide animation.)
Let's actually compute one
SageMath ships a native ExteriorAlgebra, so we can let the computer enforce the rules and just watch. Here \(e_1,e_2,e_3\) are an orthonormal basis and * is the wedge product:
# SageMath
E.<e1,e2,e3> = ExteriorAlgebra(QQ)
u = 2*e1 + 3*e2
v = 1*e1 - 1*e2 + 4*e3
print("u โง v =", u*v)
print("v โง u =", v*u)
print("e1 โง e1 =", e1*e1)
print("uโงv + vโงu =", u*v + v*u)
which prints
u โง v = -5*e1*e2 + 8*e1*e3 + 12*e2*e3
v โง u = 5*e1*e2 - 8*e1*e3 - 12*e2*e3
e1 โง e1 = 0
uโงv + vโงu = 0
Reading the code, line by line:
E.<e1,e2,e3> = ExteriorAlgebra(QQ)โExteriorAlgebra(QQ)builds the exterior (Grassmann) algebra over \(\mathbb Q\) (the rationals โ exact arithmetic, no rounding). TheE.<e1,e2,e3>part is Sage's generator-injection syntax: it names the algebraEand drops three basis vectorse1, e2, e3straight into your namespace, ready to use. Crucially, in this object the symbol*is the wedge product \(\wedge\) โ Sage already knows \(e_i\wedge e_i=0\) and \(e_i\wedge e_j=-e_j\wedge e_i\).u = 2*e1 + 3*e2andv = 1*e1 - 1*e2 + 4*e3โ ordinary vectors, written as rational combinations of the basis. (They're grade-1 elements ofE.)u*vโ asks Sage for the wedge product \(\mathbf u\wedge\mathbf v\).
Working out u*v by hand to see why the output is what it is. With \(\mathbf u=2e_1+3e_2\) and \(\mathbf v=e_1-e_2+4e_3\), distribute all \(2\times 3=6\) products:
Now apply the rules: \(e_1\wedge e_1=e_2\wedge e_2=0\), and rewrite \(e_2\wedge e_1=-e_1\wedge e_2\):
\[ = -2(e_1\wedge e_2) + 8(e_1\wedge e_3) - 3(e_1\wedge e_2) + 12(e_2\wedge e_3) = \boxed{-5\,e_1e_2 + 8\,e_1e_3 + 12\,e_2e_3}, \]exactly Sage's first line (-5*e1*e2 + 8*e1*e3 + 12*e2*e3). The other three lines confirm the personality of the algebra: v*u is the negative (antisymmetry), e1*e1 is 0 (self-annihilation), and u*v + v*u is 0 (the two together). Every rule from the table, confirmed by a machine that has no idea what a parallelogram is.
The same computation in three systems
One nice thing about the wedge: every serious math system speaks it, so you can pick your favourite. Here is the exact same \(\mathbf u\wedge\mathbf v\) in SageMath, Wolfram, and Julia โ all returning the bivector \(-5\,e_{12}+8\,e_{13}+12\,e_{23}\).
SageMath (what we ran above):
E.<e1,e2,e3> = ExteriorAlgebra(QQ)
(2*e1 + 3*e2) * (1*e1 - 1*e2 + 4*e3)
-5*e1*e2 + 8*e1*e3 + 12*e2*e3
Wolfram Language. Version 15+ ships a native GrassmannAlgebra, where ** is the wedge and NonCommutativeExpand reduces it:
galg = GrassmannAlgebra[{x, y, z}];
NonCommutativeExpand[(2 x + 3 y) ** (x - y + 4 z), galg]
-5 x ** y + 8 x ** z + 12 y ** z
If you're on an older Wolfram (no GrassmannAlgebra), the antisymmetry rule is one line โ build the matrix \(B_{ij}=u_iv_j-u_jv_i\); its independent entries \((B_{12},B_{13},B_{23})\)are the bivector components. This version-independent snippet is verified on Wolfram 14.2:
u = {2, 3, 0}; v = {1, -1, 4};
B = Table[u[[i]] v[[j]] - u[[j]] v[[i]], {i, 3}, {j, 3}];
{B[[1,2]], B[[1,3]], B[[2,3]]} (* components of e12, e13, e23 *)
{-5, 8, 12}
Julia with Grassmann.jl โ handy since this very site runs on Julia. After ]add Grassmann:
using Grassmann
@basis โ^3 # conjures v1,v2,v3 and the wedge operator โง
u = 2v1 + 3v2
w = 1v1 - 1v2 + 4v3
u โง w
-5vโโ + 8vโโ + 12vโโ # the same bivector
@basis โ^3 is the analogue of Sage's generator-injection โ it drops v1,v2,v3 and โง into scope for 3D Euclidean space; vโโ is how Grassmann.jl prints \(e_1\wedge e_2\). Three languages, three notations, one geometric object.
Components of a bivector
Let's open up \(\mathbf u\wedge\mathbf v\) in coordinates. In 2D with basis \(e_1,e_2\), write \(\mathbf u=u_1e_1+u_2e_2\), \(\mathbf v=v_1e_1+v_2e_2\) and distribute ("FOIL"):
\[ \mathbf u\wedge\mathbf v = \underbrace{u_1v_1\,e_1\wedge e_1}_{0} + u_1v_2\,e_1\wedge e_2 + u_2v_1\,\underbrace{e_2\wedge e_1}_{-e_1\wedge e_2} + \underbrace{u_2v_2\,e_2\wedge e_2}_{0}. \]Collecting:
\[ \mathbf u\wedge\mathbf v = (u_1v_2-u_2v_1)\,e_1\wedge e_2. \]That coefficient \(u_1v_2-u_2v_1\) is exactly the signed area of the parallelogram (and the \(2\times 2\) determinant!). In the \(xy\)-plane there is only one basis bivector, \(e_1\wedge e_2\), because there's only one pair of axes.
In 3D there are three pairs of axes, so three basis bivectors \(e_1\wedge e_2,\ e_1\wedge e_3,\ e_2\wedge e_3\). Let SymPy do the bookkeeping symbolically โ no special library, just antisymmetry by hand:
# SymPy โ wedge of two 3D vectors, the honest way
import sympy as sp
ux,uy,uz,vx,vy,vz = sp.symbols("u_x u_y u_z v_x v_y v_z")
u = sp.Matrix([ux,uy,uz]); v = sp.Matrix([vx,vy,vz])
# the three independent components (e1โงe2, e1โงe3, e2โงe3):
e12 = ux*vy - uy*vx
e13 = ux*vz - uz*vx
e23 = uy*vz - uz*vy
print("u โง v -> (e12, e13, e23) =", (e12, e13, e23))
print("cross product =", list(u.cross(v)))
u โง v -> (e12, e13, e23) = (u_x*v_y - u_y*v_x, u_x*v_z - u_z*v_x, u_y*v_z - u_z*v_y)
cross product = [u_y*v_z - u_z*v_y, -u_x*v_z + u_z*v_x, u_x*v_y - u_y*v_x]
Line by line:
import sympy as spโ SymPy is Python's symbolic-math engine; the variables below are symbols, not numbers, so everything stays as exact algebra.sp.symbols("u_x u_y u_z v_x v_y v_z")โ creates six symbolic unknowns. The names with underscores (u_x) make SymPy print them as subscripts \(u_x\).sp.Matrix([...])โ packs the components into column vectors so we can call.cross()on them.The three lines
e12 = ux*vy - uy*vx, etc. โ we compute the bivector components by hand using exactly the FOIL-and-flip rule from above. Each is the \(2\times 2\) determinant of the corresponding pair of columns: \(\,e_{ij}=u_iv_j-u_jv_i\). No geometric-algebra library needed โ that's the point: the rules are simple enough to do with bare arithmetic.u.cross(v)โ SymPy's built-in cross product, for comparison.
Why the outputs match. The wedge gives \((e_{12},e_{13},e_{23})=(u_xv_y-u_yv_x,\;u_xv_z-u_zv_x,\;u_yv_z-u_zv_y)\), while cross gives \((u_yv_z-u_zv_y,\;-(u_xv_z-u_zv_x),\;u_xv_y-u_yv_x)\). Term-by-term these are the same three numbers, merely reordered and with one sign flipped โ the cross product lists them in the order \((yz,\,zx,\,xy)\) with the middle one negated, which is precisely the Hodge-dual relabelling of the bivector's \((xy,\,xz,\,yz)\) components. Same information, different costume.
Look familiar? Those are the same three numbers as the cross product (just relabeled and re-signed). The cross product is a 3D-only accident โ the shadow that the honest, dimension-agnostic bivector casts when you're lucky enough to live in three dimensions. This is also why the cross product behaves so strangely in a mirror: it's secretly a bivector wearing a vector costume.
In 3D, the bivector u โง v (the shaded plane) has exactly one perpendicular direction. The cross product u ร v just points along it. The plane is the real object; the arrow is its dual.
๐น๏ธ Play with it: an interactive bivector
Enough watching โ drag the sliders below to set the components of \(\mathbf u\) and \(\mathbf v\). The plot redraws the two vectors and the parallelogram they span, and the panel shows the live wedge \(\mathbf u\wedge\mathbf v\) โ its three components \((e_{12},e_{13},e_{23})\) and its area \(\lVert\mathbf u\wedge\mathbf v\rVert\). Try making \(\mathbf u\) and \(\mathbf v\)parallel and watch the area collapse to \(0\) (self-annihilation, live).
Prefer Wolfram? The same picture is one Graphics3D call you can paste into a notebook (or TeXmacs) for a fully rotatable 3D view โ the green polygon is the bivector \(\mathbf v_1\wedge\mathbf v_2\):
v1 = {2, 1, 0}; v2 = {1, 3, 1};
Graphics3D[{
Thick, Red, Arrow[{{0,0,0}, v1}], (* vector v1 *)
Blue, Arrow[{{0,0,0}, v2}], (* vector v2 *)
Opacity[0.3], Green,
Polygon[{{0,0,0}, v1, v1+v2, v2}] (* the bivector area v1 โง v2 *)
}, Axes -> True, Boxed -> False, PlotLabel -> "Visualizing a Bivector Area"]
A fully worked example: area is a determinant
Let's grind one all the way through. Take \(\mathbf u = 3e_1 + e_2\) and \(\mathbf v = e_1 + 2e_2\) in the plane. Distribute, kill the self-wedges, and flip \(e_2\wedge e_1\):
\[ \begin{aligned} \mathbf u\wedge\mathbf v &= (3e_1+e_2)\wedge(e_1+2e_2)\\[2pt] &= 3\underbrace{(e_1\wedge e_1)}_{0} + 6\,(e_1\wedge e_2) + 1\,(e_2\wedge e_1) + 2\underbrace{(e_2\wedge e_2)}_{0}\\[2pt] &= 6\,(e_1\wedge e_2) - 1\,(e_1\wedge e_2) \;=\; \boxed{5\,(e_1\wedge e_2)}. \end{aligned} \]That coefficient \(5\) is the signed area of the parallelogram โ and it is exactly the determinant
\[ \det\begin{pmatrix} 3 & 1\\ 1 & 2\end{pmatrix} = 3\cdot 2 - 1\cdot 1 = 5. \]Sage agrees instantly:
# SageMath
E.<e1,e2,e3> = ExteriorAlgebra(QQ)
u = 3*e1 + 1*e2
v = 1*e1 + 2*e2
print("u โง v =", u*v)
print("signed area =", matrix(QQ,[[3,1],[1,2]]).det())
u โง v = 5*e1*e2
signed area = 5
This is the deep punchline of grade-2: the wedge of two vectors measures signed area, and that number is a determinant. Push to three vectors and \(\mathbf a\wedge\mathbf b\wedge\mathbf c\) measures signed volume โ the \(3\times 3\) determinant. The exterior algebra is, in a real sense, where determinants are born.
# triple wedge = oriented volume = a 3x3 determinant
a = e1 + e2; b = e2 + e3; c = e3 + e1
print("a โง b โง c =", a*b*c)
print("det =", matrix(QQ,[[1,1,0],[0,1,1],[1,0,1]]).det())
a โง b โง c = 2*e1*e2*e3
det = 2
Here a*b*c is the triple wedge \(\mathbf a\wedge\mathbf b\wedge\mathbf c\). Because we're in 3D, the only surviving grade-3 basis element is \(e_1e_2e_3\), so the answer is a single number times it โ the signed volume of the parallelepiped. matrix(QQ, [...]) builds the matrix whose rows are the components of a, b, c, and .det() is its determinant. Both print 2: the coefficient of \(e_1e_2e_3\) in the wedge is, identically, the \(3\times3\) determinant. Wedge = determinant is not an analogy โ it's the same computation.
Physical intuition: angular momentum is really a bivector
Here is where this stops being abstract and starts fixing things you were quietly taught wrong.
In intro physics, angular momentum \(\mathbf L = \mathbf r\times\mathbf p\) is drawn as a vector, conjured with the right-hand rule: curl your fingers along the rotation, your thumb "is" \(\mathbf L\). It works โ but it's a ritual, and rituals should make you suspicious. Why should a rotation, which happens in a plane, be represented by an arrow perpendicular to that plane? In 2D there's no "perpendicular direction" to point along, and in 4D there are too many. The arrow is a 3D coincidence.
The honest object is the bivector \(\mathbf L = \mathbf r\wedge\mathbf p\): the oriented plane in which the circulation actually happens.
# Angular momentum as a bivector, L = r โง p
E.<e1,e2,e3> = ExteriorAlgebra(QQ)
r = 2*e1 # position along x
p = 3*e2 # momentum along y
print("L = r โง p =", r*p)
L = r โง p = 6*e1*e2 # circulation in the xโy plane
Here r points along \(x\) and p along \(y\), so r*p \(=2\cdot3\,(e_1\wedge e_2)=6\,e_1e_2\) โ a pure bivector lying in the \(xy\)-plane, which is exactly the plane the particle orbits in. The coefficient \(6\) is the magnitude \(|\mathbf r||\mathbf p|\sin\theta = 2\cdot 3\cdot\sin 90^\circ\). No right hand required. The plane of rotation is the answer, and its orientation (which way it circulates) is built in.
The honest object is the shaded plane of rotation (the bivector r โง p). The familiar "angular-momentum arrow" (dashed, up the z-axis) is just the perpendicular stand-in โ and it's the one that misbehaves in a mirror.
The mirror test that exposes the impostor
Now the experiment from the video. Put a spinning disk in front of a mirror and reflect it in the plane of the mirror.
The bivector reverses its circulation in the mirror โ a sensible, geometric result. The "angular-momentum arrow," by contrast, would point the same way (it's an axial vector), which is the tell-tale sign it isn't an honest vector at all.
The bivector \(\mathbf r\wedge\mathbf p\) does the natural thing: it reverses its orientation, because the boundary circulation visibly reverses. Clean, predictable, geometric.
The arrow \(\mathbf r\times\mathbf p\) misbehaves: under reflection it points the same way an ordinary vector wouldn't. Physicists patch this by calling it an axial vector (or pseudovector) and bolting on extra sign rules.
Those extra rules are unnecessary the moment you admit the truth: rotation lives in a plane, so its natural home is a bivector, not an arrow. Magnetic field \(\mathbf B\), torque \(\boldsymbol\tau\), vorticity โ every "axial vector" in physics is a bivector that's been flattened into an arrow by the 3D cross-product trick.
Orientation from the boundary (a Stokes-shaped hint)
How do you even assign an orientation to a bivector, a trivector, a \(k\)-vector? The same way every time: read it off the boundary.
Build a bivector by laying vectors tip-to-tail around the rim of a patch; the patch inherits the rim's circulation. Build a trivector from bivector faces of a little cube, with the rule that neighbouring faces must circulate oppositely across a shared edge โ then "reversing the volume" just means reversing every face.
A trivector a โง b โง c is an oriented parallelepiped โ a chunk of signed volume. Reverse the orientation of its boundary faces and you negate the whole volume.
This "orientation = boundary" idea is not a cute aside โ it is the seed of Stokes' theorem, \(\int_{\partial\Omega}\omega = \int_\Omega d\omega\), the grand unification of the fundamental theorem of calculus, Green's, Gauss's and the curl theorem. Differential forms are just Grassmann algebra with calculus poured on top. (We'll save that feast for its own post.)
Climbing the grades: vectors โ bivectors โ trivectors โ โฆ
Nothing stops us from wedging a third vector on:
\[ \mathbf u\wedge\mathbf v\wedge\mathbf w \]is a trivector โ an oriented volume. Keep going and you get \(k\)-vectors of every grade \(k\). But there's a ceiling: in \(n\) dimensions, once you wedge more than \(n\) vectors, two of them must "collide" along some axis and the whole thing collapses to zero.
How many independent basis \(k\)-vectors live in \(n\) dimensions? Just count how many ways you can choose \(k\) distinct axes out of \(n\): that's \(\binom{n}{k}\). Stack the grades and you get a Pascal's-triangle "diamond" of dimensions, summing to
\[ \sum_{k=0}^{n}\binom{n}{k} = 2^{\,n}. \]# SageMath โ dimension of each grade in n dimensions
for n in range(1, 6):
grades = [binomial(n, k) for k in range(n+1)]
print(f"n={n}: grades {grades} total 2^{n} = {sum(grades)}")
n=1: grades [1, 1] total 2^1 = 2
n=2: grades [1, 2, 1] total 2^2 = 4
n=3: grades [1, 3, 3, 1] total 2^3 = 8
n=4: grades [1, 4, 6, 4, 1] total 2^4 = 16
n=5: grades [1, 5, 10, 10, 5, 1] total 2^5 = 32
binomial(n, k) is "\(n\) choose \(k\)" \(=\binom{n}{k}\) โ the number of ways to pick \(k\) distinct axes out of \(n\), which is exactly how many independent basis \(k\)-vectors exist. The list comprehension [binomial(n,k) for k in range(n+1)] sweeps the grade \(k\) from \(0\) (scalars) up to \(n\) (the top volume). Each row is a row of Pascal's triangle, and sum(grades) \(=\sum_k\binom{n}{k}=2^n\) by the binomial theorem โ so an \(n\)-dimensional space has a \(2^n\)-dimensional exterior algebra. (Notice the rows are palindromes: grade \(k\) and grade \(n-k\) always have the same dimension โ a hint of Hodge duality, the pairing that turns the cross product's bivector back into a vector in 3D.)
The exterior algebra of 3D space, drawn as a lattice: each line means "is contained in." Dimensions 1, 3, 3, 1 โ a Pascal row summing to 2ยณ = 8. The scalar sits at the bottom, the single oriented volume at the top.
Notice the top grade is always 1-dimensional: in \(n\)D there's essentially one \(n\)-vector (the oriented volume element), up to a scale โ because you can always shuffle the axes back into standard order at the cost of some minus signs.
A general element mixing grades โ like \(2 + 3e_1 - 5\,e_2\wedge e_3\) โ is called a multivector. Grassmann algebra is precisely the vector space of all multivectors, with the wedge product gluing the grades together.
Orientation, all the way up
Every multivector has exactly two orientations (\(\pm\)). For a vector you flip the arrow. For a bivector you reverse the circulation around its boundary. For a trivector you reverse the orientations of all the bivector faces of its little cube โ neighbors must disagree across shared edges. The rule "read orientation off the boundary" works in every grade. It's the same rule that powers Stokes' theorem, but that's a story for another day.
The grown-up definition (tensor algebra รท a rule)
Here's the slick, "official" construction โ skippable on a first read, but it's beautiful and it sets up the Clifford story perfectly.
Start with everything: the tensor algebra \(T(V)\) of a vector space \(V\). It contains scalars, vectors, all tensor products \(\mathbf u\otimes\mathbf v\), all triples \(\mathbf u\otimes\mathbf v\otimes\mathbf w\), and so on, to infinity โ an enormous, free playground where nothing simplifies.
Now impose one rule: declare every \(\mathbf v\otimes\mathbf v\) to be zero. Formally, take the quotient by the (two-sided) ideal generated by all \(\mathbf v\otimes\mathbf v\):
\[ \boxed{\;\Lambda(V) \;=\; T(V)\,\big/\,\langle\, \mathbf v\otimes\mathbf v \,\rangle\;} \]The instant you do this, \(\mathbf v\otimes\mathbf v=0\) forces \(\mathbf u\otimes\mathbf v=-\mathbf v\otimes\mathbf u\) (same proof as before), the infinite tower of tensors collapses, and what survives โ for, say, \(V=\mathbb R^2\) โ is just the four guys \(\{1,\,e_1,\,e_2,\,e_1\wedge e_2\}\). That quotient is the Grassmann algebra, and \(\otimes\) becomes \(\wedge\).
Grassmann algebra = the free algebra on a vector space, modulo "anything squared is zero."Hold that sentence. In Part 2, we change the right-hand side of that rule from "zero" to "the vector's squared length" โ and that one tweak turns areas into the geometric product, gives us complex numbers, quaternions, the Pauli and Dirac matrices, and ultimately spinors.
Where this is heading: differential forms, and a cameo in QFT
Two big doors open from here, and both deserve their own posts โ so this is just a teaser.
Door 1 โ Differential forms (geometry & gravity). Pour calculus onto Grassmann algebra and you get differential \(p\)-forms: completely antisymmetric tensors, i.e. wedge products of \(1\)-forms. Everything we built reappears: the wedge of forms \(A\wedge B=(-1)^{pq}B\wedge A\), the exterior derivative \(\mathrm d\) with the magic identity \(\mathrm d^2=0\), Hodge duality \(\star\) relating \(p\)-forms to \((n-p)\)-forms (remember those palindromic Pascal rows?), and Stokes' theorem \(\int_{\partial\Omega}\omega=\int_\Omega \mathrm d\omega\). In electromagnetism this is gorgeous: the field strength is a \(2\)-form \(F=\mathrm dA\), and two of Maxwell's four equations collapse into the single statement
\[ \mathrm dF = 0. \]The other two become \(\mathrm d{\star}F=J\). The whole of classical E&M, in two lines of Grassmann-with-calculus. (This is the language of general relativity and gauge theory โ a future post.)
Door 2 โ Grassmann numbers and fermions (quantum field theory). Here's the cameo that surprises people. In QFT, fermions (electrons, quarks, neutrinos) are described in the path integral not by ordinary numbers but by anticommuting "numbers" \(\theta_i\) with
\[ \theta_i\theta_j = -\theta_j\theta_i, \qquad \theta_i^2 = 0. \]Those are exactly the generators of a Grassmann algebra โ the same \(\mathbf v\wedge\mathbf v=0\) rule you just learned! And it's not a coincidence: \(\theta_i^2=0\)is the Pauli exclusion principle in algebraic clothing โ you can't put two identical fermions in the same state, just as you can't wedge a vector with itself. Integrating over these variables uses the curious Berezin integral \(\int \mathrm d\theta\,\theta = 1\), which is what makes fermionic path integrals (and the whole machinery of the Standard Model's matter fields) work.
The humble rule "squares vanish" is the same rule that forbids two electrons from sharing a state. We'll unpack the QFT side properly in a later post.
Recap
The wedge product \(\mathbf u\wedge\mathbf v\) is an oriented area (a bivector), with \(\mathbf v\wedge\mathbf u=-\mathbf u\wedge\mathbf v\) and \(\mathbf u\wedge\mathbf u=0\).
Antisymmetry and self-annihilation are the same rule.
Bivector components are signed areas / determinants; in 3D they reproduce the cross product (which is just a bivector in disguise).
Wedging builds a tower of grades; in \(n\)D the dimensions are the Pascal row \(\binom{n}{k}\), summing to \(2^n\).
Officially, \(\Lambda(V)=T(V)/\langle \mathbf v\otimes\mathbf v\rangle\) โ "squares vanish."
Next time we flip that last rule and meet the algebra that makes spinors stop looking like accidents.
โก๏ธ Continue to Part 2 โ Clifford (Geometric) Algebra.