lemma quadForm_ext_eq_quadForm_blockII
(k : Nat) (Lk : Matrix (Vertex b k) (Vertex b k) ℝ)
(x : (sSplit (b := b) k).I → ℝ) :
let g : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I) → ℝ := fun s =>
match s with
| Sum.inl _ => 0
| Sum.inr i => x i
let f : Vertex b k → ℝ := fun v => g ((sSplit (b := b) k).e v)
PillarA.LayerA.quadForm Lk f =
PillarA.LayerA.quadForm ((sSplit (b := b) k).blockII Lk) x := by
classical
intro g f
change (∑ v : Vertex b k, f v * (∑ w : Vertex b k, Lk v w * f w))
= (∑ i : (sSplit (b := b) k).I,
x i * (∑ j : (sSplit (b := b) k).I, ((sSplit (b := b) k).blockII Lk) i j * x j))
have houter :
(∑ v : Vertex b k, f v * (∑ w : Vertex b k, Lk v w * f w))
=
(∑ s : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I),
f (((sSplit (b := b) k).e).symm s) *
(∑ w : Vertex b k, Lk (((sSplit (b := b) k).e).symm s) w * f w)) := by
simpa using
(Fintype.sum_equiv (sSplit (b := b) k).e
(fun v : Vertex b k => f v * (∑ w : Vertex b k, Lk v w * f w))
(fun s : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I) =>
f (((sSplit (b := b) k).e).symm s) *
(∑ w : Vertex b k,
Lk (((sSplit (b := b) k).e).symm s) w * f w))
(by intro v; simp))
have hinner :
∀ s : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I),
(∑ w : Vertex b k, Lk (((sSplit (b := b) k).e).symm s) w * f w)
=
(∑ t : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I),
Lk (((sSplit (b := b) k).e).symm s) (((sSplit (b := b) k).e).symm t) *
f (((sSplit (b := b) k).e).symm t))
:= by
intro s
simpa using
(Fintype.sum_equiv (sSplit (b := b) k).e
(fun w : Vertex b k => Lk (((sSplit (b := b) k).e).symm s) w * f w)
(fun t : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I) =>
Lk (((sSplit (b := b) k).e).symm s) (((sSplit (b := b) k).e).symm t) *
f (((sSplit (b := b) k).e).symm t))
(by intro w; simp))
have hf :
∀ s : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I),
f (((sSplit (b := b) k).e).symm s) = g s := by
intro s
simp [f]
have hLHS :
(∑ v : Vertex b k, f v * (∑ w : Vertex b k, Lk v w * f w))
=
(∑ s : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I),
g s * (∑ t : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I),
Lk (((sSplit (b := b) k).e).symm s) (((sSplit (b := b) k).e).symm t) * g t)) := by
calc
(∑ v : Vertex b k, f v * (∑ w : Vertex b k, Lk v w * f w))
=
(∑ s : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I),
f (((sSplit (b := b) k).e).symm s) *
(∑ w : Vertex b k, Lk (((sSplit (b := b) k).e).symm s) w * f w)) := houter
_ =
(∑ s : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I),
f (((sSplit (b := b) k).e).symm s) *
(∑ t : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I),
Lk (((sSplit (b := b) k).e).symm s) (((sSplit (b := b) k).e).symm t) *
f (((sSplit (b := b) k).e).symm t)))
:= by
refine Fintype.sum_congr
(fun s : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I) =>
f (((sSplit (b := b) k).e).symm s) *
(∑ w : Vertex b k,
Lk (((sSplit (b := b) k).e).symm s) w * f w))
(fun s : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I) =>
f (((sSplit (b := b) k).e).symm s) *
(∑ t : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I),
Lk (((sSplit (b := b) k).e).symm s) (((sSplit (b := b) k).e).symm t) *
f (((sSplit (b := b) k).e).symm t)))
(by
intro s
exact congrArg (fun z => f (((sSplit (b := b) k).e).symm s) * z) (hinner s))
_ = _ := by
simp [hf]
have hSplitOuter :
(∑ s : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I),
g s * (∑ t : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I),
Lk (((sSplit (b := b) k).e).symm s) (((sSplit (b := b) k).e).symm t) * g t))
=
(∑ bb : (sSplit (b := b) k).B,
g (Sum.inl bb) * (∑ t : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I),
Lk (((sSplit (b := b) k).e).symm (Sum.inl bb)) (((sSplit (b := b) k).e).symm t) * g t))
+
(∑ ii : (sSplit (b := b) k).I,
g (Sum.inr ii) * (∑ t : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I),
Lk (((sSplit (b := b) k).e).symm (Sum.inr ii))
(((sSplit (b := b) k).e).symm t) * g t))
:= by
simp [Fintype.sum_sum_type]
have hInnerI :
∀ ii : (sSplit (b := b) k).I,
(∑ t : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I),
Lk (((sSplit (b := b) k).e).symm (Sum.inr ii)) (((sSplit (b := b) k).e).symm t) * g t)
=
(∑ jj : (sSplit (b := b) k).I,
Lk (((sSplit (b := b) k).e).symm (Sum.inr ii))
(((sSplit (b := b) k).e).symm (Sum.inr jj)) * x jj)
:= by
intro ii
calc
(∑ t : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I),
Lk (((sSplit (b := b) k).e).symm (Sum.inr ii)) (((sSplit (b := b) k).e).symm t) * g t)
=
(∑ bb : (sSplit (b := b) k).B,
Lk (((sSplit (b := b) k).e).symm (Sum.inr ii))
(((sSplit (b := b) k).e).symm (Sum.inl bb)) * g (Sum.inl bb))
+
(∑ jj : (sSplit (b := b) k).I,
Lk (((sSplit (b := b) k).e).symm (Sum.inr ii))
(((sSplit (b := b) k).e).symm (Sum.inr jj)) * g (Sum.inr jj))
:= by
simp [Fintype.sum_sum_type]
_ =
(∑ jj : (sSplit (b := b) k).I,
Lk (((sSplit (b := b) k).e).symm (Sum.inr ii))
(((sSplit (b := b) k).e).symm (Sum.inr jj)) * x jj)
:= by
simp [g]
calc
(∑ v : Vertex b k, f v * (∑ w : Vertex b k, Lk v w * f w))
=
(∑ s : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I),
g s * (∑ t : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I),
Lk (((sSplit (b := b) k).e).symm s) (((sSplit (b := b) k).e).symm t) * g t)) := hLHS
_ =
(∑ bb : (sSplit (b := b) k).B,
g (Sum.inl bb) * (∑ t : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I),
Lk (((sSplit (b := b) k).e).symm (Sum.inl bb)) (((sSplit (b := b) k).e).symm t) * g t))
+
(∑ ii : (sSplit (b := b) k).I,
g (Sum.inr ii) * (∑ t : Sum ((sSplit (b := b) k).B) ((sSplit (b := b) k).I),
Lk (((sSplit (b := b) k).e).symm (Sum.inr ii))
(((sSplit (b := b) k).e).symm t) * g t)) := hSplitOuter
_ =
(∑ ii : (sSplit (b := b) k).I,
x ii * (∑ jj : (sSplit (b := b) k).I,
Lk (((sSplit (b := b) k).e).symm (Sum.inr ii))
(((sSplit (b := b) k).e).symm (Sum.inr jj)) * x jj))
:= by
simp [g, hInnerI]
_ =
(∑ ii : (sSplit (b := b) k).I,
x ii * (∑ jj : (sSplit (b := b) k).I, ((sSplit (b := b) k).blockII Lk) ii jj * x jj)) := by
simp [PillarA.OQS.Split.blockII, PillarA.OQS.Split.reindex, Matrix.reindex]