Theorem: Module.End.iSup_genEigenspace_inf_le_add
File: Mathlib/LinearAlgebra/Eigenspace/Basic.lean

Proof steps:
state_before: K R : Type v
V M : Type w
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
f₁ f₂ : End R M
μ₁ μ₂ : R
h : Commute f₁ f₂
⊢ (⨆ k, (f₁.genEigenspace μ₁) k) ⊓ ⨆ k, (f₂.genEigenspace μ₂) k ≤ ⨆ k, ((f₁ + f₂).genEigenspace (μ₁ + μ₂)) k
state_after: K R : Type v
V M : Type w
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
f₁ f₂ : End R M
μ₁ μ₂ : R
h : Commute f₁ f₂
m : M
hm : m ∈ (⨆ k, (f₁.genEigenspace μ₁) k) ⊓ ⨆ k, (f₂.genEigenspace μ₂) k
⊢ m ∈ ⨆ k, ((f₁ + f₂).genEigenspace (μ₁ + μ₂)) k
tactic: intro m hm
state_before: K R : Type v
V M : Type w
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
f₁ f₂ : End R M
μ₁ μ₂ : R
h : Commute f₁ f₂
m : M
hm : m ∈ (⨆ k, (f₁.genEigenspace μ₁) k) ⊓ ⨆ k, (f₂.genEigenspace μ₂) k
⊢ m ∈ ⨆ k, ((f₁ + f₂).genEigenspace (μ₁ + μ₂)) k
state_after: K R : Type v
V M : Type w
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
f₁ f₂ : End R M
μ₁ μ₂ : R
h : Commute f₁ f₂
m : M
hm : (∃ k, ((f₁ - μ₁ • 1) ^ k) m = 0) ∧ ∃ k, ((f₂ - μ₂ • 1) ^ k) m = 0
⊢ ∃ k, ((f₁ + f₂ - (μ₁ + μ₂) • 1) ^ k) m = 0
tactic: simp only [iSup_le_iff, Submodule.mem_inf, Submodule.mem_iSup_of_chain,
    mem_genEigenspace] at hm ⊢
state_before: K R : Type v
V M : Type w
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
f₁ f₂ : End R M
μ₁ μ₂ : R
h : Commute f₁ f₂
m : M
hm : (∃ k, ((f₁ - μ₁ • 1) ^ k) m = 0) ∧ ∃ k, ((f₂ - μ₂ • 1) ^ k) m = 0
⊢ ∃ k, ((f₁ + f₂ - (μ₁ + μ₂) • 1) ^ k) m = 0
state_after: case intro.intro.intro
K R : Type v
V M : Type w
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
f₁ f₂ : End R M
μ₁ μ₂ : R
h : Commute f₁ f₂
m : M
k₁ : ℕ
hk₁ : ((f₁ - μ₁ • 1) ^ k₁) m = 0
k₂ : ℕ
hk₂ : ((f₂ - μ₂ • 1) ^ k₂) m = 0
⊢ ∃ k, ((f₁ + f₂ - (μ₁ + μ₂) • 1) ^ k) m = 0
tactic: obtain ⟨⟨k₁, hk₁⟩, ⟨k₂, hk₂⟩⟩ := hm
state_before: case intro.intro.intro
K R : Type v
V M : Type w
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
f₁ f₂ : End R M
μ₁ μ₂ : R
h : Commute f₁ f₂
m : M
k₁ : ℕ
hk₁ : ((f₁ - μ₁ • 1) ^ k₁) m = 0
k₂ : ℕ
hk₂ : ((f₂ - μ₂ • 1) ^ k₂) m = 0
⊢ ∃ k, ((f₁ + f₂ - (μ₁ + μ₂) • 1) ^ k) m = 0
state_after: case h
K R : Type v
V M : Type w
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
f₁ f₂ : End R M
μ₁ μ₂ : R
h : Commute f₁ f₂
m : M
k₁ : ℕ
hk₁ : ((f₁ - μ₁ • 1) ^ k₁) m = 0
k₂ : ℕ
hk₂ : ((f₂ - μ₂ • 1) ^ k₂) m = 0
⊢ ((f₁ + f₂ - (μ₁ + μ₂) • 1) ^ (k₁ + k₂ - 1)) m = 0
tactic: use k₁ + k₂ - 1
state_before: case h
K R : Type v
V M : Type w
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
f₁ f₂ : End R M
μ₁ μ₂ : R
h : Commute f₁ f₂
m : M
k₁ : ℕ
hk₁ : ((f₁ - μ₁ • 1) ^ k₁) m = 0
k₂ : ℕ
hk₂ : ((f₂ - μ₂ • 1) ^ k₂) m = 0
⊢ ((f₁ + f₂ - (μ₁ + μ₂) • 1) ^ (k₁ + k₂ - 1)) m = 0
state_after: case h
K R : Type v
V M : Type w
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
f₁ f₂ : End R M
μ₁ μ₂ : R
h : Commute f₁ f₂
m : M
k₁ : ℕ
hk₁ : ((f₁ - μ₁ • 1) ^ k₁) m = 0
k₂ : ℕ
hk₂ : ((f₂ - μ₂ • 1) ^ k₂) m = 0
this : f₁ + f₂ - (μ₁ + μ₂) • 1 = f₁ - μ₁ • 1 + (f₂ - μ₂ • 1)
⊢ ((f₁ + f₂ - (μ₁ + μ₂) • 1) ^ (k₁ + k₂ - 1)) m = 0
tactic: have : f₁ + f₂ - (μ₁ + μ₂) • 1 = (f₁ - μ₁ • 1) + (f₂ - μ₂ • 1) := by
    rw [add_smul]; exact add_sub_add_comm f₁ f₂ (μ₁ • 1) (μ₂ • 1)
