Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Differential Forms

We express differential forms in terms of tensors and index notation. The closest treatment seems to be Winitzki (2009), but we improve even upon that in clarity, exact short definitions and explicit examples.

It seems the usual old-fashioned index-based tensor formalism described in Čertík, O. et al. (2025) is all that is needed, and the differential forms provide an equivalent and optional treatment for antisymmetric tensors, which might be sometimes useful, but fundamentally does not bring any new feature or machinery, exactly the same computations can be done using index-based tensors also. We show how to equivalently rewrite any differential form formula or computation using tensors.

Here is a concurring opinion from Brian Beckman’s From the Steam Age to the Standard Model

This book uses the old-fashioned index notation typified by Lovelock and Rund (L&R). It is written entirely in terms of transformation rules between coordinate systems. This is refreshingly concrete for the physicist concerned with calculation. After all, we must have numbers and arrays to do calculations. The downside of this ancient notation is that it’s no help in understanding contemporary literature. We can’t have our cake—coordinate-free notation for concise theorizing—and eat it—concrete coordinates for practical calculation—too.

We also avoid Cartan’s exterior calculus, typified by the Grassmann wedge product, as in dxdyd x\wedge{}d y. While this is a beautiful and powerful formalism, it’s not usually taught at an undergraduate level, and we don’t want assume it of the reader. We also don’t want to take the time and space to develop it. We can do all the physics we want without it, for now.

In these notes, we do take the time and space to develop that bridge from modern notation to the classical index notation.

Vectors, Forms, and Tensors

Vectors

Any vector u\mathbf{u} can be written as:

u=uiei.\mathbf{u}=u^i \vec{e}_i\,.

One-Forms

Any one-form p\mathbf{p} can be written as:

p=pie~i.\mathbf{p}=p_i \tilde{e}^i\,.

Whereas the basis vectors are ei  \vec{e}_i\;, the basis one-forms are e~i\tilde{e}^i.

Tensors

Any rank‑2 contravariant tensor A\mathbf{A} can be written as:

A=Aij  eiej.\mathbf{A}=A^{ij}\; \vec{e}_i \otimes \vec{e}_j\,.

Any rank‑3 contravariant tensor A\mathbf{A} can be written as:

A=Aijk  eiejek.\mathbf{A}=A^{ijk}\; \vec{e}_i \otimes \vec{e}_j \otimes \vec{e}_k\,.

The contravariant tensor bases are eiej\vec{e}_i \otimes \vec{e}_j and eiejek\vec{e}_i \otimes \vec{e}_j \otimes \vec{e}_k\,, respectively.

Mixing lower and upper indices:

A=Aij  eie~j.\mathbf{A}=A^i{}_{j}\; \vec{e}_i \otimes \tilde{e}^j\,.

The vector basis and the dual (form) basis are related by a dot product:

e~iej=δij.\tilde{e}^i \cdot \vec{e}_j = \delta^i{}_j\,.

If the vector basis is a coordinate basis, then basis vectors can be written as:

ei=rxixi,\vec{e}_i = {\partial\,\mathbf{r}\over\partial x^i} \equiv {\partial\over\partial x^i}\,,

where the position vector r\mathbf{r} can be omitted, and the basis vector is treated as an operator on any function on the manifold (we will not use this notation).

The corresponding 1-form basis can be written as

e~idxi.\tilde{e}^i \equiv dx^i\,.

As noted above, the one-form can act on a vector to produce a scalar, by definition of the dual space of linear operators on vectors, where 1-forms live, as follows using an inner (dot) product:

p(u)pu=pie~iujej=piuje~iej=piujδij=piui.\begin{aligned} \mathbf{p}(\mathbf{u})&\equiv\mathbf{p} \cdot \mathbf{u} \\&=p_i \tilde{e}^i \cdot u^j \vec{e}_j \\&=p_i u^j \tilde{e}^i \cdot \vec{e}_j \\&=p_i u^j \delta^i{}_j \\&=p_i u^i\,. \end{aligned}

We will not use the p(u)\mathbf{p}(\mathbf{u}) notation, preferring the dot product directly, or simply contracting indices as piuip_i u^i. All other forms acting on vectors are defined in a similar way using a dot product. In index notation, dot product becomes contraction.

Index Notation

We omit writing the basis vectors, so expressions from the previous sections would be just uiu^i, pip_i, AijA^{ij}, AijkA^{ijk}, AijA^i{}_j, piuip_i u^i, etc. In most cases that is enough to fully represent everything. When we want to represent the tensor itself rather than just its components in the underlying fields (usually R\mathbb{R} or C\mathbb{C}), we include the basis functions too.

Upper and lower indices are treated equally. They just denote contravariant and covariant components of the same tensor.

Antisymmetric and Symmetric Tensors

The antisymmetric part of any covariant rank-2 tensor AijA_{ij} can be written as follows:

A[ij]=12!εijεklAkl=12det(δikδilδjkδjl)Akl=12(δikδjlδilδjk)Akl=12(AijAji).\begin{aligned} A_{[ij]} &= {1\over2!}\varepsilon_{ij}\varepsilon^{kl} A_{kl} \\ &= {1\over2}\det\begin{pmatrix} \delta_i{}^k & \delta_i{}^l \\ \delta_j{}^k & \delta_j{}^l \end{pmatrix} A_{kl} \\ &= {1\over2}(\delta_i{}^k\delta_j{}^l - \delta_i{}^l \delta_j{}^k) A_{kl}\\ & =\frac12(A_{ij}-A_{ji})\,. \end{aligned}

Together these give the decomposition of any rank-2 tensor into its symmetric and antisymmetric parts, Aij=A(ij)+A[ij]A_{ij}=A_{(ij)}+A_{[ij]}.

Lean proof: symPart, antisymPart, and the decomposition symPart_add_antisymPart

Over R\mathbb{R}, define the symmetric and antisymmetric parts of a rank-2 tensor, A(ij)=12(Aij+Aji)A_{(ij)}={1\over2}(A_{ij}+A_{ji}) and A[ij]=12(AijAji)A_{[ij]}={1\over2}(A_{ij}-A_{ji}). The Lean checks confirm that they are genuinely symmetric and antisymmetric and that they sum back to AijA_{ij}.

DifferentialFormsFlow.lean
/-- The **symmetric part** `A_(ij) = ½(A i j + A j i)` of a rank-2 tensor over `ℝ`. -/
noncomputable def symPart (A : ι → ι → ℝ) : ι → ι → ℝ := fun i j => (A i j + A j i) / 2

/-- The **antisymmetric part** `A_[ij] = ½(A i j − A j i)` of a rank-2 tensor over `ℝ`; this is the
normalized antisymmetrization bracket used throughout `01-paper.md`. -/
noncomputable def antisymPart (A : ι → ι → ℝ) : ι → ι → ℝ := fun i j => (A i j - A j i) / 2

/-- The symmetric part really is symmetric: `A_(ij) = A_(ji)`. -/
theorem symPart_isSymm (A : ι → ι → ℝ) (i j : ι) : symPart A i j = symPart A j i := by
  unfold symPart; ring

/-- The antisymmetric part really is antisymmetric: `A_[ij] = -A_[ji]`. -/
theorem antisymPart_isAntisymm (A : ι → ι → ℝ) (i j : ι) :
    antisymPart A i j = - antisymPart A j i := by
  unfold antisymPart; ring

/-- Every rank-2 tensor is the sum of its symmetric and antisymmetric parts:
`A i j = A_(ij) + A_[ij]`. -/
theorem symPart_add_antisymPart (A : ι → ι → ℝ) (i j : ι) :
    symPart A i j + antisymPart A i j = A i j := by
  unfold symPart antisymPart; ring

Antisymmetric part of a covariant rank-3 tensor:

A[ijk]=13!εijkεlmnAlmn=13!det(δilδimδinδjlδjmδjnδklδkmδkn)Almn=13!(δilδjmδknδimδjlδkn+)Almn=16(AijkAjik++).\begin{aligned} A_{[ijk]} &= {1\over3!}\varepsilon_{ijk}\varepsilon^{lmn} A_{lmn} \\&= {1\over3!}\det\begin{pmatrix} \delta_i{}^l & \delta_i{}^m & \delta_i{}^n \\ \delta_j{}^l & \delta_j{}^m & \delta_j{}^n \\ \delta_k{}^l & \delta_k{}^m & \delta_k{}^n \\ \end{pmatrix} A_{lmn} \\&= {1\over3!}(\delta_i{}^l\delta_j{}^m\delta_k{}^n - \delta_i{}^m\delta_j{}^l\delta_k{}^n + \cdots) A_{lmn} \\&= {1\over6}(A_{ijk}-A_{jik}+\cdots - \cdots + \cdots)\,. \end{aligned}

Antisymmetric part of a covariant rank-4 tensor:

A[ijkl]=14!εijklεmnopAmnop=14!det(δimδinδioδipδjmδjnδjoδjpδkmδknδkoδkpδlmδlnδloδlp)Amnop=14!(δimδjnδkoδlpδinδjmδkoδlp+)Amnop=124(AijklAjikl+).\begin{aligned} A_{[ijkl]} &= {1\over4!}\varepsilon_{ijkl}\varepsilon^{mnop} A_{mnop} \\&= {1\over4!}\det\begin{pmatrix} \delta_i{}^m & \delta_i{}^n & \delta_i{}^o & \delta_i{}^p \\ \delta_j{}^m & \delta_j{}^n & \delta_j{}^o & \delta_j{}^p \\ \delta_k{}^m & \delta_k{}^n & \delta_k{}^o & \delta_k{}^p \\ \delta_l{}^m & \delta_l{}^n & \delta_l{}^o & \delta_l{}^p \end{pmatrix} A_{mnop} \\&={1\over4!}(\delta_i{}^m\delta_j{}^n\delta_k{}^o\delta_l{}^p - \delta_i{}^n\delta_j{}^m\delta_k{}^o\delta_l{}^p + \cdots) A_{mnop} \\&={1\over24}(A_{ijkl}-A_{jikl}+\cdots)\,. \end{aligned}

