Theorem: Matrix.det_eq_of_forall_row_eq_smul_add_const_aux
File: Mathlib/LinearAlgebra/Matrix/Determinant.lean

tactic: rintro c hs k - A_eq
state_before: case empty
m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A B : Matrix n n R
⊢ ∀ (c : n → R),
    (∀ (i : n), ¬i ∈ ∅ → c i = 0) → ∀ (k : n), ¬k ∈ ∅ → (∀ (i j : n), A i j = B i j + c i * B k j) → det A = det B

tactic: have : ∀ i, c i = 0 := by
  intro i
  specialize hs i
  contrapose! hs
  simp [hs]
state_before: case empty
m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A B : Matrix n n R
c : n → R
hs : ∀ (i : n), ¬i ∈ ∅ → c i = 0
k : n
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
⊢ det A = det B

tactic: congr
state_before: case empty
m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A B : Matrix n n R
c : n → R
hs : ∀ (i : n), ¬i ∈ ∅ → c i = 0
k : n
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
this : ∀ (i : n), c i = 0
⊢ det A = det B

tactic: ext (i j)
state_before: case empty.e_M
m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A B : Matrix n n R
c : n → R
hs : ∀ (i : n), ¬i ∈ ∅ → c i = 0
k : n
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
this : ∀ (i : n), c i = 0
⊢ A = B

tactic: rw [A_eq, this, MulZeroClass.zero_mul, add_zero]
state_before: case empty.e_M.a.h
m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A B : Matrix n n R
c : n → R
hs : ∀ (i : n), ¬i ∈ ∅ → c i = 0
k : n
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
this : ∀ (i : n), c i = 0
i j : n
⊢ A i j = B i j

tactic: intro i
state_before: m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A B : Matrix n n R
c : n → R
hs : ∀ (i : n), ¬i ∈ ∅ → c i = 0
k : n
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
⊢ ∀ (i : n), c i = 0

tactic: specialize hs i
state_before: m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A B : Matrix n n R
c : n → R
hs : ∀ (i : n), ¬i ∈ ∅ → c i = 0
k : n
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
i : n
⊢ c i = 0

tactic: contrapose! hs
state_before: m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A B : Matrix n n R
c : n → R
k : n
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
i : n
hs : ¬i ∈ ∅ → c i = 0
⊢ c i = 0

tactic: simp [hs]
state_before: m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A B : Matrix n n R
c : n → R
k : n
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
i : n
hs : c i ≠ 0
⊢ ¬i ∈ ∅ ∧ c i ≠ 0

tactic: intro c hs k hk A_eq
state_before: case insert
m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A : Matrix n n R
i : n
s : Finset n
_hi : ¬i ∈ s
ih :
  ∀ {B : Matrix n n R} (c : n → R),
    (∀ (i : n), ¬i ∈ s → c i = 0) → ∀ (k : n), ¬k ∈ s → (∀ (i j : n), A i j = B i j + c i * B k j) → det A = det B
B : Matrix n n R
⊢ ∀ (c : n → R),
    (∀ (i_1 : n), ¬i_1 ∈ insert i s → c i_1 = 0) →
      ∀ (k : n), ¬k ∈ insert i s → (∀ (i j : n), A i j = B i j + c i * B k j) → det A = det B

tactic: have hAi : A i = B i + c i • B k := funext (A_eq i)
state_before: case insert
m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A : Matrix n n R
i : n
s : Finset n
_hi : ¬i ∈ s
ih :
  ∀ {B : Matrix n n R} (c : n → R),
    (∀ (i : n), ¬i ∈ s → c i = 0) → ∀ (k : n), ¬k ∈ s → (∀ (i j : n), A i j = B i j + c i * B k j) → det A = det B
B : Matrix n n R
c : n → R
hs : ∀ (i_1 : n), ¬i_1 ∈ insert i s → c i_1 = 0
k : n
hk : ¬k ∈ insert i s
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
⊢ det A = det B

tactic: rw [@ih (updateRow  B i (A i)) (Function.update c i 0), hAi, det_updateRow_add_smul_self]
state_before: case insert
m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A : Matrix n n R
i : n
s : Finset n
_hi : ¬i ∈ s
ih :
  ∀ {B : Matrix n n R} (c : n → R),
    (∀ (i : n), ¬i ∈ s → c i = 0) → ∀ (k : n), ¬k ∈ s → (∀ (i j : n), A i j = B i j + c i * B k j) → det A = det B
B : Matrix n n R
c : n → R
hs : ∀ (i_1 : n), ¬i_1 ∈ insert i s → c i_1 = 0
k : n
hk : ¬k ∈ insert i s
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
hAi : A i = B i + c i • B k
⊢ det A = det B

tactic: exact mt (fun h => show k ∈ insert i s from h ▸ Finset.mem_insert_self _ _) hk
state_before: case insert.hij
m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A : Matrix n n R
i : n
s : Finset n
_hi : ¬i ∈ s
ih :
  ∀ {B : Matrix n n R} (c : n → R),
    (∀ (i : n), ¬i ∈ s → c i = 0) → ∀ (k : n), ¬k ∈ s → (∀ (i j : n), A i j = B i j + c i * B k j) → det A = det B