state_before: case h
K R : Type v
V M : Type w
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
f₁ f₂ : End R M
μ₁ μ₂ : R
h : Commute f₁ f₂
m : M
k₁ : ℕ
hk₁ : ((f₁ - μ₁ • 1) ^ k₁) m = 0
k₂ : ℕ
hk₂ : ((f₂ - μ₂ • 1) ^ k₂) m = 0
this : f₁ + f₂ - (μ₁ + μ₂) • 1 = f₁ - μ₁ • 1 + (f₂ - μ₂ • 1)
⊢ ((f₁ + f₂ - (μ₁ + μ₂) • 1) ^ (k₁ + k₂ - 1)) m = 0
state_after: case h
K R : Type v
V M : Type w
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
f₁ f₂ : End R M
μ₁ μ₂ : R
m : M
k₁ : ℕ
hk₁ : ((f₁ - μ₁ • 1) ^ k₁) m = 0
k₂ : ℕ
hk₂ : ((f₂ - μ₂ • 1) ^ k₂) m = 0
this : f₁ + f₂ - (μ₁ + μ₂) • 1 = f₁ - μ₁ • 1 + (f₂ - μ₂ • 1)
h : Commute (f₁ - μ₁ • 1) (f₂ - μ₂ • 1)
⊢ ((f₁ + f₂ - (μ₁ + μ₂) • 1) ^ (k₁ + k₂ - 1)) m = 0
tactic: replace h : Commute (f₁ - μ₁ • 1) (f₂ - μ₂ • 1) :=
    (h.sub_right <| Algebra.commute_algebraMap_right μ₂ f₁).sub_left
      (Algebra.commute_algebraMap_left μ₁ _)
