Index Notation and the Summation Convention

Vector calculus written with arrows and named operators is geometrically vivid but algebraically treacherous: try proving ∇×(∇×A)=∇(∇⋅A)−∇2A\nabla\times(\nabla\times\mathbf{A})=\nabla(\nabla\cdot\mathbf{A})-\nabla^2\mathbf{A} by pushing arrows around and you will lose a sign more often than not. Index notation removes the guesswork by trading each vector for its ordered list of Cartesian components, a↔ai\mathbf{a}\leftrightarrow a_i with i∈{1,2,3}i\in\{1,2,3\}. Once vectors are just indexed real numbers, every vector operation becomes ordinary algebra, and the entire geometric content of three-dimensional space is carried by two constant symbols plus one bookkeeping rule. The rule is the Einstein summation convention: an index appearing exactly twice in a single multiplicative term is silently summed over its full range, and the ∑\sum is dropped. Such a repeated index is a dummy — its name is irrelevant, so aibi=ajbja_ib_i=a_jb_j, internal plumbing you may rename at will. An index appearing once is a free index; it labels an output slot and must appear identically in every term and on both sides. These two constraints — at most two occurrences per index, free indices matched throughout — catch the great majority of algebra errors before a single number is computed. The two structural symbols are the Kronecker delta δij\delta_{ij}, which substitutes indices and encodes orthonormality, and the Levi-Civita symbol εijk\varepsilon_{ijk}, totally antisymmetric with ε123=+1\varepsilon_{123}=+1, which encodes orientation and manufactures the cross product and the determinant. Their single contraction, the epsilon-delta identity, is the engine of the whole subject: it collapses any product of two cross products into a difference of dot products, turning celebrated vector identities into three-line exercises and generalising cleanly to the Cartesian tensors of continuum mechanics and the four-index tensors of relativity.

Key takeaways
  • Index notation labels components by subscripts, aia_i for the ii-th Cartesian component of a\mathbf{a}, so geometric objects become algebraic symbols with explicit slots.
  • The summation convention drops the sum sign: an index repeated in a term is summed over its range, so aibi≡∑iaibi=a⋅ba_ib_i\equiv\sum_i a_ib_i=\mathbf{a}\cdot\mathbf{b}.
  • The Kronecker delta δij\delta_{ij} (substitution) and the Levi-Civita symbol εijk\varepsilon_{ijk} (antisymmetriser) are the only two building blocks; together they encode dot product, cross product, and every vector identity.
  • The master identity εijkεilm=δjlδkm−δjmδkl\varepsilon_{ijk}\varepsilon_{ilm}=\delta_{jl}\delta_{km}-\delta_{jm}\delta_{kl} collapses two cross products into dot products, so BAC-CAB and curl-of-curl fall out in a few lines.
  • Bookkeeping self-checks: free indices must match across every term; a dummy index appears at most twice; three occurrences is meaningless.
  • The same machinery runs vector calculus through ∂i≡∂/∂xi\partial_i\equiv\partial/\partial x_i — gradient, divergence, curl, Laplacian — and is literally how `einsum` computes tensor contractions in modern libraries.
  • Key idea: Repeated index ⇒ sum; the pair (δij,εijk)(\delta_{ij},\varepsilon_{ijk}) plus the identity εijkεilm=δjlδkm−δjmδkl\varepsilon_{ijk}\varepsilon_{ilm}=\delta_{jl}\delta_{km}-\delta_{jm}\delta_{kl} converts every vector identity into routine algebra.

Where this lives today

The summation convention long ago escaped the blackboard and became executable code. Every major numerical library — NumPy, PyTorch, TensorFlow, JAX — ships an `einsum` ("Einstein summation") primitive whose subscript string is the convention: `np.einsum('ijk,j,k->i', eps, a, b)` computes a cross product, `'i,i->'` a dot product, `'ii->'` a trace, each by naming which indices repeat. Deep-learning frameworks lean on it because a network layer is a chain of tensor contractions, and index strings make the pattern explicit and the memory layout optimisable. In numerical relativity the same notation, promoted to four indices and a metric, is what codes solve when they evolve Gμν=8πTμνG_{\mu\nu}=8\pi T_{\mu\nu} for the gravitational waveforms LIGO and Virgo match against black-hole mergers; lattice QCD contracts colour and spinor indices billions of times per configuration, and finite-element solvers evaluate σij=Cijklεkl\sigma_{ij}=C_{ijkl}\varepsilon_{kl} at every quadrature point. A notation invented to tame vector identities on paper became the natural interface between the algebra of physics and the tensor hardware of computing.

The physical picture

Stop picturing a vector as an arrow and picture it as a labelled column of three numbers, each in a numbered slot; the subscript is just the slot's address. An index equation is then a single line that is secretly three, nine, or twenty-seven scalar equations at once, one for every value the free indices can take. Summation is the default because almost every sum in vector algebra runs over a repeated component label, and hiding the ∑\sum lets the eye track the only thing that matters: which indices are free and which are tied together. The first figure shows this literally, computing a dot product by pairing slots.

