Theorem: Matrix.vecMul_surjective_iff_exists_left_inverse
File: Mathlib/LinearAlgebra/Matrix/NonsingularInverse.lean

Proof steps:
state_before: l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
inst✝² : Semiring R
inst✝¹ : Fintype m
inst✝ : Finite n
A : Matrix m n R
⊢ (Function.Surjective fun v => v ᵥ* A) ↔ ∃ B, B * A = 1
state_after: case intro
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
inst✝² : Semiring R
inst✝¹ : Fintype m
inst✝ : Finite n
A : Matrix m n R
val✝ : Fintype n
⊢ (Function.Surjective fun v => v ᵥ* A) ↔ ∃ B, B * A = 1
tactic: cases nonempty_fintype n
state_before: case intro
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
inst✝² : Semiring R
inst✝¹ : Fintype m
inst✝ : Finite n
A : Matrix m n R
val✝ : Fintype n
⊢ (Function.Surjective fun v => v ᵥ* A) ↔ ∃ B, B * A = 1
state_after: case intro
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
inst✝² : Semiring R
inst✝¹ : Fintype m
inst✝ : Finite n
A : Matrix m n R
val✝ : Fintype n
h : Function.Surjective fun v => v ᵥ* A
⊢ ∃ B, B * A = 1
tactic: refine ⟨fun h ↦ ?_, fun ⟨B, hBA⟩ y ↦ ⟨y ᵥ* B, by simp [hBA]⟩⟩
state_before: case intro
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
inst✝² : Semiring R
inst✝¹ : Fintype m
inst✝ : Finite n
A : Matrix m n R
val✝ : Fintype n
h : Function.Surjective fun v => v ᵥ* A
rows : n → m → R
hrows : ∀ (x : n), (fun v => v ᵥ* A) (rows x) = Pi.single x 1
⊢ ∃ B, B * A = 1
state_after: case intro
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
inst✝² : Semiring R
inst✝¹ : Fintype m
inst✝ : Finite n
A : Matrix m n R
val✝ : Fintype n
h : Function.Surjective fun v => v ᵥ* A
rows : n → m → R
hrows : ∀ (x : n), (fun v => v ᵥ* A) (rows x) = Pi.single x 1
i j : n
⊢ (of rows * A) i j = 1 i j
tactic: refine ⟨Matrix.of rows, Matrix.ext fun i j => ?_⟩
state_before: case intro
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
inst✝² : Semiring R
inst✝¹ : Fintype m
inst✝ : Finite n
A : Matrix m n R
val✝ : Fintype n
h : Function.Surjective fun v => v ᵥ* A
rows : n → m → R
hrows : ∀ (x : n), (fun v => v ᵥ* A) (rows x) = Pi.single x 1
i j : n
⊢ (of rows * A) i j = 1 i j
state_after: case intro
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
inst✝² : Semiring R
inst✝¹ : Fintype m
inst✝ : Finite n
A : Matrix m n R
val✝ : Fintype n
h : Function.Surjective fun v => v ᵥ* A
rows : n → m → R
hrows : ∀ (x : n), (fun v => v ᵥ* A) (rows x) = Pi.single x 1
i j : n
⊢ (of rows i ᵥ* A) j = (fun v => v ᵥ* A) (rows i) j
tactic: rw [mul_apply_eq_vecMul, one_eq_pi_single, ← hrows]
state_before: case intro
l : Type u_1
m : Type u
n : Type u'
α : Type v
inst✝⁴ : DecidableEq m
inst✝³ : DecidableEq n
R : Type u_2
inst✝² : Semiring R
inst✝¹ : Fintype m
inst✝ : Finite n
A : Matrix m n R
val✝ : Fintype n
h : Function.Surjective fun v => v ᵥ* A
rows : n → m → R
hrows : ∀ (x : n), (fun v => v ᵥ* A) (rows x) = Pi.single x 1
i j : n
⊢ (of rows i ᵥ* A) j = (fun v => v ᵥ* A) (rows i) j
state_after: no goals
tactic: rfl