The fraction at the beginning tells us how many terms there are in the final answer: 2, 6, 24 for ranks 2, 3, 4.

Exterior (Wedge) Product

The exterior (wedge) product of two 1-forms u=uie~i\mathbf{u}=u_i \tilde{e}^i and v=vie~i\mathbf{v}=v_i \tilde{e}^i is defined as:

uvuvvu.\mathbf{u} \wedge \mathbf{v} \equiv \mathbf{u} \otimes \mathbf{v} - \mathbf{v} \otimes \mathbf{u}\,.

Expressing this in components in a basis:

uv=uie~ivje~j=uvvu=uie~ivje~jvie~iuje~j=uivje~ie~jviuje~ie~j=(uivjujvi)e~ie~j=det(uiujvivj)e~ie~j=Aij  e~ie~j.\begin {aligned} \mathbf {u} \wedge \mathbf {v} & = u_i \tilde {e}^i \wedge v_j \tilde {e}^j \\ & = \mathbf {u} \otimes \mathbf {v} - \mathbf {v} \otimes \mathbf {u} \\ & = u_i \tilde {e}^i \otimes v_j \tilde {e}^j - v_i \tilde {e}^i \otimes u_j \tilde {e}^j \\ & = u_i v_j \tilde{e}^i \otimes \tilde{e}^j - v_i u_j \tilde{e}^i \otimes \tilde{e}^j \\ & = (u_i v_j-u_j v_i) \tilde{e}^i \otimes \tilde{e}^j \\ & = \det\begin{pmatrix} u_i & u_j \\ v_i & v_j \end{pmatrix} \tilde{e}^i \otimes \tilde{e}^j \\ & = A_{ij}\;\tilde{e}^i \otimes \tilde{e}^j\,. \end {aligned}

The tensor AijA_{ij} is antisymmetric.

The last equation can be written as a wedge product by first rewriting the tensor basis into its symmetric and antisymmetric parts:

Aij  e~ie~j=Aij12(e~ie~j+e~je~i)+Aij12(e~ie~je~je~i)=Aij12(e~ie~j+e~je~i)+Aij12e~ie~j=12Aij  e~ie~j.\begin{aligned} A_{ij}\;\tilde{e}^i \otimes \tilde{e}^j &=A_{ij}{1\over2}(\tilde{e}^i \otimes \tilde{e}^j+\tilde{e}^j \otimes \tilde{e}^i) +A_{ij}{1\over2}(\tilde{e}^i \otimes \tilde{e}^j-\tilde{e}^j \otimes \tilde{e}^i) \\&=A_{ij}{1\over2}(\tilde{e}^i \otimes \tilde{e}^j+\tilde{e}^j \otimes \tilde{e}^i)+A_{ij}{1\over2} \tilde{e}^i \wedge \tilde{e}^j \\&={1\over2} A_{ij}\; \tilde{e}^i \wedge \tilde{e}^j\,. \end{aligned}

The left term contains an antisymmetric tensor Aij=uivjujviA_{ij}=u_i v_j-u_j v_i contracted with a symmetric tensor (e~ie~j+e~je~i)(\tilde{e}^i \otimes \tilde{e}^j+\tilde{e}^j \otimes \tilde{e}^i); the result is zero.

Lean proof: contract_antisymm_symm (and contract_antisymPart_symPart)

Writing the full contraction of two rank-2 covariant tensors as i,jAijSij\sum_{i,j} A_{ij}\,S^{ij}, relabelling the summation indices iji\leftrightarrow j and using antisymmetry Aij=AjiA_{ij}=-A_{ji} together with symmetry Sij=SjiS^{ij}=S^{ji} shows that the contraction equals its own negation. Over R\mathbb{R} this forces it to vanish.

DifferentialFormsFlow.lean
/-- The **full contraction** `∑_{i,j} A i j * S i j` of two rank-2 covariant tensors `A` and `S`,
each written as a function `ι → ι → R` of its two indices over a finite index set `ι`. -/
def contract [Fintype ι] [NonUnitalNonAssocSemiring R] (A S : ι → ι → R) : R :=
  ∑ i, ∑ j, A i j * S i j

