Theorem: Matrix.rank_mul_eq_right_of_isUnit_det
File: Mathlib/Data/Matrix/Rank.lean

tactic: let b : Basis m R (m → R) := Pi.basisFun R m
state_before: l : Type u_1
m : Type u_2
n : Type u_3
o : Type u_4
R : Type u_5
inst✝⁴ : Fintype n
inst✝³ : Fintype o
inst✝² : CommRing R
inst✝¹ : Fintype m
inst✝ : DecidableEq m
A : Matrix m m R
B : Matrix m n R
hA : IsUnit A.det
⊢ (A * B).rank = B.rank
state_after: l : Type u_1
m : Type u_2
n : Type u_3
o : Type u_4
R : Type u_5
inst✝⁴ : Fintype n
inst✝³ : Fintype o
inst✝² : CommRing R
inst✝¹ : Fintype m
inst✝ : DecidableEq m
A : Matrix m m R
B : Matrix m n R
hA : IsUnit A.det
b : Basis m R (m → R) := Pi.basisFun R m
⊢ (A * B).rank = B.rank

tactic: replace hA : IsUnit (LinearMap.toMatrix b b A.mulVecLin).det := by
  convert hA; rw [← LinearEquiv.eq_symm_apply]; rfl
state_before: l : Type u_1
m : Type u_2
n : Type u_3
o : Type u_4
R : Type u_5
inst✝⁴ : Fintype n
inst✝³ : Fintype o
inst✝² : CommRing R
inst✝¹ : Fintype m
inst✝ : DecidableEq m
A : Matrix m m R
B : Matrix m n R
hA : IsUnit A.det
b : Basis m R (m → R) := Pi.basisFun R m
⊢ (A * B).rank = B.rank
state_after: l : Type u_1
m : Type u_2
n : Type u_3
o : Type u_4
R : Type u_5
inst✝⁴ : Fintype n
inst✝³ : Fintype o
inst✝² : CommRing R
inst✝¹ : Fintype m
inst✝ : DecidableEq m
A : Matrix m m R
B : Matrix m n R
b : Basis m R (m → R) := Pi.basisFun R m
hA : IsUnit ((LinearMap.toMatrix b b) A.mulVecLin).det
⊢ (A * B).rank = B.rank

tactic: have hAB : mulVecLin (A * B) = (LinearEquiv.ofIsUnitDet hA).comp (mulVecLin B) := by ext; simp
state_before: l : Type u_1
m : Type u_2
n : Type u_3
o : Type u_4
R : Type u_5
inst✝⁴ : Fintype n
inst✝³ : Fintype o
inst✝² : CommRing R
inst✝¹ : Fintype m
inst✝ : DecidableEq m
A : Matrix m m R
B : Matrix m n R
b : Basis m R (m → R) := Pi.basisFun R m
hA : IsUnit ((LinearMap.toMatrix b b) A.mulVecLin).det
⊢ (A * B).rank = B.rank
state_after: l : Type u_1
m : Type u_2
n : Type u_3
o : Type u_4
R : Type u_5
inst✝⁴ : Fintype n
inst✝³ : Fintype o
inst✝² : CommRing R
inst✝¹ : Fintype m
inst✝ : DecidableEq m
A : Matrix m m R
B : Matrix m n R
b : Basis m R (m → R) := Pi.basisFun R m
hA : IsUnit ((LinearMap.toMatrix b b) A.mulVecLin).det
hAB : (A * B).mulVecLin = ↑(LinearEquiv.ofIsUnitDet hA) ∘ₗ B.mulVecLin
⊢ (A * B).rank = B.rank

tactic: rw [rank, rank, hAB, LinearMap.range_comp, LinearEquiv.finrank_map_eq]
state_before: l : Type u_1
m : Type u_2
n : Type u_3
o : Type u_4
R : Type u_5
inst✝⁴ : Fintype n
inst✝³ : Fintype o
inst✝² : CommRing R
inst✝¹ : Fintype m
inst✝ : DecidableEq m
A : Matrix m m R
B : Matrix m n R
b : Basis m R (m → R) := Pi.basisFun R m
hA : IsUnit ((LinearMap.toMatrix b b) A.mulVecLin).det
hAB : (A * B).mulVecLin = ↑(LinearEquiv.ofIsUnitDet hA) ∘ₗ B.mulVecLin
⊢ (A * B).rank = B.rank
state_after: no goals

