Theorem: Matrix.inv_kronecker
File: Mathlib/Data/Matrix/Kronecker.lean

tactic: by_cases hA : IsUnit A.det
state_before: R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
⊢ (kroneckerMap (fun x x_1 => x * x_1) A B)⁻¹ = kroneckerMap (fun x x_1 => x * x_1) A⁻¹ B⁻¹

tactic: swap
state_before: case pos
R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
hA : IsUnit (det A)
⊢ (kroneckerMap (fun x x_1 => x * x_1) A B)⁻¹ = kroneckerMap (fun x x_1 => x * x_1) A⁻¹ B⁻¹

case neg
R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
hA : ¬IsUnit (det A)
⊢ (kroneckerMap (fun x x_1 => x * x_1) A B)⁻¹ = kroneckerMap (fun x x_1 => x * x_1) A⁻¹ B⁻¹

tactic: by_cases hB : IsUnit B.det
state_before: case pos
R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
hA : IsUnit (det A)
⊢ (kroneckerMap (fun x x_1 => x * x_1) A B)⁻¹ = kroneckerMap (fun x x_1 => x * x_1) A⁻¹ B⁻¹

tactic: swap
state_before: case pos
R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
hA : IsUnit (det A)
hB : IsUnit (det B)
⊢ (kroneckerMap (fun x x_1 => x * x_1) A B)⁻¹ = kroneckerMap (fun x x_1 => x * x_1) A⁻¹ B⁻¹

case neg
R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
hA : IsUnit (det A)
hB : ¬IsUnit (det B)
⊢ (kroneckerMap (fun x x_1 => x * x_1) A B)⁻¹ = kroneckerMap (fun x x_1 => x * x_1) A⁻¹ B⁻¹

tactic: cases isEmpty_or_nonempty n
state_before: case neg
R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
hA : ¬IsUnit (det A)
⊢ (kroneckerMap (fun x x_1 => x * x_1) A B)⁻¹ = kroneckerMap (fun x x_1 => x * x_1) A⁻¹ B⁻¹

tactic: have hAB : ¬IsUnit (A ⊗ₖ B).det := by
  refine' mt (fun hAB => _) hA
  rw [det_kronecker] at hAB
  exact (isUnit_pow_iff Fintype.card_ne_zero).mp (isUnit_of_mul_isUnit_left hAB)
state_before: case neg.inr
R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
hA : ¬IsUnit (det A)
h✝ : Nonempty n
⊢ (kroneckerMap (fun x x_1 => x * x_1) A B)⁻¹ = kroneckerMap (fun x x_1 => x * x_1) A⁻¹ B⁻¹

tactic: rw [nonsing_inv_apply_not_isUnit _ hA, zero_kronecker, nonsing_inv_apply_not_isUnit _ hAB]
state_before: case neg.inr
R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
hA : ¬IsUnit (det A)
h✝ : Nonempty n
hAB : ¬IsUnit (det (kroneckerMap (fun x x_1 => x * x_1) A B))
⊢ (kroneckerMap (fun x x_1 => x * x_1) A B)⁻¹ = kroneckerMap (fun x x_1 => x * x_1) A⁻¹ B⁻¹

tactic: exact Subsingleton.elim _ _
state_before: case neg.inl
R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
hA : ¬IsUnit (det A)
h✝ : IsEmpty n
⊢ (kroneckerMap (fun x x_1 => x * x_1) A B)⁻¹ = kroneckerMap (fun x x_1 => x * x_1) A⁻¹ B⁻¹

tactic: refine' mt (fun hAB => _) hA
state_before: R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
hA : ¬IsUnit (det A)
h✝ : Nonempty n
⊢ ¬IsUnit (det (kroneckerMap (fun x x_1 => x * x_1) A B))

tactic: rw [det_kronecker] at hAB
state_before: R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
hA : ¬IsUnit (det A)
h✝ : Nonempty n
hAB : IsUnit (det (kroneckerMap (fun x x_1 => x * x_1) A B))
⊢ IsUnit (det A)

tactic: exact (isUnit_pow_iff Fintype.card_ne_zero).mp (isUnit_of_mul_isUnit_left hAB)
state_before: R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
hA : ¬IsUnit (det A)
h✝ : Nonempty n
hAB : IsUnit (det A ^ Fintype.card n * det B ^ Fintype.card m)
⊢ IsUnit (det A)

