Skip to content

Commit 1912fa5

Browse files
committed
chore: move things around in the Analytic folder (#16972)
We move some things in the `Analytic` folder, particularly in and out of `Basic`. Notably * The fact that the addition and subtraction are analytic is moved from `Basic` to `Constructions`, where there are already the same facts for multiplication and scalar multiplication * Congruence lemmas are moved from `Within` to `Basic` * Uniqueness of power series is moved from `Basic` to the (already existing file!) `Uniqueness` * Order of imports is swapped between `Calculus.FDeriv.Analytic` and `Analytic.Within`. We also add a few docstrings to the files to show their structure. This gives a more principled hierarchy, better suited to the addition of future lemmas. This PR is just moving things around, no statement has been added or removed.
1 parent 87c9362 commit 1912fa5

File tree

9 files changed

+407
-396
lines changed

9 files changed

+407
-396
lines changed

β€ŽMathlib/Analysis/Analytic/Basic.leanβ€Ž

Lines changed: 105 additions & 310 deletions
Large diffs are not rendered by default.

β€ŽMathlib/Analysis/Analytic/CPolynomial.leanβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Sophie Morel
55
-/
66
import Mathlib.Analysis.Analytic.ChangeOrigin
7+
import Mathlib.Analysis.Analytic.Constructions
78

89
/-! We specialize the theory fo analytic functions to the case of functions that admit a
910
development given by a *finite* formal multilinear series. We call them "continuously polynomial",

β€ŽMathlib/Analysis/Analytic/ChangeOrigin.leanβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ that the set of points at which a given function is analytic is open, see `isOpe
3636
noncomputable section
3737

3838
open scoped NNReal ENNReal Topology
39-
open Filter
39+
open Filter Set
4040

4141
variable {π•œ E F : Type*} [NontriviallyNormedField π•œ] [NormedAddCommGroup E] [NormedSpace π•œ E]
4242
[NormedAddCommGroup F] [NormedSpace π•œ F]

β€ŽMathlib/Analysis/Analytic/Constructions.leanβ€Ž

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,157 @@ variable {E F G H : Type*} [NormedAddCommGroup E] [NormedSpace π•œ E] [NormedAd
3131
variable {𝕝 : Type*} [NontriviallyNormedField 𝕝] [NormedAlgebra π•œ 𝕝]
3232
variable {A : Type*} [NormedRing A] [NormedAlgebra π•œ A]
3333

34+
/-!
35+
### Constants are analytic
36+
-/
37+
38+
theorem hasFPowerSeriesOnBall_const {c : F} {e : E} :
39+
HasFPowerSeriesOnBall (fun _ => c) (constFormalMultilinearSeries π•œ E c) e ⊀ := by
40+
refine ⟨by simp, WithTop.zero_lt_top, fun _ => hasSum_single 0 fun n hn => ?_⟩
41+
simp [constFormalMultilinearSeries_apply hn]
42+
43+
theorem hasFPowerSeriesAt_const {c : F} {e : E} :
44+
HasFPowerSeriesAt (fun _ => c) (constFormalMultilinearSeries π•œ E c) e :=
45+
⟨⊀, hasFPowerSeriesOnBall_const⟩
46+
47+
theorem analyticAt_const {v : F} {x : E} : AnalyticAt π•œ (fun _ => v) x :=
48+
⟨constFormalMultilinearSeries π•œ E v, hasFPowerSeriesAt_const⟩
49+
50+
theorem analyticOn_const {v : F} {s : Set E} : AnalyticOn π•œ (fun _ => v) s :=
51+
fun _ _ => analyticAt_const
52+
53+
theorem analyticWithinAt_const {v : F} {s : Set E} {x : E} : AnalyticWithinAt π•œ (fun _ => v) s x :=
54+
analyticAt_const.analyticWithinAt
55+
56+
theorem analyticWithinOn_const {v : F} {s : Set E} : AnalyticWithinOn π•œ (fun _ => v) s :=
57+
analyticOn_const.analyticWithinOn
58+
59+
/-!
60+
### Addition, negation, subtraction
61+
-/
62+
63+
section
64+
65+
variable {f g : E β†’ F} {pf pg : FormalMultilinearSeries π•œ E F} {s : Set E} {x : E} {r : ℝβ‰₯0∞}
66+
67+
theorem HasFPowerSeriesWithinOnBall.add (hf : HasFPowerSeriesWithinOnBall f pf s x r)
68+
(hg : HasFPowerSeriesWithinOnBall g pg s x r) :
69+
HasFPowerSeriesWithinOnBall (f + g) (pf + pg) s x r :=
70+
{ r_le := le_trans (le_min_iff.2 ⟨hf.r_le, hg.r_le⟩) (pf.min_radius_le_radius_add pg)
71+
r_pos := hf.r_pos
72+
hasSum := fun hy h'y => (hf.hasSum hy h'y).add (hg.hasSum hy h'y) }
73+
74+
theorem HasFPowerSeriesOnBall.add (hf : HasFPowerSeriesOnBall f pf x r)
75+
(hg : HasFPowerSeriesOnBall g pg x r) : HasFPowerSeriesOnBall (f + g) (pf + pg) x r :=
76+
{ r_le := le_trans (le_min_iff.2 ⟨hf.r_le, hg.r_le⟩) (pf.min_radius_le_radius_add pg)
77+
r_pos := hf.r_pos
78+
hasSum := fun hy => (hf.hasSum hy).add (hg.hasSum hy) }
79+
80+
theorem HasFPowerSeriesWithinAt.add
81+
(hf : HasFPowerSeriesWithinAt f pf s x) (hg : HasFPowerSeriesWithinAt g pg s x) :
82+
HasFPowerSeriesWithinAt (f + g) (pf + pg) s x := by
83+
rcases (hf.eventually.and hg.eventually).exists with ⟨r, hr⟩
84+
exact ⟨r, hr.1.add hr.2⟩
85+
86+
theorem HasFPowerSeriesAt.add (hf : HasFPowerSeriesAt f pf x) (hg : HasFPowerSeriesAt g pg x) :
87+
HasFPowerSeriesAt (f + g) (pf + pg) x := by
88+
rcases (hf.eventually.and hg.eventually).exists with ⟨r, hr⟩
89+
exact ⟨r, hr.1.add hr.2⟩
90+
91+
theorem AnalyticWithinAt.add (hf : AnalyticWithinAt π•œ f s x) (hg : AnalyticWithinAt π•œ g s x) :
92+
AnalyticWithinAt π•œ (f + g) s x :=
93+
let ⟨_, hpf⟩ := hf
94+
let ⟨_, hqf⟩ := hg
95+
(hpf.add hqf).analyticWithinAt
96+
97+
theorem AnalyticAt.add (hf : AnalyticAt π•œ f x) (hg : AnalyticAt π•œ g x) : AnalyticAt π•œ (f + g) x :=
98+
let ⟨_, hpf⟩ := hf
99+
let ⟨_, hqf⟩ := hg
100+
(hpf.add hqf).analyticAt
101+
102+
theorem HasFPowerSeriesWithinOnBall.neg (hf : HasFPowerSeriesWithinOnBall f pf s x r) :
103+
HasFPowerSeriesWithinOnBall (-f) (-pf) s x r :=
104+
{ r_le := by
105+
rw [pf.radius_neg]
106+
exact hf.r_le
107+
r_pos := hf.r_pos
108+
hasSum := fun hy h'y => (hf.hasSum hy h'y).neg }
109+
110+
theorem HasFPowerSeriesOnBall.neg (hf : HasFPowerSeriesOnBall f pf x r) :
111+
HasFPowerSeriesOnBall (-f) (-pf) x r :=
112+
{ r_le := by
113+
rw [pf.radius_neg]
114+
exact hf.r_le
115+
r_pos := hf.r_pos
116+
hasSum := fun hy => (hf.hasSum hy).neg }
117+
118+
theorem HasFPowerSeriesWithinAt.neg (hf : HasFPowerSeriesWithinAt f pf s x) :
119+
HasFPowerSeriesWithinAt (-f) (-pf) s x :=
120+
let ⟨_, hrf⟩ := hf
121+
hrf.neg.hasFPowerSeriesWithinAt
122+
123+
theorem HasFPowerSeriesAt.neg (hf : HasFPowerSeriesAt f pf x) : HasFPowerSeriesAt (-f) (-pf) x :=
124+
let ⟨_, hrf⟩ := hf
125+
hrf.neg.hasFPowerSeriesAt
126+
127+
theorem AnalyticWithinAt.neg (hf : AnalyticWithinAt π•œ f s x) : AnalyticWithinAt π•œ (-f) s x :=
128+
let ⟨_, hpf⟩ := hf
129+
hpf.neg.analyticWithinAt
130+
131+
theorem AnalyticAt.neg (hf : AnalyticAt π•œ f x) : AnalyticAt π•œ (-f) x :=
132+
let ⟨_, hpf⟩ := hf
133+
hpf.neg.analyticAt
134+
135+
theorem HasFPowerSeriesWithinOnBall.sub (hf : HasFPowerSeriesWithinOnBall f pf s x r)
136+
(hg : HasFPowerSeriesWithinOnBall g pg s x r) :
137+
HasFPowerSeriesWithinOnBall (f - g) (pf - pg) s x r := by
138+
simpa only [sub_eq_add_neg] using hf.add hg.neg
139+
140+
theorem HasFPowerSeriesOnBall.sub (hf : HasFPowerSeriesOnBall f pf x r)
141+
(hg : HasFPowerSeriesOnBall g pg x r) : HasFPowerSeriesOnBall (f - g) (pf - pg) x r := by
142+
simpa only [sub_eq_add_neg] using hf.add hg.neg
143+
144+
theorem HasFPowerSeriesWithinAt.sub
145+
(hf : HasFPowerSeriesWithinAt f pf s x) (hg : HasFPowerSeriesWithinAt g pg s x) :
146+
HasFPowerSeriesWithinAt (f - g) (pf - pg) s x := by
147+
simpa only [sub_eq_add_neg] using hf.add hg.neg
148+
149+
theorem HasFPowerSeriesAt.sub (hf : HasFPowerSeriesAt f pf x) (hg : HasFPowerSeriesAt g pg x) :
150+
HasFPowerSeriesAt (f - g) (pf - pg) x := by
151+
simpa only [sub_eq_add_neg] using hf.add hg.neg
152+
153+
theorem AnalyticWithinAt.sub (hf : AnalyticWithinAt π•œ f s x) (hg : AnalyticWithinAt π•œ g s x) :
154+
AnalyticWithinAt π•œ (f - g) s x := by
155+
simpa only [sub_eq_add_neg] using hf.add hg.neg
156+
157+
theorem AnalyticAt.sub (hf : AnalyticAt π•œ f x) (hg : AnalyticAt π•œ g x) :
158+
AnalyticAt π•œ (f - g) x := by
159+
simpa only [sub_eq_add_neg] using hf.add hg.neg
160+
161+
theorem AnalyticWithinOn.add (hf : AnalyticWithinOn π•œ f s) (hg : AnalyticWithinOn π•œ g s) :
162+
AnalyticWithinOn π•œ (f + g) s :=
163+
fun z hz => (hf z hz).add (hg z hz)
164+
165+
theorem AnalyticOn.add (hf : AnalyticOn π•œ f s) (hg : AnalyticOn π•œ g s) :
166+
AnalyticOn π•œ (f + g) s :=
167+
fun z hz => (hf z hz).add (hg z hz)
168+
169+
theorem AnalyticWithinOn.neg (hf : AnalyticWithinOn π•œ f s) : AnalyticWithinOn π•œ (-f) s :=
170+
fun z hz ↦ (hf z hz).neg
171+
172+
theorem AnalyticOn.neg (hf : AnalyticOn π•œ f s) : AnalyticOn π•œ (-f) s :=
173+
fun z hz ↦ (hf z hz).neg
174+
175+
theorem AnalyticWithinOn.sub (hf : AnalyticWithinOn π•œ f s) (hg : AnalyticWithinOn π•œ g s) :
176+
AnalyticWithinOn π•œ (f - g) s :=
177+
fun z hz => (hf z hz).sub (hg z hz)
178+
179+
theorem AnalyticOn.sub (hf : AnalyticOn π•œ f s) (hg : AnalyticOn π•œ g s) :
180+
AnalyticOn π•œ (f - g) s :=
181+
fun z hz => (hf z hz).sub (hg z hz)
182+
183+
end
184+
34185
/-!
35186
### Cartesian products are analytic
36187
-/

β€ŽMathlib/Analysis/Analytic/Uniqueness.leanβ€Ž

Lines changed: 132 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Authors: SΓ©bastien GouΓ«zel
55
-/
66
import Mathlib.Analysis.Analytic.Linear
77
import Mathlib.Analysis.Analytic.Composition
8+
import Mathlib.Analysis.Analytic.Constructions
89
import Mathlib.Analysis.Normed.Module.Completion
910
import Mathlib.Analysis.Analytic.ChangeOrigin
1011

@@ -21,7 +22,137 @@ variable {π•œ : Type*} [NontriviallyNormedField π•œ] {E : Type*} [NormedAddCom
2122

2223
open Set
2324

24-
open scoped Topology ENNReal
25+
open scoped Topology ENNReal NNReal
26+
27+
/-!
28+
### Uniqueness of power series
29+
If a function `f : E β†’ F` has two representations as power series at a point `x : E`, corresponding
30+
to formal multilinear series `p₁` and `pβ‚‚`, then these representations agree term-by-term. That is,
31+
for any `n : β„•` and `y : E`, `p₁ n (fun i ↦ y) = pβ‚‚ n (fun i ↦ y)`. In the one-dimensional case,
32+
when `f : π•œ β†’ E`, the continuous multilinear maps `p₁ n` and `pβ‚‚ n` are given by
33+
`ContinuousMultilinearMap.mkPiRing`, and hence are determined completely by the value of
34+
`p₁ n (fun i ↦ 1)`, so `p₁ = pβ‚‚`. Consequently, the radius of convergence for one series can be
35+
transferred to the other.
36+
-/
37+
38+
section Uniqueness
39+
40+
open ContinuousMultilinearMap
41+
42+
theorem Asymptotics.IsBigO.continuousMultilinearMap_apply_eq_zero {n : β„•} {p : E[Γ—n]β†’L[π•œ] F}
43+
(h : (fun y => p fun _ => y) =O[𝓝 0] fun y => β€–yβ€– ^ (n + 1)) (y : E) : (p fun _ => y) = 0 := by
44+
obtain ⟨c, c_pos, hc⟩ := h.exists_pos
45+
obtain ⟨t, ht, t_open, z_mem⟩ := eventually_nhds_iff.mp (isBigOWith_iff.mp hc)
46+
obtain ⟨δ, δ_pos, δΡ⟩ := (Metric.isOpen_iff.mp t_open) 0 z_mem
47+
clear h hc z_mem
48+
cases' n with n
49+
Β· exact norm_eq_zero.mp (by
50+
-- Porting note: the symmetric difference of the `simpa only` sets:
51+
-- added `zero_add, pow_one`
52+
-- removed `zero_pow, Ne.def, Nat.one_ne_zero, not_false_iff`
53+
simpa only [fin0_apply_norm, norm_eq_zero, norm_zero, zero_add, pow_one,
54+
mul_zero, norm_le_zero_iff] using ht 0 (δΡ (Metric.mem_ball_self δ_pos)))
55+
Β· refine Or.elim (Classical.em (y = 0))
56+
(fun hy => by simpa only [hy] using p.map_zero) fun hy => ?_
57+
replace hy := norm_pos_iff.mpr hy
58+
refine norm_eq_zero.mp (le_antisymm (le_of_forall_pos_le_add fun Ξ΅ Ξ΅_pos => ?_) (norm_nonneg _))
59+
have hβ‚€ := _root_.mul_pos c_pos (pow_pos hy (n.succ + 1))
60+
obtain ⟨k, k_pos, k_norm⟩ := NormedField.exists_norm_lt π•œ
61+
(lt_min (mul_pos Ξ΄_pos (inv_pos.mpr hy)) (mul_pos Ξ΅_pos (inv_pos.mpr hβ‚€)))
62+
have h₁ : β€–k β€’ yβ€– < Ξ΄ := by
63+
rw [norm_smul]
64+
exact inv_mul_cancel_rightβ‚€ hy.ne.symm Ξ΄ β–Έ
65+
mul_lt_mul_of_pos_right (lt_of_lt_of_le k_norm (min_le_left _ _)) hy
66+
have hβ‚‚ :=
67+
calc
68+
β€–p fun _ => k β€’ yβ€– ≀ c * β€–k β€’ yβ€– ^ (n.succ + 1) := by
69+
-- Porting note: now Lean wants `_root_.`
70+
simpa only [norm_pow, _root_.norm_norm] using ht (k β€’ y) (δΡ (mem_ball_zero_iff.mpr h₁))
71+
--simpa only [norm_pow, norm_norm] using ht (k β€’ y) (δΡ (mem_ball_zero_iff.mpr h₁))
72+
_ = β€–kβ€– ^ n.succ * (β€–kβ€– * (c * β€–yβ€– ^ (n.succ + 1))) := by
73+
-- Porting note: added `Nat.succ_eq_add_one` since otherwise `ring` does not conclude.
74+
simp only [norm_smul, mul_pow, Nat.succ_eq_add_one]
75+
-- Porting note: removed `rw [pow_succ]`, since it now becomes superfluous.
76+
ring
77+
have h₃ : β€–kβ€– * (c * β€–yβ€– ^ (n.succ + 1)) < Ξ΅ :=
78+
inv_mul_cancel_rightβ‚€ hβ‚€.ne.symm Ξ΅ β–Έ
79+
mul_lt_mul_of_pos_right (lt_of_lt_of_le k_norm (min_le_right _ _)) hβ‚€
80+
calc
81+
β€–p fun _ => yβ€– = β€–k⁻¹ ^ n.succβ€– * β€–p fun _ => k β€’ yβ€– := by
82+
simpa only [inv_smul_smulβ‚€ (norm_pos_iff.mp k_pos), norm_smul, Finset.prod_const,
83+
Finset.card_fin] using
84+
congr_arg norm (p.map_smul_univ (fun _ : Fin n.succ => k⁻¹) fun _ : Fin n.succ => k β€’ y)
85+
_ ≀ β€–k⁻¹ ^ n.succβ€– * (β€–kβ€– ^ n.succ * (β€–kβ€– * (c * β€–yβ€– ^ (n.succ + 1)))) := by gcongr
86+
_ = β€–(k⁻¹ * k) ^ n.succβ€– * (β€–kβ€– * (c * β€–yβ€– ^ (n.succ + 1))) := by
87+
rw [← mul_assoc]
88+
simp [norm_mul, mul_pow]
89+
_ ≀ 0 + Ξ΅ := by
90+
rw [inv_mul_cancelβ‚€ (norm_pos_iff.mp k_pos)]
91+
simpa using h₃.le
92+
93+
/-- If a formal multilinear series `p` represents the zero function at `x : E`, then the
94+
terms `p n (fun i ↦ y)` appearing in the sum are zero for any `n : β„•`, `y : E`. -/
95+
theorem HasFPowerSeriesAt.apply_eq_zero {p : FormalMultilinearSeries π•œ E F} {x : E}
96+
(h : HasFPowerSeriesAt 0 p x) (n : β„•) : βˆ€ y : E, (p n fun _ => y) = 0 := by
97+
refine Nat.strong_induction_on n fun k hk => ?_
98+
have psum_eq : p.partialSum (k + 1) = fun y => p k fun _ => y := by
99+
funext z
100+
refine Finset.sum_eq_single _ (fun b hb hnb => ?_) fun hn => ?_
101+
Β· have := Finset.mem_range_succ_iff.mp hb
102+
simp only [hk b (this.lt_of_ne hnb), Pi.zero_apply]
103+
Β· exact False.elim (hn (Finset.mem_range.mpr (lt_add_one k)))
104+
replace h := h.isBigO_sub_partialSum_pow k.succ
105+
simp only [psum_eq, zero_sub, Pi.zero_apply, Asymptotics.isBigO_neg_left] at h
106+
exact h.continuousMultilinearMap_apply_eq_zero
107+
108+
/-- A one-dimensional formal multilinear series representing the zero function is zero. -/
109+
theorem HasFPowerSeriesAt.eq_zero {p : FormalMultilinearSeries π•œ π•œ E} {x : π•œ}
110+
(h : HasFPowerSeriesAt 0 p x) : p = 0 := by
111+
ext n x
112+
rw [← mkPiRing_apply_one_eq_self (p n)]
113+
simp [h.apply_eq_zero n 1]
114+
115+
/-- One-dimensional formal multilinear series representing the same function are equal. -/
116+
theorem HasFPowerSeriesAt.eq_formalMultilinearSeries {p₁ pβ‚‚ : FormalMultilinearSeries π•œ π•œ E}
117+
{f : π•œ β†’ E} {x : π•œ} (h₁ : HasFPowerSeriesAt f p₁ x) (hβ‚‚ : HasFPowerSeriesAt f pβ‚‚ x) : p₁ = pβ‚‚ :=
118+
sub_eq_zero.mp (HasFPowerSeriesAt.eq_zero (x := x) (by simpa only [sub_self] using h₁.sub hβ‚‚))
119+
120+
theorem HasFPowerSeriesAt.eq_formalMultilinearSeries_of_eventually
121+
{p q : FormalMultilinearSeries π•œ π•œ E} {f g : π•œ β†’ E} {x : π•œ} (hp : HasFPowerSeriesAt f p x)
122+
(hq : HasFPowerSeriesAt g q x) (heq : βˆ€αΆ  z in 𝓝 x, f z = g z) : p = q :=
123+
(hp.congr heq).eq_formalMultilinearSeries hq
124+
125+
/-- A one-dimensional formal multilinear series representing a locally zero function is zero. -/
126+
theorem HasFPowerSeriesAt.eq_zero_of_eventually {p : FormalMultilinearSeries π•œ π•œ E} {f : π•œ β†’ E}
127+
{x : π•œ} (hp : HasFPowerSeriesAt f p x) (hf : f =αΆ [𝓝 x] 0) : p = 0 :=
128+
(hp.congr hf).eq_zero
129+
130+
/-- If a function `f : π•œ β†’ E` has two power series representations at `x`, then the given radii in
131+
which convergence is guaranteed may be interchanged. This can be useful when the formal multilinear
132+
series in one representation has a particularly nice form, but the other has a larger radius. -/
133+
theorem HasFPowerSeriesOnBall.exchange_radius {p₁ pβ‚‚ : FormalMultilinearSeries π•œ π•œ E} {f : π•œ β†’ E}
134+
{r₁ rβ‚‚ : ℝβ‰₯0∞} {x : π•œ} (h₁ : HasFPowerSeriesOnBall f p₁ x r₁)
135+
(hβ‚‚ : HasFPowerSeriesOnBall f pβ‚‚ x rβ‚‚) : HasFPowerSeriesOnBall f p₁ x rβ‚‚ :=
136+
hβ‚‚.hasFPowerSeriesAt.eq_formalMultilinearSeries h₁.hasFPowerSeriesAt β–Έ hβ‚‚
137+
138+
/-- If a function `f : π•œ β†’ E` has power series representation `p` on a ball of some radius and for
139+
each positive radius it has some power series representation, then `p` converges to `f` on the whole
140+
`π•œ`. -/
141+
theorem HasFPowerSeriesOnBall.r_eq_top_of_exists {f : π•œ β†’ E} {r : ℝβ‰₯0∞} {x : π•œ}
142+
{p : FormalMultilinearSeries π•œ π•œ E} (h : HasFPowerSeriesOnBall f p x r)
143+
(h' : βˆ€ (r' : ℝβ‰₯0) (_ : 0 < r'), βˆƒ p' : FormalMultilinearSeries π•œ π•œ E,
144+
HasFPowerSeriesOnBall f p' x r') :
145+
HasFPowerSeriesOnBall f p x ∞ :=
146+
{ r_le := ENNReal.le_of_forall_pos_nnreal_lt fun r hr _ =>
147+
let ⟨_, hp'⟩ := h' r hr
148+
(h.exchange_radius hp').r_le
149+
r_pos := ENNReal.coe_lt_top
150+
hasSum := fun {y} _ =>
151+
let ⟨r', hr'⟩ := exists_gt β€–yβ€–β‚Š
152+
let ⟨_, hp'⟩ := h' r' hr'.ne_bot.bot_lt
153+
(h.exchange_radius hp').hasSum <| mem_emetric_ball_zero_iff.mpr (ENNReal.coe_lt_coe.2 hr') }
154+
155+
end Uniqueness
25156

26157
namespace AnalyticOn
27158

0 commit comments

Comments
Β (0)