state_before: case h
K R : Type v
V M : Type w
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
f₁ f₂ : End R M
μ₁ μ₂ : R
m : M
k₁ : ℕ
hk₁ : ((f₁ - μ₁ • 1) ^ k₁) m = 0
k₂ : ℕ
hk₂ : ((f₂ - μ₂ • 1) ^ k₂) m = 0
this : f₁ + f₂ - (μ₁ + μ₂) • 1 = f₁ - μ₁ • 1 + (f₂ - μ₂ • 1)
h : Commute (f₁ - μ₁ • 1) (f₂ - μ₂ • 1)
⊢ ((f₁ + f₂ - (μ₁ + μ₂) • 1) ^ (k₁ + k₂ - 1)) m = 0
state_after: case h
K R : Type v
V M : Type w
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
f₁ f₂ : End R M
μ₁ μ₂ : R
m : M
k₁ : ℕ
hk₁ : ((f₁ - μ₁ • 1) ^ k₁) m = 0
k₂ : ℕ
hk₂ : ((f₂ - μ₂ • 1) ^ k₂) m = 0
this : f₁ + f₂ - (μ₁ + μ₂) • 1 = f₁ - μ₁ • 1 + (f₂ - μ₂ • 1)
h : Commute (f₁ - μ₁ • 1) (f₂ - μ₂ • 1)
⊢ ∑ c ∈ Finset.antidiagonal (k₁ + k₂ - 1), ((k₁ + k₂ - 1).choose c.1 • ((f₁ - μ₁ • 1) ^ c.1 * (f₂ - μ₂ • 1) ^ c.2)) m =
    0