tactic: cases isEmpty_or_nonempty m
state_before: case neg
R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
hA : IsUnit (det A)
hB : ¬IsUnit (det B)
⊢ (kroneckerMap (fun x x_1 => x * x_1) A B)⁻¹ = kroneckerMap (fun x x_1 => x * x_1) A⁻¹ B⁻¹

tactic: have hAB : ¬IsUnit (A ⊗ₖ B).det := by
  refine' mt (fun hAB => _) hB
  rw [det_kronecker] at hAB
  exact (isUnit_pow_iff Fintype.card_ne_zero).mp (isUnit_of_mul_isUnit_right hAB)
state_before: case neg.inr
R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
hA : IsUnit (det A)
hB : ¬IsUnit (det B)
h✝ : Nonempty m
⊢ (kroneckerMap (fun x x_1 => x * x_1) A B)⁻¹ = kroneckerMap (fun x x_1 => x * x_1) A⁻¹ B⁻¹

tactic: rw [nonsing_inv_apply_not_isUnit _ hB, kronecker_zero, nonsing_inv_apply_not_isUnit _ hAB]
state_before: case neg.inr
R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
hA : IsUnit (det A)
hB : ¬IsUnit (det B)
h✝ : Nonempty m
hAB : ¬IsUnit (det (kroneckerMap (fun x x_1 => x * x_1) A B))
⊢ (kroneckerMap (fun x x_1 => x * x_1) A B)⁻¹ = kroneckerMap (fun x x_1 => x * x_1) A⁻¹ B⁻¹

tactic: exact Subsingleton.elim _ _
state_before: case neg.inl
R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
hA : IsUnit (det A)
hB : ¬IsUnit (det B)
h✝ : IsEmpty m
⊢ (kroneckerMap (fun x x_1 => x * x_1) A B)⁻¹ = kroneckerMap (fun x x_1 => x * x_1) A⁻¹ B⁻¹

tactic: refine' mt (fun hAB => _) hB
state_before: R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
hA : IsUnit (det A)
hB : ¬IsUnit (det B)
h✝ : Nonempty m
⊢ ¬IsUnit (det (kroneckerMap (fun x x_1 => x * x_1) A B))

tactic: rw [det_kronecker] at hAB
state_before: R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
hA : IsUnit (det A)
hB : ¬IsUnit (det B)
h✝ : Nonempty m
hAB : IsUnit (det (kroneckerMap (fun x x_1 => x * x_1) A B))
⊢ IsUnit (det B)

tactic: exact (isUnit_pow_iff Fintype.card_ne_zero).mp (isUnit_of_mul_isUnit_right hAB)
state_before: R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
hA : IsUnit (det A)
hB : ¬IsUnit (det B)
h✝ : Nonempty m
hAB : IsUnit (det A ^ Fintype.card n * det B ^ Fintype.card m)
⊢ IsUnit (det B)

tactic: apply inv_eq_right_inv
state_before: case pos
R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
hA : IsUnit (det A)
hB : IsUnit (det B)
⊢ (kroneckerMap (fun x x_1 => x * x_1) A B)⁻¹ = kroneckerMap (fun x x_1 => x * x_1) A⁻¹ B⁻¹

tactic: rw [← mul_kronecker_mul, ← one_kronecker_one, mul_nonsing_inv _ hA, mul_nonsing_inv _ hB]
state_before: case pos.h
R : Type u_3
α : Type ?u.173346
α' : Type ?u.173349
β : Type ?u.173352
β' : Type ?u.173355
γ : Type ?u.173358
γ' : Type ?u.173361
l : Type ?u.173364
m : Type u_1
n : Type u_2
p : Type ?u.173373
q : Type ?u.173376
r : Type ?u.173379
l' : Type ?u.173382
m' : Type ?u.173385
n' : Type ?u.173388
p' : Type ?u.173391
inst✝⁴ : Fintype m
inst✝³ : Fintype n
inst✝² : DecidableEq m
inst✝¹ : DecidableEq n
inst✝ : CommRing R
A : Matrix m m R
B : Matrix n n R
hA : IsUnit (det A)
hB : IsUnit (det B)
⊢ kroneckerMap (fun x x_1 => x * x_1) A B ⬝ kroneckerMap (fun x x_1 => x * x_1) A⁻¹ B⁻¹ = 1