Theorem: Matrix.linfty_opNNNorm_mul
File: Mathlib/Analysis/Matrix.lean

tactic: simp_rw [linfty_opNNNorm_def, Matrix.mul_apply]
state_before: R : Type u_1
l : Type u_2
m : Type u_3
n : Type u_4
α : Type u_5
β : Type u_6
ι : Type u_7
inst✝⁴ : Fintype l
inst✝³ : Fintype m
inst✝² : Fintype n
inst✝¹ : Unique ι
inst✝ : NonUnitalSeminormedRing α
A : Matrix l m α
B : Matrix m n α
⊢ ‖A * B‖₊ ≤ ‖A‖₊ * ‖B‖₊
state_after: R : Type u_1
l : Type u_2
m : Type u_3
n : Type u_4
α : Type u_5
β : Type u_6
ι : Type u_7
inst✝⁴ : Fintype l
inst✝³ : Fintype m
inst✝² : Fintype n
inst✝¹ : Unique ι
inst✝ : NonUnitalSeminormedRing α
A : Matrix l m α
B : Matrix m n α
⊢ (Finset.univ.sup fun i => ∑ x : n, ‖∑ j : m, A i j * B j x‖₊) ≤
    (Finset.univ.sup fun i => ∑ j : m, ‖A i j‖₊) * Finset.univ.sup fun i => ∑ j : n, ‖B i j‖₊

tactic: calc
  (Finset.univ.sup fun i => ∑ k, ‖∑ j, A i j * B j k‖₊) ≤
      Finset.univ.sup fun i => ∑ k, ∑ j, ‖A i j‖₊ * ‖B j k‖₊ :=
    Finset.sup_mono_fun fun i _hi =>
      Finset.sum_le_sum fun k _hk => nnnorm_sum_le_of_le _ fun j _hj => nnnorm_mul_le _ _
  _ = Finset.univ.sup fun i => ∑ j, ‖A i j‖₊ * ∑ k, ‖B j k‖₊ := by
    simp_rw [@Finset.sum_comm m, Finset.mul_sum]
  _ ≤ Finset.univ.sup fun i => ∑ j, ‖A i j‖₊ * Finset.univ.sup fun i => ∑ j, ‖B i j‖₊ := by
    refine Finset.sup_mono_fun fun i _hi => ?_
    gcongr with j hj
    exact Finset.le_sup (f := fun i ↦ ∑ k : n, ‖B i k‖₊) hj
  _ ≤ (Finset.univ.sup fun i => ∑ j, ‖A i j‖₊) * Finset.univ.sup fun i => ∑ j, ‖B i j‖₊ := by
    simp_rw [← Finset.sum_mul, ← NNReal.finset_sup_mul]
    rfl
state_before: R : Type u_1
l : Type u_2
m : Type u_3
n : Type u_4
α : Type u_5
β : Type u_6
ι : Type u_7
inst✝⁴ : Fintype l
inst✝³ : Fintype m
inst✝² : Fintype n
inst✝¹ : Unique ι
inst✝ : NonUnitalSeminormedRing α
A : Matrix l m α
B : Matrix m n α
⊢ (Finset.univ.sup fun i => ∑ x : n, ‖∑ j : m, A i j * B j x‖₊) ≤
    (Finset.univ.sup fun i => ∑ j : m, ‖A i j‖₊) * Finset.univ.sup fun i => ∑ j : n, ‖B i j‖₊
state_after: no goals

tactic: simp_rw [@Finset.sum_comm m, Finset.mul_sum]
state_before: R : Type u_1
l : Type u_2
m : Type u_3
n : Type u_4
α : Type u_5
β : Type u_6
ι : Type u_7
inst✝⁴ : Fintype l
inst✝³ : Fintype m
inst✝² : Fintype n
inst✝¹ : Unique ι
inst✝ : NonUnitalSeminormedRing α
A : Matrix l m α
B : Matrix m n α
⊢ (Finset.univ.sup fun i => ∑ k : n, ∑ j : m, ‖A i j‖₊ * ‖B j k‖₊) =
    Finset.univ.sup fun i => ∑ j : m, ‖A i j‖₊ * ∑ k : n, ‖B j k‖₊
state_after: no goals

tactic: refine Finset.sup_mono_fun fun i _hi => ?_
state_before: R : Type u_1
l : Type u_2
m : Type u_3
n : Type u_4
α : Type u_5
β : Type u_6
ι : Type u_7
inst✝⁴ : Fintype l
inst✝³ : Fintype m
inst✝² : Fintype n
inst✝¹ : Unique ι
inst✝ : NonUnitalSeminormedRing α
A : Matrix l m α
B : Matrix m n α
⊢ (Finset.univ.sup fun i => ∑ j : m, ‖A i j‖₊ * ∑ k : n, ‖B j k‖₊) ≤
    Finset.univ.sup fun i => ∑ j : m, ‖A i j‖₊ * Finset.univ.sup fun i => ∑ j : n, ‖B i j‖₊
