-- Mathlib/Data/Matrix/Kronecker.lean
theorem det_kroneckerMapBilinear [CommSemiring R] [Fintype m] [Fintype n] [DecidableEq m]
    [DecidableEq n] [CommRing α] [CommRing β] [CommRing γ] [Module R α] [Module R β] [Module R γ]
    (f : α →ₗ[R] β →ₗ[R] γ) (h_comm : ∀ a b a' b', f (a * b) (a' * b') = f a a' * f b b')
    (A : Matrix m m α) (B : Matrix n n β) :
    det (kroneckerMapBilinear f A B) =
      det (A.map fun a => f a 1) ^ Fintype.card n * det (B.map fun b => f 1 b) ^ Fintype.card m :=
  calc
    det (kroneckerMapBilinear f A B) =
        det (kroneckerMapBilinear f A 1 * kroneckerMapBilinear f 1 B)

Proof state:
R : Type u_1
α : Type u_2
β : Type u_4
γ : Type u_6
m : Type u_9
n : Type u_10
inst✝¹⁰ : CommSemiring R
inst✝⁹ : Fintype m
inst✝⁸ : Fintype n
inst✝⁷ : DecidableEq m
inst✝⁶ : DecidableEq n
inst✝⁵ : CommRing α
inst✝⁴ : CommRing β
inst✝³ : CommRing γ
inst✝² : Module R α
inst✝¹ : Module R β
inst✝ : Module R γ
f : α →ₗ[R] β →ₗ[R] γ
h_comm : ∀ (a b : α) (a' b' : β), (f (a * b)) (a' * b') = (f a) a' * (f b) b'
A : Matrix m m α
B : Matrix n n β
⊢ (blockDiagonal fun x => A.map fun a => (f a) 1).det * (blockDiagonal fun x => B.map fun b => (f 1) b).det =
    (A.map fun a => (f a) 1).det ^ Fintype.card n * (B.map fun b => (f 1) b).det ^ Fintype.card m

Tactic:
simp_rw [det_blockDiagonal, Finset.prod_const, Finset.card_univ]

Result:
no goals

Proof state:
R : Type u_1
α : Type u_2
β : Type u_4
γ : Type u_6
m : Type u_9
n : Type u_10
inst✝¹⁰ : CommSemiring R
inst✝⁹ : Fintype m
inst✝⁸ : Fintype n
inst✝⁷ : DecidableEq m
inst✝⁶ : DecidableEq n
inst✝⁵ : CommRing α
inst✝⁴ : CommRing β
inst✝³ : CommRing γ
inst✝² : Module R α
inst✝¹ : Module R β
inst✝ : Module R γ
f : α →ₗ[R] β →ₗ[R] γ
h_comm : ∀ (a b : α) (a' b' : β), (f (a * b)) (a' * b') = (f a) a' * (f b) b'
A : Matrix m m α
B : Matrix n n β
⊢ (((kroneckerMapBilinear f) A) B).det = (((kroneckerMapBilinear f) A) 1 * ((kroneckerMapBilinear f) 1) B).det

Tactic:
rw [← kroneckerMapBilinear_mul_mul f h_comm, Matrix.mul_one, Matrix.one_mul]

Result:
no goals

Proof state:
R : Type u_1
α : Type u_2
β : Type u_4
γ : Type u_6
m : Type u_9
n : Type u_10
inst✝¹⁰ : CommSemiring R
inst✝⁹ : Fintype m
inst✝⁸ : Fintype n
inst✝⁷ : DecidableEq m
inst✝⁶ : DecidableEq n
inst✝⁵ : CommRing α
inst✝⁴ : CommRing β
inst✝³ : CommRing γ
inst✝² : Module R α
inst✝¹ : Module R β
inst✝ : Module R γ
f : α →ₗ[R] β →ₗ[R] γ
h_comm : ∀ (a b : α) (a' b' : β), (f (a * b)) (a' * b') = (f a) a' * (f b) b'
A : Matrix m m α
B : Matrix n n β
x✝ : β
⊢ (f 0) x✝ = 0

Tactic:
exact LinearMap.map_zero₂ _ _

Result:
no goals

Proof state:
R : Type u_1
α : Type u_2
β : Type u_4
γ : Type u_6
m : Type u_9
n : Type u_10
inst✝¹⁰ : CommSemiring R
inst✝⁹ : Fintype m
inst✝⁸ : Fintype n
inst✝⁷ : DecidableEq m
inst✝⁶ : DecidableEq n
inst✝⁵ : CommRing α
inst✝⁴ : CommRing β
inst✝³ : CommRing γ
inst✝² : Module R α
inst✝¹ : Module R β
inst✝ : Module R γ
f : α →ₗ[R] β →ₗ[R] γ
h_comm : ∀ (a b : α) (a' b' : β), (f (a * b)) (a' * b') = (f a) a' * (f b) b'
A : Matrix m m α
B : Matrix n n β
⊢ (((kroneckerMapBilinear f) A) 1 * ((kroneckerMapBilinear f) 1) B).det =
    (blockDiagonal fun x => A.map fun a => (f a) 1).det * (blockDiagonal fun x => B.map fun b => (f 1) b).det

Tactic:
rw [det_mul, ← diagonal_one, ← diagonal_one, kroneckerMapBilinear_apply_apply,
  kroneckerMap_diagonal_right _ fun _ => _, kroneckerMapBilinear_apply_apply,
  kroneckerMap_diagonal_left _ fun _ => _, det_reindex_self]

