Theorem: AffineBasis.affineSpan_eq_top_of_toMatrix_left_inv
File: Mathlib/LinearAlgebra/AffineSpace/Matrix.lean

tactic: suffices ∀ i, b i ∈ affineSpan k (range p) by
  rw [eq_top_iff, ← b.tot, affineSpan_le]
  rintro q ⟨i, rfl⟩
  exact this i
state_before: ι : Type u₁
k : Type u₂
V : Type u₃
P : Type u₄
inst✝⁷ : AddCommGroup V
inst✝⁶ : AffineSpace V P
inst✝⁵ : Ring k
inst✝⁴ : Module k V
b : AffineBasis ι k P
ι' : Type u_1
inst✝³ : Fintype ι'
inst✝² : Fintype ι
b₂ : AffineBasis ι k P
inst✝¹ : DecidableEq ι
inst✝ : Nontrivial k
p : ι' → P
A : Matrix ι ι' k
hA : A ⬝ toMatrix b p = 1
⊢ affineSpan k (range p) = ⊤

tactic: intro i
state_before: ι : Type u₁
k : Type u₂
V : Type u₃
P : Type u₄
inst✝⁷ : AddCommGroup V
inst✝⁶ : AffineSpace V P
inst✝⁵ : Ring k
inst✝⁴ : Module k V
b : AffineBasis ι k P
ι' : Type u_1
inst✝³ : Fintype ι'
inst✝² : Fintype ι
b₂ : AffineBasis ι k P
inst✝¹ : DecidableEq ι
inst✝ : Nontrivial k
p : ι' → P
A : Matrix ι ι' k
hA : A ⬝ toMatrix b p = 1
⊢ ∀ (i : ι), ↑b i ∈ affineSpan k (range p)

tactic: have hAi : (∑ j, A i j) = 1 := by
  calc
    (∑ j, A i j) = ∑ j, A i j * ∑ l, b.toMatrix p j l := by simp
    _ = ∑ j, ∑ l, A i j * b.toMatrix p j l := by simp_rw [Finset.mul_sum]
    _ = ∑ l, ∑ j, A i j * b.toMatrix p j l := by rw [Finset.sum_comm]
    _ = ∑ l, (A ⬝ b.toMatrix p) i l := rfl
    _ = 1 := by simp [hA, Matrix.one_apply, Finset.filter_eq]
state_before: ι : Type u₁
k : Type u₂
V : Type u₃
P : Type u₄
inst✝⁷ : AddCommGroup V
inst✝⁶ : AffineSpace V P
inst✝⁵ : Ring k
inst✝⁴ : Module k V
b : AffineBasis ι k P
ι' : Type u_1
inst✝³ : Fintype ι'
inst✝² : Fintype ι
b₂ : AffineBasis ι k P
inst✝¹ : DecidableEq ι
inst✝ : Nontrivial k
p : ι' → P
A : Matrix ι ι' k
hA : A ⬝ toMatrix b p = 1
i : ι
⊢ ↑b i ∈ affineSpan k (range p)

tactic: have hbi : b i = Finset.univ.affineCombination k p (A i) := by
  apply b.ext_elem
  intro j
  rw [b.coord_apply, Finset.univ.map_affineCombination _ _ hAi,
    Finset.univ.affineCombination_eq_linear_combination _ _ hAi]
  change _ = (A ⬝ b.toMatrix p) i j
  simp_rw [hA, Matrix.one_apply, @eq_comm _ i j]
state_before: ι : Type u₁
k : Type u₂
V : Type u₃
P : Type u₄
inst✝⁷ : AddCommGroup V
inst✝⁶ : AffineSpace V P
inst✝⁵ : Ring k
inst✝⁴ : Module k V
b : AffineBasis ι k P
ι' : Type u_1
inst✝³ : Fintype ι'
inst✝² : Fintype ι
b₂ : AffineBasis ι k P
inst✝¹ : DecidableEq ι
inst✝ : Nontrivial k
p : ι' → P
A : Matrix ι ι' k
hA : A ⬝ toMatrix b p = 1
i : ι
hAi : ∑ j : ι', A i j = 1
⊢ ↑b i ∈ affineSpan k (range p)

