Skip to content

Commit d130e8e

Browse files
committed
EuclideanSpace outerProduct properties
1 parent d91d760 commit d130e8e

1 file changed

Lines changed: 76 additions & 7 deletions

File tree

QCLib/LinearAlgebra/StdBasis.lean

Lines changed: 76 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3639
public section
3740

38-
open EuclideanSpace
41+
open EuclideanSpace PiOuterProduct Function
3942

4043
variable {ι : 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

56125
noncomputable def BasisVector (i : ι) :=
57126
basisFun ι ℂ i

0 commit comments

Comments
 (0)