Imports
/- Copyright (c) 2026 Justin Findlay. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Authors: Justin Findlay -/ module public import Physlib.Electromagnetism.Kinematics.FieldStrength

Gauge Transformations of the Electromagnetic Potential

i. Overview

In this module we define gauge transformations of the electromagnetic potential A^μ ↦ A^μ + ∂^μ χ where χ : SpaceTime d → ℝ is a smooth gauge function, and prove that the field strength tensor is invariant under such transformations.

The raised-index gradient ∂^μ χ := η^{μν} ∂_ν χ is necessary because the bare covariant gradient ∂_μ χ does not make F^{μν} invariant. The formal witness is fieldStrengthMatrix_bareGradient_inl_inr (§B.5), which computes a specific nonzero component of the field strength of a bare-gradient potential. The invariance theorem toFieldStrength_gaugeTransform doubles as a correctness test of ofGradient.

ii. Key results

    ofGradient : The pure-gauge potential A^μ = η^{μν} ∂_ν χ built from a gauge function χ.

    gaugeTransform : The gauge transformation A^μ ↦ A^μ + ∂^μ χ.

    toFieldStrength_ofGradient : A pure-gauge potential has vanishing field strength.

    toFieldStrength_gaugeTransform : The field strength tensor is invariant under gauge transformations.

    fieldStrengthMatrix_gaugeTransform : The field strength matrix is invariant under gauge transformations.

    gaugeTransform_gaugeTransform : Composing two gauge shifts equals shifting by the sum; upgrades one-step F-invariance to invariance along any finite chain.

    ofGradient_equivariant : ofGradient intertwines the Lorentz action with function composition.

    gaugeTransform_equivariant : Gauge transformations commute with Lorentz transformations.

    fieldStrengthMatrix_bareGradient_inl_inr : The (inl 0, inr i) field-strength component of the bare-gradient potential χ(x) = x⁰·xⁱ equals 2; in particular the bare gradient does not give a gauge-invariant field strength (necessity of the metric contraction in ofGradient).

iii. Table of contents

    A. The pure-gauge potential

      A.1. Definition and basic lemmas

      A.2. Differentiability of the pure-gauge potential

      A.3. Vanishing field strength of the pure-gauge potential

      A.4. Lorentz equivariance of the pure-gauge potential

    B. Gauge transformations

      B.1. Definition and basic lemmas

      B.2. Invariance of the field strength

      B.3. Group structure of gauge shifts

      B.4. Equivariance under Lorentz transformations

      B.5. Necessity: bare gradient does not give gauge invariance

iv. References

    https://en.wikipedia.org/wiki/Mathematical_descriptions_of_the_electromagnetic_field#Gauge_freedom

@[expose] public sectionattribute [-simp] Fintype.sum_sum_typeattribute [-simp] Nat.succ_eq_add_one

A. The pure-gauge potential

A.1. Definition and basic lemmas

Unfolding of the summed definition of ofGradient.

lemma ofGradient_apply_sum {d} (χ : SpaceTime d ) (x : SpaceTime d) (μ : Fin 1 Fin d) : ofGradient χ x μ = κ, η μ κ * ∂_ κ χ x := rfl

Evaluation of ofGradient in the diagonal form; the off-diagonal entries of η vanish so only the κ = μ term survives.

d:χ:SpaceTime d x:SpaceTime dμ:Fin 1 Fin dκ:Fin 1 Fin da✝:κ Finset.univ:κ μ0 * ∂_ κ χ x = 0 All goals completed! 🐙 d:χ:SpaceTime d x:SpaceTime dμ:Fin 1 Fin dμ Finset.univ η μ μ * ∂_ μ χ x = 0 All goals completed! 🐙

The pure-gauge potential built from the zero gauge function has all components zero.

d:x:SpaceTime dμ:Fin 1 Fin dη μ μ * ∂_ μ 0 x = 0 All goals completed! 🐙

ofGradient is additive in the gauge function (when both summands are differentiable).