Figure
A vector is a column of numbered slots, the subscript being the slot address. The contraction aᵢbᵢ pairs and sums the slots: for a = (2, 3, 6) and b = (1, 0, 2) it gives 2·1 + 3·0 + 6·2 = 14 = a·b, one scalar with no free index left
One index equation is secretly a sum over slots: aᵢbᵢ = a·b vector a 2 3 6 a₁ (i = 1) a₂ (i = 2) a₃ (i = 3) vector b 1 0 2 aᵢbᵢ a₁b₁ + a₂b₂ + a₃b₃ = 2·1 + 3·0 + 6·2 = 14 (a scalar) free index — labels a slot, sacred, must match across the equation dummy index — repeated, summed, plumbing you may rename: aᵢbᵢ = aⱼbⱼ Here i appears twice, so it is summed away — the result carries no free index and is a single number.

The Kronecker delta is a do-nothing-but-rename operator: δijaj=ai\delta_{ij}a_j=a_i merely relabels the summed slot, so it is the Cartesian identity matrix and encodes orthonormality, e^i⋅e^j=δij\hat{\mathbf{e}}_i\cdot\hat{\mathbf{e}}_j=\delta_{ij}. The Levi-Civita symbol is its opposite temperament, an antisymmetriser that flips sign whenever two indices swap and vanishes the instant any two coincide — why the cross product of parallel vectors is zero and a determinant flips sign when two rows swap. The second figure shows the epsilon as a cyclic wheel and the one identity that makes the subject mechanical.

Figure
The Levi-Civita symbol as a cyclic wheel: forward cycle 1→2→3→1 gives +1, reverse gives −1, any repeat gives 0. The epsilon-delta identity is the engine, and it evaluates the cross product component: (a×b)₁ = ε₁ⱼₖaⱼbₖ = a₂b₃ − a₃b₂ = 3·2 − 6·0 = 6
εᵢⱼₖ: the cyclic wheel and the one identity that runs everything 1 2 3 forward cycle = +1 reverse cycle = −1 any repeat = 0 ε₁₂₃ = ε₂₃₁ = ε₃₁₂ = +1 the engine (master identity) εᵢⱼₖ εᵢₗₘ = δⱼₗδₖₘ − δⱼₘδₖₗ a worked component, a = (2, 3, 6), b = (1, 0, 2) (a×b)₁ = ε₁ⱼₖ aⱼ bₖ = a₂b₃ − a₃b₂ = 3·2 − 6·0 = 6 the free index i = 1 survives; j, k are summed away

The core equations

The whole toolkit fits on one page, but every symbol earns its place. We begin with the convention, then the two structural symbols, then the operations they generate, and finally the differential operators that carry index notation into vector calculus. The summation convention is a definition, not a theorem: writing an index twice is an instruction to sum. Applied to two vectors it reproduces the dot product with no ∑\sum sign, and the result is a scalar because no free index survives.

aibi≡∑i=13aibi=a⋅b(1)a_ib_i \equiv \sum_{i=1}^{3} a_ib_i = \mathbf{a}\cdot\mathbf{b} \qquad (1)

where: ai,bia_i,b_i — Cartesian components of a,b\mathbf{a},\mathbf{b}; ii — repeated (dummy) index, summed 11 to 33; ≡\equiv — definition, the ∑\sum implied by repetition. Reading: two paired subscripts mean multiply-and-add over all three axes. The Kronecker delta gives the components of the identity in an orthonormal frame. Its defining property in calculations is substitution: contracting it against any object renames the free index, and its trace counts the dimension.

