Theorem: Matrix.adjugate_transpose
File: Mathlib/LinearAlgebra/Matrix/Adjugate.lean

tactic: ext (i j)
state_before: m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
⊢ (adjugate A)ᵀ = adjugate Aᵀ

tactic: rw [transpose_apply, adjugate_apply, adjugate_apply, updateRow_transpose, det_transpose]
state_before: case a.h
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
i j : n
⊢ (adjugate A)ᵀ i j = adjugate Aᵀ i j

tactic: rw [det_apply', det_apply']
state_before: case a.h
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
i j : n
⊢ det (updateRow A i (Pi.single j 1)) = det (updateColumn A j (Pi.single i 1))

tactic: apply Finset.sum_congr rfl
state_before: case a.h
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
i j : n
⊢ ∑ σ : Perm n, ↑↑(↑sign σ) * ∏ i_1 : n, updateRow A i (Pi.single j 1) (↑σ i_1) i_1 =
    ∑ σ : Perm n, ↑↑(↑sign σ) * ∏ i_1 : n, updateColumn A j (Pi.single i 1) (↑σ i_1) i_1

tactic: intro σ _
state_before: case a.h
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
i j : n
⊢ ∀ (x : Perm n),
    x ∈ univ →
      ↑↑(↑sign x) * ∏ i_1 : n, updateRow A i (Pi.single j 1) (↑x i_1) i_1 =
        ↑↑(↑sign x) * ∏ i_1 : n, updateColumn A j (Pi.single i 1) (↑x i_1) i_1

tactic: congr 1
state_before: case a.h
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
i j : n
σ : Perm n
a✝ : σ ∈ univ
⊢ ↑↑(↑sign σ) * ∏ i_1 : n, updateRow A i (Pi.single j 1) (↑σ i_1) i_1 =
    ↑↑(↑sign σ) * ∏ i_1 : n, updateColumn A j (Pi.single i 1) (↑σ i_1) i_1

tactic: by_cases i = σ j
state_before: case a.h.e_a
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
i j : n
σ : Perm n
a✝ : σ ∈ univ
⊢ ∏ i_1 : n, updateRow A i (Pi.single j 1) (↑σ i_1) i_1 = ∏ i_1 : n, updateColumn A j (Pi.single i 1) (↑σ i_1) i_1

tactic: congr
state_before: case pos
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
i j : n
σ : Perm n
a✝ : σ ∈ univ
h : i = ↑σ j
⊢ ∏ i_1 : n, updateRow A i (Pi.single j 1) (↑σ i_1) i_1 = ∏ i_1 : n, updateColumn A j (Pi.single i 1) (↑σ i_1) i_1

tactic: ext j'
state_before: case pos.e_f
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
i j : n
σ : Perm n
a✝ : σ ∈ univ
h : i = ↑σ j
⊢ (fun i_1 => updateRow A i (Pi.single j 1) (↑σ i_1) i_1) = fun i_1 => updateColumn A j (Pi.single i 1) (↑σ i_1) i_1