/-- Contracting an **antisymmetric** tensor `A` (`A i j = -A j i`) with a **symmetric** tensor `S`
(`S i j = S j i`) yields a quantity equal to its own negation.  Relabelling `i ↔ j` in the double
sum turns each term `A i j * S i j` into `A j i * S j i = (-A i j) * (S i j) = -(A i j * S i j)`. -/
theorem contract_antisymm_symm_eq_neg [Fintype ι] [Ring R] {A S : ι → ι → R}
    (hA : ∀ i j, A i j = -A j i) (hS : ∀ i j, S i j = S j i) :
    contract A S = - contract A S := by
  have reindex : contract A S = ∑ i, ∑ j, A j i * S j i := by
    rw [contract, Finset.sum_comm]
  conv_lhs => rw [reindex]
  rw [contract, ← Finset.sum_neg_distrib]
  refine Finset.sum_congr rfl fun i _ => ?_
  rw [← Finset.sum_neg_distrib]
  refine Finset.sum_congr rfl fun j _ => ?_
  rw [hA j i, hS j i, neg_mul]

/-- Over `ℝ` (any ring where `2` is cancellable) the contraction of an antisymmetric tensor with a
symmetric tensor is therefore exactly zero, as claimed in `01-paper.md`. -/
theorem contract_antisymm_symm [Fintype ι] {A S : ι → ι → ℝ}
    (hA : ∀ i j, A i j = -A j i) (hS : ∀ i j, S i j = S j i) :
    contract A S = 0 := by
  have h := contract_antisymm_symm_eq_neg hA hS
  linarith

In particular, applied to the symmetric and antisymmetric parts defined earlier, the antisymmetric part of any tensor contracts to zero against the symmetric part of any tensor.

DifferentialFormsFlow.lean
/-- Combining the splitting with `contract_antisymm_symm`: over `ℝ`, the full contraction of the
antisymmetric part of any tensor with the symmetric part of any tensor vanishes. -/
theorem contract_antisymPart_symPart [Fintype ι] (A B : ι → ι → ℝ) :
    contract (antisymPart A) (symPart B) = 0 :=
  contract_antisymm_symm (antisymPart_isAntisymm A) (symPart_isSymm B)

We end up with:

uie~ivje~j=(uivjujvi)e~ie~j=12(uivjujvi)  e~ie~j.\begin{aligned} u_i \tilde{e}^i \wedge v_j \tilde{e}^j &=(u_i v_j-u_j v_i) \tilde{e}^i \otimes \tilde{e}^j \\& = {1\over2} (u_i v_j-u_j v_i)\; \tilde{e}^i \wedge \tilde{e}^j\,. \end{aligned}

Thus we get:

uie~ivje~j=det(uiujvivj)e~ie~j=Aije~ie~j=12Aije~ie~j.u_i \tilde{e}^i \wedge v_j \tilde{e}^j = \det\begin{pmatrix} u_i & u_j \\ v_i & v_j \end{pmatrix} \tilde{e}^i \otimes \tilde{e}^j = A_{ij}\tilde{e}^i \otimes \tilde{e}^j = {1\over2}A_{ij}\tilde{e}^i \wedge \tilde{e}^j\,.

The wedge product of three 1-forms is defined using:

uvwuvwvuw+wuvwvu++vwuuwv\begin{aligned} \mathbf{u} \wedge \mathbf{v} \wedge \mathbf{w} &\equiv \mathbf{u} \otimes \mathbf{v} \otimes \mathbf{w} \\&-\mathbf{v} \otimes \mathbf{u} \otimes \mathbf{w} \\&+\mathbf{w} \otimes \mathbf{u} \otimes \mathbf{v} \\&-\mathbf{w} \otimes \mathbf{v} \otimes \mathbf{u}+% \\&+\mathbf{v} \otimes \mathbf{w} \otimes \mathbf{u} \\&-\mathbf{u} \otimes \mathbf{w} \otimes \mathbf{v} \end{aligned}

Expressing this in components we get a rank 3 antisymmetric tensor:

uie~ivje~jwke~k=det(uiujukvivjvkwiwjwk)e~ie~je~k=Aijk  e~ie~je~k.\begin{aligned} u_i \tilde{e}^i \wedge v_j \tilde{e}^j \wedge w_k\tilde{e}^k &= \det\begin{pmatrix} u_i & u_j & u_k \\ v_i & v_j & v_k \\ w_i & w_j & w_k \end{pmatrix} \tilde{e}^i \otimes \tilde{e}^j \otimes \tilde{e}^k \\&=A_{ijk}\;\tilde{e}^i \otimes \tilde{e}^j \otimes \tilde{e}^k\,. \end{aligned}

This tensor can also be written in the wedge basis, with a 13!1\over3! factor:

Aijk  e~ie~je~k=13!Aijk  e~ie~je~k.A_{ijk}\;\tilde{e}^i \otimes \tilde{e}^j \otimes \tilde{e}^k ={1\over 3!}A_{ijk}\;\tilde{e}^i \wedge \tilde{e}^j \wedge \tilde{e}^k\,.