lemma ofGradient_add {d} {χ₁ χ₂ : SpaceTime d } (hχ₁ : Differentiable χ₁) (hχ₂ : Differentiable χ₂) : ofGradient (χ₁ + χ₂) = ofGradient χ₁ + ofGradient χ₂ := d:χ₁:SpaceTime d χ₂:SpaceTime d hχ₁:Differentiable χ₁hχ₂:Differentiable χ₂ofGradient (χ₁ + χ₂) = ofGradient χ₁ + ofGradient χ₂ d:χ₁:SpaceTime d χ₂:SpaceTime d hχ₁:Differentiable χ₁hχ₂:Differentiable χ₂(ofGradient (χ₁ + χ₂)).val = (ofGradient χ₁ + ofGradient χ₂).val; d:χ₁:SpaceTime d χ₂:SpaceTime d hχ₁:Differentiable χ₁hχ₂:Differentiable χ₂x:SpaceTime dμ:Fin 1 Fin d(ofGradient (χ₁ + χ₂)).val x μ = (ofGradient χ₁ + ofGradient χ₂).val x μ d:χ₁:SpaceTime d χ₂:SpaceTime d hχ₁:Differentiable χ₁hχ₂:Differentiable χ₂x:SpaceTime dμ:Fin 1 Fin d(ofGradient (χ₁ + χ₂)).val x μ = (ofGradient χ₁).val x μ + (ofGradient χ₂).val x μ All goals completed! 🐙

A.2. Differentiability of the pure-gauge potential

The pure-gauge potential is differentiable when χ is C^2.

d:χ:SpaceTime d :ContDiff 2 χ (ν : Fin 1 Fin d), Differentiable fun x => (ofGradient χ).val x ν d:χ:SpaceTime d :ContDiff 2 χμ:Fin 1 Fin dDifferentiable fun x => (ofGradient χ).val x μ simp_rw d:χ:SpaceTime d :ContDiff 2 χμ:Fin 1 Fin dDifferentiable fun x => (ofGradient χ).val x μd:χ:SpaceTime d :ContDiff 2 χμ:Fin 1 Fin dDifferentiable fun x => η μ μ * ∂_ μ χ x] All goals completed! 🐙

The pure-gauge potential is C^n when χ is C^{n+1}.

n:WithTop ℕ∞d:χ:SpaceTime d :ContDiff (n + 1) χ (ν : Fin 1 Fin d), ContDiff n fun x => (ofGradient χ).val x ν n:WithTop ℕ∞d:χ:SpaceTime d :ContDiff (n + 1) χμ:Fin 1 Fin dContDiff n fun x => (ofGradient χ).val x μ simp_rw n:WithTop ℕ∞d:χ:SpaceTime d :ContDiff (n + 1) χμ:Fin 1 Fin dContDiff n fun x => (ofGradient χ).val x μn:WithTop ℕ∞d:χ:SpaceTime d :ContDiff (n + 1) χμ:Fin 1 Fin dContDiff n fun x => η μ μ * ∂_ μ χ x] n:WithTop ℕ∞d:χ:SpaceTime d :ContDiff (n + 1) χμ:Fin 1 Fin dh:ContDiff n (∂_ μ χ)ContDiff n fun x => η μ μ * ∂_ μ χ x All goals completed! 🐙

A.3. Vanishing field strength of the pure-gauge potential

A pure-gauge potential has vanishing field strength.

d:χ:SpaceTime d :ContDiff 2 χx:SpaceTime dμν:(Fin 1 Fin d) × (Fin 1 Fin d)heq:(fderiv (∂_ μν.2 χ) x) (Vector.basis μν.1) = (fderiv (∂_ μν.1 χ) x) (Vector.basis μν.2)η μν.1 μν.1 * (η μν.2 μν.2 * (fderiv (∂_ μν.1 χ) x) (Vector.basis μν.2)) - η μν.2 μν.2 * (η μν.1 μν.1 * (fderiv (∂_ μν.1 χ) x) (Vector.basis μν.2)) = 0 All goals completed! 🐙