tactic: subst h
state_before: case pos.e_f.h
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
i j : n
σ : Perm n
a✝ : σ ∈ univ
h : i = ↑σ j
j' : n
⊢ updateRow A i (Pi.single j 1) (↑σ j') j' = updateColumn A j (Pi.single i 1) (↑σ j') j'

tactic: have : σ j' = σ j ↔ j' = j := σ.injective.eq_iff
state_before: case pos.e_f.h
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
j : n
σ : Perm n
a✝ : σ ∈ univ
j' : n
⊢ updateRow A (↑σ j) (Pi.single j 1) (↑σ j') j' = updateColumn A j (Pi.single (↑σ j) 1) (↑σ j') j'

tactic: rw [updateRow_apply, updateColumn_apply]
state_before: case pos.e_f.h
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
j : n
σ : Perm n
a✝ : σ ∈ univ
j' : n
this : ↑σ j' = ↑σ j ↔ j' = j
⊢ updateRow A (↑σ j) (Pi.single j 1) (↑σ j') j' = updateColumn A j (Pi.single (↑σ j) 1) (↑σ j') j'

tactic: simp_rw [this]
state_before: case pos.e_f.h
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
j : n
σ : Perm n
a✝ : σ ∈ univ
j' : n
this : ↑σ j' = ↑σ j ↔ j' = j
⊢ (if ↑σ j' = ↑σ j then Pi.single j 1 j' else A (↑σ j') j') =
    if j' = j then Pi.single (↑σ j) 1 (↑σ j') else A (↑σ j') j'

tactic: rw [← dite_eq_ite, ← dite_eq_ite]
state_before: case pos.e_f.h
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
j : n
σ : Perm n
a✝ : σ ∈ univ
j' : n
this : ↑σ j' = ↑σ j ↔ j' = j
⊢ (if j' = j then Pi.single j 1 j' else A (↑σ j') j') = if j' = j then Pi.single (↑σ j) 1 (↑σ j') else A (↑σ j') j'

tactic: congr 1 with rfl
state_before: case pos.e_f.h
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
j : n
σ : Perm n
a✝ : σ ∈ univ
j' : n
this : ↑σ j' = ↑σ j ↔ j' = j
⊢ (if x : j' = j then Pi.single j 1 j' else A (↑σ j') j') =
    if x : j' = j then Pi.single (↑σ j) 1 (↑σ j') else A (↑σ j') j'

tactic: rw [Pi.single_eq_same, Pi.single_eq_same]
state_before: case pos.e_f.h.e_t.h
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
σ : Perm n
a✝ : σ ∈ univ
j' : n
this : ↑σ j' = ↑σ j' ↔ j' = j'
⊢ Pi.single j' 1 j' = Pi.single (↑σ j') 1 (↑σ j')

tactic: have : (∏ j' : n, updateColumn A j (Pi.single i 1) (σ j') j') = 0 := by
  apply prod_eq_zero (mem_univ j)
  rw [updateColumn_self, Pi.single_eq_of_ne' h]
state_before: case neg
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
i j : n
σ : Perm n
a✝ : σ ∈ univ
h : ¬i = ↑σ j
⊢ ∏ i_1 : n, updateRow A i (Pi.single j 1) (↑σ i_1) i_1 = ∏ i_1 : n, updateColumn A j (Pi.single i 1) (↑σ i_1) i_1

tactic: rw [this]
state_before: case neg
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
i j : n
σ : Perm n
a✝ : σ ∈ univ
h : ¬i = ↑σ j
this : ∏ j' : n, updateColumn A j (Pi.single i 1) (↑σ j') j' = 0
⊢ ∏ i_1 : n, updateRow A i (Pi.single j 1) (↑σ i_1) i_1 = ∏ i_1 : n, updateColumn A j (Pi.single i 1) (↑σ i_1) i_1

tactic: apply prod_eq_zero (mem_univ (σ⁻¹ i))
state_before: case neg
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
i j : n
σ : Perm n
a✝ : σ ∈ univ
h : ¬i = ↑σ j
this : ∏ j' : n, updateColumn A j (Pi.single i 1) (↑σ j') j' = 0
⊢ ∏ i_1 : n, updateRow A i (Pi.single j 1) (↑σ i_1) i_1 = 0

tactic: erw [apply_symm_apply σ i, updateRow_self]
state_before: case neg
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
i j : n
σ : Perm n
a✝ : σ ∈ univ
h : ¬i = ↑σ j
this : ∏ j' : n, updateColumn A j (Pi.single i 1) (↑σ j') j' = 0
⊢ updateRow A i (Pi.single j 1) (↑σ (↑σ⁻¹ i)) (↑σ⁻¹ i) = 0

tactic: apply Pi.single_eq_of_ne
state_before: case neg
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
i j : n
σ : Perm n
a✝ : σ ∈ univ
h : ¬i = ↑σ j
this : ∏ j' : n, updateColumn A j (Pi.single i 1) (↑σ j') j' = 0
⊢ Pi.single j 1 (↑σ⁻¹ i) = 0

tactic: intro h'
state_before: case neg.h
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
i j : n
σ : Perm n
a✝ : σ ∈ univ
h : ¬i = ↑σ j
this : ∏ j' : n, updateColumn A j (Pi.single i 1) (↑σ j') j' = 0
⊢ ↑σ⁻¹ i ≠ j

tactic: exact h ((symm_apply_eq σ).mp h')
state_before: case neg.h
m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
i j : n
σ : Perm n
a✝ : σ ∈ univ
h : ¬i = ↑σ j
this : ∏ j' : n, updateColumn A j (Pi.single i 1) (↑σ j') j' = 0
h' : ↑σ⁻¹ i = j
⊢ False

tactic: apply prod_eq_zero (mem_univ j)
state_before: m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
i j : n
σ : Perm n
a✝ : σ ∈ univ
h : ¬i = ↑σ j
⊢ ∏ j' : n, updateColumn A j (Pi.single i 1) (↑σ j') j' = 0

tactic: rw [updateColumn_self, Pi.single_eq_of_ne' h]
state_before: m : Type u
n : Type v
α : Type w
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
inst✝ : CommRing α
A : Matrix n n α
i j : n
σ : Perm n
a✝ : σ ∈ univ
h : ¬i = ↑σ j
⊢ updateColumn A j (Pi.single i 1) (↑σ j) j = 0