This is the rank-3 analogue of the rank-2 identity (28); the 13!1\over3! is the generalized double counting, since each wedge e~ie~je~k\tilde{e}^i \wedge \tilde{e}^j \wedge \tilde{e}^k expands into 3!3! signed tensor products.

Lean proof: otimesExpand_eq_smul_wedgeExpand

Model rank-3 covariant tensors over a finite index set as the free R\mathbb{R}-module on index triples, with basis tensor e~p0e~p1e~p2\tilde{e}^{p_0}\otimes\tilde{e}^{p_1}\otimes\tilde{e}^{p_2} and wedge e~p0e~p1e~p2=σsgn(σ)e~pσ(0)e~pσ(1)e~pσ(2)\tilde{e}^{p_0}\wedge\tilde{e}^{p_1}\wedge\tilde{e}^{p_2}=\sum_\sigma \operatorname{sgn}(\sigma)\,\tilde{e}^{p_{\sigma(0)}}\otimes\tilde{e}^{p_{\sigma(1)}}\otimes\tilde{e}^{p_{\sigma(2)}}.

DifferentialFormsFlow.lean
/-- Levi-Civita sign of a permutation of the three tensor slots, as a real scalar. -/
def signR (σ : Equiv.Perm (Fin 3)) : ℝ := ((Equiv.Perm.sign σ : ℤ) : ℝ)

/-- The basis tensor `ẽ^{p 0} ⊗ ẽ^{p 1} ⊗ ẽ^{p 2}` in the free `ℝ`-module on index triples. -/
def basisTensor [DecidableEq ι] (p : Fin 3 → ι) : (Fin 3 → ι) → ℝ := Pi.single p 1

/-- The `⊗`-expansion `∑_{i,j,k} A_{ijk} ẽⁱ⊗ẽʲ⊗ẽᵏ` of a rank-3 tensor with coefficients `A`. -/
def otimesExpand [Fintype ι] [DecidableEq ι] (A : (Fin 3 → ι) → ℝ) : (Fin 3 → ι) → ℝ :=
  ∑ p, A p • basisTensor p

/-- The wedge basis tensor `ẽ^{p 0} ∧ ẽ^{p 1} ∧ ẽ^{p 2}`: the signed sum over permutations of the
three slots, matching the note's definition of `u ∧ v ∧ w`. -/
def wedge [DecidableEq ι] (p : Fin 3 → ι) : (Fin 3 → ι) → ℝ :=
  ∑ σ : Equiv.Perm (Fin 3), signR σ • basisTensor (p ∘ ⇑σ)

/-- The `∧`-expansion `∑_{i,j,k} A_{ijk} ẽⁱ∧ẽʲ∧ẽᵏ`. -/
def wedgeExpand [Fintype ι] [DecidableEq ι] (A : (Fin 3 → ι) → ℝ) : (Fin 3 → ι) → ℝ :=
  ∑ p, A p • wedge p

For a fully antisymmetric AijkA_{ijk} (such as the determinant above), reindexing the double sum pσ\sum_{p}\sum_\sigma by ppσp\mapsto p\circ\sigma and using antisymmetry turns each wedge term back into the plain tensor term, so all 3!3! permutations contribute one copy each, canceling the 13!1\over3!.

DifferentialFormsFlow.lean
/-- **The rank-3 claim of `01-paper.md`.** For a fully antisymmetric rank-3 tensor `A`
(`A (p ∘ σ) = sign σ * A p`), the `⊗`-expansion equals `1/3!` times the `∧`-expansion:
`A_{ijk} ẽⁱ⊗ẽʲ⊗ẽᵏ = (1/3!) A_{ijk} ẽⁱ∧ẽʲ∧ẽᵏ`. -/
theorem otimesExpand_eq_smul_wedgeExpand [Fintype ι] [DecidableEq ι] (A : (Fin 3 → ι) → ℝ)
    (hA : ∀ (p : Fin 3 → ι) (σ : Equiv.Perm (Fin 3)), A (p ∘ ⇑σ) = signR σ * A p) :
    otimesExpand A = (1 / 6 : ℝ) • wedgeExpand A := by
  have hcard : Fintype.card (Equiv.Perm (Fin 3)) = 6 := by
    rw [Fintype.card_perm, Fintype.card_fin]; rfl
  have h6 : wedgeExpand A = (6 : ℝ) • otimesExpand A := by
    rw [wedgeExpand_eq_card_smul A hA, hcard, ← Nat.cast_smul_eq_nsmul ℝ]
    norm_num
  rw [h6, smul_smul]
  norm_num

Higher-order products are defined in analogous manner (nn wedge products is a rank nn fully antisymmetric tensor). The exterior product can be defined for vectors as well. The components of these tensors are equal to:

Aij=det(uiujvivj)=uivjujviA_{ij}= \det\begin{pmatrix} u_i & u_j \\ v_i & v_j \end{pmatrix} = u_i v_j - u_j v_i