tactic: convert hA
state_before: l : Type u_1
m : Type u_2
n : Type u_3
o : Type u_4
R : Type u_5
inst✝⁴ : Fintype n
inst✝³ : Fintype o
inst✝² : CommRing R
inst✝¹ : Fintype m
inst✝ : DecidableEq m
A : Matrix m m R
B : Matrix m n R
hA : IsUnit A.det
b : Basis m R (m → R) := Pi.basisFun R m
⊢ IsUnit ((LinearMap.toMatrix b b) A.mulVecLin).det
state_after: case h.e'_3.h.e'_6
l : Type u_1
m : Type u_2
n : Type u_3
o : Type u_4
R : Type u_5
inst✝⁴ : Fintype n
inst✝³ : Fintype o
inst✝² : CommRing R
inst✝¹ : Fintype m
inst✝ : DecidableEq m
A : Matrix m m R
B : Matrix m n R
hA : IsUnit A.det
b : Basis m R (m → R) := Pi.basisFun R m
⊢ (LinearMap.toMatrix b b) A.mulVecLin = A

tactic: rw [← LinearEquiv.eq_symm_apply]
state_before: case h.e'_3.h.e'_6
l : Type u_1
m : Type u_2
n : Type u_3
o : Type u_4
R : Type u_5
inst✝⁴ : Fintype n
inst✝³ : Fintype o
inst✝² : CommRing R
inst✝¹ : Fintype m
inst✝ : DecidableEq m
A : Matrix m m R
B : Matrix m n R
hA : IsUnit A.det
b : Basis m R (m → R) := Pi.basisFun R m
⊢ (LinearMap.toMatrix b b) A.mulVecLin = A
state_after: case h.e'_3.h.e'_6
l : Type u_1
m : Type u_2
n : Type u_3
o : Type u_4
R : Type u_5
inst✝⁴ : Fintype n
inst✝³ : Fintype o
inst✝² : CommRing R
inst✝¹ : Fintype m
inst✝ : DecidableEq m
A : Matrix m m R
B : Matrix m n R
hA : IsUnit A.det
b : Basis m R (m → R) := Pi.basisFun R m
⊢ A.mulVecLin = (LinearMap.toMatrix b b).symm A

tactic: rfl
state_before: case h.e'_3.h.e'_6
l : Type u_1
m : Type u_2
n : Type u_3
o : Type u_4
R : Type u_5
inst✝⁴ : Fintype n
inst✝³ : Fintype o
inst✝² : CommRing R
inst✝¹ : Fintype m
inst✝ : DecidableEq m
A : Matrix m m R
B : Matrix m n R
hA : IsUnit A.det
b : Basis m R (m → R) := Pi.basisFun R m
⊢ A.mulVecLin = (LinearMap.toMatrix b b).symm A
state_after: no goals

tactic: ext
state_before: l : Type u_1
m : Type u_2
n : Type u_3
o : Type u_4
R : Type u_5
inst✝⁴ : Fintype n
inst✝³ : Fintype o
inst✝² : CommRing R
inst✝¹ : Fintype m
inst✝ : DecidableEq m
A : Matrix m m R
B : Matrix m n R
b : Basis m R (m → R) := Pi.basisFun R m
hA : IsUnit ((LinearMap.toMatrix b b) A.mulVecLin).det
⊢ (A * B).mulVecLin = ↑(LinearEquiv.ofIsUnitDet hA) ∘ₗ B.mulVecLin
state_after: case h.h
l : Type u_1
m : Type u_2
n : Type u_3
o : Type u_4
R : Type u_5
inst✝⁴ : Fintype n
inst✝³ : Fintype o
inst✝² : CommRing R
inst✝¹ : Fintype m
inst✝ : DecidableEq m
A : Matrix m m R
B : Matrix m n R
b : Basis m R (m → R) := Pi.basisFun R m
hA : IsUnit ((LinearMap.toMatrix b b) A.mulVecLin).det
x✝¹ : n → R
x✝ : m
⊢ (A * B).mulVecLin x✝¹ x✝ = (↑(LinearEquiv.ofIsUnitDet hA) ∘ₗ B.mulVecLin) x✝¹ x✝

tactic: simp
state_before: case h.h
l : Type u_1
m : Type u_2
n : Type u_3
o : Type u_4
R : Type u_5
inst✝⁴ : Fintype n
inst✝³ : Fintype o
inst✝² : CommRing R
inst✝¹ : Fintype m
inst✝ : DecidableEq m
A : Matrix m m R
B : Matrix m n R
b : Basis m R (m → R) := Pi.basisFun R m
hA : IsUnit ((LinearMap.toMatrix b b) A.mulVecLin).det
x✝¹ : n → R
x✝ : m
⊢ (A * B).mulVecLin x✝¹ x✝ = (↑(LinearEquiv.ofIsUnitDet hA) ∘ₗ B.mulVecLin) x✝¹ x✝
state_after: no goals