PhysLean/HepLean/PerturbationTheory/FieldOpAlgebra/WicksTheoremNormal.lean
2025-02-10 10:51:44 +00:00

257 lines
11 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) 2025 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Tooby-Smith
-/
import HepLean.PerturbationTheory.FieldOpAlgebra.StaticWickTheorem
import HepLean.PerturbationTheory.FieldOpAlgebra.WicksTheorem
import HepLean.PerturbationTheory.WickContraction.Sign.Join
import HepLean.PerturbationTheory.WickContraction.TimeCond
/-!
# Wick's theorem for normal ordered lists
-/
namespace FieldSpecification
variable {𝓕 : FieldSpecification}
open FieldOpFreeAlgebra
namespace FieldOpAlgebra
open WickContraction
open EqTimeOnly
/--
For a list `φs` of `𝓕.FieldOp`, then
`𝓣(φs) = ∑ φsΛ, φsΛ.1.wickTerm • φsΛ.1.timeContract.1 * 𝓣(𝓝(ofFieldOpList [φsΛ.1]ᵘᶜ))`
where the sum is over all Wick contraction `φsΛ` which only have equal time contractions.
This result follows from
- `static_wick_theorem` to rewrite `𝓣(φs)` on the left hand side as a sum of
`𝓣(φsΛ.staticWickTerm)`.
- `EqTimeOnly.timeOrder_staticContract_of_not_mem` and `timeOrder_timeOrder_mid` to set to
those `𝓣(φsΛ.staticWickTerm)` for which `φsΛ` has a contracted pair which are not
equal time to zero.
- `staticContract_eq_timeContract_of_eqTimeOnly` to rewrite the static contract
in the remaining `𝓣(φsΛ.staticWickTerm)` as a time contract.
- `timeOrder_timeContract_mul_of_eqTimeOnly_left` to move the time contracts out of the time
ordering.
-/
lemma timeOrder_ofFieldOpList_eqTimeOnly (φs : List 𝓕.FieldOp) :
𝓣(ofFieldOpList φs) = ∑ (φsΛ : {φsΛ // φsΛ.EqTimeOnly (φs := φs)}),
φsΛ.1.sign • φsΛ.1.timeContract.1 * 𝓣(𝓝(ofFieldOpList [φsΛ.1]ᵘᶜ)) := by
rw [static_wick_theorem φs]
let e2 : WickContraction φs.length ≃
{φsΛ : WickContraction φs.length // φsΛ.EqTimeOnly} ⊕
{φsΛ : WickContraction φs.length // ¬ φsΛ.EqTimeOnly} :=
(Equiv.sumCompl _).symm
rw [← e2.symm.sum_comp]
simp only [Equiv.symm_symm, Algebra.smul_mul_assoc, Fintype.sum_sum_type,
Equiv.sumCompl_apply_inl, Equiv.sumCompl_apply_inr, map_add, map_sum, map_smul, e2]
simp only [staticWickTerm, Algebra.smul_mul_assoc, map_smul]
conv_lhs =>
enter [2, 2, x]
rw [timeOrder_timeOrder_left]
rw [timeOrder_staticContract_of_not_mem _ x.2]
simp only [Finset.univ_eq_attach, zero_mul, map_zero, smul_zero, Finset.sum_const_zero, add_zero]
congr
funext x
rw [staticContract_eq_timeContract_of_eqTimeOnly]
rw [timeOrder_timeContract_mul_of_eqTimeOnly_left]
exact x.2
exact x.2
lemma timeOrder_ofFieldOpList_eq_eqTimeOnly_empty (φs : List 𝓕.FieldOp) :
𝓣(ofFieldOpList φs) = 𝓣(𝓝(ofFieldOpList φs)) +
∑ (φsΛ : {φsΛ // φsΛ.EqTimeOnly (φs := φs) ∧ φsΛ ≠ empty}),
φsΛ.1.sign • φsΛ.1.timeContract.1 * 𝓣(𝓝(ofFieldOpList [φsΛ.1]ᵘᶜ)) := by
let e1 : {φsΛ : WickContraction φs.length // φsΛ.EqTimeOnly} ≃
{φsΛ : {φsΛ : WickContraction φs.length // φsΛ.EqTimeOnly} // φsΛ.1 = empty} ⊕
{φsΛ : {φsΛ : WickContraction φs.length // φsΛ.EqTimeOnly} // ¬ φsΛ.1 = empty} :=
(Equiv.sumCompl _).symm
rw [timeOrder_ofFieldOpList_eqTimeOnly, ← e1.symm.sum_comp]
simp only [Equiv.symm_symm, Algebra.smul_mul_assoc, Fintype.sum_sum_type,
Equiv.sumCompl_apply_inl, Equiv.sumCompl_apply_inr, ne_eq, e1]
congr 1
· let e2 : {φsΛ : {φsΛ : WickContraction φs.length // φsΛ.EqTimeOnly} // φsΛ.1 = empty } ≃
Unit := {
toFun := fun x => (), invFun := fun x => ⟨⟨empty, by simp⟩, rfl⟩,
left_inv a := by
ext
simp [a.2], right_inv a := by simp}
rw [← e2.symm.sum_comp]
simp [e2, sign_empty]
· let e2 : { φsΛ : {φsΛ : WickContraction φs.length // φsΛ.EqTimeOnly} // ¬ φsΛ.1 = empty } ≃
{φsΛ // φsΛ.EqTimeOnly ∧ φsΛ ≠ empty} := {
toFun := fun x => ⟨x, ⟨x.1.2, x.2⟩⟩, invFun := fun x => ⟨⟨x.1, x.2.1⟩, x.2.2⟩,
left_inv a := by rfl, right_inv a := by rfl }
rw [← e2.symm.sum_comp]
rfl
/--
For a list `φs` of `𝓕.FieldOp`, then
`𝓣(𝓝(φs)) = 𝓣(φs) - ∑ φsΛ, φsΛ.1.wickTerm • φsΛ.1.timeContract.1 * 𝓣(𝓝(ofFieldOpList [φsΛ.1]ᵘᶜ))`
where the sum is over all *non-empty* Wick contraction `φsΛ` which only
have equal time contractions.
This result follows directly from
- `timeOrder_ofFieldOpList_eqTimeOnly`
-/
lemma normalOrder_timeOrder_ofFieldOpList_eq_eqTimeOnly_empty (φs : List 𝓕.FieldOp) :
𝓣(𝓝(ofFieldOpList φs)) = 𝓣(ofFieldOpList φs) -
∑ (φsΛ : {φsΛ // φsΛ.EqTimeOnly (φs := φs) ∧ φsΛ ≠ empty}),
φsΛ.1.sign • φsΛ.1.timeContract.1 * 𝓣(𝓝(ofFieldOpList [φsΛ.1]ᵘᶜ)) := by
rw [timeOrder_ofFieldOpList_eq_eqTimeOnly_empty]
simp
/--
For a list `φs` of `𝓕.FieldOp`, then `𝓣(φs)` is equal to the sum of
- `∑ φsΛ, φsΛ.wickTerm` where the sum is over all Wick contraction `φsΛ` which have
no contractions of equal time.
- `∑ φsΛ, φsΛ.sign • φsΛ.timeContract * (∑ φssucΛ, φssucΛ.wickTerm)`, where
the first sum is over all Wick contraction `φsΛ` which only have equal time contractions
and the second sum is over all Wick contraction `φssucΛ` of the uncontracted elements of `φsΛ`
which do not have any equal time contractions.
The proof of proceeds as follows
- `wicks_theorem` is used to rewrite `𝓣(φs)` as a sum over all Wick contractions.
- The sum over all Wick contractions is then split additively into two parts using based on having
or not having an equal time contractions.
- Using `join`, the sum `∑ φsΛ, _` over Wick contractions which do have equal time contractions
is split into two sums `∑ φsΛ, ∑ φsucΛ, _`, the first over non-zero elements
which only have equal time contractions and the second over Wick contractions `φsucΛ` of
`[φsΛ]ᵘᶜ` which do not have equal time contractions.
- `join_sign_timeContract` is then used to equate terms.
-/
lemma timeOrder_haveEqTime_split (φs : List 𝓕.FieldOp) :
𝓣(ofFieldOpList φs) = (∑ (φsΛ : {φsΛ : WickContraction φs.length // ¬ HaveEqTime φsΛ}),
φsΛ.1.sign • φsΛ.1.timeContract.1 * 𝓝(ofFieldOpList [φsΛ.1]ᵘᶜ))
+ ∑ (φsΛ : {φsΛ // φsΛ.EqTimeOnly (φs := φs) ∧ φsΛ ≠ empty}), φsΛ.1.sign • φsΛ.1.timeContract *
(∑ φssucΛ : { φssucΛ : WickContraction [φsΛ.1]ᵘᶜ.length // ¬ φssucΛ.HaveEqTime },
φssucΛ.1.wickTerm) := by
rw [wicks_theorem]
simp only [wickTerm]
let e1 : WickContraction φs.length ≃ {φsΛ // HaveEqTime φsΛ} ⊕ {φsΛ // ¬ HaveEqTime φsΛ} := by
exact (Equiv.sumCompl HaveEqTime).symm
rw [← e1.symm.sum_comp]
simp only [Equiv.symm_symm, Algebra.smul_mul_assoc, Fintype.sum_sum_type,
Equiv.sumCompl_apply_inl, Equiv.sumCompl_apply_inr, ne_eq, sub_left_inj, e1]
rw [add_comm]
congr 1
let f : WickContraction φs.length → 𝓕.FieldOpAlgebra := fun φsΛ =>
φsΛ.sign • (φsΛ.timeContract.1 * 𝓝(ofFieldOpList [φsΛ]ᵘᶜ))
change ∑ (φsΛ : {φsΛ : WickContraction φs.length // HaveEqTime φsΛ}), f φsΛ.1 = _
rw [sum_haveEqTime]
congr
funext φsΛ
simp only [f]
conv_lhs =>
enter [2, φsucΛ]
rw [← Algebra.smul_mul_assoc]
rw [join_sign_timeContract φsΛ.1 φsucΛ.1]
conv_lhs =>
enter [2, φsucΛ]
rw [mul_assoc]
rw [← Finset.mul_sum, ← Algebra.smul_mul_assoc]
congr
funext φsΛ'
simp only [ne_eq, Algebra.smul_mul_assoc]
congr 1
rw [@join_uncontractedListGet]
lemma normalOrder_timeOrder_ofFieldOpList_eq_not_haveEqTime_sub_inductive (φs : List 𝓕.FieldOp) :
𝓣(𝓝(ofFieldOpList φs)) =
(∑ (φsΛ : {φsΛ : WickContraction φs.length // ¬ HaveEqTime φsΛ}), φsΛ.1.wickTerm)
+ ∑ (φsΛ : {φsΛ // φsΛ.EqTimeOnly (φs := φs) ∧ φsΛ ≠ empty}),
sign φs ↑φsΛ • (φsΛ.1).timeContract *
(∑ φssucΛ : { φssucΛ : WickContraction [φsΛ.1]ᵘᶜ.length // ¬ φssucΛ.HaveEqTime },
φssucΛ.1.wickTerm - 𝓣(𝓝(ofFieldOpList [φsΛ.1]ᵘᶜ))) := by
rw [normalOrder_timeOrder_ofFieldOpList_eq_eqTimeOnly_empty,
timeOrder_haveEqTime_split]
rw [add_sub_assoc]
congr 1
simp only [ne_eq, Algebra.smul_mul_assoc]
rw [← Finset.sum_sub_distrib]
congr 1
funext x
simp only
rw [← smul_sub, ← mul_sub]
lemma wicks_theorem_normal_order_empty : 𝓣(𝓝(ofFieldOpList [])) =
∑ (φsΛ : {φsΛ : WickContraction ([] : List 𝓕.FieldOp).length // ¬ HaveEqTime φsΛ}),
φsΛ.1.wickTerm := by
simp only [wickTerm]
let e2 : {φsΛ : WickContraction ([] : List 𝓕.FieldOp).length // ¬ HaveEqTime φsΛ} ≃ Unit :=
{
toFun := fun x => (),
invFun := fun x => ⟨empty, by simp⟩,
left_inv := by
intro a
simp only [List.length_nil]
apply Subtype.eq
apply Subtype.eq
simp only [empty]
ext i
simp only [Finset.not_mem_empty, false_iff]
by_contra hn
have h2 := a.1.2.1 i hn
rw [@Finset.card_eq_two] at h2
obtain ⟨a, b, ha, hb, hab⟩ := h2
exact Fin.elim0 a,
right_inv := by intro a; simp}
rw [← e2.symm.sum_comp]
simp only [Finset.univ_unique, PUnit.default_eq_unit, List.length_nil, Equiv.coe_fn_symm_mk,
sign_empty, timeContract_empty, OneMemClass.coe_one, one_smul, uncontractedListGet_empty,
one_mul, Finset.sum_const, Finset.card_singleton, e2]
have h1' : ofFieldOpList (𝓕 := 𝓕) [] = ofCrAnList [] := by rfl
rw [h1']
rw [normalOrder_ofCrAnList]
simp only [normalOrderSign_nil, normalOrderList_nil, one_smul]
rw [ofCrAnList, timeOrder_eq_ι_timeOrderF]
rw [timeOrderF_ofCrAnListF]
simp
/--For a list `φs` of `𝓕.FieldOp`, the normal-ordered version of Wick's theorem states that
`𝓣(𝓝(φs)) = ∑ φsΛ, φsΛ.wickTerm`
where the sum is over all Wick contraction `φsΛ` in which no two contracted elements
have the same time.
The proof of proceeds by induction on `φs`, with the base case `[]` holding by following
through definitions. and the inductive case holding as a result of
- `timeOrder_haveEqTime_split`
- `normalOrder_timeOrder_ofFieldOpList_eq_eqTimeOnly_empty`
- and the induction hypothesis on `𝓣(𝓝([φsΛ.1]ᵘᶜ))` for contractions `φsΛ` of `φs` which only
have equal time contractions and are non-empty.
-/
theorem wicks_theorem_normal_order : (φs : List 𝓕.FieldOp) →
𝓣(𝓝(ofFieldOpList φs)) =
∑ (φsΛ : {φsΛ : WickContraction φs.length // ¬ HaveEqTime φsΛ}), φsΛ.1.wickTerm
| [] => wicks_theorem_normal_order_empty
| φ :: φs => by
rw [normalOrder_timeOrder_ofFieldOpList_eq_not_haveEqTime_sub_inductive]
simp only [Algebra.smul_mul_assoc, ne_eq, add_right_eq_self]
apply Finset.sum_eq_zero
intro φsΛ hφsΛ
simp only [smul_eq_zero]
right
have ih := wicks_theorem_normal_order [φsΛ.1]ᵘᶜ
rw [ih]
simp [wickTerm]
termination_by φs => φs.length
decreasing_by
simp only [uncontractedListGet, List.length_cons, List.length_map, gt_iff_lt]
rw [uncontractedList_length_eq_card]
have hc := uncontracted_card_eq_iff φsΛ.1
simp only [List.length_cons, φsΛ.2.2, iff_false] at hc
have hc' := uncontracted_card_le φsΛ.1
simp_all only [Algebra.smul_mul_assoc, List.length_cons, Finset.mem_univ, gt_iff_lt]
omega
end FieldOpAlgebra
end FieldSpecification