Skip to content

Commit 5443d88

Browse files
committed
feat(ContinuousFunctionalCalculus): a ^ y is invertible iff a is invertible (#25005)
This PR shows that `a ^ y` is invertible iff `a` is also invertible, where the power is defined via the continuous functional calculus.
1 parent 6189bf8 commit 5443d88

File tree

2 files changed

+79
-14
lines changed
  • Mathlib/Analysis
    • CStarAlgebra/ContinuousFunctionalCalculus
    • SpecialFunctions/ContinuousFunctionalCalculus/Rpow

2 files changed

+79
-14
lines changed

Mathlib/Analysis/CStarAlgebra/ContinuousFunctionalCalculus/Order.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ lemma CFC.conjugate_rpow_neg_one_half {a : A} (h₀ : IsUnit a) (ha : 0 ≤ a :=
270270
a ^ (-(1 / 2) : ℝ) * a * a ^ (-(1 / 2) : ℝ) = 1 := by
271271
lift a to Aˣ using h₀
272272
nth_rw 2 [← rpow_one (a : A)]
273-
simp only [← rpow_add (a.zero_notMem_spectrum ℝ≥0)]
273+
simp only [← rpow_add a.isUnit]
274274
norm_num
275275
exact rpow_zero _
276276

@@ -305,7 +305,7 @@ lemma le_iff_norm_sqrt_mul_rpow {a b : A} (hbu : IsUnit b) (ha : 0 ≤ a) (hb :
305305
_ = 1 := conjugate_rpow_neg_one_half b.isUnit
306306
· calc
307307
a = (sqrt ↑b * ↑b ^ (-(1 / 2) : ℝ)) * a * (↑b ^ (-(1 / 2) : ℝ) * sqrt ↑b) := by
308-
simp only [CFC.sqrt_eq_rpow .., ← CFC.rpow_add (b.zero_notMem_spectrum ℝ≥0)]
308+
simp only [CFC.sqrt_eq_rpow .., ← CFC.rpow_add b.isUnit]
309309
norm_num
310310
simp [CFC.rpow_zero (b : A)]
311311
_ = sqrt ↑b * (↑b ^ (-(1 / 2) : ℝ) * a * ↑b ^ (-(1 / 2) : ℝ)) * sqrt ↑b := by

Mathlib/Analysis/SpecialFunctions/ContinuousFunctionalCalculus/Rpow/Basic.lean

Lines changed: 77 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -363,43 +363,54 @@ lemma rpow_algebraMap {x : ℝ≥0} {y : ℝ} :
363363
(algebraMap ℝ≥0 A x) ^ y = algebraMap ℝ≥0 A (x ^ y) := by
364364
rw [rpow_def, cfc_algebraMap ..]
365365

366-
lemma rpow_add {a : A} {x y : ℝ} (ha : 0 ∉ spectrum ℝ≥0 a) :
366+
lemma rpow_add {a : A} {x y : ℝ} (ha : IsUnit a) :
367367
a ^ (x + y) = a ^ x * a ^ y := by
368+
have ha' : 0 ∉ spectrum ℝ≥0 a := spectrum.zero_notMem _ ha
368369
simp only [rpow_def, NNReal.rpow_eq_pow]
369370
rw [← cfc_mul _ _ a]
370371
refine cfc_congr ?_
371372
intro z hz
372373
have : z ≠ 0 := by aesop
373374
simp [NNReal.rpow_add this _ _]
374375

375-
-- TODO: relate to a strict positivity condition
376376
lemma rpow_rpow [IsTopologicalRing A] [T2Space A]
377-
(a : A) (x y : ℝ) (ha₁ : 0 ∉ spectrum ℝ≥0 a) (hx : x ≠ 0) (ha₂ : 0 ≤ a := by cfc_tac) :
377+
(a : A) (x y : ℝ) (ha₁ : IsUnit a) (hx : x ≠ 0) (ha₂ : 0 ≤ a := by cfc_tac) :
378378
(a ^ x) ^ y = a ^ (x * y) := by
379+
have ha₁' : 0 ∉ spectrum ℝ≥0 a := spectrum.zero_notMem _ ha₁
379380
simp only [rpow_def]
380381
rw [← cfc_comp _ _ a ha₂]
381382
refine cfc_congr fun _ _ => ?_
382383
simp [NNReal.rpow_mul]
383384

385+
lemma rpow_rpow_inv [IsTopologicalRing A] [T2Space A]
386+
(a : A) (x : ℝ) (ha₁ : IsUnit a) (hx : x ≠ 0) (ha₂ : 0 ≤ a := by cfc_tac) :
387+
(a ^ x) ^ x⁻¹ = a := by
388+
rw [rpow_rpow a x x⁻¹ ha₁ hx ha₂, mul_inv_cancel₀ hx, rpow_one a ha₂]
389+
390+
lemma rpow_inv_rpow [IsTopologicalRing A] [T2Space A]
391+
(a : A) (x : ℝ) (ha₁ : IsUnit a) (hx : x ≠ 0) (ha₂ : 0 ≤ a := by cfc_tac) :
392+
(a ^ x⁻¹) ^ x = a := by
393+
simpa using rpow_rpow_inv a x⁻¹ ha₁ (inv_ne_zero hx) ha₂
394+
384395
lemma rpow_rpow_of_exponent_nonneg [IsTopologicalRing A] [T2Space A] (a : A) (x y : ℝ)
385396
(hx : 0 ≤ x) (hy : 0 ≤ y) (ha₂ : 0 ≤ a := by cfc_tac) : (a ^ x) ^ y = a ^ (x * y) := by
386397
simp only [rpow_def]
387398
rw [← cfc_comp _ _ a]
388399
refine cfc_congr fun _ _ => ?_
389400
simp [NNReal.rpow_mul]
390401

391-
lemma rpow_mul_rpow_neg {a : A} (x : ℝ) (ha : 0 ∉ spectrum ℝ≥0 a)
402+
lemma rpow_mul_rpow_neg {a : A} (x : ℝ) (ha : IsUnit a)
392403
(ha' : 0 ≤ a := by cfc_tac) : a ^ x * a ^ (-x) = 1 := by
393404
rw [← rpow_add ha, add_neg_cancel, rpow_zero a]
394405

395-
lemma rpow_neg_mul_rpow {a : A} (x : ℝ) (ha : 0 ∉ spectrum ℝ≥0 a)
406+
lemma rpow_neg_mul_rpow {a : A} (x : ℝ) (ha : IsUnit a)
396407
(ha' : 0 ≤ a := by cfc_tac) : a ^ (-x) * a ^ x = 1 := by
397408
rw [← rpow_add ha, neg_add_cancel, rpow_zero a]
398409

399410
lemma rpow_neg_one_eq_inv (a : Aˣ) (ha : (0 : A) ≤ a := by cfc_tac) :
400411
a ^ (-1 : ℝ) = (↑a⁻¹ : A) := by
401412
refine a.inv_eq_of_mul_eq_one_left ?_ |>.symm
402-
simpa [rpow_one (a : A)] using rpow_neg_mul_rpow 1 (spectrum.zero_notMem ℝ≥0 a.isUnit)
413+
simpa [rpow_one (a : A)] using rpow_neg_mul_rpow 1 a.isUnit
403414

404415
lemma rpow_neg_one_eq_cfc_inv {A : Type*} [PartialOrder A] [NormedRing A] [StarRing A]
405416
[StarOrderedRing A] [NormedAlgebra ℝ A] [NonnegSpectrumClass ℝ A]
@@ -424,6 +435,37 @@ lemma rpow_intCast (a : Aˣ) (n : ℤ) (ha : (0 : A) ≤ a := by cfc_tac) :
424435
refine cfc_congr fun _ _ => ?_
425436
simp
426437

438+
/-- `a ^ x` bundled as an element of `Aˣ` for `a : Aˣ`. -/
439+
@[simps]
440+
noncomputable def _root_.Units.cfcRpow (a : Aˣ) (x : ℝ) (ha : (0 : A) ≤ a := by cfc_tac) : Aˣ :=
441+
⟨(a : A) ^ x, (a : A) ^ (-x), rpow_mul_rpow_neg x (by simp), rpow_neg_mul_rpow x (by simp)⟩
442+
443+
@[aesop safe apply]
444+
lemma _root_.IsUnit.cfcRpow {a : A} (ha : IsUnit a) (x : ℝ) (ha_nonneg : 0 ≤ a := by cfc_tac) :
445+
IsUnit (a ^ x) :=
446+
ha.unit.cfcRpow x |>.isUnit
447+
448+
lemma spectrum_rpow (a : A) (x : ℝ)
449+
(h : ContinuousOn (· ^ x) (spectrum ℝ≥0 a) := by cfc_cont_tac)
450+
(ha : 0 ≤ a := by cfc_tac) :
451+
spectrum ℝ≥0 (a ^ x) = (· ^ x) '' spectrum ℝ≥0 a :=
452+
cfc_map_spectrum (· ^ x : ℝ≥0 → ℝ≥0) a ha h
453+
454+
lemma isUnit_rpow_iff (a : A) (y : ℝ) (hy : y ≠ 0) (ha : 0 ≤ a := by cfc_tac) :
455+
IsUnit (a ^ y) ↔ IsUnit a := by
456+
nontriviality A
457+
refine ⟨fun h => ?_, fun h => h.cfcRpow y ha⟩
458+
rw [rpow_def] at h
459+
by_cases hf : ContinuousOn (fun x : ℝ≥0 => x ^ y) (spectrum ℝ≥0 a)
460+
· rw [isUnit_cfc_iff _ a hf] at h
461+
refine spectrum.isUnit_of_zero_notMem ℝ≥0 ?_
462+
intro h0
463+
specialize h 0 h0
464+
simp only [ne_eq, NNReal.rpow_eq_zero_iff, true_and, Decidable.not_not] at h
465+
exact hy h
466+
· rw [cfc_apply_of_not_continuousOn a hf] at h
467+
exact False.elim <| not_isUnit_zero h
468+
427469
section prod
428470

429471
variable [IsTopologicalRing A] [T2Space A]
@@ -436,16 +478,18 @@ variable {B : Type*} [PartialOrder B] [Ring B] [StarRing B] [TopologicalSpace B]
436478

437479
/- Note that there is higher-priority instance of `Pow (A × B) ℝ` coming from the `Pow` instance for
438480
products, hence the direct use of `rpow` here. -/
439-
lemma rpow_map_prod {a : A} {b : B} {x : ℝ} (ha : 0 ∉ spectrum ℝ≥0 a) (hb : 0 ∉ spectrum ℝ≥0 b)
481+
lemma rpow_map_prod {a : A} {b : B} {x : ℝ} (ha : IsUnit a) (hb : IsUnit b)
440482
(ha' : 0 ≤ a := by cfc_tac) (hb' : 0 ≤ b := by cfc_tac) :
441483
rpow (a, b) x = (a ^ x, b ^ x) := by
484+
have ha'' : 0 ∉ spectrum ℝ≥0 a := spectrum.zero_notMem _ ha
485+
have hb'' : 0 ∉ spectrum ℝ≥0 b := spectrum.zero_notMem _ hb
442486
simp only [rpow_def]
443487
unfold rpow
444488
refine cfc_map_prod (R := ℝ≥0) (S := ℝ) _ a b (by cfc_cont_tac) ?_
445489
rw [Prod.le_def]
446490
constructor <;> simp [ha', hb']
447491

448-
lemma rpow_eq_rpow_prod {a : A} {b : B} {x : ℝ} (ha : 0 ∉ spectrum ℝ≥0 a) (hb : 0 ∉ spectrum ℝ≥0 b)
492+
lemma rpow_eq_rpow_prod {a : A} {b : B} {x : ℝ} (ha : IsUnit a) (hb : IsUnit b)
449493
(ha' : 0 ≤ a := by cfc_tac) (hb' : 0 ≤ b := by cfc_tac) :
450494
rpow (a, b) x = (a, b) ^ x := rpow_map_prod ha hb
451495

@@ -466,14 +510,15 @@ variable {ι : Type*} {C : ι → Type*} [∀ i, PartialOrder (C i)] [∀ i, Rin
466510

467511
/- Note that there is a higher-priority instance of `Pow (∀ i, B i) ℝ` coming from the `Pow`
468512
instance for pi types, hence the direct use of `rpow` here. -/
469-
lemma rpow_map_pi {c : ∀ i, C i} {x : ℝ} (hc : ∀ i, 0 ∉ spectrum ℝ≥0 (c i))
513+
lemma rpow_map_pi {c : ∀ i, C i} {x : ℝ} (hc : ∀ i, IsUnit (c i))
470514
(hc' : ∀ i, 0 ≤ c i := by cfc_tac) :
471515
rpow c x = fun i => (c i) ^ x := by
516+
have hc'' : ∀ i, 0 ∉ spectrum ℝ≥0 (c i) := fun i => spectrum.zero_notMem _ (hc i)
472517
simp only [rpow_def]
473518
unfold rpow
474519
exact cfc_map_pi (S := ℝ) _ c
475520

476-
lemma rpow_eq_rpow_pi {c : ∀ i, C i} {x : ℝ} (hc : ∀ i, 0 ∉ spectrum ℝ≥0 (c i))
521+
lemma rpow_eq_rpow_pi {c : ∀ i, C i} {x : ℝ} (hc : ∀ i, IsUnit (c i))
477522
(hc' : ∀ i, 0 ≤ c i := by cfc_tac) :
478523
rpow c x = c ^ x := rpow_map_pi hc
479524

@@ -511,7 +556,7 @@ lemma sqrt_algebraMap {r : ℝ≥0} : sqrt (algebraMap ℝ≥0 A r) = algebraMap
511556
lemma sqrt_one : sqrt (1 : A) = 1 := by simp [sqrt_eq_cfc]
512557

513558
-- TODO: relate to a strict positivity condition
514-
lemma sqrt_rpow {a : A} {x : ℝ} (h : 0 ∉ spectrum ℝ≥0 a)
559+
lemma sqrt_rpow {a : A} {x : ℝ} (h : IsUnit a)
515560
(hx : x ≠ 0) : sqrt (a ^ x) = a ^ (x / 2) := by
516561
by_cases hnonneg : 0 ≤ a
517562
case pos =>
@@ -520,7 +565,7 @@ lemma sqrt_rpow {a : A} {x : ℝ} (h : 0 ∉ spectrum ℝ≥0 a)
520565
simp [sqrt_eq_cfc, rpow_def, cfc_apply_of_not_predicate a hnonneg]
521566

522567
-- TODO: relate to a strict positivity condition
523-
lemma rpow_sqrt (a : A) (x : ℝ) (h : 0 ∉ spectrum ℝ≥0 a)
568+
lemma rpow_sqrt (a : A) (x : ℝ) (h : IsUnit a)
524569
(ha : 0 ≤ a := by cfc_tac) : (sqrt a) ^ x = a ^ (x / 2) := by
525570
rw [sqrt_eq_rpow, div_eq_mul_inv, one_mul,
526571
rpow_rpow _ _ _ h (by norm_num), inv_mul_eq_div]
@@ -546,6 +591,26 @@ lemma rpow_sqrt_nnreal {a : A} {x : ℝ≥0}
546591
have h₁ : 0 ≤ (x : ℝ) := NNReal.zero_le_coe
547592
rw [sqrt_eq_rpow, rpow_rpow_of_exponent_nonneg _ _ _ (by norm_num) h₁, one_div_mul_eq_div]
548593

594+
lemma isUnit_nnrpow_iff (a : A) (y : ℝ≥0) (hy : y ≠ 0) (ha : 0 ≤ a := by cfc_tac) :
595+
IsUnit (a ^ y) ↔ IsUnit a := by
596+
rw [nnrpow_eq_rpow (pos_of_ne_zero hy)]
597+
refine isUnit_rpow_iff a y ?_ ha
598+
exact_mod_cast hy
599+
600+
@[aesop safe apply]
601+
lemma _root_.IsUnit.cfcNNRpow (a : A) (y : ℝ≥0) (ha_unit : IsUnit a) (hy : y ≠ 0)
602+
(ha : 0 ≤ a := by cfc_tac) : IsUnit (a ^ y) :=
603+
(isUnit_nnrpow_iff a y hy ha).mpr ha_unit
604+
605+
lemma isUnit_sqrt_iff (a : A) (ha : 0 ≤ a := by cfc_tac) : IsUnit (sqrt a) ↔ IsUnit a := by
606+
rw [sqrt_eq_rpow]
607+
exact isUnit_rpow_iff a _ (by norm_num) ha
608+
609+
@[aesop safe apply]
610+
lemma _root_.IsUnit.cfcSqrt (a : A) (ha_unit : IsUnit a) (ha : 0 ≤ a := by cfc_tac) :
611+
IsUnit (sqrt a) :=
612+
(isUnit_sqrt_iff a ha).mpr ha_unit
613+
549614
end unital_vs_nonunital
550615

551616
end Unital

0 commit comments

Comments
 (0)