tactic: rw [hbi]
state_before: ι : Type u₁
k : Type u₂
V : Type u₃
P : Type u₄
inst✝⁷ : AddCommGroup V
inst✝⁶ : AffineSpace V P
inst✝⁵ : Ring k
inst✝⁴ : Module k V
b : AffineBasis ι k P
ι' : Type u_1
inst✝³ : Fintype ι'
inst✝² : Fintype ι
b₂ : AffineBasis ι k P
inst✝¹ : DecidableEq ι
inst✝ : Nontrivial k
p : ι' → P
A : Matrix ι ι' k
hA : A ⬝ toMatrix b p = 1
i : ι
hAi : ∑ j : ι', A i j = 1
hbi : ↑b i = ↑(Finset.affineCombination k Finset.univ p) (A i)
⊢ ↑b i ∈ affineSpan k (range p)

tactic: exact affineCombination_mem_affineSpan hAi p
state_before: ι : Type u₁
k : Type u₂
V : Type u₃
P : Type u₄
inst✝⁷ : AddCommGroup V
inst✝⁶ : AffineSpace V P
inst✝⁵ : Ring k
inst✝⁴ : Module k V
b : AffineBasis ι k P
ι' : Type u_1
inst✝³ : Fintype ι'
inst✝² : Fintype ι
b₂ : AffineBasis ι k P
inst✝¹ : DecidableEq ι
inst✝ : Nontrivial k
p : ι' → P
A : Matrix ι ι' k
hA : A ⬝ toMatrix b p = 1
i : ι
hAi : ∑ j : ι', A i j = 1
hbi : ↑b i = ↑(Finset.affineCombination k Finset.univ p) (A i)
⊢ ↑(Finset.affineCombination k Finset.univ p) (A i) ∈ affineSpan k (range p)

tactic: rw [eq_top_iff, ← b.tot, affineSpan_le]
state_before: ι : Type u₁
k : Type u₂
V : Type u₃
P : Type u₄
inst✝⁷ : AddCommGroup V
inst✝⁶ : AffineSpace V P
inst✝⁵ : Ring k
inst✝⁴ : Module k V
b : AffineBasis ι k P
ι' : Type u_1
inst✝³ : Fintype ι'
inst✝² : Fintype ι
b₂ : AffineBasis ι k P
inst✝¹ : DecidableEq ι
inst✝ : Nontrivial k
p : ι' → P
A : Matrix ι ι' k
hA : A ⬝ toMatrix b p = 1
this : ∀ (i : ι), ↑b i ∈ affineSpan k (range p)
⊢ affineSpan k (range p) = ⊤

tactic: rintro q ⟨i, rfl⟩
state_before: ι : Type u₁
k : Type u₂
V : Type u₃
P : Type u₄
inst✝⁷ : AddCommGroup V
inst✝⁶ : AffineSpace V P
inst✝⁵ : Ring k
inst✝⁴ : Module k V
b : AffineBasis ι k P
ι' : Type u_1
inst✝³ : Fintype ι'
inst✝² : Fintype ι
b₂ : AffineBasis ι k P
inst✝¹ : DecidableEq ι
inst✝ : Nontrivial k
p : ι' → P
A : Matrix ι ι' k
hA : A ⬝ toMatrix b p = 1
this : ∀ (i : ι), ↑b i ∈ affineSpan k (range p)
⊢ range ↑b ⊆ ↑(affineSpan k (range p))

tactic: exact this i
state_before: case intro
ι : Type u₁
k : Type u₂
V : Type u₃
P : Type u₄
inst✝⁷ : AddCommGroup V
inst✝⁶ : AffineSpace V P
inst✝⁵ : Ring k
inst✝⁴ : Module k V
b : AffineBasis ι k P
ι' : Type u_1
inst✝³ : Fintype ι'
inst✝² : Fintype ι
b₂ : AffineBasis ι k P
inst✝¹ : DecidableEq ι
inst✝ : Nontrivial k
p : ι' → P
A : Matrix ι ι' k
hA : A ⬝ toMatrix b p = 1
this : ∀ (i : ι), ↑b i ∈ affineSpan k (range p)
i : ι
⊢ ↑b i ∈ ↑(affineSpan k (range p))

