Theorem: Matrix.blockDiagonal'_mul
File: Mathlib/Data/Matrix/Block.lean

tactic: ext (⟨k, i⟩⟨k', j⟩)
state_before: l : Type ?u.225429
m : Type ?u.225432
n : Type ?u.225435
o : Type u_3
p : Type ?u.225441
q : Type ?u.225444
m' : o → Type u_4
n' : o → Type u_2
p' : o → Type u_5
R : Type ?u.225462
S : Type ?u.225465
α : Type u_1
β : Type ?u.225471
inst✝³ : DecidableEq o
inst✝² : NonUnitalNonAssocSemiring α
inst✝¹ : (i : o) → Fintype (n' i)
inst✝ : Fintype o
M : (i : o) → Matrix (m' i) (n' i) α
N : (i : o) → Matrix (n' i) (p' i) α
⊢ (blockDiagonal' fun k => M k ⬝ N k) = blockDiagonal' M ⬝ blockDiagonal' N

tactic: simp only [blockDiagonal'_apply, mul_apply, ← Finset.univ_sigma_univ, Finset.sum_sigma]
state_before: case a.mk.h.mk
l : Type ?u.225429
m : Type ?u.225432
n : Type ?u.225435
o : Type u_3
p : Type ?u.225441
q : Type ?u.225444
m' : o → Type u_4
n' : o → Type u_2
p' : o → Type u_5
R : Type ?u.225462
S : Type ?u.225465
α : Type u_1
β : Type ?u.225471
inst✝³ : DecidableEq o
inst✝² : NonUnitalNonAssocSemiring α
inst✝¹ : (i : o) → Fintype (n' i)
inst✝ : Fintype o
M : (i : o) → Matrix (m' i) (n' i) α
N : (i : o) → Matrix (n' i) (p' i) α
k : o
i : m' k
k' : o
j : p' k'
⊢ blockDiagonal' (fun k => M k ⬝ N k) { fst := k, snd := i } { fst := k', snd := j } =
    (blockDiagonal' M ⬝ blockDiagonal' N) { fst := k, snd := i } { fst := k', snd := j }

tactic: rw [Fintype.sum_eq_single k]
state_before: case a.mk.h.mk
l : Type ?u.225429
m : Type ?u.225432
n : Type ?u.225435
o : Type u_3
p : Type ?u.225441
q : Type ?u.225444
m' : o → Type u_4
n' : o → Type u_2
p' : o → Type u_5
R : Type ?u.225462
S : Type ?u.225465
α : Type u_1
β : Type ?u.225471
inst✝³ : DecidableEq o
inst✝² : NonUnitalNonAssocSemiring α
inst✝¹ : (i : o) → Fintype (n' i)
inst✝ : Fintype o
M : (i : o) → Matrix (m' i) (n' i) α
N : (i : o) → Matrix (n' i) (p' i) α
k : o
i : m' k
k' : o
j : p' k'
⊢ (if h : k = k' then
      ∑ j_1 : n' k, M k i j_1 * N k j_1 (cast (_ : p' { fst := k', snd := j }.fst = p' { fst := k, snd := i }.fst) j)
    else 0) =
    ∑ x : o,
      ∑ x_1 : n' x,
        (if h : k = x then M k i (cast (_ : n' { fst := x, snd := x_1 }.fst = n' { fst := k, snd := i }.fst) x_1)
          else 0) *
          if h : x = k' then N x x_1 (cast (_ : p' { fst := k', snd := j }.fst = p' { fst := x, snd := x_1 }.fst) j)
          else 0

tactic: simp only [if_pos, dif_pos]
state_before: case a.mk.h.mk
l : Type ?u.225429
m : Type ?u.225432
n : Type ?u.225435
o : Type u_3
p : Type ?u.225441
q : Type ?u.225444
m' : o → Type u_4
n' : o → Type u_2
p' : o → Type u_5
R : Type ?u.225462
S : Type ?u.225465
α : Type u_1
β : Type ?u.225471
inst✝³ : DecidableEq o
inst✝² : NonUnitalNonAssocSemiring α
inst✝¹ : (i : o) → Fintype (n' i)
inst✝ : Fintype o
M : (i : o) → Matrix (m' i) (n' i) α
N : (i : o) → Matrix (n' i) (p' i) α
k : o
i : m' k
k' : o
j : p' k'
⊢ (if h : k = k' then
      ∑ j_1 : n' k, M k i j_1 * N k j_1 (cast (_ : p' { fst := k', snd := j }.fst = p' { fst := k, snd := i }.fst) j)
    else 0) =
    ∑ x : n' k,
      (if h : k = k then M k i (cast (_ : n' { fst := k, snd := x }.fst = n' { fst := k, snd := i }.fst) x) else 0) *
        if h : k = k' then N k x (cast (_ : p' { fst := k', snd := j }.fst = p' { fst := k, snd := x }.fst) j) else 0

tactic: split_ifs <;> simp
state_before: case a.mk.h.mk
l : Type ?u.225429
m : Type ?u.225432
n : Type ?u.225435
o : Type u_3
p : Type ?u.225441
q : Type ?u.225444
m' : o → Type u_4
n' : o → Type u_2
p' : o → Type u_5
R : Type ?u.225462
S : Type ?u.225465
α : Type u_1
β : Type ?u.225471
inst✝³ : DecidableEq o
inst✝² : NonUnitalNonAssocSemiring α
inst✝¹ : (i : o) → Fintype (n' i)
inst✝ : Fintype o
M : (i : o) → Matrix (m' i) (n' i) α
N : (i : o) → Matrix (n' i) (p' i) α
k : o
i : m' k
k' : o
j : p' k'
⊢ (if h : k = k' then
      ∑ j_1 : n' k, M k i j_1 * N k j_1 (cast (_ : p' { fst := k', snd := j }.fst = p' { fst := k, snd := i }.fst) j)
    else 0) =
    ∑ x : n' k,
      M k i (cast (_ : n' { fst := k, snd := x }.fst = n' { fst := k, snd := i }.fst) x) *
        if h : k = k' then N k x (cast (_ : p' { fst := k', snd := j }.fst = p' { fst := k, snd := x }.fst) j) else 0

tactic: intro j' hj'
state_before: case a.mk.h.mk
l : Type ?u.225429
m : Type ?u.225432
n : Type ?u.225435
o : Type u_3
p : Type ?u.225441
q : Type ?u.225444
m' : o → Type u_4
n' : o → Type u_2
p' : o → Type u_5
R : Type ?u.225462
S : Type ?u.225465
α : Type u_1
β : Type ?u.225471
inst✝³ : DecidableEq o
inst✝² : NonUnitalNonAssocSemiring α
inst✝¹ : (i : o) → Fintype (n' i)
inst✝ : Fintype o
M : (i : o) → Matrix (m' i) (n' i) α
N : (i : o) → Matrix (n' i) (p' i) α
k : o
i : m' k
k' : o
j : p' k'
⊢ ∀ (x : o),
    x ≠ k →
      (∑ x_2 : n' x,
          (if h : k = x then M k i (cast (_ : n' { fst := x, snd := x_2 }.fst = n' { fst := k, snd := i }.fst) x_2)
            else 0) *
            if h : x = k' then N x x_2 (cast (_ : p' { fst := k', snd := j }.fst = p' { fst := x, snd := x_2 }.fst) j)
            else 0) =
        0

tactic: exact Finset.sum_eq_zero fun _ _ => by rw [dif_neg hj'.symm, MulZeroClass.zero_mul]
state_before: case a.mk.h.mk
l : Type ?u.225429
m : Type ?u.225432
n : Type ?u.225435
o : Type u_3
p : Type ?u.225441
q : Type ?u.225444
m' : o → Type u_4
n' : o → Type u_2
p' : o → Type u_5
R : Type ?u.225462
S : Type ?u.225465
α : Type u_1
β : Type ?u.225471
inst✝³ : DecidableEq o
inst✝² : NonUnitalNonAssocSemiring α
inst✝¹ : (i : o) → Fintype (n' i)
inst✝ : Fintype o
M : (i : o) → Matrix (m' i) (n' i) α
N : (i : o) → Matrix (n' i) (p' i) α
k : o
i : m' k
k' : o
j : p' k'
j' : o
hj' : j' ≠ k
⊢ (∑ x : n' j',
      (if h : k = j' then M k i (cast (_ : n' { fst := j', snd := x }.fst = n' { fst := k, snd := i }.fst) x) else 0) *
        if h : j' = k' then N j' x (cast (_ : p' { fst := k', snd := j }.fst = p' { fst := j', snd := x }.fst) j)
        else 0) =
    0

tactic: rw [dif_neg hj'.symm, MulZeroClass.zero_mul]
state_before: l : Type ?u.225429
m : Type ?u.225432
n : Type ?u.225435
o : Type u_3
p : Type ?u.225441
q : Type ?u.225444
m' : o → Type u_4
n' : o → Type u_2
p' : o → Type u_5
R : Type ?u.225462
S : Type ?u.225465
α : Type u_1
β : Type ?u.225471
inst✝³ : DecidableEq o
inst✝² : NonUnitalNonAssocSemiring α
inst✝¹ : (i : o) → Fintype (n' i)
inst✝ : Fintype o
M : (i : o) → Matrix (m' i) (n' i) α
N : (i : o) → Matrix (n' i) (p' i) α
k : o
i : m' k
k' : o
j : p' k'
j' : o
hj' : j' ≠ k
x✝¹ : n' j'
x✝ : x✝¹ ∈ Finset.univ
⊢ ((if h : k = j' then M k i (cast (_ : n' { fst := j', snd := x✝¹ }.fst = n' { fst := k, snd := i }.fst) x✝¹) else 0) *
      if h : j' = k' then N j' x✝¹ (cast (_ : p' { fst := k', snd := j }.fst = p' { fst := j', snd := x✝¹ }.fst) j)
      else 0) =
    0