-- Mathlib/Analysis/CStarAlgebra/Spectrum.lean
theorem IsStarNormal.spectralRadius_eq_nnnorm (a : A) [IsStarNormal a] :
    spectralRadius ℂ a = ‖a‖₊

Proof state:
case h
A : Type u_1
inst✝¹ : CStarAlgebra A
a : A
inst✝ : IsStarNormal a
n : ℕ
⊢ ↑‖(a⋆ * a) ^ n‖₊ ^ (1 / ↑n) = ((fun x => x ^ 2) ∘ fun n => ↑‖a ^ n‖₊ ^ (1 / ↑n)) n

Tactic:
rw [Function.comp_apply, ← rpow_natCast, ← rpow_mul, mul_comm, rpow_mul, rpow_natCast, ←
  coe_pow, sq, ← nnnorm_star_mul_self, Commute.mul_pow (star_comm_self' a), star_pow]

Result:
no goals

Proof state:
A : Type u_1
inst✝¹ : CStarAlgebra A
a : A
inst✝ : IsStarNormal a
⊢ spectralRadius ℂ a = ↑‖a‖₊

Tactic:
refine (ENNReal.pow_right_strictMono two_ne_zero).injective ?_

Result:
A : Type u_1
inst✝¹ : CStarAlgebra A
a : A
inst✝ : IsStarNormal a
⊢ spectralRadius ℂ a ^ 2 = ↑‖a‖₊ ^ 2

Proof state:
A : Type u_1
inst✝¹ : CStarAlgebra A
a : A
inst✝ : IsStarNormal a
⊢ (fun n => ↑‖(a⋆ * a) ^ n‖₊ ^ (1 / ↑n)) = (fun x => x ^ 2) ∘ fun n => ↑‖a ^ n‖₊ ^ (1 / ↑n)

Tactic:
funext n

Result:
case h
A : Type u_1
inst✝¹ : CStarAlgebra A
a : A
inst✝ : IsStarNormal a
n : ℕ
⊢ ↑‖(a⋆ * a) ^ n‖₊ ^ (1 / ↑n) = ((fun x => x ^ 2) ∘ fun n => ↑‖a ^ n‖₊ ^ (1 / ↑n)) n

Proof state:
A : Type u_1
inst✝¹ : CStarAlgebra A
a : A
inst✝ : IsStarNormal a
⊢ spectralRadius ℂ a ^ 2 = ↑‖a‖₊ ^ 2

Tactic:
have heq :
  (fun n : ℕ => (‖(a⋆ * a) ^ n‖₊ : ℝ≥0∞) ^ (1 / n : ℝ)) =
    (fun x => x ^ 2) ∘ fun n : ℕ => (‖a ^ n‖₊ : ℝ≥0∞) ^ (1 / n : ℝ) := by
  funext n
  rw [Function.comp_apply, ← rpow_natCast, ← rpow_mul, mul_comm, rpow_mul, rpow_natCast, ←
    coe_pow, sq, ← nnnorm_star_mul_self, Commute.mul_pow (star_comm_self' a), star_pow]

Result:
A : Type u_1
inst✝¹ : CStarAlgebra A
a : A
inst✝ : IsStarNormal a
heq : (fun n => ↑‖(a⋆ * a) ^ n‖₊ ^ (1 / ↑n)) = (fun x => x ^ 2) ∘ fun n => ↑‖a ^ n‖₊ ^ (1 / ↑n)
⊢ spectralRadius ℂ a ^ 2 = ↑‖a‖₊ ^ 2

Proof state:
A : Type u_1
inst✝¹ : CStarAlgebra A
a : A
inst✝ : IsStarNormal a
heq : (fun n => ↑‖(a⋆ * a) ^ n‖₊ ^ (1 / ↑n)) = (fun x => x ^ 2) ∘ fun n => ↑‖a ^ n‖₊ ^ (1 / ↑n)
h₂ : Tendsto (fun n => ↑‖(a⋆ * a) ^ n‖₊ ^ (1 / ↑n)) atTop (𝓝 (spectralRadius ℂ a ^ 2))
⊢ spectralRadius ℂ a ^ 2 = ↑‖a‖₊ ^ 2

Tactic:
convert tendsto_nhds_unique h₂ (pow_nnnorm_pow_one_div_tendsto_nhds_spectralRadius (a⋆ * a))

Result:
case h.e'_3
A : Type u_1
inst✝¹ : CStarAlgebra A
a : A
inst✝ : IsStarNormal a
heq : (fun n => ↑‖(a⋆ * a) ^ n‖₊ ^ (1 / ↑n)) = (fun x => x ^ 2) ∘ fun n => ↑‖a ^ n‖₊ ^ (1 / ↑n)
h₂ : Tendsto (fun n => ↑‖(a⋆ * a) ^ n‖₊ ^ (1 / ↑n)) atTop (𝓝 (spectralRadius ℂ a ^ 2))
⊢ ↑‖a‖₊ ^ 2 = spectralRadius ℂ (a⋆ * a)

Proof state:
A : Type u_1
inst✝¹ : CStarAlgebra A
a : A
inst✝ : IsStarNormal a
heq : (fun n => ↑‖(a⋆ * a) ^ n‖₊ ^ (1 / ↑n)) = (fun x => x ^ 2) ∘ fun n => ↑‖a ^ n‖₊ ^ (1 / ↑n)
⊢ spectralRadius ℂ a ^ 2 = ↑‖a‖₊ ^ 2

Tactic:
have h₂ :=
  ((ENNReal.continuous_pow 2).tendsto (spectralRadius ℂ a)).comp
    (spectrum.pow_nnnorm_pow_one_div_tendsto_nhds_spectralRadius a)

Result:
A : Type u_1
inst✝¹ : CStarAlgebra A
a : A
inst✝ : IsStarNormal a
heq : (fun n => ↑‖(a⋆ * a) ^ n‖₊ ^ (1 / ↑n)) = (fun x => x ^ 2) ∘ fun n => ↑‖a ^ n‖₊ ^ (1 / ↑n)
h₂ : Tendsto ((fun a => a ^ 2) ∘ fun n => ↑‖a ^ n‖₊ ^ (1 / ↑n)) atTop (𝓝 (spectralRadius ℂ a ^ 2))
⊢ spectralRadius ℂ a ^ 2 = ↑‖a‖₊ ^ 2

Proof state:
A : Type u_1
inst✝¹ : CStarAlgebra A
a : A
inst✝ : IsStarNormal a
heq : (fun n => ↑‖(a⋆ * a) ^ n‖₊ ^ (1 / ↑n)) = (fun x => x ^ 2) ∘ fun n => ↑‖a ^ n‖₊ ^ (1 / ↑n)
h₂ : Tendsto ((fun a => a ^ 2) ∘ fun n => ↑‖a ^ n‖₊ ^ (1 / ↑n)) atTop (𝓝 (spectralRadius ℂ a ^ 2))
⊢ spectralRadius ℂ a ^ 2 = ↑‖a‖₊ ^ 2

Tactic:
rw [← heq] at h₂

Result:
A : Type u_1
inst✝¹ : CStarAlgebra A
a : A
inst✝ : IsStarNormal a
heq : (fun n => ↑‖(a⋆ * a) ^ n‖₊ ^ (1 / ↑n)) = (fun x => x ^ 2) ∘ fun n => ↑‖a ^ n‖₊ ^ (1 / ↑n)
h₂ : Tendsto (fun n => ↑‖(a⋆ * a) ^ n‖₊ ^ (1 / ↑n)) atTop (𝓝 (spectralRadius ℂ a ^ 2))
⊢ spectralRadius ℂ a ^ 2 = ↑‖a‖₊ ^ 2

Proof state:
case h.e'_3
A : Type u_1
inst✝¹ : CStarAlgebra A
a : A
inst✝ : IsStarNormal a
heq : (fun n => ↑‖(a⋆ * a) ^ n‖₊ ^ (1 / ↑n)) = (fun x => x ^ 2) ∘ fun n => ↑‖a ^ n‖₊ ^ (1 / ↑n)
h₂ : Tendsto (fun n => ↑‖(a⋆ * a) ^ n‖₊ ^ (1 / ↑n)) atTop (𝓝 (spectralRadius ℂ a ^ 2))
⊢ ↑‖a‖₊ ^ 2 = spectralRadius ℂ (a⋆ * a)

Tactic:
rw [(IsSelfAdjoint.star_mul_self a).spectralRadius_eq_nnnorm, sq, nnnorm_star_mul_self, coe_mul]

Result:
no goals