tactic: calc
  (∑ j, A i j) = ∑ j, A i j * ∑ l, b.toMatrix p j l := by simp
  _ = ∑ j, ∑ l, A i j * b.toMatrix p j l := by simp_rw [Finset.mul_sum]
  _ = ∑ l, ∑ j, A i j * b.toMatrix p j l := by rw [Finset.sum_comm]
  _ = ∑ l, (A ⬝ b.toMatrix p) i l := rfl
  _ = 1 := by simp [hA, Matrix.one_apply, Finset.filter_eq]
state_before: ι : Type u₁
k : Type u₂
V : Type u₃
P : Type u₄
inst✝⁷ : AddCommGroup V
inst✝⁶ : AffineSpace V P
inst✝⁵ : Ring k
inst✝⁴ : Module k V
b : AffineBasis ι k P
ι' : Type u_1
inst✝³ : Fintype ι'
inst✝² : Fintype ι
b₂ : AffineBasis ι k P
inst✝¹ : DecidableEq ι
inst✝ : Nontrivial k
p : ι' → P
A : Matrix ι ι' k
hA : A ⬝ toMatrix b p = 1
i : ι
⊢ ∑ j : ι', A i j = 1

tactic: simp
state_before: ι : Type u₁
k : Type u₂
V : Type u₃
P : Type u₄
inst✝⁷ : AddCommGroup V
inst✝⁶ : AffineSpace V P
inst✝⁵ : Ring k
inst✝⁴ : Module k V
b : AffineBasis ι k P
ι' : Type u_1
inst✝³ : Fintype ι'
inst✝² : Fintype ι
b₂ : AffineBasis ι k P
inst✝¹ : DecidableEq ι
inst✝ : Nontrivial k
p : ι' → P
A : Matrix ι ι' k
hA : A ⬝ toMatrix b p = 1
i : ι
⊢ ∑ j : ι', A i j = ∑ j : ι', A i j * ∑ l : ι, toMatrix b p j l

tactic: simp_rw [Finset.mul_sum]
state_before: ι : Type u₁
k : Type u₂
V : Type u₃
P : Type u₄
inst✝⁷ : AddCommGroup V
inst✝⁶ : AffineSpace V P
inst✝⁵ : Ring k
inst✝⁴ : Module k V
b : AffineBasis ι k P
ι' : Type u_1
inst✝³ : Fintype ι'
inst✝² : Fintype ι
b₂ : AffineBasis ι k P
inst✝¹ : DecidableEq ι
inst✝ : Nontrivial k
p : ι' → P
A : Matrix ι ι' k
hA : A ⬝ toMatrix b p = 1
i : ι
⊢ ∑ j : ι', A i j * ∑ l : ι, toMatrix b p j l = ∑ j : ι', ∑ l : ι, A i j * toMatrix b p j l

tactic: rw [Finset.sum_comm]
state_before: ι : Type u₁
k : Type u₂
V : Type u₃
P : Type u₄
inst✝⁷ : AddCommGroup V
inst✝⁶ : AffineSpace V P
inst✝⁵ : Ring k
inst✝⁴ : Module k V
b : AffineBasis ι k P
ι' : Type u_1
inst✝³ : Fintype ι'
inst✝² : Fintype ι
b₂ : AffineBasis ι k P
inst✝¹ : DecidableEq ι
inst✝ : Nontrivial k
p : ι' → P
A : Matrix ι ι' k
hA : A ⬝ toMatrix b p = 1
i : ι
⊢ ∑ j : ι', ∑ l : ι, A i j * toMatrix b p j l = ∑ l : ι, ∑ j : ι', A i j * toMatrix b p j l

tactic: simp [hA, Matrix.one_apply, Finset.filter_eq]
state_before: ι : Type u₁
k : Type u₂
V : Type u₃
P : Type u₄
inst✝⁷ : AddCommGroup V
inst✝⁶ : AffineSpace V P
inst✝⁵ : Ring k
inst✝⁴ : Module k V
b : AffineBasis ι k P
ι' : Type u_1
inst✝³ : Fintype ι'
inst✝² : Fintype ι
b₂ : AffineBasis ι k P
inst✝¹ : DecidableEq ι
inst✝ : Nontrivial k
p : ι' → P
A : Matrix ι ι' k
hA : A ⬝ toMatrix b p = 1
i : ι
⊢ ∑ l : ι, (A ⬝ toMatrix b p) i l = 1