and

Aijk=det(uiujukvivjvkwiwjwk).A_{ijk} = \det\begin{pmatrix} u_i & u_j & u_k \\ v_i & v_j & v_k \\ w_i & w_j & w_k \end{pmatrix}\,.

The wedge product is equal to the tensor written using the tensor basis in equations (28) and (30). The same tensor in index notation is given by equations (32) and (33).

Via properties of a determinant, we can see that the wedge product is just a fully antisymmetric tensor.

Examples

dxdzdx \wedge dz

We can now use the definitions to compute various special cases. For example, if we have the exterior product of two 1-forms dxdx and dzdz (with components dxi=δ1idx_i=\delta_{1i} and dzi=δ3idz_i=\delta_{3i}):

dxdz=det(δ1iδ1jδ3iδ3j)e~ie~j=e~1e~3e~3e~1,dx \wedge dz = \det\begin{pmatrix} \delta_{1i} & \delta_{1j} \\ \delta_{3i} & \delta_{3j} \end{pmatrix} \tilde{e}^i \otimes \tilde{e}^j = \tilde{e}^1 \otimes \tilde{e}^3 - \tilde{e}^3 \otimes \tilde{e}^1 \,,

thus the components of this rank 2 tensor are:

Aij=det(δ1iδ1jδ3iδ3j)=δ1iδ3jδ1jδ3i=(001000100).A_{ij}=\det\begin{pmatrix} \delta_{1i} & \delta_{1j} \\ \delta_{3i} & \delta_{3j} \end{pmatrix}=\delta_{1i}\delta_{3j}-\delta_{1j}\delta_{3i} =\begin{pmatrix} 0 & 0 & 1 \\ 0 & 0 & 0 \\ -1 & 0 & 0 \end{pmatrix} \,.

e~1e~3\tilde{e}^1 \wedge \tilde{e}^3

The exterior product of two basis 1-forms e~1\tilde{e}^1 and e~3\tilde{e}^3 is:

e~1e~3=det(δ1iδ1jδ3iδ3j)e~ie~j=e~1e~3e~3e~1,\tilde{e}^1 \wedge \tilde{e}^3 = \det\begin{pmatrix} \delta_{1i} & \delta_{1j} \\ \delta_{3i} & \delta_{3j} \end{pmatrix} \tilde{e}^i \otimes \tilde{e}^j = \tilde{e}^1 \otimes \tilde{e}^3 - \tilde{e}^3 \otimes \tilde{e}^1 \,,

thus the components of this rank 2 tensor are:

Aij=det(δ1iδ1jδ3iδ3j)=δ1iδ3jδ1jδ3i=(001000100).A_{ij}=\det\begin{pmatrix} \delta_{1i} & \delta_{1j} \\ \delta_{3i} & \delta_{3j} \end{pmatrix}=\delta_{1i}\delta_{3j}-\delta_{1j}\delta_{3i} =\begin{pmatrix} 0 & 0 & 1 \\ 0 & 0 & 0 \\ -1 & 0 & 0 \end{pmatrix} \,.

We can see that e~1e~3=e~1e~3e~3e~1\tilde{e}^1 \wedge \tilde{e}^3 = \tilde{e}^1 \otimes \tilde{e}^3 - \tilde{e}^3 \otimes \tilde{e}^1, so the wedge product is simply an antisymmetric tensor, written with with basis functions included.

dx1dx2dx4dx^1 \wedge dx^2 \wedge dx^4 Evaluated on Vectors

When evaluating the form (composed of basis forms) on vectors u\mathbf{u}, v\mathbf{v} and w\mathbf{w}, we are computing the following dot product of the two rank-3 tensors (full contraction):

(dx1dx2dx4)(uvw)=det(δ1iδ1jδ1kδ2iδ2jδ2kδ4iδ4jδ4k)e~ie~je~k(ulvmwnelemen)=det(δ1iδ1jδ1kδ2iδ2jδ2kδ4iδ4jδ4k)uivjwk=det(u1v1w1u2v2w2u4v4w4).\begin{aligned} &(dx^1 \wedge dx^2 \wedge dx^4) \cdot (\mathbf{u} \otimes \mathbf{v} \otimes \mathbf{w}) \\&= \det\begin{pmatrix} \delta_{1i} & \delta_{1j} & \delta_{1k} \\ \delta_{2i} & \delta_{2j} & \delta_{2k} \\ \delta_{4i} & \delta_{4j} & \delta_{4k} \\ \end{pmatrix} \tilde{e}^i \otimes \tilde{e}^j \otimes \tilde{e}^k \cdot (u^l v^m w^n \vec{e}_l \otimes \vec{e}_m \otimes \vec{e}_n) \\&= \det\begin{pmatrix} \delta_{1i} & \delta_{1j} & \delta_{1k} \\ \delta_{2i} & \delta_{2j} & \delta_{2k} \\ \delta_{4i} & \delta_{4j} & \delta_{4k} \\ \end{pmatrix} u^i v^j w^k \\&= \det\begin{pmatrix} u_1 & v_1 & w_1 \\ u_2 & v_2 & w_2 \\ u_4 & v_4 & w_4 \\ \end{pmatrix}\,.\end{aligned}

