@@ -20,10 +20,13 @@ import QCLib.Mathlib.Lemmas
2020* `BasisVector`, a synonym for `Pi.basisFun ℂ`
2121* `Qubit` for `Fin 2`, so that the vector space for a single qubit is `Qubit → ℂ`
2222* `Register n` for `(Fin n) → Qubit`, so that the vector space for `n` qubits is `Register n → ℂ`
23+ * `PiOuterPrdocutInst` A type class instance that provides outer product notation
24+ for dependent families of `EuclideanSpace` vectors.
2325
2426 ## Main results
2527
2628* `basisVector_eq_prod` standard basis functions factorize
29+ * `PiOuterProduct.toMultilinearMap` Outer products as multilinear maps.
2730
2831 This file also collects `•` application
2932
@@ -35,23 +38,89 @@ This file also collects `•` application
3538
3639public section
3740
38- open EuclideanSpace
41+ open EuclideanSpace PiOuterProduct Function
3942
4043variable {ι : Type *} [Fintype ι]
4144
42- namespace PiOuterProduct
45+ namespace EuclideanSpace
4346
44- variable {α : Type *} [CommMonoid α] (l : ι → Type *)
47+ variable {α : Type *} (l : ι → Type *)
4548
46- instance : PiOuterProduct (fun i => EuclideanSpace α (l i)) (EuclideanSpace α (Π i, l i)) where
49+ @[simp]
50+ theorem ofLp_update_apply {ι : Type *} [DecidableEq ι] {l : ι → Type *}
51+ (f : Π i, EuclideanSpace α (l i)) (i' : ι) (x : EuclideanSpace α (l i'))
52+ (j : Π i, l i) (i : ι) :
53+ (update f i' x i).ofLp (j i)
54+ = update (fun i ↦ (f i).ofLp (j i)) i' (x.ofLp (j i')) i :=
55+ apply_update (fun i (v : EuclideanSpace α (l i)) ↦ v.ofLp (j i)) f i' x i
56+
57+ instance PiOuterPrdocutInst [CommMonoid α] :
58+ PiOuterProduct (fun i => EuclideanSpace α (l i)) (EuclideanSpace α (Π i, l i)) where
4759 tprod f := WithLp.toLp 2 (⨂ i, ((f i) : (l i → α)))
4860
4961@[simp]
50- theorem piOuterProduct_ofLp_apply (f : (i : ι) → EuclideanSpace α (l i)) (j) :
51- (⨂ i, f i ).ofLp j = ∏ i, f i (j i) := by
62+ theorem piOuterProduct_apply [CommMonoid α] (f : (i : ι) → EuclideanSpace α (l i)) (j) :
63+ (⨂ i, f i).ofLp j = ∏ i, f i (j i) := by
5264 simp [PiOuterProduct.tprod, ← Multiset.prod_eq_foldr]
5365
54- end PiOuterProduct
66+ @[simp]
67+ theorem piOuterProduct_one [CommMonoid α] :
68+ (⨂ i, (WithLp.toLp 2 (1 : l i → α) : EuclideanSpace α (l i)))
69+ = (WithLp.toLp 2 (1 : (Π i, l i) → α) : EuclideanSpace α (Π i, l i)) := by
70+ ext j
71+ simp
72+
73+ @[simp]
74+ theorem piOuterProduct_zero [CommMonoidWithZero α] (f : Π i, EuclideanSpace α (l i))
75+ (h : ∃ i, f i = (WithLp.toLp 2 (0 : l i → α) : EuclideanSpace α (l i))) :
76+ (⨂ i, f i) = (WithLp.toLp 2 (0 : (Π i, l i) → α) : EuclideanSpace α (Π i, l i)) := by
77+ ext j
78+ obtain ⟨i, hi⟩ := h
79+ rw [piOuterProduct_apply]
80+ exact Finset.prod_eq_zero (Finset.mem_univ i) (by simp [hi])
81+
82+ @[simp]
83+ theorem piOuterProduct_smul [CommSemiring α] [DecidableEq ι]
84+ (f : Π i, EuclideanSpace α (l i)) (i : ι) (s : α)
85+ (x : EuclideanSpace α (l i)) :
86+ (⨂ j, (update f i (s • x)) j) = s • (⨂ j, (update f i x) j) := by
87+ ext
88+ simp [Finset.prod_update_of_mem, mul_assoc]
89+
90+ -- Lean only synthesizes `Add` under `SeminormedAddCommGroup` assumption.
91+ -- See `PiLp.add_apply`. Investigate why?
92+ @[simp]
93+ theorem piOuterProduct_add [DecidableEq ι] [CommMonoid α]
94+ [SeminormedAddCommGroup α] [RightDistribClass α]
95+ (f : Π i, EuclideanSpace α (l i)) (i : ι) (x y : EuclideanSpace α (l i)) :
96+ (⨂ j, (update f i (x + y)) j) = (⨂ j, (update f i x) j) + (⨂ j, (update f i y) j) := by
97+ ext
98+ simp [Finset.prod_update_of_mem, add_mul]
99+
100+ @ [simps, expose]
101+ def PiOuterProduct.toMultilinearMap [SeminormedCommRing α] :
102+ MultilinearMap α (fun i => EuclideanSpace α (l i)) (EuclideanSpace α (Π i, l i)) where
103+ toFun f := ⨂ i, f i
104+ map_update_add' := by simp
105+ map_update_smul' := by simp
106+
107+ theorem piOuterProduct_smul_univ [SeminormedCommRing α] (c : ι → α)
108+ (f : Π i, EuclideanSpace α (l i)) :
109+ (⨂ i, c i • f i) = (∏ i, c i) • (⨂ i, f i) := by
110+ simp [← EuclideanSpace.PiOuterProduct.toMultilinearMap_apply, MultilinearMap.map_smul_univ]
111+
112+ theorem piOuterProduct_smul_const [SeminormedCommRing α] (a : α)
113+ (f : Π i, EuclideanSpace α (l i)) :
114+ (⨂ i, a • f i) = a ^ (Fintype.card ι) • (⨂ i, f i) := by
115+ simp [piOuterProduct_smul_univ]
116+
117+ theorem piOuterProduct_univ_sum [DecidableEq ι] [SeminormedCommRing α] {κ : Type *} [Fintype κ]
118+ (g : (i : ι) → κ → EuclideanSpace α (l i)) :
119+ (⨂ i, ∑ j : κ, g i j) = ∑ k : (ι → κ), ⨂ i, g i (k i) := by
120+ ext x
121+ simp [piOuterProduct_apply, Fintype.prod_sum]
122+
123+ end EuclideanSpace
55124
56125noncomputable def BasisVector (i : ι) :=
57126 basisFun ι ℂ i
0 commit comments