B : Matrix n n R
c : n → R
hs : ∀ (i_1 : n), ¬i_1 ∈ insert i s → c i_1 = 0
k : n
hk : ¬k ∈ insert i s
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
hAi : A i = B i + c i • B k
⊢ i ≠ k

tactic: intro i' hi'
state_before: case insert.x
m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A : Matrix n n R
i : n
s : Finset n
_hi : ¬i ∈ s
ih :
  ∀ {B : Matrix n n R} (c : n → R),
    (∀ (i : n), ¬i ∈ s → c i = 0) → ∀ (k : n), ¬k ∈ s → (∀ (i j : n), A i j = B i j + c i * B k j) → det A = det B
B : Matrix n n R
c : n → R
hs : ∀ (i_1 : n), ¬i_1 ∈ insert i s → c i_1 = 0
k : n
hk : ¬k ∈ insert i s
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
hAi : A i = B i + c i • B k
⊢ ∀ (i_1 : n), ¬i_1 ∈ s → update c i 0 i_1 = 0

tactic: rw [Function.update_apply]
state_before: case insert.x
m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A : Matrix n n R
i : n
s : Finset n
_hi : ¬i ∈ s
ih :
  ∀ {B : Matrix n n R} (c : n → R),
    (∀ (i : n), ¬i ∈ s → c i = 0) → ∀ (k : n), ¬k ∈ s → (∀ (i j : n), A i j = B i j + c i * B k j) → det A = det B
B : Matrix n n R
c : n → R
hs : ∀ (i_1 : n), ¬i_1 ∈ insert i s → c i_1 = 0
k : n
hk : ¬k ∈ insert i s
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
hAi : A i = B i + c i • B k
i' : n
hi' : ¬i' ∈ s
⊢ update c i 0 i' = 0

tactic: split_ifs with hi'i
state_before: case insert.x
m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A : Matrix n n R
i : n
s : Finset n
_hi : ¬i ∈ s
ih :
  ∀ {B : Matrix n n R} (c : n → R),
    (∀ (i : n), ¬i ∈ s → c i = 0) → ∀ (k : n), ¬k ∈ s → (∀ (i j : n), A i j = B i j + c i * B k j) → det A = det B
B : Matrix n n R
c : n → R
hs : ∀ (i_1 : n), ¬i_1 ∈ insert i s → c i_1 = 0
k : n
hk : ¬k ∈ insert i s
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
hAi : A i = B i + c i • B k
i' : n
hi' : ¬i' ∈ s
⊢ (if i' = i then 0 else c i') = 0

tactic: rfl
state_before: case insert.x.inl
m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A : Matrix n n R
i : n
s : Finset n
_hi : ¬i ∈ s
ih :
  ∀ {B : Matrix n n R} (c : n → R),
    (∀ (i : n), ¬i ∈ s → c i = 0) → ∀ (k : n), ¬k ∈ s → (∀ (i j : n), A i j = B i j + c i * B k j) → det A = det B
B : Matrix n n R
c : n → R
hs : ∀ (i_1 : n), ¬i_1 ∈ insert i s → c i_1 = 0
k : n
hk : ¬k ∈ insert i s
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
hAi : A i = B i + c i • B k
i' : n
hi' : ¬i' ∈ s
hi'i : i' = i
⊢ 0 = 0

