Imports
/- 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 -/ module public import Physlib.QFT.PerturbationTheory.FieldStatistics.Basic public import Mathlib.Data.Finset.Sort

Field statistics of a finite set.

@[expose] public section

The field statistic associated with a map f : Fin n → 𝓕 (usually .get of a list) and a finite set of elements of Fin n.

def ofFinset {n : ℕ} (q : 𝓕 → FieldStatistic) (f : Fin n → 𝓕) (a : Finset (Fin n)) : FieldStatistic := ofList q ((a.sort (· ≤ ·)).map f)
@[simp] lemma ofFinset_empty (q : 𝓕 → FieldStatistic) (f : Fin n → 𝓕) : ofFinset q f ∅ = 1 := 𝓕:Typen:ℕq:𝓕 → FieldStatisticf:Fin n → 𝓕⊢ ofFinset q f ∅ = 1 𝓕:Typen:ℕq:𝓕 → FieldStatisticf:Fin n → 𝓕⊢ bosonic = 1 All goals completed! 🐙lemma ofFinset_singleton {n : ℕ} (q : 𝓕 → FieldStatistic) (f : Fin n → 𝓕) (i : Fin n) : ofFinset q f {i} = q (f i) := 𝓕:Typen:ℕq:𝓕 → FieldStatisticf:Fin n → 𝓕i:Fin n⊢ ofFinset q f {i} = q (f i) All goals completed! 🐙𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ (List.map f (List.map i (a.sort fun x1 x2 => x1 ≤ x2))).Perm (List.map f ((Finset.map { toFun := i, inj' := hi } a).sort fun x1 x2 => x1 ≤ x2)) 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ (List.map i (a.sort fun x1 x2 => x1 ≤ x2)).Perm ((Finset.map { toFun := i, inj' := hi } a).sort fun x1 x2 => x1 ≤ x2) 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ (List.map i (a.sort fun x1 x2 => x1 ≤ x2)).Nodup𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ ((Finset.map { toFun := i, inj' := hi } a).sort fun x1 x2 => x1 ≤ x2).Nodup𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ (List.map i (a.sort fun x1 x2 => x1 ≤ x2)).toFinset = ((Finset.map { toFun := i, inj' := hi } a).sort fun x1 x2 => x1 ≤ x2).toFinset 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ (List.map i (a.sort fun x1 x2 => x1 ≤ x2)).Nodup 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ (a.sort fun x1 x2 => x1 ≤ x2).Nodup𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ ∀ x ∈ a.sort fun x1 x2 => x1 ≤ x2, ∀ y ∈ a.sort fun x1 x2 => x1 ≤ x2, i x = i y → x = y 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ ∀ x ∈ a.sort fun x1 x2 => x1 ≤ x2, ∀ y ∈ a.sort fun x1 x2 => x1 ≤ x2, i x = i y → x = y 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ ∀ x ∈ a, ∀ y ∈ a, i x = i y → x = y 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)x:Fin mhx:x ∈ ay:Fin mhy:y ∈ a⊢ i x = i y → x = y All goals completed! 🐙 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ ((Finset.map { toFun := i, inj' := hi } a).sort fun x1 x2 => x1 ≤ x2).Nodup All goals completed! 🐙 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a:Finset (Fin m)⊢ (List.map i (a.sort fun x1 x2 => x1 ≤ x2)).toFinset = ((Finset.map { toFun := i, inj' := hi } a).sort fun x1 x2 => x1 ≤ x2).toFinset 𝓕:Typen:ℕm:ℕq:𝓕 → FieldStatistici:Fin m → Fin nhi:Function.Injective if:Fin n → 𝓕a✝:Finset (Fin m)a:Fin n⊢ a ∈ (List.map i (a✝.sort fun x1 x2 => x1 ≤ x2)).toFinset ↔ a ∈ ((Finset.map { toFun := i, inj' := hi } a✝).sort fun x1 x2 => x1 ≤ x2).toFinset All goals completed! 🐙𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ ofList q (List.map φs.get ((insert i a).sort fun x1 x2 => x1 ≤ x2)) = ofList q (φs[↑i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2)) erw [𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ ofList q (List.map φs.get ((insert i a).sort fun x1 x2 => x1 ≤ x2)) = ofList q (List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2))𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ ofList q (List.map φs.get ((insert i a).sort fun x1 x2 => x1 ≤ x2)) = ofList q (List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)) 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ (List.map φs.get ((insert i a).sort fun x1 x2 => x1 ≤ x2)).Perm (List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)) 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ ((insert i a).sort fun x1 x2 => x1 ≤ x2).Perm (i :: a.sort fun x1 x2 => x1 ≤ x2) 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ ((insert i a).sort fun x1 x2 => x1 ≤ x2).Nodup𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ (i :: a.sort fun x1 x2 => x1 ≤ x2).Nodup𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ ∀ (a_1 : Fin φs.length), (a_1 ∈ (insert i a).sort fun x1 x2 => x1 ≤ x2) ↔ a_1 ∈ i :: a.sort fun x1 x2 => x1 ≤ x2 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ ((insert i a).sort fun x1 x2 => x1 ≤ x2).Nodup All goals completed! 🐙 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ (i :: a.sort fun x1 x2 => x1 ≤ x2).Nodup 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)⊢ i ∉ a All goals completed! 🐙 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a✝:Finset (Fin φs.length)i:Fin φs.lengthh:i ∉ ah1:φs[i] :: List.map φs.get (a.sort fun x1 x2 => x1 ≤ x2) = List.map φs.get (i :: a.sort fun x1 x2 => x1 ≤ x2)a:Fin φs.length⊢ (a ∈ (insert i a✝).sort fun x1 x2 => x1 ≤ x2) ↔ a ∈ i :: a✝.sort fun x1 x2 => x1 ≤ x2 All goals completed! 🐙𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∈ aha:a = insert i (a.erase i)⊢ ofFinset q φs.get (a.erase i) = q φs[i] * q φs[i] * ofFinset q φs.get (a.erase i)𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∈ aha:a = insert i (a.erase i)⊢ i ∉ a.erase i 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.lengthh:i ∈ aha:a = insert i (a.erase i)⊢ i ∉ a.erase i All goals completed! 🐙𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)⊢ (∏ i, if i ∈ a.sort fun x1 x2 => x1 ≤ x2 then q φs[i] else 1) = ∏ i, if i ∈ a then q φs[i] else 1𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)⊢ (a.sort fun x1 x2 => x1 ≤ x2).Nodup 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)⊢ (fun i => if i ∈ a.sort fun x1 x2 => x1 ≤ x2 then q φs[i] else 1) = fun i => if i ∈ a then q φs[i] else 1𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)⊢ (a.sort fun x1 x2 => x1 ≤ x2).Nodup 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)i:Fin φs.length⊢ (if i ∈ a.sort fun x1 x2 => x1 ≤ x2 then q φs[i] else 1) = if i ∈ a then q φs[i] else 1𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)⊢ (a.sort fun x1 x2 => x1 ≤ x2).Nodup 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)⊢ (a.sort fun x1 x2 => x1 ≤ x2).Nodup All goals completed! 🐙𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)⊢ (∏ x, (if x ∈ a then q φs[x] else 1) * if x ∈ b then q φs[x] else 1) = ∏ i, if i ∈ (a ∪ b) \ (a ∩ b) then q φs[i] else 1 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)⊢ (fun x => (if x ∈ a then q φs[x] else 1) * if x ∈ b then q φs[x] else 1) = fun i => if i ∈ (a ∪ b) \ (a ∩ b) then q φs[i] else 1 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)x:Fin φs.length⊢ ((if x ∈ a then q φs[x] else 1) * if x ∈ b then q φs[x] else 1) = if x ∈ (a ∪ b) \ (a ∩ b) then q φs[x] else 1 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)x:Fin φs.length⊢ (if x ∈ b then if x ∈ a then 1 else q φs[↑x] else if x ∈ a then q φs[↑x] else 1) = if (x ∈ a ∨ x ∈ b) ∧ (x ∈ a → x ∉ b) then q φs[↑x] else 1 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)x:Fin φs.lengthh✝:x ∈ b⊢ (if x ∈ a then 1 else q φs[↑x]) = if (x ∈ a ∨ x ∈ b) ∧ (x ∈ a → x ∉ b) then q φs[↑x] else 1𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)x:Fin φs.lengthh✝:x ∉ b⊢ (if x ∈ a then q φs[↑x] else 1) = if (x ∈ a ∨ x ∈ b) ∧ (x ∈ a → x ∉ b) then q φs[↑x] else 1 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)x:Fin φs.lengthh✝:x ∈ b⊢ (if x ∈ a then 1 else q φs[↑x]) = if (x ∈ a ∨ x ∈ b) ∧ (x ∈ a → x ∉ b) then q φs[↑x] else 1 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)x:Fin φs.lengthh:x ∈ b⊢ (if x ∈ a then 1 else q φs[↑x]) = if (x ∈ a ∨ x ∈ b) ∧ (x ∈ a → x ∉ b) then q φs[↑x] else 1 All goals completed! 🐙 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)x:Fin φs.lengthh✝:x ∉ b⊢ (if x ∈ a then q φs[↑x] else 1) = if (x ∈ a ∨ x ∈ b) ∧ (x ∈ a → x ∉ b) then q φs[↑x] else 1 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)x:Fin φs.lengthh:x ∉ b⊢ (if x ∈ a then q φs[↑x] else 1) = if (x ∈ a ∨ x ∈ b) ∧ (x ∈ a → x ∉ b) then q φs[↑x] else 1 All goals completed! 🐙𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)b:Finset (Fin φs.length)h:Disjoint a b⊢ ofFinset q φs.get ((a ∪ b) \ ∅) = ofFinset q φs.get (a ∪ b) All goals completed! 🐙𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ ofFinset q φs.get (Finset.filter p a ∪ {i ∈ a | ¬p i}) = ofFinset q φs.get a𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ Disjoint (Finset.filter p a) ({i ∈ a | ¬p i}) 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ Finset.filter p a ∪ {i ∈ a | ¬p i} = a𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ Disjoint (Finset.filter p a) ({i ∈ a | ¬p i}) 𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ Disjoint (Finset.filter p a) ({i ∈ a | ¬p i}) All goals completed! 🐙𝓕:Typeq:𝓕 → FieldStatisticφs:List 𝓕a:Finset (Fin φs.length)p:Fin φs.length → Propinst✝:DecidablePred p⊢ ofFinset q φs.get (Finset.filter p a) = ofFinset q φs.get ({i ∈ a | ¬p i}) * ofFinset q φs.get ({i ∈ a | ¬p i}) * ofFinset q φs.get (Finset.filter p a) All goals completed! 🐙