A.4. Lorentz equivariance of the pure-gauge potential

ofGradient intertwines the Lorentz action on potentials with composition by Λ⁻¹ on the gauge function: Λ • ofGradient χ = ofGradient (χ ∘ (Λ⁻¹ • ·)). The proof reduces to the metric-commutativity identity Λ * η = η * (Λ⁻¹)ᵀ, which is the defining property of the Lorentz group (LorentzGroup.comm_minkowskiMatrix).

ofGradient intertwines the Lorentz action on potentials with composition by Λ⁻¹ on the gauge function: Λ • ofGradient χ = ofGradient (χ ∘ (Λ⁻¹ • ·)).

All goals completed! 🐙

B. Gauge transformations

B.1. Definition and basic lemmas

Evaluation of gaugeTransform.

lemma gaugeTransform_apply {d} (χ : SpaceTime d ) (A : ElectromagneticPotential d) (x : SpaceTime d) : gaugeTransform χ A x = A x + ofGradient χ x := d:χ:SpaceTime d A:ElectromagneticPotential dx:SpaceTime d(gaugeTransform χ A).val x = A.val x + (ofGradient χ).val x All goals completed! 🐙

B.2. Invariance of the field strength

The key ingredient — that a pure-gauge potential has vanishing field strength — is proved in §A.3 (toFieldStrength_ofGradient).

The field strength tensor is invariant under gauge transformations.

All goals completed! 🐙

The field strength matrix is invariant under gauge transformations.

All goals completed! 🐙

B.3. Group structure of gauge shifts

Composing two gauge shifts by χ₁ and χ₂ is the same as shifting by χ₁ + χ₂. Together with gaugeTransform_zero this shows that the map χ ↦ (A ↦ gaugeTransform χ A) is a group action of the additive group of smooth functions. (We do not build the formal MulAction here — the composition lemma is the agreeable core, and the rest is straightforward from it.)

The ofGradient lemmas used here — ofGradient_zero and ofGradient_add — are proved in §A.1.

Shifting by the zero gauge function is the identity.

lemma gaugeTransform_zero {d} (A : ElectromagneticPotential d) : gaugeTransform (0 : SpaceTime d ) A = A := d:A:ElectromagneticPotential dgaugeTransform 0 A = A d:A:ElectromagneticPotential d(gaugeTransform 0 A).val = A.val; d:A:ElectromagneticPotential dx:SpaceTime dμ:Fin 1 Fin d(gaugeTransform 0 A).val x μ = A.val x μ d:A:ElectromagneticPotential dx:SpaceTime dμ:Fin 1 Fin d(gaugeTransform 0 A).val x μ = A.val x μ All goals completed! 🐙

Two successive gauge shifts compose: shifting by χ₂ then χ₁ equals shifting by χ₁ + χ₂. This upgrades one-step F-invariance to invariance along any finite chain of gauge shifts.

d:A:ElectromagneticPotential dχ₁:SpaceTime d χ₂:SpaceTime d hχ₁:Differentiable χ₁hχ₂:Differentiable χ₂x:SpaceTime dμ:Fin 1 Fin d(A.val x + (ofGradient χ₂).val x + (ofGradient χ₁).val x) μ = (A.val x + (ofGradient χ₁ + ofGradient χ₂).val x) μ All goals completed! 🐙

B.4. Equivariance under Lorentz transformations

The gauge-transformation map commutes with the Lorentz group action: applying Λ to a potential and then gauge-transforming by χ is the same as gauge-transforming by χ ∘ (Λ⁻¹ • ·) and then applying Λ. The proof delegates to ofGradient_equivariant (§A.4).

Gauge transformations commute with Lorentz transformations: applying Λ and then performing a gauge transformation by χ equals performing a gauge transformation by χ ∘ (Λ⁻¹ • ·) and then applying Λ.

