PhysLean/HepLean/SpaceTime/LorentzTensor/EinsteinNotation/Basic.lean
2024-09-04 06:36:42 -04:00

111 lines
4.9 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/-
Copyright (c) 2024 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Tooby-Smith
-/
import Mathlib.LinearAlgebra.StdBasis
import HepLean.SpaceTime.LorentzTensor.Basic
import Mathlib.LinearAlgebra.DirectSum.Finsupp
import Mathlib.LinearAlgebra.Finsupp
/-!
# Einstein notation for real tensors
Einstein notation is a specific example of index notation, with only one color.
In this file we define Einstein notation for generic ring `R`.
-/
open TensorProduct
/-- Einstein tensors have only one color, corresponding to a `down` index. . -/
def einsteinTensorColor : TensorColor where
Color := Unit
τ a := a
τ_involutive μ := by rfl
instance : Fintype einsteinTensorColor.Color := Unit.fintype
instance : DecidableEq einsteinTensorColor.Color := instDecidableEqPUnit
variable {R : Type} [CommSemiring R]
/-- The `TensorStructure` associated with `n`-dimensional tensors. -/
noncomputable def einsteinTensor (R : Type) [CommSemiring R] (n : ) : TensorStructure R where
toTensorColor := einsteinTensorColor
ColorModule _ := Fin n → R
colorModule_addCommMonoid _ := Pi.addCommMonoid
colorModule_module _ := Pi.Function.module (Fin n) R R
contrDual _ := TensorProduct.lift (Fintype.linearCombination R R)
contrDual_symm a x y := by
simp only [lift.tmul, Fintype.linearCombination_apply, smul_eq_mul, mul_comm, Equiv.cast_refl,
Equiv.refl_apply]
unit a := ∑ i, Pi.basisFun R (Fin n) i ⊗ₜ[R] Pi.basisFun R (Fin n) i
unit_rid a x:= by
simp only [Pi.basisFun_apply]
rw [tmul_sum, map_sum]
trans ∑ i, x i • Pi.basisFun R (Fin n) i
· refine Finset.sum_congr rfl (fun i _ => ?_)
simp only [TensorStructure.contrLeftAux, LinearEquiv.refl_toLinearMap, LinearMap.coe_comp,
LinearEquiv.coe_coe, Function.comp_apply, assoc_symm_tmul, map_tmul, lift.tmul,
Fintype.linearCombination_apply, Pi.single_apply, smul_eq_mul, ite_mul, one_mul, zero_mul,
Finset.sum_ite_eq', Finset.mem_univ, ↓reduceIte, LinearMap.id_coe, id_eq, lid_tmul,
Pi.basisFun_apply]
· funext a
simp only [Pi.basisFun_apply, Finset.sum_apply, Pi.smul_apply, Pi.single_apply, smul_eq_mul,
mul_ite, mul_one, mul_zero, Finset.sum_ite_eq, Finset.mem_univ, ↓reduceIte]
metric a := ∑ i, Pi.basisFun R (Fin n) i ⊗ₜ[R] Pi.basisFun R (Fin n) i
metric_dual a := by
simp only [Pi.basisFun_apply, map_sum, comm_tmul]
rw [tmul_sum, map_sum]
refine Finset.sum_congr rfl (fun i _ => ?_)
rw [sum_tmul, map_sum, Fintype.sum_eq_single i]
· simp only [TensorStructure.contrMidAux, LinearEquiv.refl_toLinearMap,
TensorStructure.contrLeftAux, LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply,
assoc_tmul, map_tmul, LinearMap.id_coe, id_eq, assoc_symm_tmul, lift.tmul,
Fintype.linearCombination_apply, Pi.single_apply, smul_eq_mul, mul_ite, mul_one, mul_zero,
Finset.sum_ite_eq', Finset.mem_univ, ↓reduceIte, lid_tmul, one_smul]
· intro x hi
simp only [TensorStructure.contrMidAux, LinearEquiv.refl_toLinearMap,
TensorStructure.contrLeftAux, LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply,
assoc_tmul, map_tmul, LinearMap.id_coe, id_eq, assoc_symm_tmul, lift.tmul,
Fintype.linearCombination_apply, Pi.single_apply, smul_eq_mul, mul_ite, mul_one, mul_zero,
Finset.sum_ite_eq', Finset.mem_univ, ↓reduceIte, lid_tmul, ite_smul, one_smul, zero_smul]
rw [if_neg hi]
exact tmul_zero (Fin n → R) (Pi.single x 1)
namespace einsteinTensor
open TensorStructure
noncomputable section
instance : OfNat einsteinTensorColor.Color 0 := ⟨PUnit.unit⟩
instance : OfNat (einsteinTensor R n).Color 0 := ⟨PUnit.unit⟩
@[simp]
lemma ofNat_inst_eq : @einsteinTensor.instOfNatColorOfNatNat R _ n =
einsteinTensor.instOfNatColorEinsteinTensorColorOfNatNat := rfl
/-- A vector from an Einstein tensor with one index. -/
def toVec : (einsteinTensor R n).Tensor ![Unit.unit] ≃ₗ[R] Fin n → R :=
PiTensorProduct.subsingletonEquiv 0
/-- A matrix from an Einstein tensor with two indices. -/
def toMatrix : (einsteinTensor R n).Tensor ![Unit.unit, Unit.unit] ≃ₗ[R] Matrix (Fin n) (Fin n) R :=
((einsteinTensor R n).mapIso ((Fin.castOrderIso
(by rfl : (Nat.succ 0).succ = Nat.succ 0 + Nat.succ 0)).toEquiv.trans
finSumFinEquiv.symm) (by funext x; fin_cases x <;> rfl)).trans <|
((einsteinTensor R n).tensoratorEquiv ![0] ![0]).symm.trans <|
(TensorProduct.congr ((PiTensorProduct.subsingletonEquiv 0))
((PiTensorProduct.subsingletonEquiv 0))).trans <|
(TensorProduct.congr (Finsupp.linearEquivFunOnFinite R R (Fin n)).symm
(Finsupp.linearEquivFunOnFinite R R (Fin n)).symm).trans <|
(finsuppTensorFinsupp' R (Fin n) (Fin n)).trans <|
(Finsupp.linearEquivFunOnFinite R R (Fin n × Fin n)).trans <|
(LinearEquiv.curry R R (Fin n) (Fin n))
end
end einsteinTensor