/- 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 HepLean.PerturbationTheory.Wick.Signs.StaticWickCoef /-! # Koszul signs and ordering for lists and algebras -/ namespace Wick noncomputable section open FieldStatistic variable {๐“• : Type} (q : ๐“• โ†’ FieldStatistic) (le : ๐“• โ†’ ๐“• โ†’ Prop) [DecidableRel le] /-- Given a relation `r` on `I` sorts elements of `MonoidAlgebra โ„‚ (FreeMonoid I)` by `r` giving it a signed dependent on `q`. -/ def koszulOrderMonoidAlgebra : MonoidAlgebra โ„‚ (FreeMonoid ๐“•) โ†’โ‚—[โ„‚] MonoidAlgebra โ„‚ (FreeMonoid ๐“•) := Finsupp.lift (MonoidAlgebra โ„‚ (FreeMonoid ๐“•)) โ„‚ (List ๐“•) (fun i => Finsupp.lsingle (R := โ„‚) (List.insertionSort le i) (koszulSign q le i)) lemma koszulOrderMonoidAlgebra_ofList (i : List ๐“•) : koszulOrderMonoidAlgebra q le (MonoidAlgebra.of โ„‚ (FreeMonoid ๐“•) i) = (koszulSign q le i) โ€ข (MonoidAlgebra.of โ„‚ (FreeMonoid ๐“•) (List.insertionSort le i)) := by simp only [koszulOrderMonoidAlgebra, Finsupp.lsingle_apply, MonoidAlgebra.of_apply, MonoidAlgebra.smul_single', mul_one] rw [MonoidAlgebra.ext_iff] intro x erw [Finsupp.lift_apply] simp only [MonoidAlgebra.smul_single', zero_mul, Finsupp.single_zero, Finsupp.sum_single_index, one_mul] @[simp] lemma koszulOrderMonoidAlgebra_single (l : FreeMonoid ๐“•) (x : โ„‚) : koszulOrderMonoidAlgebra q le (MonoidAlgebra.single l x) = (koszulSign q le l) โ€ข (MonoidAlgebra.single (List.insertionSort le l) x) := by simp only [koszulOrderMonoidAlgebra, Finsupp.lsingle_apply, MonoidAlgebra.smul_single'] rw [MonoidAlgebra.ext_iff] intro x' erw [Finsupp.lift_apply] simp only [MonoidAlgebra.smul_single', zero_mul, Finsupp.single_zero, Finsupp.sum_single_index, one_mul, MonoidAlgebra.single] congr 2 rw [NonUnitalNormedCommRing.mul_comm] /-- Given a relation `r` on `I` sorts elements of `FreeAlgebra โ„‚ I` by `r` giving it a signed dependent on `q`. -/ def koszulOrder : FreeAlgebra โ„‚ ๐“• โ†’โ‚—[โ„‚] FreeAlgebra โ„‚ ๐“• := FreeAlgebra.equivMonoidAlgebraFreeMonoid.symm.toAlgHom.toLinearMap โˆ˜โ‚— koszulOrderMonoidAlgebra q le โˆ˜โ‚— FreeAlgebra.equivMonoidAlgebraFreeMonoid.toAlgHom.toLinearMap @[simp] lemma koszulOrder_ฮน (i : ๐“•) : koszulOrder q le (FreeAlgebra.ฮน โ„‚ i) = FreeAlgebra.ฮน โ„‚ i := by simp only [koszulOrder, AlgEquiv.toAlgHom_eq_coe, AlgEquiv.toAlgHom_toLinearMap, koszulOrderMonoidAlgebra, Finsupp.lsingle_apply, LinearMap.coe_comp, Function.comp_apply, AlgEquiv.toLinearMap_apply] rw [AlgEquiv.symm_apply_eq] simp only [FreeAlgebra.equivMonoidAlgebraFreeMonoid, MonoidAlgebra.of_apply, AlgEquiv.ofAlgHom_apply, FreeAlgebra.lift_ฮน_apply] rw [@MonoidAlgebra.ext_iff] intro x erw [Finsupp.lift_apply] simp only [MonoidAlgebra.smul_single', List.insertionSort, List.orderedInsert, koszulSign_freeMonoid_of, mul_one, Finsupp.single_zero, Finsupp.sum_single_index] rfl @[simp] lemma koszulOrder_single (l : FreeMonoid ๐“•) : koszulOrder q le (FreeAlgebra.equivMonoidAlgebraFreeMonoid.symm (MonoidAlgebra.single l x)) = FreeAlgebra.equivMonoidAlgebraFreeMonoid.symm (MonoidAlgebra.single (List.insertionSort le l) (koszulSign q le l * x)) := by simp [koszulOrder] @[simp] lemma koszulOrder_ฮน_pair (i j : ๐“•) : koszulOrder q le (FreeAlgebra.ฮน โ„‚ i * FreeAlgebra.ฮน โ„‚ j) = if le i j then FreeAlgebra.ฮน โ„‚ i * FreeAlgebra.ฮน โ„‚ j else (koszulSign q le [i, j]) โ€ข (FreeAlgebra.ฮน โ„‚ j * FreeAlgebra.ฮน โ„‚ i) := by have h1 : FreeAlgebra.ฮน โ„‚ i * FreeAlgebra.ฮน โ„‚ j = FreeAlgebra.equivMonoidAlgebraFreeMonoid.symm (MonoidAlgebra.single [i, j] 1) := by simp only [FreeAlgebra.equivMonoidAlgebraFreeMonoid, MonoidAlgebra.of_apply, AlgEquiv.ofAlgHom_symm_apply, MonoidAlgebra.lift_single, one_smul] rfl conv_lhs => rw [h1] simp only [koszulOrder, AlgEquiv.toAlgHom_eq_coe, AlgEquiv.toAlgHom_toLinearMap, LinearMap.coe_comp, Function.comp_apply, AlgEquiv.toLinearMap_apply, AlgEquiv.apply_symm_apply, koszulOrderMonoidAlgebra_single, List.insertionSort, List.orderedInsert, MonoidAlgebra.smul_single', mul_one] by_cases hr : le i j ยท rw [if_pos hr, if_pos hr] simp only [FreeAlgebra.equivMonoidAlgebraFreeMonoid, MonoidAlgebra.of_apply, AlgEquiv.ofAlgHom_symm_apply, MonoidAlgebra.lift_single] have hKS : koszulSign q le [i, j] = 1 := by simp only [koszulSign, koszulSignInsert, Fin.isValue, mul_one, ite_eq_left_iff, ite_eq_right_iff, and_imp] exact fun a a_1 a_2 => False.elim (a hr) rw [hKS] simp only [one_smul] rfl ยท rw [if_neg hr, if_neg hr] simp only [FreeAlgebra.equivMonoidAlgebraFreeMonoid, MonoidAlgebra.of_apply, AlgEquiv.ofAlgHom_symm_apply, MonoidAlgebra.lift_single] rfl @[simp] lemma koszulOrder_one : koszulOrder q le 1 = 1 := by trans koszulOrder q le (FreeAlgebra.equivMonoidAlgebraFreeMonoid.symm (MonoidAlgebra.single [] 1)) congr ยท simp only [FreeAlgebra.equivMonoidAlgebraFreeMonoid, MonoidAlgebra.of_apply, AlgEquiv.ofAlgHom_symm_apply, MonoidAlgebra.lift_single, one_smul] rfl ยท simp only [koszulOrder_single, List.insertionSort, mul_one, EmbeddingLike.map_eq_one_iff] rfl lemma mul_koszulOrder_le (i : ๐“•) (A : FreeAlgebra โ„‚ ๐“•) (hi : โˆ€ j, le i j) : FreeAlgebra.ฮน โ„‚ i * koszulOrder q le A = koszulOrder q le (FreeAlgebra.ฮน โ„‚ i * A) := by let f : FreeAlgebra โ„‚ ๐“• โ†’โ‚—[โ„‚] FreeAlgebra โ„‚ ๐“• := { toFun := fun x => FreeAlgebra.ฮน โ„‚ i * x, map_add' := fun x y => by simp [mul_add], map_smul' := by simp} change (f โˆ˜โ‚— koszulOrder q le) A = (koszulOrder q le โˆ˜โ‚— f) _ have f_single (l : FreeMonoid ๐“•) (x : โ„‚) : f ((FreeAlgebra.equivMonoidAlgebraFreeMonoid.symm (MonoidAlgebra.single l x))) = (FreeAlgebra.equivMonoidAlgebraFreeMonoid.symm (MonoidAlgebra.single (i :: l) x)) := by simp only [LinearMap.coe_mk, AddHom.coe_mk, f] have hf : FreeAlgebra.ฮน โ„‚ i = FreeAlgebra.equivMonoidAlgebraFreeMonoid.symm (MonoidAlgebra.single [i] 1) := by simp only [FreeAlgebra.equivMonoidAlgebraFreeMonoid, MonoidAlgebra.of_apply, AlgEquiv.ofAlgHom_symm_apply, MonoidAlgebra.lift_single, one_smul] rfl rw [hf] rw [@AlgEquiv.eq_symm_apply] simp only [map_mul, AlgEquiv.apply_symm_apply, MonoidAlgebra.single_mul_single, one_mul] rfl have h1 : f โˆ˜โ‚— koszulOrder q le = koszulOrder q le โˆ˜โ‚— f := by let e : FreeAlgebra โ„‚ ๐“• โ‰ƒโ‚—[โ„‚] MonoidAlgebra โ„‚ (FreeMonoid ๐“•) := FreeAlgebra.equivMonoidAlgebraFreeMonoid.toLinearEquiv apply (LinearEquiv.eq_comp_toLinearMap_iff (eโ‚โ‚‚ := e.symm) _ _).mp apply MonoidAlgebra.lhom_ext' intro l apply LinearMap.ext intro x simp only [LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply, MonoidAlgebra.lsingle_apply] erw [koszulOrder_single] rw [f_single] erw [f_single] rw [koszulOrder_single] congr 2 ยท simp only [List.insertionSort] have hi (l : List ๐“•) : i :: l = List.orderedInsert le i l := by induction l with | nil => rfl | cons j l ih => refine (List.orderedInsert_of_le le l (hi j)).symm exact hi _ ยท congr 1 rw [koszulSign] have h1 (l : List ๐“•) : koszulSignInsert q le i l = 1 := by exact koszulSignInsert_le_forall q le i l hi rw [h1] simp rw [h1] lemma koszulOrder_mul_ge (i : ๐“•) (A : FreeAlgebra โ„‚ ๐“•) (hi : โˆ€ j, le j i) : koszulOrder q le A * FreeAlgebra.ฮน โ„‚ i = koszulOrder q le (A * FreeAlgebra.ฮน โ„‚ i) := by let f : FreeAlgebra โ„‚ ๐“• โ†’โ‚—[โ„‚] FreeAlgebra โ„‚ ๐“• := { toFun := fun x => x * FreeAlgebra.ฮน โ„‚ i, map_add' := fun x y => by simp [add_mul], map_smul' := by simp} change (f โˆ˜โ‚— koszulOrder q le) A = (koszulOrder q le โˆ˜โ‚— f) A have f_single (l : FreeMonoid ๐“•) (x : โ„‚) : f ((FreeAlgebra.equivMonoidAlgebraFreeMonoid.symm (MonoidAlgebra.single l x))) = (FreeAlgebra.equivMonoidAlgebraFreeMonoid.symm (MonoidAlgebra.single (l.toList ++ [i]) x)) := by simp only [LinearMap.coe_mk, AddHom.coe_mk, f] have hf : FreeAlgebra.ฮน โ„‚ i = FreeAlgebra.equivMonoidAlgebraFreeMonoid.symm (MonoidAlgebra.single [i] 1) := by simp only [FreeAlgebra.equivMonoidAlgebraFreeMonoid, MonoidAlgebra.of_apply, AlgEquiv.ofAlgHom_symm_apply, MonoidAlgebra.lift_single, one_smul] rfl rw [hf] rw [@AlgEquiv.eq_symm_apply] simp only [map_mul, AlgEquiv.apply_symm_apply, MonoidAlgebra.single_mul_single, mul_one] rfl have h1 : f โˆ˜โ‚— koszulOrder q le = koszulOrder q le โˆ˜โ‚— f := by let e : FreeAlgebra โ„‚ ๐“• โ‰ƒโ‚—[โ„‚] MonoidAlgebra โ„‚ (FreeMonoid ๐“•) := FreeAlgebra.equivMonoidAlgebraFreeMonoid.toLinearEquiv apply (LinearEquiv.eq_comp_toLinearMap_iff (eโ‚โ‚‚ := e.symm) _ _).mp apply MonoidAlgebra.lhom_ext' intro l apply LinearMap.ext intro x simp only [LinearMap.coe_comp, LinearEquiv.coe_coe, Function.comp_apply, MonoidAlgebra.lsingle_apply] erw [koszulOrder_single] rw [f_single] erw [f_single] rw [koszulOrder_single] congr 3 ยท change (List.insertionSort le l) ++ [i] = List.insertionSort le (l.toList ++ [i]) have hoi (l : List ๐“•) (j : ๐“•) : List.orderedInsert le j (l ++ [i]) = List.orderedInsert le j l ++ [i] := by induction l with | nil => simp [hi] | cons b l ih => simp only [List.orderedInsert, List.append_eq] by_cases hr : le j b ยท rw [if_pos hr, if_pos hr] rfl ยท rw [if_neg hr, if_neg hr] rw [ih] rfl have hI (l : List ๐“•) : (List.insertionSort le l) ++ [i] = List.insertionSort le (l ++ [i]) := by induction l with | nil => rfl | cons j l ih => simp only [List.insertionSort, List.append_eq] rw [โ† ih] rw [hoi] rw [hI] rfl ยท have hI (l : List ๐“•) : koszulSign q le l = koszulSign q le (l ++ [i]) := by induction l with | nil => simp [koszulSign, koszulSignInsert] | cons j l ih => simp only [koszulSign, List.append_eq] rw [ih] simp only [mul_eq_mul_right_iff] apply Or.inl rw [koszulSignInsert_ge_forall_append q le l j i hi] rw [hI] rfl rw [h1] end end Wick