d:A:ElectromagneticPotential dχ:SpaceTime d :Differentiable χΛ:(LorentzGroup d)Λ (A + ofGradient χ) = Λ A + Λ ofGradient χ -- Goal: Λ • (A + ofGradient χ) = Λ • A + Λ • ofGradient χ d:A:ElectromagneticPotential dχ:SpaceTime d :Differentiable χΛ:(LorentzGroup d)(Λ (A + ofGradient χ)).val = (Λ A + Λ ofGradient χ).val; d:A:ElectromagneticPotential dχ:SpaceTime d :Differentiable χΛ:(LorentzGroup d)x:SpaceTime dμ:Fin 1 Fin d(Λ (A + ofGradient χ)).val x μ = (Λ A + Λ ofGradient χ).val x μ All goals completed! 🐙

B.5. Necessity: bare gradient does not give gauge invariance

We exhibit a concrete gauge function χ(x) = x⁰·xⁱ whose bare covariant gradient B^μ := ∂_μ χ has a nonzero field-strength component (equal to 2), certifying that the metric contraction in ofGradient is required for gauge invariance.

The (inl 0, inr i) component of the field strength matrix of the bare-gradient potential B^μ := ∂_μ χ for χ(x) = x⁰·xⁱ equals 2. This witnesses that the bare covariant gradient does not produce a gauge-invariant field strength, so the raised-index contraction η^{μν} ∂_ν χ in ofGradient is necessary (see the module overview).