state_after: R : Type u_1
l : Type u_2
m : Type u_3
n : Type u_4
α : Type u_5
β : Type u_6
ι : Type u_7
inst✝⁴ : Fintype l
inst✝³ : Fintype m
inst✝² : Fintype n
inst✝¹ : Unique ι
inst✝ : NonUnitalSeminormedRing α
A : Matrix l m α
B : Matrix m n α
i : l
_hi : i ∈ Finset.univ
⊢ ∑ j : m, ‖A i j‖₊ * ∑ k : n, ‖B j k‖₊ ≤ ∑ j : m, ‖A i j‖₊ * Finset.univ.sup fun i => ∑ j : n, ‖B i j‖₊

tactic: gcongr with j hj
state_before: R : Type u_1
l : Type u_2
m : Type u_3
n : Type u_4
α : Type u_5
β : Type u_6
ι : Type u_7
inst✝⁴ : Fintype l
inst✝³ : Fintype m
inst✝² : Fintype n
inst✝¹ : Unique ι
inst✝ : NonUnitalSeminormedRing α
A : Matrix l m α
B : Matrix m n α
i : l
_hi : i ∈ Finset.univ
⊢ ∑ j : m, ‖A i j‖₊ * ∑ k : n, ‖B j k‖₊ ≤ ∑ j : m, ‖A i j‖₊ * Finset.univ.sup fun i => ∑ j : n, ‖B i j‖₊
state_after: case h.bc
R : Type u_1
l : Type u_2
m : Type u_3
n : Type u_4
α : Type u_5
β : Type u_6
ι : Type u_7
inst✝⁴ : Fintype l
inst✝³ : Fintype m
inst✝² : Fintype n
inst✝¹ : Unique ι
inst✝ : NonUnitalSeminormedRing α
A : Matrix l m α
B : Matrix m n α
i : l
_hi : i ∈ Finset.univ
j : m
hj : j ∈ Finset.univ
⊢ ∑ k : n, ‖B j k‖₊ ≤ Finset.univ.sup fun i => ∑ j : n, ‖B i j‖₊

tactic: exact Finset.le_sup (f := fun i ↦ ∑ k : n, ‖B i k‖₊) hj
state_before: case h.bc
R : Type u_1
l : Type u_2
m : Type u_3
n : Type u_4
α : Type u_5
β : Type u_6
ι : Type u_7
inst✝⁴ : Fintype l
inst✝³ : Fintype m
inst✝² : Fintype n
inst✝¹ : Unique ι
inst✝ : NonUnitalSeminormedRing α
A : Matrix l m α
B : Matrix m n α
i : l
_hi : i ∈ Finset.univ
j : m
hj : j ∈ Finset.univ
⊢ ∑ k : n, ‖B j k‖₊ ≤ Finset.univ.sup fun i => ∑ j : n, ‖B i j‖₊
state_after: no goals

tactic: simp_rw [← Finset.sum_mul, ← NNReal.finset_sup_mul]
state_before: R : Type u_1
l : Type u_2
m : Type u_3
n : Type u_4
α : Type u_5
β : Type u_6
ι : Type u_7
inst✝⁴ : Fintype l
inst✝³ : Fintype m
inst✝² : Fintype n
inst✝¹ : Unique ι
inst✝ : NonUnitalSeminormedRing α
A : Matrix l m α
B : Matrix m n α
⊢ (Finset.univ.sup fun i => ∑ j : m, ‖A i j‖₊ * Finset.univ.sup fun i => ∑ j : n, ‖B i j‖₊) ≤
    (Finset.univ.sup fun i => ∑ j : m, ‖A i j‖₊) * Finset.univ.sup fun i => ∑ j : n, ‖B i j‖₊
state_after: R : Type u_1
l : Type u_2
m : Type u_3
n : Type u_4
α : Type u_5
β : Type u_6
ι : Type u_7
inst✝⁴ : Fintype l
inst✝³ : Fintype m
inst✝² : Fintype n
inst✝¹ : Unique ι
inst✝ : NonUnitalSeminormedRing α
A : Matrix l m α
B : Matrix m n α
⊢ ((Finset.univ.sup fun a => ∑ i : m, ‖A a i‖₊) * Finset.univ.sup fun i => ∑ j : n, ‖B i j‖₊) ≤
    (Finset.univ.sup fun a => ∑ i : m, ‖A a i‖₊) * Finset.univ.sup fun i => ∑ j : n, ‖B i j‖₊

tactic: rfl
state_before: R : Type u_1
l : Type u_2
m : Type u_3
n : Type u_4
α : Type u_5
β : Type u_6
ι : Type u_7
inst✝⁴ : Fintype l
inst✝³ : Fintype m
inst✝² : Fintype n
inst✝¹ : Unique ι
inst✝ : NonUnitalSeminormedRing α
A : Matrix l m α
B : Matrix m n α
⊢ ((Finset.univ.sup fun a => ∑ i : m, ‖A a i‖₊) * Finset.univ.sup fun i => ∑ j : n, ‖B i j‖₊) ≤
    (Finset.univ.sup fun a => ∑ i : m, ‖A a i‖₊) * Finset.univ.sup fun i => ∑ j : n, ‖B i j‖₊
state_after: no goals