tactic: rw [this, h.add_pow', LinearMap.coeFn_sum, Finset.sum_apply]
state_before: case h
K R : Type v
V M : Type w
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
f₁ f₂ : End R M
μ₁ μ₂ : R
m : M
k₁ : ℕ
hk₁ : ((f₁ - μ₁ • 1) ^ k₁) m = 0
k₂ : ℕ
hk₂ : ((f₂ - μ₂ • 1) ^ k₂) m = 0
this : f₁ + f₂ - (μ₁ + μ₂) • 1 = f₁ - μ₁ • 1 + (f₂ - μ₂ • 1)
h : Commute (f₁ - μ₁ • 1) (f₂ - μ₂ • 1)
⊢ ∑ c ∈ Finset.antidiagonal (k₁ + k₂ - 1), ((k₁ + k₂ - 1).choose c.1 • ((f₁ - μ₁ • 1) ^ c.1 * (f₂ - μ₂ • 1) ^ c.2)) m =
    0
state_after: case h
K R : Type v
V M : Type w
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
f₁ f₂ : End R M
μ₁ μ₂ : R
m : M
k₁ : ℕ
hk₁ : ((f₁ - μ₁ • 1) ^ k₁) m = 0
k₂ : ℕ
hk₂ : ((f₂ - μ₂ • 1) ^ k₂) m = 0
this : f₁ + f₂ - (μ₁ + μ₂) • 1 = f₁ - μ₁ • 1 + (f₂ - μ₂ • 1)
h : Commute (f₁ - μ₁ • 1) (f₂ - μ₂ • 1)
x✝ : ℕ × ℕ
i j : ℕ
hij : (i, j) ∈ Finset.antidiagonal (k₁ + k₂ - 1)
⊢ ((k₁ + k₂ - 1).choose (i, j).1 • ((f₁ - μ₁ • 1) ^ (i, j).1 * (f₂ - μ₂ • 1) ^ (i, j).2)) m = 0
tactic: refine Finset.sum_eq_zero fun ⟨i, j⟩ hij ↦ ?_
state_before: case h
K R : Type v
V M : Type w
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
f₁ f₂ : End R M
μ₁ μ₂ : R
m : M
k₁ : ℕ
hk₁ : ((f₁ - μ₁ • 1) ^ k₁) m = 0
k₂ : ℕ
hk₂ : ((f₂ - μ₂ • 1) ^ k₂) m = 0
this : f₁ + f₂ - (μ₁ + μ₂) • 1 = f₁ - μ₁ • 1 + (f₂ - μ₂ • 1)
h : Commute (f₁ - μ₁ • 1) (f₂ - μ₂ • 1)
x✝ : ℕ × ℕ
i j : ℕ
hij : (i, j) ∈ Finset.antidiagonal (k₁ + k₂ - 1)
⊢ ((k₁ + k₂ - 1).choose (i, j).1 • ((f₁ - μ₁ • 1) ^ (i, j).1 * (f₂ - μ₂ • 1) ^ (i, j).2)) m = 0
state_after: case h
K R : Type v
V M : Type w
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
f₁ f₂ : End R M
μ₁ μ₂ : R
m : M
k₁ : ℕ
hk₁ : ((f₁ - μ₁ • 1) ^ k₁) m = 0
k₂ : ℕ
hk₂ : ((f₂ - μ₂ • 1) ^ k₂) m = 0
this : f₁ + f₂ - (μ₁ + μ₂) • 1 = f₁ - μ₁ • 1 + (f₂ - μ₂ • 1)
h : Commute (f₁ - μ₁ • 1) (f₂ - μ₂ • 1)
x✝ : ℕ × ℕ
i j : ℕ
hij : (i, j) ∈ Finset.antidiagonal (k₁ + k₂ - 1)
⊢ ((f₁ - μ₁ • 1) ^ i * (f₂ - μ₂ • 1) ^ j) m = 0
tactic: suffices (((f₁ - μ₁ • 1) ^ i) * ((f₂ - μ₂ • 1) ^ j)) m = 0 by
    rw [LinearMap.smul_apply, this, smul_zero]
state_before: case h
K R : Type v
V M : Type w
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
f₁ f₂ : End R M
μ₁ μ₂ : R
m : M
k₁ : ℕ
hk₁ : ((f₁ - μ₁ • 1) ^ k₁) m = 0
k₂ : ℕ
hk₂ : ((f₂ - μ₂ • 1) ^ k₂) m = 0
this : f₁ + f₂ - (μ₁ + μ₂) • 1 = f₁ - μ₁ • 1 + (f₂ - μ₂ • 1)
h : Commute (f₁ - μ₁ • 1) (f₂ - μ₂ • 1)
x✝ : ℕ × ℕ
i j : ℕ
hij : (i, j) ∈ Finset.antidiagonal (k₁ + k₂ - 1)
⊢ ((f₁ - μ₁ • 1) ^ i * (f₂ - μ₂ • 1) ^ j) m = 0
state_after: case h.inl
K R : Type v
V M : Type w
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
f₁ f₂ : End R M
μ₁ μ₂ : R
m : M
k₁ : ℕ
hk₁ : ((f₁ - μ₁ • 1) ^ k₁) m = 0
k₂ : ℕ
hk₂ : ((f₂ - μ₂ • 1) ^ k₂) m = 0
this : f₁ + f₂ - (μ₁ + μ₂) • 1 = f₁ - μ₁ • 1 + (f₂ - μ₂ • 1)
h : Commute (f₁ - μ₁ • 1) (f₂ - μ₂ • 1)
x✝ : ℕ × ℕ
i j : ℕ
hij : (i, j) ∈ Finset.antidiagonal (k₁ + k₂ - 1)
hi : k₁ ≤ (i, j).1
⊢ ((f₁ - μ₁ • 1) ^ i * (f₂ - μ₂ • 1) ^ j) m = 0

case h.inr
K R : Type v
V M : Type w
inst✝⁵ : CommRing R
inst✝⁴ : AddCommGroup M
inst✝³ : Module R M
inst✝² : Field K
inst✝¹ : AddCommGroup V
inst✝ : Module K V
f₁ f₂ : End R M
μ₁ μ₂ : R
m : M
k₁ : ℕ
hk₁ : ((f₁ - μ₁ • 1) ^ k₁) m = 0
k₂ : ℕ
hk₂ : ((f₂ - μ₂ • 1) ^ k₂) m = 0
this : f₁ + f₂ - (μ₁ + μ₂) • 1 = f₁ - μ₁ • 1 + (f₂ - μ₂ • 1)
h : Commute (f₁ - μ₁ • 1) (f₂ - μ₂ • 1)
x✝ : ℕ × ℕ
i j : ℕ
hij : (i, j) ∈ Finset.antidiagonal (k₁ + k₂ - 1)
hj : k₂ ≤ (i, j).2
⊢ ((f₁ - μ₁ • 1) ^ i * (f₂ - μ₂ • 1) ^ j) m = 0
tactic: cases' Nat.le_or_le_of_add_eq_add_pred (Finset.mem_antidiagonal.mp hij) with hi hj