d:i:Fin dx:SpaceTime dχ:SpaceTime d := fun y => y (Sum.inl 0) * y (Sum.inr i)B:ElectromagneticPotential d := { val := fun y μ => ∂_ μ χ y }:ContDiff 2 χhB:Differentiable B.valhfderiv: (y : SpaceTime d), fderiv χ y = y (Sum.inr i) Vector.coordCLM (Sum.inl 0) + y (Sum.inl 0) Vector.coordCLM (Sum.inr i)η (Sum.inl 0, Sum.inr i).1 (Sum.inl 0, Sum.inr i).1 * (fderiv (fun x => B.val x (Sum.inr i)) x) (Vector.basis (Sum.inl 0)) - η (Sum.inl 0, Sum.inr i).2 (Sum.inl 0, Sum.inr i).2 * (fderiv (fun x => B.val x (Sum.inl 0)) x) (Vector.basis (Sum.inr i)) = 2 d:i:Fin dx:SpaceTime dχ:SpaceTime d := fun y => y (Sum.inl 0) * y (Sum.inr i)B:ElectromagneticPotential d := { val := fun y μ => ∂_ μ χ y }:ContDiff 2 χhB:Differentiable B.valhfderiv: (y : SpaceTime d), fderiv χ y = y (Sum.inr i) Vector.coordCLM (Sum.inl 0) + y (Sum.inl 0) Vector.coordCLM (Sum.inr i)η (Sum.inl 0) (Sum.inl 0) * (fderiv (fun x => (fderiv χ x) (Vector.basis (Sum.inr i))) x) (Vector.basis (Sum.inl 0)) - η (Sum.inr i) (Sum.inr i) * (fderiv (fun x => (fderiv χ x) (Vector.basis (Sum.inl 0))) x) (Vector.basis (Sum.inr i)) = 2 simp_rw d:i:Fin dx:SpaceTime dχ:SpaceTime d := fun y => y (Sum.inl 0) * y (Sum.inr i)B:ElectromagneticPotential d := { val := fun y μ => ∂_ μ χ y }:ContDiff 2 χhB:Differentiable B.valhfderiv: (y : SpaceTime d), fderiv χ y = y (Sum.inr i) Vector.coordCLM (Sum.inl 0) + y (Sum.inl 0) Vector.coordCLM (Sum.inr i)η (Sum.inl 0) (Sum.inl 0) * (fderiv (fun x => (fderiv χ x) (Vector.basis (Sum.inr i))) x) (Vector.basis (Sum.inl 0)) - η (Sum.inr i) (Sum.inr i) * (fderiv (fun x => (fderiv χ x) (Vector.basis (Sum.inl 0))) x) (Vector.basis (Sum.inr i)) = 2d:i:Fin dx:SpaceTime dχ:SpaceTime d := fun y => y (Sum.inl 0) * y (Sum.inr i)B:ElectromagneticPotential d := { val := fun y μ => ∂_ μ χ y }:ContDiff 2 χhB:Differentiable B.valhfderiv: (y : SpaceTime d), fderiv χ y = y (Sum.inr i) Vector.coordCLM (Sum.inl 0) + y (Sum.inl 0) Vector.coordCLM (Sum.inr i)η (Sum.inl 0) (Sum.inl 0) * (fderiv (fun x => (x (Sum.inr i) Vector.coordCLM (Sum.inl 0) + x (Sum.inl 0) Vector.coordCLM (Sum.inr i)) (Vector.basis (Sum.inr i))) x) (Vector.basis (Sum.inl 0)) - η (Sum.inr i) (Sum.inr i) * (fderiv (fun x => (x (Sum.inr i) Vector.coordCLM (Sum.inl 0) + x (Sum.inl 0) Vector.coordCLM (Sum.inr i)) (Vector.basis (Sum.inl 0))) x) (Vector.basis (Sum.inr i)) = 2] d:i:Fin dx:SpaceTime dχ:SpaceTime d := fun y => y (Sum.inl 0) * y (Sum.inr i)B:ElectromagneticPotential d := { val := fun y μ => ∂_ μ χ y }:ContDiff 2 χhB:Differentiable B.valhfderiv: (y : SpaceTime d), fderiv χ y = y (Sum.inr i) Vector.coordCLM (Sum.inl 0) + y (Sum.inl 0) Vector.coordCLM (Sum.inr i)η (Sum.inl 0) (Sum.inl 0) * (fderiv (fun x => (x (Sum.inr i) * if Sum.inr i = Sum.inl 0 then 1 else 0) + x (Sum.inl 0) * if True then 1 else 0) x) (Vector.basis (Sum.inl 0)) - η (Sum.inr i) (Sum.inr i) * (fderiv (fun x => (x (Sum.inr i) * if True then 1 else 0) + x (Sum.inl 0) * if Sum.inl 0 = Sum.inr i then 1 else 0) x) (Vector.basis (Sum.inr i)) = 2 d:i:Fin dx:SpaceTime dχ:SpaceTime d := fun y => y (Sum.inl 0) * y (Sum.inr i)B:ElectromagneticPotential d := { val := fun y μ => ∂_ μ χ y }:ContDiff 2 χhB:Differentiable B.valhfderiv: (y : SpaceTime d), fderiv χ y = y (Sum.inr i) Vector.coordCLM (Sum.inl 0) + y (Sum.inl 0) Vector.coordCLM (Sum.inr i)η (Sum.inl 0) (Sum.inl 0) * (fderiv (fun x => if Sum.inr i = Sum.inl 0 then x (Sum.inr i) + x (Sum.inl 0) else x (Sum.inl 0)) x) (Vector.basis (Sum.inl 0)) - η (Sum.inr i) (Sum.inr i) * (fderiv (fun x => x (Sum.inr i) + if Sum.inl 0 = Sum.inr i then x (Sum.inl 0) else 0) x) (Vector.basis (Sum.inr i)) = 2 d:i:Fin dx:SpaceTime dχ:SpaceTime d := fun y => y (Sum.inl 0) * y (Sum.inr i)B:ElectromagneticPotential d := { val := fun y μ => ∂_ μ χ y }:ContDiff 2 χhB:Differentiable B.valhfderiv: (y : SpaceTime d), fderiv χ y = y (Sum.inr i) Vector.coordCLM (Sum.inl 0) + y (Sum.inl 0) Vector.coordCLM (Sum.inr i)1 * (fderiv (fun x => if Sum.inr i = Sum.inl 0 then x (Sum.inr i) + x (Sum.inl 0) else x (Sum.inl 0)) x) (Vector.basis (Sum.inl 0)) - -1 * (fderiv (fun x => x (Sum.inr i) + if Sum.inl 0 = Sum.inr i then x (Sum.inl 0) else 0) x) (Vector.basis (Sum.inr i)) = 2 d:i:Fin dx:SpaceTime dχ:SpaceTime d := fun y => y (Sum.inl 0) * y (Sum.inr i)B:ElectromagneticPotential d := { val := fun y μ => ∂_ μ χ y }:ContDiff 2 χhB:Differentiable B.valhfderiv: (y : SpaceTime d), fderiv χ y = y (Sum.inr i) Vector.coordCLM (Sum.inl 0) + y (Sum.inl 0) Vector.coordCLM (Sum.inr i)1 * (fderiv (fun x => x (Sum.inl 0)) x) (Vector.basis (Sum.inl 0)) - -1 * (fderiv (fun x => x (Sum.inr i)) x) (Vector.basis (Sum.inr i)) = 2 d:i:Fin dx:SpaceTime dχ:SpaceTime d := fun y => y (Sum.inl 0) * y (Sum.inr i)B:ElectromagneticPotential d := { val := fun y μ => ∂_ μ χ y }:ContDiff 2 χhB:Differentiable B.valhfderiv: (y : SpaceTime d), fderiv χ y = y (Sum.inr i) Vector.coordCLM (Sum.inl 0) + y (Sum.inl 0) Vector.coordCLM (Sum.inr i)1 * 1 - -1 * 1 = 2 All goals completed! 🐙