Result:
R : Type u_1
α : Type u_2
β : Type u_4
γ : Type u_6
m : Type u_9
n : Type u_10
inst✝¹⁰ : CommSemiring R
inst✝⁹ : Fintype m
inst✝⁸ : Fintype n
inst✝⁷ : DecidableEq m
inst✝⁶ : DecidableEq n
inst✝⁵ : CommRing α
inst✝⁴ : CommRing β
inst✝³ : CommRing γ
inst✝² : Module R α
inst✝¹ : Module R β
inst✝ : Module R γ
f : α →ₗ[R] β →ₗ[R] γ
h_comm : ∀ (a b : α) (a' b' : β), (f (a * b)) (a' * b') = (f a) a' * (f b) b'
A : Matrix m m α
B : Matrix n n β
⊢ ∀ (x : β), (f 0) x = 0

R : Type u_1
α : Type u_2
β : Type u_4
γ : Type u_6
m : Type u_9
n : Type u_10
inst✝¹⁰ : CommSemiring R
inst✝⁹ : Fintype m
inst✝⁸ : Fintype n
inst✝⁷ : DecidableEq m
inst✝⁶ : DecidableEq n
inst✝⁵ : CommRing α
inst✝⁴ : CommRing β
inst✝³ : CommRing γ
inst✝² : Module R α
inst✝¹ : Module R β
inst✝ : Module R γ
f : α →ₗ[R] β →ₗ[R] γ
h_comm : ∀ (a b : α) (a' b' : β), (f (a * b)) (a' * b') = (f a) a' * (f b) b'
A : Matrix m m α
B : Matrix n n β
⊢ ∀ (x : α), (f x) 0 = 0

Proof state:
R : Type u_1
α : Type u_2
β : Type u_4
γ : Type u_6
m : Type u_9
n : Type u_10
inst✝¹⁰ : CommSemiring R
inst✝⁹ : Fintype m
inst✝⁸ : Fintype n
inst✝⁷ : DecidableEq m
inst✝⁶ : DecidableEq n
inst✝⁵ : CommRing α
inst✝⁴ : CommRing β
inst✝³ : CommRing γ
inst✝² : Module R α
inst✝¹ : Module R β
inst✝ : Module R γ
f : α →ₗ[R] β →ₗ[R] γ
h_comm : ∀ (a b : α) (a' b' : β), (f (a * b)) (a' * b') = (f a) a' * (f b) b'
A : Matrix m m α
B : Matrix n n β
⊢ ∀ (x : α), (f x) 0 = 0

Tactic:
intro

Result:
R : Type u_1
α : Type u_2
β : Type u_4
γ : Type u_6
m : Type u_9
n : Type u_10
inst✝¹⁰ : CommSemiring R
inst✝⁹ : Fintype m
inst✝⁸ : Fintype n
inst✝⁷ : DecidableEq m
inst✝⁶ : DecidableEq n
inst✝⁵ : CommRing α
inst✝⁴ : CommRing β
inst✝³ : CommRing γ
inst✝² : Module R α
inst✝¹ : Module R β
inst✝ : Module R γ
f : α →ₗ[R] β →ₗ[R] γ
h_comm : ∀ (a b : α) (a' b' : β), (f (a * b)) (a' * b') = (f a) a' * (f b) b'
A : Matrix m m α
B : Matrix n n β
x✝ : α
⊢ (f x✝) 0 = 0

Proof state:
R : Type u_1
α : Type u_2
β : Type u_4
γ : Type u_6
m : Type u_9
n : Type u_10
inst✝¹⁰ : CommSemiring R
inst✝⁹ : Fintype m
inst✝⁸ : Fintype n
inst✝⁷ : DecidableEq m
inst✝⁶ : DecidableEq n
inst✝⁵ : CommRing α
inst✝⁴ : CommRing β
inst✝³ : CommRing γ
inst✝² : Module R α
inst✝¹ : Module R β
inst✝ : Module R γ
f : α →ₗ[R] β →ₗ[R] γ
h_comm : ∀ (a b : α) (a' b' : β), (f (a * b)) (a' * b') = (f a) a' * (f b) b'
A : Matrix m m α
B : Matrix n n β
⊢ ∀ (x : β), (f 0) x = 0

Tactic:
intro

Result:
R : Type u_1
α : Type u_2
β : Type u_4
γ : Type u_6
m : Type u_9
n : Type u_10
inst✝¹⁰ : CommSemiring R
inst✝⁹ : Fintype m
inst✝⁸ : Fintype n
inst✝⁷ : DecidableEq m
inst✝⁶ : DecidableEq n
inst✝⁵ : CommRing α
inst✝⁴ : CommRing β
inst✝³ : CommRing γ
inst✝² : Module R α
inst✝¹ : Module R β
inst✝ : Module R γ
f : α →ₗ[R] β →ₗ[R] γ
h_comm : ∀ (a b : α) (a' b' : β), (f (a * b)) (a' * b') = (f a) a' * (f b) b'
A : Matrix m m α
B : Matrix n n β
x✝ : β
⊢ (f 0) x✝ = 0

Proof state:
R : Type u_1
α : Type u_2
β : Type u_4
γ : Type u_6
m : Type u_9
n : Type u_10
inst✝¹⁰ : CommSemiring R
inst✝⁹ : Fintype m
inst✝⁸ : Fintype n
inst✝⁷ : DecidableEq m
inst✝⁶ : DecidableEq n
inst✝⁵ : CommRing α
inst✝⁴ : CommRing β
inst✝³ : CommRing γ
inst✝² : Module R α
inst✝¹ : Module R β
inst✝ : Module R γ
f : α →ₗ[R] β →ₗ[R] γ
h_comm : ∀ (a b : α) (a' b' : β), (f (a * b)) (a' * b') = (f a) a' * (f b) b'
A : Matrix m m α
B : Matrix n n β
x✝ : α
⊢ (f x✝) 0 = 0

Tactic:
exact map_zero _

Result:
no goals