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

tactic: simp only [det_apply', mul_apply, prod_univ_sum, mul_sum, Fintype.piFinset_univ]
state_before: m : Type ?u.320844
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
M N : Matrix n n R
⊢ det (M ⬝ N) = ∑ p : n → n, ∑ σ : Perm n, ↑↑(↑sign σ) * ∏ i : n, M (↑σ i) (p i) * N (p i) i

tactic: rw [Finset.sum_comm]
state_before: m : Type ?u.320844
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
M N : Matrix n n R
⊢ ∑ x : Perm n, ∑ x_1 : n → n, ↑↑(↑sign x) * ∏ x_2 : n, M (↑x x_2) (x_1 x_2) * N (x_1 x_2) x_2 =
    ∑ x : n → n, ∑ x_1 : Perm n, ↑↑(↑sign x_1) * ∏ x_2 : n, M (↑x_1 x_2) (x x_2) * N (x x_2) x_2

tactic: simpa only [true_and_iff, mem_filter, mem_univ] using hbij
state_before: m : Type ?u.320844
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
M N : Matrix n n R
f : n → n
x✝ : f ∈ univ
hbij : ¬f ∈ filter Bijective univ
⊢ ¬Bijective fun i => f i

tactic: injection h
state_before: m : Type ?u.320844
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
M N : Matrix n n R
x✝³ x✝² : n → n
x✝¹ : x✝³ ∈ filter Bijective univ
x✝ : x✝² ∈ filter Bijective univ
h : (fun p h => ofBijective p (_ : Bijective p)) x✝³ x✝¹ = (fun p h => ofBijective p (_ : Bijective p)) x✝² x✝
⊢ x✝³ = x✝²

tactic: simp only [mul_comm, mul_left_comm, prod_mul_distrib, mul_assoc]
state_before: m : Type ?u.320844
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
M N : Matrix n n R
⊢ ∑ τ : Perm n, ∑ σ : Perm n, ↑↑(↑sign σ) * ∏ i : n, M (↑σ i) (↑τ i) * N (↑τ i) i =
    ∑ σ : Perm n, ∑ τ : Perm n, (∏ i : n, N (↑σ i) i) * ↑↑(↑sign τ) * ∏ j : n, M (↑τ j) (↑σ j)

tactic: have : (∏ j, M (τ j) (σ j)) = ∏ j, M ((τ * σ⁻¹) j) j := by
  rw [← (σ⁻¹ : _ ≃ _).prod_comp]
  simp only [Equiv.Perm.coe_mul, apply_inv_self, Function.comp_apply]
state_before: m : Type ?u.320844
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
M N : Matrix n n R
σ : Perm n
x✝ : σ ∈ univ
τ : Perm n
⊢ (∏ i : n, N (↑σ i) i) * ↑↑(↑sign τ) * ∏ j : n, M (↑τ j) (↑σ j) =
    (∏ i : n, N (↑σ i) i) * (↑↑(↑sign σ) * ↑↑(↑sign (↑(Equiv.mulRight σ⁻¹) τ))) *
      ∏ i : n, M (↑(↑(Equiv.mulRight σ⁻¹) τ) i) i

tactic: have h : ε σ * ε (τ * σ⁻¹) = ε τ :=
  calc
    ε σ * ε (τ * σ⁻¹) = ε (τ * σ⁻¹ * σ) := by
      rw [mul_comm, sign_mul (τ * σ⁻¹)]
      simp only [Int.cast_mul, Units.val_mul]
    _ = ε τ := by simp only [inv_mul_cancel_right]
state_before: m : Type ?u.320844
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
M N : Matrix n n R
σ : Perm n
x✝ : σ ∈ univ
τ : Perm n
this : ∏ j : n, M (↑τ j) (↑σ j) = ∏ j : n, M (↑(τ * σ⁻¹) j) j
⊢ (∏ i : n, N (↑σ i) i) * ↑↑(↑sign τ) * ∏ j : n, M (↑τ j) (↑σ j) =
    (∏ i : n, N (↑σ i) i) * (↑↑(↑sign σ) * ↑↑(↑sign (↑(Equiv.mulRight σ⁻¹) τ))) *
      ∏ i : n, M (↑(↑(Equiv.mulRight σ⁻¹) τ) i) i

tactic: simp_rw [Equiv.coe_mulRight, h]
state_before: m : Type ?u.320844
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
M N : Matrix n n R
σ : Perm n
x✝ : σ ∈ univ
τ : Perm n
this : ∏ j : n, M (↑τ j) (↑σ j) = ∏ j : n, M (↑(τ * σ⁻¹) j) j
h : ↑↑(↑sign σ) * ↑↑(↑sign (τ * σ⁻¹)) = ↑↑(↑sign τ)
⊢ (∏ i : n, N (↑σ i) i) * ↑↑(↑sign τ) * ∏ j : n, M (↑τ j) (↑σ j) =
    (∏ i : n, N (↑σ i) i) * (↑↑(↑sign σ) * ↑↑(↑sign (↑(Equiv.mulRight σ⁻¹) τ))) *
      ∏ i : n, M (↑(↑(Equiv.mulRight σ⁻¹) τ) i) i

tactic: simp only [this]
state_before: m : Type ?u.320844
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
M N : Matrix n n R
σ : Perm n
x✝ : σ ∈ univ
τ : Perm n
this : ∏ j : n, M (↑τ j) (↑σ j) = ∏ j : n, M (↑(τ * σ⁻¹) j) j
h : ↑↑(↑sign σ) * ↑↑(↑sign (τ * σ⁻¹)) = ↑↑(↑sign τ)
⊢ (∏ x : n, N (↑σ x) x) * ↑↑(↑sign τ) * ∏ x : n, M (↑τ x) (↑σ x) =
    (∏ x : n, N (↑σ x) x) * ↑↑(↑sign τ) * ∏ x : n, M (↑(τ * σ⁻¹) x) x

tactic: rw [← (σ⁻¹ : _ ≃ _).prod_comp]
state_before: m : Type ?u.320844
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
M N : Matrix n n R
σ : Perm n
x✝ : σ ∈ univ
τ : Perm n
⊢ ∏ j : n, M (↑τ j) (↑σ j) = ∏ j : n, M (↑(τ * σ⁻¹) j) j

tactic: simp only [Equiv.Perm.coe_mul, apply_inv_self, Function.comp_apply]
state_before: m : Type ?u.320844
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
M N : Matrix n n R
σ : Perm n
x✝ : σ ∈ univ
τ : Perm n
⊢ ∏ i : n, M (↑τ (↑σ⁻¹ i)) (↑σ (↑σ⁻¹ i)) = ∏ j : n, M (↑(τ * σ⁻¹) j) j

tactic: rw [mul_comm, sign_mul (τ * σ⁻¹)]
state_before: m : Type ?u.320844
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
M N : Matrix n n R
σ : Perm n
x✝ : σ ∈ univ
τ : Perm n
this : ∏ j : n, M (↑τ j) (↑σ j) = ∏ j : n, M (↑(τ * σ⁻¹) j) j
⊢ ↑↑(↑sign σ) * ↑↑(↑sign (τ * σ⁻¹)) = ↑↑(↑sign (τ * σ⁻¹ * σ))

tactic: simp only [Int.cast_mul, Units.val_mul]
state_before: m : Type ?u.320844
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
M N : Matrix n n R
σ : Perm n
x✝ : σ ∈ univ
τ : Perm n
this : ∏ j : n, M (↑τ j) (↑σ j) = ∏ j : n, M (↑(τ * σ⁻¹) j) j
⊢ ↑↑(↑sign (τ * σ⁻¹)) * ↑↑(↑sign σ) = ↑↑(↑sign (τ * σ⁻¹) * ↑sign σ)

tactic: simp only [inv_mul_cancel_right]
state_before: m : Type ?u.320844
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
M N : Matrix n n R
σ : Perm n
x✝ : σ ∈ univ
τ : Perm n
this : ∏ j : n, M (↑τ j) (↑σ j) = ∏ j : n, M (↑(τ * σ⁻¹) j) j
⊢ ↑↑(↑sign (τ * σ⁻¹ * σ)) = ↑↑(↑sign τ)

tactic: simp only [det_apply', Finset.mul_sum, mul_comm, mul_left_comm, mul_assoc]
state_before: m : Type ?u.320844
n : Type u_1
inst✝⁴ : DecidableEq n
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : Fintype m
R : Type v
inst✝ : CommRing R
M N : Matrix n n R
⊢ ∑ σ : Perm n, ∑ τ : Perm n, (∏ i : n, N (↑σ i) i) * (↑↑(↑sign σ) * ↑↑(↑sign τ)) * ∏ i : n, M (↑τ i) i = det M * det N