δij={1i=j0i≠j,δijaj=ai,δii=3(2)\delta_{ij}=\begin{cases}1 & i=j\\[2pt]0 & i\neq j\end{cases},\qquad \delta_{ij}a_j=a_i,\qquad \delta_{ii}=3 \qquad (2)

where: δij\delta_{ij} — identity/metric components in Cartesian coordinates; δijaj=ai\delta_{ij}a_j=a_i — contraction relabels a free index; δii=3\delta_{ii}=3 — trace equals the dimension. Reading: whenever you see a delta contracted with a live index, delete the delta and rename. The Levi-Civita symbol is totally antisymmetric, fixed by one value ε123=+1\varepsilon_{123}=+1 plus the rule that swapping any two indices flips the sign. Of its 2727 entries only six are nonzero: the three cyclic permutations of (123)(123) give +1+1, the three anticyclic give −1-1.

εijk={+1(ijk) even permutation of (123)−1(ijk) odd permutation    0any two indices equal(3)\varepsilon_{ijk}=\begin{cases}+1 & (ijk)\ \text{even permutation of}\ (123)\\-1 & (ijk)\ \text{odd permutation}\\\;\;0 & \text{any two indices equal}\end{cases} \qquad (3)

where: εijk\varepsilon_{ijk} — totally antisymmetric symbol, ε123=+1\varepsilon_{123}=+1; even/odd — parity of the permutation carrying (123)→(ijk)(123)\to(ijk). Reading: the algebraic embodiment of right-handed orientation. The cross product is where the epsilon does its most familiar work: one free index ii labels the output, the two dummy indices j,kj,k run over the antisymmetric combinations, reproducing the determinant mnemonic automatically.

(a×b)i=εijk ajbk(4)(\mathbf{a}\times\mathbf{b})_i=\varepsilon_{ijk}\,a_jb_k \qquad (4)

where: (a×b)i(\mathbf{a}\times\mathbf{b})_i — ii-th output component; j,kj,k — dummy indices each summed 11 to 33; ii — free output index. Reading: setting i=1i=1 gives a2b3−a3b2a_2b_3-a_3b_2, the first component of the cross product. The single identity that makes the notation powerful is the contraction of two epsilons over one shared index; everything downstream — triple products, curl-of-curl, Lagrange's identity — is a corollary of it.

εijk εilm=δjlδkm−δjmδkl(5)\varepsilon_{ijk}\,\varepsilon_{ilm}=\delta_{jl}\delta_{km}-\delta_{jm}\delta_{kl} \qquad (5)

where: ii — contracted index shared by both symbols; j,k,l,mj,k,l,m — free indices matched pairwise across both sides. Reading: two cross products sharing one axis reduce to a difference of dot-product deltas — "first-first times second-second, minus first-second times second-first". Contracting the master identity once more collapses it further; these reductions simplify epsilon-heavy expressions down to scalars.

εijk εijl=2 δkl,εijk εijk=6(6)\varepsilon_{ijk}\,\varepsilon_{ijl}=2\,\delta_{kl},\qquad \varepsilon_{ijk}\,\varepsilon_{ijk}=6 \qquad (6)

where: εijkεijl=2δkl\varepsilon_{ijk}\varepsilon_{ijl}=2\delta_{kl} — set l→jl\to j (a second sum) in (5); εijkεijk=6=3!\varepsilon_{ijk}\varepsilon_{ijk}=6=3! — the count of nonzero entries. Reading: 22 and 66 are the fingerprints of three-dimensional space, appearing whenever the epsilons fully saturate. Differentiation is itself indexed, ∂i≡∂/∂xi\partial_i\equiv\partial/\partial x_i, and this one move promotes the algebra into vector calculus: gradient, divergence, curl, and Laplacian are the four ways indices attach to ∂\partial.

∂ixj=δij;∇ϕ→∂iϕ,  ∇⋅a→∂iai,  (∇×a)i→εijk∂jak,  ∇2→∂i∂i(7)\partial_i x_j=\delta_{ij};\quad \nabla\phi\to\partial_i\phi,\ \ \nabla\cdot\mathbf{a}\to\partial_i a_i,\ \ (\nabla\times\mathbf{a})_i\to\varepsilon_{ijk}\partial_j a_k,\ \ \nabla^2\to\partial_i\partial_i \qquad (7)

where: ∂iϕ\partial_i\phi — gradient (free ii); ∂iai\partial_ia_i — divergence (contracted scalar); εijk∂jak\varepsilon_{ijk}\partial_ja_k — curl (free ii); ∂i∂i\partial_i\partial_i — Laplacian. Reading: the seed ∂ixj=δij\partial_ix_j=\delta_{ij} is the chain rule in one symbol, and all del-operator algebra is built from it. Finally, the epsilon carries the determinant, which is why orientation, Jacobians, and the sign conventions in Stokes' and Gauss' theorems all trace back to εijk\varepsilon_{ijk}.

det⁡A=εijk A1iA2jA3k=16 εijkεlmnAliAmjAnk(8)\det A=\varepsilon_{ijk}\,A_{1i}A_{2j}A_{3k}=\tfrac{1}{6}\,\varepsilon_{ijk}\varepsilon_{lmn}A_{li}A_{mj}A_{nk} \qquad (8)

where: AliA_{li} — entries of a 3×33\times3 matrix; εijk\varepsilon_{ijk} — supplies the signed permutation sum defining det⁡\det. Reading: the first form expands along rows; the symmetric second form makes the antisymmetry of det⁡\det under row or column swaps manifest.

Derivation AThe epsilon-delta identity from counting permutations

The goal is to establish equation (5), εijkεilm=δjlδkm−δjmδkl\varepsilon_{ijk}\varepsilon_{ilm}=\delta_{jl}\delta_{km}-\delta_{jm}\delta_{kl}, not by memorising it but by seeing why its right-hand side must have exactly this shape. It is the single most important result in the subject, since every vector identity below is a two-line consequence of it, so we derive it from scratch by asking what the two epsilons demand of their indices and enumerating the handful of cases that survive the contraction over ii.

Step 1. For εijk\varepsilon_{ijk} to be nonzero, i,j,ki,j,k must be distinct; likewise εilm\varepsilon_{ilm} forces i,l,mi,l,m distinct. Since ii is common and summed, surviving terms require {j,k}\{j,k\} and {l,m}\{l,m\} to each be the pair left after removing ii from {1,2,3}\{1,2,3\}. Why: antisymmetry means a repeated index kills the symbol, so only fully-distinct index sets contribute.

Step 2. With {j,k}={l,m}\{j,k\}=\{l,m\} as sets, there are only two alignments: (j,k)=(l,m)(j,k)=(l,m) same order, or (j,k)=(m,l)(j,k)=(m,l) swapped. Same order makes the epsilons identical for the surviving ii, so their product is (±1)2=+1(\pm1)^2=+1; swapped makes one the negative of the other, product −1-1. Why: fixing the pair of labels leaves the parity of their ordering as the only freedom, and parity is exactly what the epsilon tracks.

Step 3. Encode the cases with deltas. Same order is j=l, k=mj=l,\,k=m, i.e. δjlδkm\delta_{jl}\delta_{km} (+1+1); swapped is j=m, k=lj=m,\,k=l, i.e. δjmδkl\delta_{jm}\delta_{kl} (−1-1). Their sum gives εijkεilm=δjlδkm−δjmδkl\varepsilon_{ijk}\varepsilon_{ilm}=\delta_{jl}\delta_{km}-\delta_{jm}\delta_{kl}. Why: a product of deltas is the algebraic way to say "these labels coincide", so the two survival cases become the two delta products.

Step 4. Sanity-check by contraction: l→jl\to j gives εijkεijm=δjjδkm−δjmδkj=3δkm−δkm=2δkm\varepsilon_{ijk}\varepsilon_{ijm}=\delta_{jj}\delta_{km}-\delta_{jm}\delta_{kj}=3\delta_{km}-\delta_{km}=2\delta_{km}, and a further m→km\to k gives εijkεijk=2δkk=6=3!\varepsilon_{ijk}\varepsilon_{ijk}=2\delta_{kk}=6=3!. Why: the identity must reproduce the known counts 22 and 66 after partial and full saturation, and it does. *As a consistency check: enumerating all cases reproduces (5); the single and double contractions return 2δkl2\delta_{kl} and 66; and δjj=3\delta_{jj}=3 throughout confirms we are working in three dimensions.*

Go deeper · Derivation B · 1 minThe BAC-CAB rule for the vector triple product
Derivation BThe BAC-CAB rule for the vector triple product

The goal is to derive the vector triple product identity a×(b×c)=b(a⋅c)−c(a⋅b)\mathbf{a}\times(\mathbf{b}\times\mathbf{c})=\mathbf{b}(\mathbf{a}\cdot\mathbf{c})-\mathbf{c}(\mathbf{a}\cdot\mathbf{b}) using nothing but the epsilon-delta identity — a result genuinely awkward to prove with arrows that falls out in four lines of pure bookkeeping. The mnemonic name BAC-CAB records the answer, and we recover it by writing the ii-th component, introducing one epsilon per cross product, and contracting.

Step 1. Write the ii-th component, expanding the inner cross product then the outer, each contributing an epsilon: [a×(b×c)]i=εijkaj(b×c)k=εijkaj εklmblcm[\mathbf{a}\times(\mathbf{b}\times\mathbf{c})]_i=\varepsilon_{ijk}a_j(\mathbf{b}\times\mathbf{c})_k=\varepsilon_{ijk}a_j\,\varepsilon_{klm}b_lc_m. Why: nesting two cross products yields two epsilons sharing exactly one index kk, the configuration the master identity simplifies.

Step 2. Align the shared index by cyclic symmetry εijk=εkij\varepsilon_{ijk}=\varepsilon_{kij} so kk sits first on both, then apply (5): εkijεklm=δilδjm−δimδjl\varepsilon_{kij}\varepsilon_{klm}=\delta_{il}\delta_{jm}-\delta_{im}\delta_{jl}. Why: the identity needs the summed index leading both epsilons, and cyclic permutation costs no sign.

Step 3. Contract the deltas against ajblcma_jb_lc_m, each delta relabelling an index: (δilδjm−δimδjl)ajblcm=ajbicj−ajbjci(\delta_{il}\delta_{jm}-\delta_{im}\delta_{jl})a_jb_lc_m=a_jb_ic_j-a_jb_jc_i. Why: the delta acts as substitution, deleting itself and renaming the slot it touches.

Step 4. Read off the vectors, recognising the surviving dummy sums as dot products: ajbicj−ajbjci=bi(ajcj)−ci(ajbj)=[b(a⋅c)−c(a⋅b)]ia_jb_ic_j-a_jb_jc_i=b_i(a_jc_j)-c_i(a_jb_j)=[\mathbf{b}(\mathbf{a}\cdot\mathbf{c})-\mathbf{c}(\mathbf{a}\cdot\mathbf{b})]_i. Since ii was arbitrary, the vector identity holds. Why: ajcja_jc_j and ajbja_jb_j are scalars, and the free index ii rides on b\mathbf{b} and c\mathbf{c} exactly as BAC-CAB asserts. *A quick sanity check: setting a=b=x^\mathbf{a}=\mathbf{b}=\hat{\mathbf{x}}, c=y^\mathbf{c}=\hat{\mathbf{y}} gives LHS =x^×(x^×y^)=x^×z^=−y^=\hat{\mathbf{x}}\times(\hat{\mathbf{x}}\times\hat{\mathbf{y}})=\hat{\mathbf{x}}\times\hat{\mathbf{z}}=-\hat{\mathbf{y}} and RHS =x^(0)−y^(1)=−y^=\hat{\mathbf{x}}(0)-\hat{\mathbf{y}}(1)=-\hat{\mathbf{y}}, confirming the identity on a concrete unit-vector case.*

Go deeper · Derivation C · 1 minCurl of a curl and the electromagnetic wave equation
Derivation CCurl of a curl and the electromagnetic wave equation

The goal is to prove ∇×(∇×A)=∇(∇⋅A)−∇2A\nabla\times(\nabla\times\mathbf{A})=\nabla(\nabla\cdot\mathbf{A})-\nabla^2\mathbf{A}, the identity that turns Maxwell's curl equations into a wave equation, and to show it is the differential twin of BAC-CAB: replace the leading vector by ∇\nabla and components by derivatives ∂\partial, and the same epsilon-delta contraction does all the work. The only new subtlety is that derivatives commute, which lets the divergence be pulled out cleanly at the end.

Step 1. Write in indices, the constant ε\varepsilon passing freely through the derivative: [∇×(∇×A)]i=εijk∂j(εklm∂lAm)=εijkεklm∂j∂lAm[\nabla\times(\nabla\times\mathbf{A})]_i=\varepsilon_{ijk}\partial_j(\varepsilon_{klm}\partial_lA_m)=\varepsilon_{ijk}\varepsilon_{klm}\partial_j\partial_lA_m. Why: εklm\varepsilon_{klm} is a numerical constant, untouched by ∂j\partial_j, leaving two epsilons sharing kk as in the triple product.

Step 2. Apply the master identity with kk aligned first: εijkεklm=εkijεklm=δilδjm−δimδjl\varepsilon_{ijk}\varepsilon_{klm}=\varepsilon_{kij}\varepsilon_{klm}=\delta_{il}\delta_{jm}-\delta_{im}\delta_{jl}. Why: the same algebra as BAC-CAB Step 2 — the differential identity carries no content beyond epsilon-delta plus commuting partials.

Step 3. Contract against ∂j∂lAm\partial_j\partial_lA_m: (δilδjm−δimδjl)∂j∂lAm=∂j∂iAj−∂j∂jAi(\delta_{il}\delta_{jm}-\delta_{im}\delta_{jl})\partial_j\partial_lA_m=\partial_j\partial_iA_j-\partial_j\partial_jA_i. Why: the first delta pair relabels l→i, m→jl\to i,\,m\to j, the second m→i, l→jm\to i,\,l\to j.

Step 4. Recognise the operators, commuting the partials in the first term: ∂j∂iAj−∂j∂jAi=∂i(∂jAj)−(∂j∂j)Ai=[∇(∇⋅A)−∇2A]i\partial_j\partial_iA_j-\partial_j\partial_jA_i=\partial_i(\partial_jA_j)-(\partial_j\partial_j)A_i=[\nabla(\nabla\cdot\mathbf{A})-\nabla^2\mathbf{A}]_i. Why: ∂i∂j=∂j∂i\partial_i\partial_j=\partial_j\partial_i lets ∂i\partial_i move outside, exposing the divergence, while ∂j∂j\partial_j\partial_j is the Laplacian. *As an additional check, taking the divergence of both sides gives 0=∂i∂i(∂kAk)−∂i(∂k∂kAi)0=\partial_i\partial_i(\partial_kA_k)-\partial_i(\partial_k\partial_kA_i), an identity because ∇⋅(∇× ⋅)=εijk∂i∂j(⋅)=0\nabla\cdot(\nabla\times\,\cdot)=\varepsilon_{ijk}\partial_i\partial_j(\cdot)=0 by symmetric-meets-antisymmetric. Applied to source-free Faraday plus Ampère, this identity yields the electromagnetic wave equation ∇2E=μ0ε0 ∂t2E\nabla^2\mathbf{E}=\mu_0\varepsilon_0\,\partial_t^2\mathbf{E}.*

Limiting cases

Index notation specialises and generalises cleanly with the range of the indices and the kind of frame they live in.

CaseResultMeaning
Three-dimensional Cartesiani,j,k∈{1,2,3}i,j,k\in\{1,2,3\}The default of vector calculus: δij\delta_{ij} is the 3×33\times3 identity, εijk\varepsilon_{ijk} has six nonzero entries, and cross product and curl live only here.
nn-dimensional Euclideani∈{1,…,n}, δii=ni\in\{1,\dots,n\},\ \delta_{ii}=nDot products, traces, Laplacian generalise verbatim; the alternating symbol needs nn indices and the simple cross product exists only for n=3n=3.
Relativistic / curved spaceaμbμ, μ∈{0,1,2,3}a^\mu b_\mu,\ \mu\in\{0,1,2,3\}Upper and lower indices become distinct; raising and lowering use the metric gμνg_{\mu\nu}, not δij\delta_{ij}. Cartesian notation is the flat, orthonormal limit.
Rank-2 traceTii=∑iTiiT_{ii}=\sum_i T_{ii}Setting two free indices equal and summing yields the trace, the simplest scalar invariant.

Worked examples

1 · The vector triple product, checked with numbers (confidence builder)

Take a=(1,2,3)\mathbf{a}=(1,2,3), b=(0,1,4)\mathbf{b}=(0,1,4), c=(2,1,0)\mathbf{c}=(2,1,0). Compute a×(b×c)\mathbf{a}\times(\mathbf{b}\times\mathbf{c}) directly, then reproduce it from the BAC-CAB index formula, and confirm the two agree.

Step 1. Direct route. The inner cross product is b×c=(1⋅0−4⋅1, 4⋅2−0⋅0, 0⋅1−1⋅2)=(−4, 8, −2)\mathbf{b}\times\mathbf{c}=(1\cdot0-4\cdot1,\ 4\cdot2-0\cdot0,\ 0\cdot1-1\cdot2)=(-4,\,8,\,-2), so a×(b×c)=(1,2,3)×(−4,8,−2)=(2⋅(−2)−3⋅8, 3⋅(−4)−1⋅(−2), 1⋅8−2⋅(−4))=(−28, −10, 16)\mathbf{a}\times(\mathbf{b}\times\mathbf{c})=(1,2,3)\times(-4,8,-2)=(2\cdot(-2)-3\cdot8,\ 3\cdot(-4)-1\cdot(-2),\ 1\cdot8-2\cdot(-4))=(-28,\,-10,\,16).

Step 2. Index route. BAC-CAB gives b(a⋅c)−c(a⋅b)\mathbf{b}(\mathbf{a}\cdot\mathbf{c})-\mathbf{c}(\mathbf{a}\cdot\mathbf{b}), with scalar contractions a⋅c=1⋅2+2⋅1+3⋅0=4\mathbf{a}\cdot\mathbf{c}=1\cdot2+2\cdot1+3\cdot0=4 and a⋅b=1⋅0+2⋅1+3⋅4=14\mathbf{a}\cdot\mathbf{b}=1\cdot0+2\cdot1+3\cdot4=14.

Step 3. Assemble: 4 (0,1,4)−14 (2,1,0)=(0,4,16)−(28,14,0)=(−28, −10, 16)4\,(0,1,4)-14\,(2,1,0)=(0,4,16)-(28,14,0)=(-28,\,-10,\,16), identical to the direct result — but the index formula never computed an intermediate cross product. Both routes give a×(b×c)=(−28,−10,16)\mathbf{a}\times(\mathbf{b}\times\mathbf{c})=(-28,-10,16).

2 · Lagrange's identity for a product of cross products

Derive (a×b)⋅(c×d)=(a⋅c)(b⋅d)−(a⋅d)(b⋅c)(\mathbf{a}\times\mathbf{b})\cdot(\mathbf{c}\times\mathbf{d})=(\mathbf{a}\cdot\mathbf{c})(\mathbf{b}\cdot\mathbf{d})-(\mathbf{a}\cdot\mathbf{d})(\mathbf{b}\cdot\mathbf{c}) in indices, then verify it on a=(1,2,3)\mathbf{a}=(1,2,3), b=(0,1,4)\mathbf{b}=(0,1,4), c=(2,1,0)\mathbf{c}=(2,1,0), d=(1,0,1)\mathbf{d}=(1,0,1).

Step 1. Write both cross products sharing a free index and contract: (a×b)⋅(c×d)=(εijkajbk)(εilmcldm)=εijkεilm ajbkcldm(\mathbf{a}\times\mathbf{b})\cdot(\mathbf{c}\times\mathbf{d})=(\varepsilon_{ijk}a_jb_k)(\varepsilon_{ilm}c_ld_m)=\varepsilon_{ijk}\varepsilon_{ilm}\,a_jb_kc_ld_m, the two epsilons already sharing ii.

Step 2. Apply (5): (δjlδkm−δjmδkl)ajbkcldm=ajbkcjdk−ajbkckdj=(ajcj)(bkdk)−(ajdj)(bkck)(\delta_{jl}\delta_{km}-\delta_{jm}\delta_{kl})a_jb_kc_ld_m=a_jb_kc_jd_k-a_jb_kc_kd_j=(a_jc_j)(b_kd_k)-(a_jd_j)(b_kc_k), exactly (a⋅c)(b⋅d)−(a⋅d)(b⋅c)(\mathbf{a}\cdot\mathbf{c})(\mathbf{b}\cdot\mathbf{d})-(\mathbf{a}\cdot\mathbf{d})(\mathbf{b}\cdot\mathbf{c}).

Step 3. Numerical check. The four dot products are a⋅c=4\mathbf{a}\cdot\mathbf{c}=4, b⋅d=4\mathbf{b}\cdot\mathbf{d}=4, a⋅d=4\mathbf{a}\cdot\mathbf{d}=4, b⋅c=1\mathbf{b}\cdot\mathbf{c}=1, so the right side is 4⋅4−4⋅1=124\cdot4-4\cdot1=12. Directly, a×b=(5,−4,1)\mathbf{a}\times\mathbf{b}=(5,-4,1) and c×d=(1,−2,−1)\mathbf{c}\times\mathbf{d}=(1,-2,-1) dot to 5+8−1=125+8-1=12. Both sides equal 1212; setting c=a,d=b\mathbf{c}=\mathbf{a},\mathbf{d}=\mathbf{b} recovers ∣a×b∣2=∣a∣2∣b∣2−(a⋅b)2|\mathbf{a}\times\mathbf{b}|^2=|\mathbf{a}|^2|\mathbf{b}|^2-(\mathbf{a}\cdot\mathbf{b})^2.

3 · A determinant from the Levi-Civita symbol

Evaluate det⁡A\det A for A=(201132011)A=\begin{pmatrix}2&0&1\\1&3&2\\0&1&1\end{pmatrix} via det⁡A=εijkA1iA2jA3k\det A=\varepsilon_{ijk}A_{1i}A_{2j}A_{3k}.

Step 1. The three even permutations give +A11A22A33+A12A23A31+A13A21A32=2⋅3⋅1+0+1⋅1⋅1=7+A_{11}A_{22}A_{33}+A_{12}A_{23}A_{31}+A_{13}A_{21}A_{32}=2\cdot3\cdot1+0+1\cdot1\cdot1=7.

Step 2. The three odd permutations give −A13A22A31−A11A23A32−A12A21A33=−0−(2⋅2⋅1)−0=−4-A_{13}A_{22}A_{31}-A_{11}A_{23}A_{32}-A_{12}A_{21}A_{33}=-0-(2\cdot2\cdot1)-0=-4.

Step 3. Sum: det⁡A=7−4=3\det A=7-4=3, confirmed by cofactor expansion 2(3⋅1−2⋅1)−0+1(1⋅1−3⋅0)=2+1=32(3\cdot1-2\cdot1)-0+1(1\cdot1-3\cdot0)=2+1=3. det⁡A=3\det A=3, with εijk\varepsilon_{ijk} doing nothing but bookkeeping the signed permutation sum.

Physics of the portrait

Index notation is no single person's invention; it is the sediment of a seventy-year effort to make the geometry of space and spacetime computable. But if one figure sits at its centre it is Tullio Levi-Civita, whose name rides on the alternating symbol and whose absolute differential calculus is the language it grows into.

Origins · 1 minTullio Levi-Civita and how this was discovered
TL
Tullio Levi-Civita
1873–1941 · tensor calculus and the geometry of general relativity

Tullio Levi-Civita was an Italian mathematician who, with his teacher Gregorio Ricci-Curbastro, built the "absolute differential calculus" — the systematic index calculus of tensors — and published its definitive account in the 1900 memoir Méthodes de calcul différentiel absolu et leurs applications. That framework gave physics its most consequential notation: a decade later it was the machinery Einstein reached for to write general relativity, and Einstein corresponded with Levi-Civita in 1915–17, calling his command of the calculus indispensable. The totally antisymmetric symbol εijk\varepsilon_{ijk} carries his name because it is the three-dimensional shadow of the tensor densities his calculus organised. His deepest idea, parallel transport (1917), gave coordinate-independent meaning to "keeping a vector constant" along a curved path and defined the connection that still bears his name — the geometry hiding beneath the innocent derivative index ∂i\partial_i. Building upward from Kronecker's substitution delta of the 1860s and downward into Einstein's 1916 summation convention, his work is the hinge on which index notation turns from a bookkeeping trick into the native language of field theory and gravitation. Dismissed from his chair in 1938 under the Fascist racial laws, he died in Rome in 1941, isolated from the community his notation had unified.

History
1868
— Kronecker uses the delta symbol δᵢⱼ as a substitution operator in his work on bilinear forms
1896
— Levi-Civita and Ricci-Curbastro give the alternating symbol its systematic role in tensor calculus
1900
— Ricci and Levi-Civita publish the absolute differential calculus, codifying index notation
1916
— Einstein adopts the summation convention in his foundational paper on general relativity
1917
— Levi-Civita introduces parallel transport, defining the connection behind the derivative index

Going further

Texts. Arfken, Weber & Harris, Mathematical Methods for Physicists, 7th ed., ch. 2–3 · Riley, Hobson & Bence, Mathematical Methods for Physics and Engineering, 3rd ed., ch. 21 · Hassani, Mathematical Physics (tensors) · Stone & Goldbart, Mathematics for Physics, §1 · Nakahara, Geometry, Topology and Physics (tensor-density and orientation subtleties) · Byron & Fuller, Mathematics of Classical and Quantum Physics (tensor algebra). The epsilon-delta identity and its contractions (2δkl2\delta_{kl}, 66) are re-derived here from permutation counting. The key numerical results in this article are: a×(b×c)=(−28,−10,16)\mathbf{a}\times(\mathbf{b}\times\mathbf{c})=(-28,-10,16), Lagrange identity value 1212, det⁡A=3\det A=3, and det⁡A=εijkA1iA2jA3k\det A=\varepsilon_{ijk}A_{1i}A_{2j}A_{3k} confirmed against cofactor expansion. The pseudotensor character of εijk\varepsilon_{ijk} is discussed in the warning box and the FAQ on Levi-Civita.

Prerequisites. Scalar and Vector Fields. Leads to. The Gradient Operator · Divergence of a Vector Field · Curl of a Vector Field · The Del Operator and Vector Differential Identities · The Laplacian Operator.

Ask the tutor: Hand me any vector or del-operator identity you want proved and I will walk it through the epsilon-delta engine index by index.

What is the difference between a free index and a dummy index?

A free index appears exactly once in a term and labels a component of the result; a dummy index appears twice and is summed away. The test is occurrence-counting within one multiplicative term. In ci=εijkajbkc_i=\varepsilon_{ijk}a_jb_k, the index ii is free — it appears once on each side and names which component of c\mathbf{c} you compute — while j,kj,k are dummies, summed over 1,2,31,2,3 and gone from the answer. Free indices are sacred: they must appear in the same positions in every term and on both sides. Dummies are plumbing: their names carry no meaning, so ajbja_jb_j and ambma_mb_m are the same scalar, and you may rename a dummy whenever a clash threatens.

Why is an index appearing three times forbidden?

Because the convention only assigns meaning to an index occurring exactly twice: two occurrences say "sum this pair", one says "this is a free label", and three say nothing at all — the expression is undefined. In practice a triple index is a symptom that you reused a dummy name already contracted, collapsing two independent sums into one. The cure is renaming. If you want the ii-component of c\mathbf{c} scaled by a⋅b\mathbf{a}\cdot\mathbf{b}, do not write aibicia_ib_ic_i; write ajbj cia_jb_j\,c_i, giving the dot product a private dummy jj and leaving ii free. Catching triple indices early is one of the notation's best built-in error alarms.

How does the Kronecker delta act as a substitution operator?

Whenever δij\delta_{ij} is contracted with a factor carrying one of its indices, it deletes itself and renames that index. Concretely δijaj=ai\delta_{ij}a_j=a_i, since the sum over jj keeps only the j=ij=i term; the same happens inside longer expressions, δijTjk=Tik\delta_{ij}T_{jk}=T_{ik}, and on itself, δijδjk=δik\delta_{ij}\delta_{jk}=\delta_{ik}. The trace δii=3\delta_{ii}=3 is the case where both indices are contracted, counting the dimension. So you should never "compute" a delta — you cancel it, hunting for the index it shares with a neighbour and performing the rename. This one habit collapses most delta-laden expressions in a single pass, which is why δij\delta_{ij} is called the substitution tensor.

Is the Levi-Civita symbol a genuine tensor?

Under rotations it behaves exactly like a tensor, which is why we handle it freely alongside δij\delta_{ij}. But under a reflection — an orientation-reversing transformation of determinant −1-1 — the components εijk\varepsilon_{ijk} pick up an extra minus sign relative to a true rank-3 tensor, so it is properly a tensor density, or pseudotensor. The consequence is that a×b\mathbf{a}\times\mathbf{b} is a pseudovector: mirror-reflect the setup and it flips the "wrong" way compared with an ordinary vector like velocity. In right-handed frames this never bites; it matters in parity arguments, in orienting manifolds, and in telling polar from axial vectors.

Why do div-of-curl and curl-of-grad vanish identically?

Both are the same one-line fact: a symmetric pair of derivatives contracted against the antisymmetric εijk\varepsilon_{ijk} gives zero. For a curl's divergence, ∇⋅(∇×A)=εijk∂i∂jAk\nabla\cdot(\nabla\times\mathbf{A})=\varepsilon_{ijk}\partial_i\partial_jA_k; the partials commute so ∂i∂j\partial_i\partial_j is symmetric in i,ji,j while εijk\varepsilon_{ijk} is antisymmetric, and a symmetric object contracted with an antisymmetric one over the same pair sums to zero. For a gradient's curl, [∇×(∇ϕ)]i=εijk∂j∂kϕ=0[\nabla\times(\nabla\phi)]_i=\varepsilon_{ijk}\partial_j\partial_k\phi=0 by the identical argument on j,kj,k. Only equality of mixed partials is used, so these hold for every smooth A\mathbf{A} and ϕ\phi — which is exactly why scalar and vector potentials exist.

Does index notation only work in Cartesian coordinates?

The simple form here — where δij\delta_{ij} is the metric and upper versus lower indices are indistinguishable — is special to orthonormal Cartesian frames. In curvilinear coordinates or curved space you must distinguish contravariant (upper) from covariant (lower) indices, replace δij\delta_{ij} by a general metric gμνg_{\mu\nu} that raises and lowers them, and upgrade ∂i\partial_i to a covariant derivative that tracks how the basis vectors themselves change — the full absolute differential calculus of Ricci and Levi-Civita. The Cartesian version is its flat, orthonormal limit, and the right place to start: every rule you learn here — repeated-index summation, free-index matching, the epsilon-delta identity — survives into the general theory essentially unchanged.

Before this

Where this leads