tactic: apply b.ext_elem
state_before: ι : Type u₁
k : Type u₂
V : Type u₃
P : Type u₄
inst✝⁷ : AddCommGroup V
inst✝⁶ : AffineSpace V P
inst✝⁵ : Ring k
inst✝⁴ : Module k V
b : AffineBasis ι k P
ι' : Type u_1
inst✝³ : Fintype ι'
inst✝² : Fintype ι
b₂ : AffineBasis ι k P
inst✝¹ : DecidableEq ι
inst✝ : Nontrivial k
p : ι' → P
A : Matrix ι ι' k
hA : A ⬝ toMatrix b p = 1
i : ι
hAi : ∑ j : ι', A i j = 1
⊢ ↑b i = ↑(Finset.affineCombination k Finset.univ p) (A i)

tactic: intro j
state_before: ι : Type u₁
k : Type u₂
V : Type u₃
P : Type u₄
inst✝⁷ : AddCommGroup V
inst✝⁶ : AffineSpace V P
inst✝⁵ : Ring k
inst✝⁴ : Module k V
b : AffineBasis ι k P
ι' : Type u_1
inst✝³ : Fintype ι'
inst✝² : Fintype ι
b₂ : AffineBasis ι k P
inst✝¹ : DecidableEq ι
inst✝ : Nontrivial k
p : ι' → P
A : Matrix ι ι' k
hA : A ⬝ toMatrix b p = 1
i : ι
hAi : ∑ j : ι', A i j = 1
⊢ ∀ (i_1 : ι), ↑(coord b i_1) (↑b i) = ↑(coord b i_1) (↑(Finset.affineCombination k Finset.univ p) (A i))

tactic: rw [b.coord_apply, Finset.univ.map_affineCombination _ _ hAi,
  Finset.univ.affineCombination_eq_linear_combination _ _ hAi]
state_before: ι : Type u₁
k : Type u₂
V : Type u₃
P : Type u₄
inst✝⁷ : AddCommGroup V
inst✝⁶ : AffineSpace V P
inst✝⁵ : Ring k
inst✝⁴ : Module k V
b : AffineBasis ι k P
ι' : Type u_1
inst✝³ : Fintype ι'
inst✝² : Fintype ι
b₂ : AffineBasis ι k P
inst✝¹ : DecidableEq ι
inst✝ : Nontrivial k
p : ι' → P
A : Matrix ι ι' k
hA : A ⬝ toMatrix b p = 1
i : ι
hAi : ∑ j : ι', A i j = 1
j : ι
⊢ ↑(coord b j) (↑b i) = ↑(coord b j) (↑(Finset.affineCombination k Finset.univ p) (A i))

tactic: change _ = (A ⬝ b.toMatrix p) i j
state_before: ι : Type u₁
k : Type u₂
V : Type u₃
P : Type u₄
inst✝⁷ : AddCommGroup V
inst✝⁶ : AffineSpace V P
inst✝⁵ : Ring k
inst✝⁴ : Module k V
b : AffineBasis ι k P
ι' : Type u_1
inst✝³ : Fintype ι'
inst✝² : Fintype ι
b₂ : AffineBasis ι k P
inst✝¹ : DecidableEq ι
inst✝ : Nontrivial k
p : ι' → P
A : Matrix ι ι' k
hA : A ⬝ toMatrix b p = 1
i : ι
hAi : ∑ j : ι', A i j = 1
j : ι
⊢ (if j = i then 1 else 0) = ∑ i_1 : ι', A i i_1 • (↑(coord b j) ∘ p) i_1

tactic: simp_rw [hA, Matrix.one_apply, @eq_comm _ i j]
state_before: ι : Type u₁
k : Type u₂
V : Type u₃
P : Type u₄
inst✝⁷ : AddCommGroup V
inst✝⁶ : AffineSpace V P
inst✝⁵ : Ring k
inst✝⁴ : Module k V
b : AffineBasis ι k P
ι' : Type u_1
inst✝³ : Fintype ι'
inst✝² : Fintype ι
b₂ : AffineBasis ι k P
inst✝¹ : DecidableEq ι
inst✝ : Nontrivial k
p : ι' → P
A : Matrix ι ι' k
hA : A ⬝ toMatrix b p = 1
i : ι
hAi : ∑ j : ι', A i j = 1
j : ι
⊢ (if j = i then 1 else 0) = (A ⬝ toMatrix b p) i j