tactic: exact hs i' fun h => hi' ((Finset.mem_insert.mp h).resolve_left hi'i)
state_before: case insert.x.inr
m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A : Matrix n n R
i : n
s : Finset n
_hi : ¬i ∈ s
ih :
  ∀ {B : Matrix n n R} (c : n → R),
    (∀ (i : n), ¬i ∈ s → c i = 0) → ∀ (k : n), ¬k ∈ s → (∀ (i j : n), A i j = B i j + c i * B k j) → det A = det B
B : Matrix n n R
c : n → R
hs : ∀ (i_1 : n), ¬i_1 ∈ insert i s → c i_1 = 0
k : n
hk : ¬k ∈ insert i s
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
hAi : A i = B i + c i • B k
i' : n
hi' : ¬i' ∈ s
hi'i : ¬i' = i
⊢ c i' = 0

tactic: exact k
state_before: case insert.k
m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A : Matrix n n R
i : n
s : Finset n
_hi : ¬i ∈ s
ih :
  ∀ {B : Matrix n n R} (c : n → R),
    (∀ (i : n), ¬i ∈ s → c i = 0) → ∀ (k : n), ¬k ∈ s → (∀ (i j : n), A i j = B i j + c i * B k j) → det A = det B
B : Matrix n n R
c : n → R
hs : ∀ (i_1 : n), ¬i_1 ∈ insert i s → c i_1 = 0
k : n
hk : ¬k ∈ insert i s
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
hAi : A i = B i + c i • B k
⊢ n

tactic: exact fun h => hk (Finset.mem_insert_of_mem h)
state_before: case insert.x
m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A : Matrix n n R
i : n
s : Finset n
_hi : ¬i ∈ s
ih :
  ∀ {B : Matrix n n R} (c : n → R),
    (∀ (i : n), ¬i ∈ s → c i = 0) → ∀ (k : n), ¬k ∈ s → (∀ (i j : n), A i j = B i j + c i * B k j) → det A = det B
B : Matrix n n R
c : n → R
hs : ∀ (i_1 : n), ¬i_1 ∈ insert i s → c i_1 = 0
k : n
hk : ¬k ∈ insert i s
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
hAi : A i = B i + c i • B k
⊢ ¬k ∈ s

tactic: intro i' j'
state_before: case insert.x
m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A : Matrix n n R
i : n
s : Finset n
_hi : ¬i ∈ s
ih :
  ∀ {B : Matrix n n R} (c : n → R),
    (∀ (i : n), ¬i ∈ s → c i = 0) → ∀ (k : n), ¬k ∈ s → (∀ (i j : n), A i j = B i j + c i * B k j) → det A = det B
B : Matrix n n R
c : n → R
hs : ∀ (i_1 : n), ¬i_1 ∈ insert i s → c i_1 = 0
k : n
hk : ¬k ∈ insert i s
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
hAi : A i = B i + c i • B k
⊢ ∀ (i_1 j : n), A i_1 j = updateRow B i (A i) i_1 j + update c i 0 i_1 * updateRow B i (A i) k j

tactic: rw [updateRow_apply, Function.update_apply]
state_before: case insert.x
m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A : Matrix n n R
i : n
s : Finset n
_hi : ¬i ∈ s
ih :
  ∀ {B : Matrix n n R} (c : n → R),
    (∀ (i : n), ¬i ∈ s → c i = 0) → ∀ (k : n), ¬k ∈ s → (∀ (i j : n), A i j = B i j + c i * B k j) → det A = det B
B : Matrix n n R
c : n → R
hs : ∀ (i_1 : n), ¬i_1 ∈ insert i s → c i_1 = 0
k : n
hk : ¬k ∈ insert i s
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
hAi : A i = B i + c i • B k
i' j' : n
⊢ A i' j' = updateRow B i (A i) i' j' + update c i 0 i' * updateRow B i (A i) k j'

tactic: split_ifs with hi'i
state_before: case insert.x
m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A : Matrix n n R
i : n
s : Finset n
_hi : ¬i ∈ s
ih :
  ∀ {B : Matrix n n R} (c : n → R),
    (∀ (i : n), ¬i ∈ s → c i = 0) → ∀ (k : n), ¬k ∈ s → (∀ (i j : n), A i j = B i j + c i * B k j) → det A = det B
B : Matrix n n R
c : n → R
hs : ∀ (i_1 : n), ¬i_1 ∈ insert i s → c i_1 = 0
k : n
hk : ¬k ∈ insert i s
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
hAi : A i = B i + c i • B k
i' j' : n
⊢ A i' j' = (if i' = i then A i j' else B i' j') + (if i' = i then 0 else c i') * updateRow B i (A i) k j'

tactic: rw [A_eq, updateRow_ne fun h : k = i => hk <| h ▸ Finset.mem_insert_self k s]
state_before: case insert.x.inr
m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A : Matrix n n R
i : n
s : Finset n
_hi : ¬i ∈ s
ih :
  ∀ {B : Matrix n n R} (c : n → R),
    (∀ (i : n), ¬i ∈ s → c i = 0) → ∀ (k : n), ¬k ∈ s → (∀ (i j : n), A i j = B i j + c i * B k j) → det A = det B
B : Matrix n n R
c : n → R
hs : ∀ (i_1 : n), ¬i_1 ∈ insert i s → c i_1 = 0
k : n
hk : ¬k ∈ insert i s
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
hAi : A i = B i + c i • B k
i' j' : n
hi'i : ¬i' = i
⊢ A i' j' = B i' j' + c i' * updateRow B i (A i) k j'

tactic: simp [hi'i]
state_before: case insert.x.inl
m : Type ?u.1702450
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
A : Matrix n n R
i : n
s : Finset n
_hi : ¬i ∈ s
ih :
  ∀ {B : Matrix n n R} (c : n → R),
    (∀ (i : n), ¬i ∈ s → c i = 0) → ∀ (k : n), ¬k ∈ s → (∀ (i j : n), A i j = B i j + c i * B k j) → det A = det B
B : Matrix n n R
c : n → R
hs : ∀ (i_1 : n), ¬i_1 ∈ insert i s → c i_1 = 0
k : n
hk : ¬k ∈ insert i s
A_eq : ∀ (i j : n), A i j = B i j + c i * B k j
hAi : A i = B i + c i • B k
i' j' : n
hi'i : i' = i
⊢ A i' j' = A i j' + 0 * updateRow B i (A i) k j'