The form has thus selected the first, second and fourth component row of the vectors. The result is just a scalar.

Exterior Derivative

The exterior derivative dd is defined via the following rules / definitions for differential forms:

It turns out that in terms of tensors, the exterior derivative is simply a regular derivative that is made antisymmetric:

One can use the formulas from the section “Antisymmetric Tensors” above to evaluate these antisymmetric derivatives. We show examples of this below. We first compute the exterior derivative using differential forms and the above rules, and then we do exactly the same operations using tensors.

Differentiating 0-forms

Input:

f(x,y).f(x, y)\,.

Derivative:

df=xfdx+yfdy.df = \partial_x f\, dx + \partial_y f\, dy\,.

In general, we get:

df=ifdxi.df = \partial_i f \, dx^i\,.

Differentiating 1-forms

Input:

ω=f1(x1,x2)dx1+f2(x1,y2)dx2.\omega = f_1(x^1,x^2) dx^1 + f_2(x^1,y^2) dx^2\,.

Derivative:

dω=df1dx1+df2dx2=if1dxidx1+if2dxidx2=2f1dx2dx1+1f2dx1dx2=(1f22f1)dx1dx2.\begin{aligned} d\omega &= d f1 \wedge dx^1 + df_2 \wedge dx^2 \\&= \partial_i f_1 \, dx^i \wedge dx^1 + \partial_i f_2 \, dx^i \wedge dx^2 \\&= \partial_2 f_1 \, dx^2 \wedge dx^1 + \partial_1 f_2 \, dx^1 \wedge dx^2 \\&= (\partial_1 f_2 - \partial_2 f_1) dx^1 \wedge dx^2\,. \end{aligned}

In general, the derivative of a 1-form f~=fidxi\tilde f=f_i dx^i is:

df~=d(fidxi)=dfidxi=(jfidxj)dxi=12(jfiifj)dxjdxi==(jfiifj)dxjdxi.=Aij  dxidxj,\begin{aligned} d\tilde f &=d(f_i dx^i) \\&=df_i \wedge dx^i \\&=(\partial_j f_i dx^j) \wedge dx^i \\&={1\over2}(\partial_j f_i - \partial_i f_j) dx^j \wedge dx^i= \\&=(\partial_j f_i - \partial_i f_j) dx^j \otimes dx^i\,. \\&= A_{ij}\; dx^i \otimes dx^j\,, \end{aligned}

Take a 1-form fjf_j, differentiate ifj\partial_i f_j, to get a rank-2 tensor. Project it into the antisymmetric subspace dxidxjdxjdxi=12dxidxjdx^i \otimes dx^j - dx^j \otimes dx^i={1\over2}dx^i\wedge dx^j, canceling the symmetric part of the derivative. Only the antisymmetric part survives: ifjjfi\partial_i f_j - \partial_j f_i. So we define the derivative to be Aij=ifjjfiA_{ij}=\partial_i f_j - \partial_j f_i. We can define the derivative on antisymmetric tensors (exterior derivative) to be a regular derivative projected into the antisymmetric subset.

Let’s now do the same computation using regular tensors:

Aij=2[ifj]=εijεklkfl=(δikδjlδilδjk)kfl=ifjjfi.\begin{aligned} A_{ij} &= 2\,\partial_{[i} f_{j]} \\&= \varepsilon_{ij}\varepsilon^{kl} \partial_{k} f_{l} \\&= (\delta_i{}^k\delta_j{}^l-\delta_i{}^l\delta_j{}^k) \partial_{k} f_{l} \\&= \partial_i f_j - \partial_j f_i\,. \end{aligned}
Lean proof: the factor of 2 — two_mul_antisymPart

Taking Aij=ifjA_{ij}=\partial_i f_j, the normalized bracket satisfies 2[ifj]=ifjjfi2\,\partial_{[i} f_{j]} = \partial_i f_j - \partial_j f_i with no leftover 12{1\over2}, which is exactly the correction discussed above.

DifferentialFormsFlow.lean
/-- The factor of `2` in `01-paper.md`'s 1-form exterior derivative. With the *normalized* bracket
`∂_[i f_j] = ½(∂_i f_j − ∂_j f_i)`, twice the bracket has no residual `½`:
`2 ∂_[i f_j] = ∂_i f_j − ∂_j f_i`. Taking `A i j = ∂_i f_j` this is `2 * antisymPart A i j`. -/
theorem two_mul_antisymPart (A : ι → ι → ℝ) (i j : ι) :
    2 * antisymPart A i j = A i j - A j i := by
  unfold antisymPart; ring