The field strength of the bare-gradient potential B^μ := ∂_μ χ for χ(x) = x⁰·xⁱ is nonzero (follows from fieldStrengthMatrix_bareGradient_inl_inr).

d:i:Fin dx:SpaceTime dχ:SpaceTime d := fun y => y (Sum.inl 0) * y (Sum.inr i)B:ElectromagneticPotential d := { val := fun y μ => ∂_ μ χ y }h:B.toFieldStrength x = 0h2:((CoVector.basis.tensorProduct Vector.basis).repr 0) (Sum.inl 0, Sum.inr i) = 2False d:i:Fin dx:SpaceTime dχ:SpaceTime d := fun y => y (Sum.inl 0) * y (Sum.inr i)B:ElectromagneticPotential d := { val := fun y μ => ∂_ μ χ y }h:B.toFieldStrength x = 0h2:((CoVector.basis.tensorProduct Vector.basis).repr 0) (Sum.inl 0, Sum.inr i) = 2h3:(CoVector.basis.tensorProduct Vector.basis).repr 0 = 0False erw [d:i:Fin dx:SpaceTime dχ:SpaceTime d := fun y => y (Sum.inl 0) * y (Sum.inr i)B:ElectromagneticPotential d := { val := fun y μ => ∂_ μ χ y }h:B.toFieldStrength x = 0h2:0 (Sum.inl 0, Sum.inr i) = 2h3:(CoVector.basis.tensorProduct Vector.basis).repr 0 = 0False d:i:Fin dx:SpaceTime dχ:SpaceTime d := fun y => y (Sum.inl 0) * y (Sum.inr i)B:ElectromagneticPotential d := { val := fun y μ => ∂_ μ χ y }h:B.toFieldStrength x = 0h2:0 = 2h3:(CoVector.basis.tensorProduct Vector.basis).repr 0 = 0Falsed:i:Fin dx:SpaceTime dχ:SpaceTime d := fun y => y (Sum.inl 0) * y (Sum.inr i)B:ElectromagneticPotential d := { val := fun y μ => ∂_ μ χ y }h:B.toFieldStrength x = 0h2:0 = 2h3:(CoVector.basis.tensorProduct Vector.basis).repr 0 = 0False at h2 All goals completed! 🐙