The exterior derivative is simply a regular (not antisymmetric) derivative ifj\partial_{i} f_{j} that is made antisymmetric: [ifj]\partial_{[i} f_{j]}. The same applies to higher ranks.

Differentiating 2-forms in 3D

Input:

ω=(F1dx2dx3)+(F2dx3dx1)+(F3dx1dx2).\omega = (F^1 \,dx^2 \wedge dx^3) + (F^2 \,dx^3 \wedge dx^1) + (F^3 \,dx^1 \wedge dx^2)\,.

Output:

dω=(dF1dx2dx3)+(dF2dx3dx1)+(dF3dx1dx2)=(1F1dx1dx2dx3)+(2F2dx2dx3dx1)+(3F3dx3dx1dx2)=(1F1+2F2+3F3)dx1dx2dx3.\begin{aligned} d\omega &= (dF^1 \wedge dx^2 \wedge dx^3) + (dF^2 \wedge dx^3 \wedge dx^1) + (dF^3 \wedge dx^1 \wedge dx^2) \\&= (\partial_1 F^1 dx^1 \wedge dx^2 \wedge dx^3) + (\partial_2 F^2 dx^2 \wedge dx^3 \wedge dx^1) + (\partial_3 F^3 dx^3 \wedge dx^1 \wedge dx^2) \\&= (\partial_1 F^1 + \partial_2 F^2 + \partial_3 F^3) \,dx^1 \wedge dx^2 \wedge dx^3\,. \end{aligned}

In general for antisymmetric AijA_{ij}:

ω=Aijdxidxj=12Aijdxidxj.\omega = A_{ij}\, dx^i \otimes dx^j = {1\over2} A_{ij}\, dx^i \wedge dx^j\,.

Differentiate the tensor:

dω=12dAijdxidxj=12kAijdxkdxidxj=12[kAij]dxidxjdxk=1216εkijεlmnlAmndxidxjdxk=1216εkijεlmnlεmnqFqdxidxjdxk=1216εkij2δlqlFqdxidxjdxk=16εijkqFqdxidxjdxk=qFqdx1dx2dx3.\begin{aligned} d\omega &= {1\over2} d A_{ij} \, dx^i \wedge dx^j \\&= {1\over2} \partial_k A_{ij} \, dx^k \wedge dx^i \wedge dx^j \\&= {1\over2} \partial_{[k} A_{ij]} \, dx^i \wedge dx^j \wedge dx^k \\&= {1\over2} {1\over 6}\varepsilon_{kij}\varepsilon^{lmn} \partial_{l} A_{mn} \, dx^i \wedge dx^j \wedge dx^k \\&= {1\over2} {1\over 6}\varepsilon_{kij}\varepsilon^{lmn} \partial_{l} \varepsilon_{mnq} F^q \, dx^i \wedge dx^j \wedge dx^k \\&= {1\over2} {1\over 6}\varepsilon_{kij} 2 \delta^l{}_q \partial_{l} F^q \, dx^i \wedge dx^j \wedge dx^k \\&= {1\over 6}\varepsilon_{ijk} \partial_q F^q \, dx^i \wedge dx^j \wedge dx^k \\&= \partial_q F^q \, dx^1 \wedge dx^2 \wedge dx^3\,. \end{aligned}

We used the fact that the basis is antisymmetric, so only the antisymmetric part of the derivative survives. The basis becomes antisymmetric due to the incorporation of the dxkdx^k base via the wedge product, otherwise the derivative is not fully antisymmetric.

The above is the correct result for differentiating any kk-form in nn-D space where k=n1k=n-1.

Let’s now do the same computation using regular tensors:

[kAij]=16εkijεlmnlAmn=16εkijεlmnlεmnqFq==16εkij2δlqlFq=16εijkqFq.\begin{aligned} \partial_{[k} A_{ij]} &= {1\over 6}\varepsilon_{kij}\varepsilon^{lmn} \partial_{l} A_{mn} \\&= {1\over 6}\varepsilon_{kij}\varepsilon^{lmn} \partial_{l} \varepsilon_{mnq} F^q = \\&= {1\over 6}\varepsilon_{kij} 2 \delta^l{}_q \partial_{l} F^q \\&= {1\over 6}\varepsilon_{ijk} \partial_q F^q\,. \end{aligned}

The exterior derivative is simply a regular (not antisymmetric) derivative kAij\partial_{k} A_{ij} that is made antisymmetric: [kAij]\partial_{[k} A_{ij]}.

TODO

References
  1. Winitzki, S. (2009). Linear algebra via exterior products. Sergei Winitzki.
  2. Čertík, O. et al. (2025). Theoretical Physics Reference: Differential Geometry. https://www.theoretical-physics.com/dev/math/differential-geometry.html