-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Expand file tree
/
Copy pathConvergenceRadius.lean
More file actions
447 lines (376 loc) Β· 21.4 KB
/
ConvergenceRadius.lean
File metadata and controls
447 lines (376 loc) Β· 21.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
/-
Copyright (c) 2020 SΓ©bastien GouΓ«zel. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: SΓ©bastien GouΓ«zel, Yury Kudryashov
-/
module
public import Mathlib.Analysis.Calculus.FormalMultilinearSeries
public import Mathlib.Analysis.SpecificLimits.Normed
/-!
# Radius of convergence of a power series
This file introduces the notion of the radius of convergence of a power series.
## Main definitions
Let `p` be a formal multilinear series from `E` to `F`, i.e., `p n` is a multilinear map on `E^n`
for `n : β`.
* `p.radius`: the largest `r : ββ₯0β` such that `βp nβ * r^n` grows subexponentially.
* `p.le_radius_of_bound`, `p.le_radius_of_bound_nnreal`, `p.le_radius_of_isBigO`: if `βp nβ * r ^ n`
is bounded above, then `r β€ p.radius`;
* `p.isLittleO_of_lt_radius`, `p.norm_mul_pow_le_mul_pow_of_lt_radius`,
`p.isLittleO_one_of_lt_radius`,
`p.norm_mul_pow_le_of_lt_radius`, `p.nnnorm_mul_pow_le_of_lt_radius`: if `r < p.radius`, then
`βp nβ * r ^ n` tends to zero exponentially;
* `p.lt_radius_of_isBigO`: if `r β 0` and `βp nβ * r ^ n = O(a ^ n)` for some `-1 < a < 1`, then
`r < p.radius`;
* `p.partialSum n x`: the sum `β_{i = 0}^{n-1} pα΅’ xβ±`.
* `p.sum x`: the sum `β'_{i = 0}^{β} pα΅’ xβ±`.
## Implementation details
We only introduce the radius of convergence of a power series, as `p.radius`.
For a power series in finitely many dimensions, there is a finer (directional, coordinate-dependent)
notion, describing the polydisk of convergence. This notion is more specific, and not necessary to
build the general theory. We do not define it here.
-/
@[expose] public section
noncomputable section
variable {π E F G : Type*}
open Topology NNReal Filter ENNReal Set Asymptotics
open scoped Pointwise
namespace FormalMultilinearSeries
variable [Semiring π] [AddCommMonoid E] [AddCommMonoid F] [Module π E] [Module π F]
variable [TopologicalSpace E] [TopologicalSpace F]
variable [ContinuousAdd E] [ContinuousAdd F]
variable [ContinuousConstSMul π E] [ContinuousConstSMul π F]
/-- Given a formal multilinear series `p` and a vector `x`, then `p.sum x` is the sum `Ξ£ pβ xβΏ`. A
priori, it only behaves well when `βxβ < p.radius`. -/
protected def sum (p : FormalMultilinearSeries π E F) (x : E) : F :=
β' n : β, p n fun _ => x
theorem sum_mem {S : Type*} {s : S} [SetLike S F] [AddSubmonoidClass S F]
(h_closed : IsClosed (s : Set F)) (p : FormalMultilinearSeries π E F) (x : E)
(h : β k, p k (fun _ : Fin k => x) β s) :
p.sum x β s :=
tsum_mem h_closed h
/-- Given a formal multilinear series `p` and a vector `x`, then `p.partialSum n x` is the sum
`Ξ£ pβ xα΅` for `k β {0,..., n-1}`. -/
def partialSum (p : FormalMultilinearSeries π E F) (n : β) (x : E) : F :=
β k β Finset.range n, p k fun _ : Fin k => x
/-- The partial sums of a formal multilinear series are continuous. -/
theorem partialSum_continuous (p : FormalMultilinearSeries π E F) (n : β) :
Continuous (p.partialSum n) := by
unfold partialSum
fun_prop
end FormalMultilinearSeries
/-! ### The radius of a formal multilinear series -/
variable [NontriviallyNormedField π] [NormedAddCommGroup E] [NormedSpace π E] [NormedAddCommGroup F]
[NormedSpace π F] [NormedAddCommGroup G] [NormedSpace π G]
namespace FormalMultilinearSeries
variable (p : FormalMultilinearSeries π E F) {r : ββ₯0}
/-- The radius of a formal multilinear series is the largest `r` such that the sum `Ξ£ βpββ βyββΏ`
converges for all `βyβ < r`. This implies that `Ξ£ pβ yβΏ` converges for all `βyβ < r`, but these
definitions are *not* equivalent in general. -/
def radius (p : FormalMultilinearSeries π E F) : ββ₯0β :=
β¨ (r : ββ₯0) (C : β) (_ : β n, βp nβ * (r : β) ^ n β€ C), (r : ββ₯0β)
/-- If `βpββ rβΏ` is bounded in `n`, then the radius of `p` is at least `r`. -/
theorem le_radius_of_bound (C : β) {r : ββ₯0} (h : β n : β, βp nβ * (r : β) ^ n β€ C) :
(r : ββ₯0β) β€ p.radius :=
le_iSup_of_le r <| le_iSup_of_le C <| le_iSup (fun _ => (r : ββ₯0β)) h
/-- If `βpββ rβΏ` is bounded in `n`, then the radius of `p` is at least `r`. -/
theorem le_radius_of_bound_nnreal (C : ββ₯0) {r : ββ₯0} (h : β n : β, βp nββ * r ^ n β€ C) :
(r : ββ₯0β) β€ p.radius :=
p.le_radius_of_bound C fun n => mod_cast h n
/-- If `βpββ rβΏ = O(1)`, as `n β β`, then the radius of `p` is at least `r`. -/
theorem le_radius_of_isBigO (h : (fun n => βp nβ * (r : β) ^ n) =O[atTop] fun _ => (1 : β)) :
βr β€ p.radius :=
Exists.elim (isBigO_one_nat_atTop_iff.1 h) fun C hC =>
p.le_radius_of_bound C fun n => (le_abs_self _).trans (hC n)
theorem le_radius_of_eventually_le (C) (h : βαΆ n in atTop, βp nβ * (r : β) ^ n β€ C) :
βr β€ p.radius :=
p.le_radius_of_isBigO <| IsBigO.of_bound C <| h.mono fun n hn => by simpa
theorem le_radius_of_summable_nnnorm (h : Summable fun n => βp nββ * r ^ n) : βr β€ p.radius :=
p.le_radius_of_bound_nnreal (β' n, βp nββ * r ^ n) fun _ => h.le_tsum' _
theorem le_radius_of_summable (h : Summable fun n => βp nβ * (r : β) ^ n) : βr β€ p.radius :=
p.le_radius_of_summable_nnnorm <| by
simp only [β coe_nnnorm] at h
exact mod_cast h
theorem radius_eq_top_of_forall_nnreal_isBigO
(h : β r : ββ₯0, (fun n => βp nβ * (r : β) ^ n) =O[atTop] fun _ => (1 : β)) : p.radius = β :=
ENNReal.eq_top_of_forall_nnreal_le fun r => p.le_radius_of_isBigO (h r)
theorem radius_eq_top_of_eventually_eq_zero (h : βαΆ n in atTop, p n = 0) : p.radius = β :=
p.radius_eq_top_of_forall_nnreal_isBigO fun r =>
(isBigO_zero _ _).congr' (h.mono fun n hn => by simp [hn]) EventuallyEq.rfl
theorem radius_eq_top_of_forall_image_add_eq_zero (n : β) (hn : β m, p (m + n) = 0) :
p.radius = β :=
p.radius_eq_top_of_eventually_eq_zero <|
mem_atTop_sets.2 β¨n, fun _ hk => tsub_add_cancel_of_le hk βΈ hn _β©
@[simp]
theorem constFormalMultilinearSeries_radius {v : F} :
(constFormalMultilinearSeries π E v).radius = β€ :=
(constFormalMultilinearSeries π E v).radius_eq_top_of_forall_image_add_eq_zero 1
(by simp [constFormalMultilinearSeries])
/-- `0` has infinite radius of convergence -/
@[simp] lemma zero_radius : (0 : FormalMultilinearSeries π E F).radius = β := by
rw [β constFormalMultilinearSeries_zero]
exact constFormalMultilinearSeries_radius
/-- For `r` strictly smaller than the radius of `p`, then `βpββ rβΏ` tends to zero exponentially:
for some `0 < a < 1`, `βp nβ rβΏ = o(aβΏ)`. -/
theorem isLittleO_of_lt_radius (h : βr < p.radius) :
β a β Ioo (0 : β) 1, (fun n => βp nβ * (r : β) ^ n) =o[atTop] (a ^ Β·) := by
have := (TFAE_exists_lt_isLittleO_pow (fun n => βp nβ * (r : β) ^ n) 1).out 1 4
rw [this]
-- Porting note: was
-- rw [(TFAE_exists_lt_isLittleO_pow (fun n => βp nβ * (r : β) ^ n) 1).out 1 4]
simp only [radius, lt_iSup_iff] at h
rcases h with β¨t, C, hC, rtβ©
rw [ENNReal.coe_lt_coe, β NNReal.coe_lt_coe] at rt
have : 0 < (t : β) := r.coe_nonneg.trans_lt rt
rw [β div_lt_one this] at rt
refine β¨_, rt, C, Or.inr zero_lt_one, fun n => ?_β©
calc
|βp nβ * (r : β) ^ n| = βp nβ * (t : β) ^ n * (r / t : β) ^ n := by
simp [field, abs_mul, div_pow]
_ β€ C * (r / t : β) ^ n := by gcongr; apply hC
/-- For `r` strictly smaller than the radius of `p`, then `βpββ rβΏ = o(1)`. -/
theorem isLittleO_one_of_lt_radius (h : βr < p.radius) :
(fun n => βp nβ * (r : β) ^ n) =o[atTop] (fun _ => 1 : β β β) :=
let β¨_, ha, hpβ© := p.isLittleO_of_lt_radius h
hp.trans <| (isLittleO_pow_pow_of_lt_left ha.1.le ha.2).congr (fun _ => rfl) one_pow
/-- For `r` strictly smaller than the radius of `p`, then `βpββ rβΏ` tends to zero exponentially:
for some `0 < a < 1` and `C > 0`, `βp nβ * r ^ n β€ C * a ^ n`. -/
theorem norm_mul_pow_le_mul_pow_of_lt_radius (h : βr < p.radius) :
β a β Ioo (0 : β) 1, β C > 0, β n, βp nβ * (r : β) ^ n β€ C * a ^ n := by
have := ((TFAE_exists_lt_isLittleO_pow (fun n => βp nβ * (r : β) ^ n) 1).out 1 5).mp
(p.isLittleO_of_lt_radius h)
rcases this with β¨a, ha, C, hC, Hβ©
exact β¨a, ha, C, hC, fun n => (le_abs_self _).trans (H n)β©
/-- If `r β 0` and `βpββ rβΏ = O(aβΏ)` for some `-1 < a < 1`, then `r < p.radius`. -/
theorem lt_radius_of_isBigO (hβ : r β 0) {a : β} (ha : a β Ioo (-1 : β) 1)
(hp : (fun n => βp nβ * (r : β) ^ n) =O[atTop] (a ^ Β·)) : βr < p.radius := by
have := ((TFAE_exists_lt_isLittleO_pow (fun n => βp nβ * (r : β) ^ n) 1).out 2 5)
rcases this.mp β¨a, ha, hpβ© with β¨a, ha, C, hC, hpβ©
rw [β pos_iff_ne_zero, β NNReal.coe_pos] at hβ
lift a to ββ₯0 using ha.1.le
have : (r : β) < r / a := by
simpa only [div_one] using (div_lt_div_iff_of_pos_left hβ zero_lt_one ha.1).2 ha.2
norm_cast at this
rw [β ENNReal.coe_lt_coe] at this
refine this.trans_le (p.le_radius_of_bound C fun n => ?_)
rw [NNReal.coe_div, div_pow, β mul_div_assoc, div_le_iffβ (pow_pos ha.1 n)]
exact (le_abs_self _).trans (hp n)
/-- For `r` strictly smaller than the radius of `p`, then `βpββ rβΏ` is bounded. -/
theorem norm_mul_pow_le_of_lt_radius (p : FormalMultilinearSeries π E F) {r : ββ₯0}
(h : (r : ββ₯0β) < p.radius) : β C > 0, β n, βp nβ * (r : β) ^ n β€ C :=
let β¨_, ha, C, hC, hβ© := p.norm_mul_pow_le_mul_pow_of_lt_radius h
β¨C, hC, fun n => (h n).trans <| mul_le_of_le_one_right hC.lt.le (pow_le_oneβ ha.1.le ha.2.le)β©
/-- For `r` strictly smaller than the radius of `p`, then `βpββ rβΏ` is bounded. -/
theorem norm_le_div_pow_of_pos_of_lt_radius (p : FormalMultilinearSeries π E F) {r : ββ₯0}
(h0 : 0 < r) (h : (r : ββ₯0β) < p.radius) : β C > 0, β n, βp nβ β€ C / (r : β) ^ n :=
let β¨C, hC, hpβ© := p.norm_mul_pow_le_of_lt_radius h
β¨C, hC, fun n => Iff.mpr (le_div_iffβ (pow_pos h0 _)) (hp n)β©
/-- For `r` strictly smaller than the radius of `p`, then `βpββ rβΏ` is bounded. -/
theorem nnnorm_mul_pow_le_of_lt_radius (p : FormalMultilinearSeries π E F) {r : ββ₯0}
(h : (r : ββ₯0β) < p.radius) : β C > 0, β n, βp nββ * r ^ n β€ C :=
let β¨C, hC, hpβ© := p.norm_mul_pow_le_of_lt_radius h
β¨β¨C, hC.lt.leβ©, hC, mod_cast hpβ©
theorem le_radius_of_tendsto (p : FormalMultilinearSeries π E F) {l : β}
(h : Tendsto (fun n => βp nβ * (r : β) ^ n) atTop (π l)) : βr β€ p.radius :=
p.le_radius_of_isBigO (h.isBigO_one _)
theorem le_radius_of_summable_norm (p : FormalMultilinearSeries π E F)
(hs : Summable fun n => βp nβ * (r : β) ^ n) : βr β€ p.radius :=
p.le_radius_of_tendsto hs.tendsto_atTop_zero
theorem not_summable_norm_of_radius_lt_nnnorm (p : FormalMultilinearSeries π E F) {x : E}
(h : p.radius < βxββ) : Β¬Summable fun n => βp nβ * βxβ ^ n :=
fun hs => not_le_of_gt h (p.le_radius_of_summable_norm hs)
theorem summable_norm_mul_pow (p : FormalMultilinearSeries π E F) {r : ββ₯0} (h : βr < p.radius) :
Summable fun n : β => βp nβ * (r : β) ^ n := by
obtain β¨a, ha : a β Ioo (0 : β) 1, C, - : 0 < C, hpβ© := p.norm_mul_pow_le_mul_pow_of_lt_radius h
exact .of_nonneg_of_le (fun _ β¦ by positivity)
hp ((summable_geometric_of_lt_one ha.1.le ha.2).mul_left _)
theorem summable_norm_apply (p : FormalMultilinearSeries π E F) {x : E}
(hx : x β Metric.eball (0 : E) p.radius) : Summable fun n : β => βp n fun _ => xβ := by
rw [mem_eball_zero_iff] at hx
refine .of_nonneg_of_le
(fun _ β¦ norm_nonneg _) (fun n β¦ ((p n).le_opNorm _).trans_eq ?_) (p.summable_norm_mul_pow hx)
simp
theorem summable_nnnorm_mul_pow (p : FormalMultilinearSeries π E F) {r : ββ₯0} (h : βr < p.radius) :
Summable fun n : β => βp nββ * r ^ n := by
rw [β NNReal.summable_coe]
push_cast
exact p.summable_norm_mul_pow h
protected theorem summable [CompleteSpace F] (p : FormalMultilinearSeries π E F) {x : E}
(hx : x β Metric.eball (0 : E) p.radius) : Summable fun n : β => p n fun _ => x :=
(p.summable_norm_apply hx).of_norm
theorem radius_eq_top_of_summable_norm (p : FormalMultilinearSeries π E F)
(hs : β r : ββ₯0, Summable fun n => βp nβ * (r : β) ^ n) : p.radius = β :=
ENNReal.eq_top_of_forall_nnreal_le fun r => p.le_radius_of_summable_norm (hs r)
theorem radius_eq_top_iff_summable_norm (p : FormalMultilinearSeries π E F) :
p.radius = β β β r : ββ₯0, Summable fun n => βp nβ * (r : β) ^ n :=
β¨fun h _ β¦ p.summable_norm_mul_pow (h.symm βΈ ENNReal.coe_lt_top),
p.radius_eq_top_of_summable_normβ©
/-- If the radius of `p` is positive, then `βpββ` grows at most geometrically. -/
theorem le_mul_pow_of_radius_pos (p : FormalMultilinearSeries π E F) (h : 0 < p.radius) :
β (C r : _) (_ : 0 < C) (_ : 0 < r), β n, βp nβ β€ C * r ^ n := by
rcases ENNReal.lt_iff_exists_nnreal_btwn.1 h with β¨r, r0, rltβ©
have rpos : 0 < (r : β) := by simp [ENNReal.coe_pos.1 r0]
rcases norm_le_div_pow_of_pos_of_lt_radius p rpos rlt with β¨C, Cpos, hCpβ©
refine β¨C, rβ»ΒΉ, Cpos, by simp only [inv_pos, rpos], fun n => ?_β©
rw [inv_pow, β div_eq_mul_inv]
exact hCp n
lemma radius_le_of_le {π' E' F' : Type*}
[NontriviallyNormedField π'] [NormedAddCommGroup E'] [NormedSpace π' E']
[NormedAddCommGroup F'] [NormedSpace π' F']
{p : FormalMultilinearSeries π E F} {q : FormalMultilinearSeries π' E' F'}
(h : β n, βp nβ β€ βq nβ) : q.radius β€ p.radius := by
apply le_of_forall_nnreal_lt (fun r hr β¦ ?_)
rcases norm_mul_pow_le_of_lt_radius _ hr with β¨C, -, hCβ©
apply le_radius_of_bound _ C (fun n β¦ ?_)
apply le_trans _ (hC n)
gcongr
exact h n
/-- The radius of the sum of two formal series is at least the minimum of their two radii. -/
theorem min_radius_le_radius_add (p q : FormalMultilinearSeries π E F) :
min p.radius q.radius β€ (p + q).radius := by
refine ENNReal.le_of_forall_nnreal_lt fun r hr => ?_
rw [lt_min_iff] at hr
have := ((p.isLittleO_one_of_lt_radius hr.1).add (q.isLittleO_one_of_lt_radius hr.2)).isBigO
refine (p + q).le_radius_of_isBigO ((isBigO_of_le _ fun n => ?_).trans this)
rw [β add_mul, norm_mul, norm_mul, norm_norm]
gcongr
exact (norm_add_le _ _).trans (le_abs_self _)
@[simp]
theorem radius_neg (p : FormalMultilinearSeries π E F) : (-p).radius = p.radius := by
simp only [radius, neg_apply, norm_neg]
theorem radius_le_smul {p : FormalMultilinearSeries π E F} {π' : Type*} {c : π'} [NormedRing π']
[Module π' F] [SMulCommClass π π' F] [IsBoundedSMul π' F] :
p.radius β€ (c β’ p).radius := by
simp only [radius, smul_apply]
refine iSup_mono fun r β¦ iSup_mono' fun C β¦ β¨βcβ * C, iSup_mono' fun h β¦ ?_β©
simp only [le_refl, exists_prop, and_true]
intro n
grw [norm_smul_le, mul_assoc, h]
theorem radius_smul_eq (p : FormalMultilinearSeries π E F)
{π' : Type*} {c : π'} [NormedDivisionRing π'] [Module π' F] [NormSMulClass π' F]
[SMulCommClass π π' F] (hc : c β 0) :
(c β’ p).radius = p.radius := by
apply eq_of_le_of_ge _ radius_le_smul
exact radius_le_smul.trans_eq (congr_arg _ <| inv_smul_smulβ hc p)
lemma norm_compContinuousLinearMap_le (p : FormalMultilinearSeries π F G) (u : E βL[π] F) (n : β) :
βp.compContinuousLinearMap u nβ β€ βp nβ * βuβ ^ n := by
simp only [compContinuousLinearMap]
apply le_trans (ContinuousMultilinearMap.norm_compContinuousLinearMap_le _ _)
simp
lemma enorm_compContinuousLinearMap_le (p : FormalMultilinearSeries π F G)
(u : E βL[π] F) (n : β) : βp.compContinuousLinearMap u nββ β€ βp nββ * βuββ ^ n := by
rw [β ofReal_norm, β ofReal_norm, β ofReal_norm,
β ENNReal.ofReal_pow (by simp), β ENNReal.ofReal_mul (by simp)]
gcongr
apply norm_compContinuousLinearMap_le
lemma nnnorm_compContinuousLinearMap_le (p : FormalMultilinearSeries π F G)
(u : E βL[π] F) (n : β) : βp.compContinuousLinearMap u nββ β€ βp nββ * βuββ ^ n :=
norm_compContinuousLinearMap_le p u n
theorem div_le_radius_compContinuousLinearMap (p : FormalMultilinearSeries π F G) (u : E βL[π] F) :
p.radius / βuββ β€ (p.compContinuousLinearMap u).radius := by
obtain (rfl | h_zero) := eq_zero_or_nnnorm_pos u
Β· simp
rw [ENNReal.div_le_iff (by simpa using h_zero) (by simp)]
refine le_of_forall_nnreal_lt fun r hr β¦ ?_
rw [β ENNReal.div_le_iff (by simpa using h_zero) (by simp), enorm_eq_nnnorm, β coe_div h_zero.ne']
obtain β¨C, hC_pos, hCβ© := p.norm_mul_pow_le_of_lt_radius hr
refine le_radius_of_bound _ C fun n β¦ ?_
calc
βp.compContinuousLinearMap u nβ * β(r / βuββ) ^ n β€ βp nβ * βuβ ^ n * β(r / βuββ) ^ n := by
gcongr
exact nnnorm_compContinuousLinearMap_le p u n
_ = βp nβ * r ^ n := by
simp only [NNReal.coe_div, coe_nnnorm, div_pow, mul_assoc]
rw [mul_div_cancelβ]
rw [β NNReal.coe_pos] at h_zero
positivity
_ β€ C := hC n
theorem le_radius_compContinuousLinearMap (p : FormalMultilinearSeries π F G) (u : E ββα΅’[π] F) :
p.radius β€ (p.compContinuousLinearMap u.toContinuousLinearMap).radius := by
obtain (h | h) := subsingleton_or_nontrivial E
Β· simp [Subsingleton.elim u.toContinuousLinearMap 0]
Β· simpa [u.norm_toContinuousLinearMap]
using div_le_radius_compContinuousLinearMap p u.toContinuousLinearMap
theorem radius_compContinuousLinearMap_le [Nontrivial F]
(p : FormalMultilinearSeries π F G) (u : E βL[π] F) :
(p.compContinuousLinearMap u.toContinuousLinearMap).radius β€
βu.symm.toContinuousLinearMapββ * p.radius := by
have := (p.compContinuousLinearMap u.toContinuousLinearMap).div_le_radius_compContinuousLinearMap
u.symm.toContinuousLinearMap
simp only [compContinuousLinearMap_comp, ContinuousLinearEquiv.coe_comp_coe_symm,
compContinuousLinearMap_id] at this
rwa [ENNReal.div_le_iff' (by simpa [DFunLike.ext_iff] using exists_ne 0) (by simp)] at this
@[simp]
theorem radius_compContinuousLinearMap_linearIsometryEquiv_eq [Nontrivial E]
(p : FormalMultilinearSeries π F G) (u : E ββα΅’[π] F) :
(p.compContinuousLinearMap u.toLinearIsometry.toContinuousLinearMap).radius = p.radius := by
refine le_antisymm ?_ <| le_radius_compContinuousLinearMap _ _
have _ : Nontrivial F := u.symm.toEquiv.nontrivial
convert radius_compContinuousLinearMap_le p u.toContinuousLinearEquiv
have : u.toContinuousLinearEquiv.symm.toContinuousLinearMap =
u.symm.toLinearIsometry.toContinuousLinearMap := rfl
simp [this]
/-- This is a version of `radius_compContinuousLinearMap_linearIsometryEquiv_eq` with better
opportunity for unification, at the cost of manually supplying some hypotheses. -/
theorem radius_compContinuousLinearMap_eq [Nontrivial E]
(p : FormalMultilinearSeries π F G) (u : E βL[π] F) (hu_iso : Isometry u)
(hu_surj : Function.Surjective u) :
(p.compContinuousLinearMap u).radius = p.radius :=
let v : E ββα΅’[π] F :=
{ LinearEquiv.ofBijective u.toLinearMap β¨hu_iso.injective, hu_surjβ© with
norm_map' := hu_iso.norm_map_of_map_zero (map_zero u) }
radius_compContinuousLinearMap_linearIsometryEquiv_eq p v
@[simp]
theorem radius_compNeg [Nontrivial E] (p : FormalMultilinearSeries π E F) :
(p.compContinuousLinearMap (-(.id _ _))).radius = p.radius :=
radius_compContinuousLinearMap_linearIsometryEquiv_eq _ (.neg π)
@[simp]
theorem radius_shift (p : FormalMultilinearSeries π E F) : p.shift.radius = p.radius := by
simp only [radius, shift, Nat.succ_eq_add_one, ContinuousMultilinearMap.curryRight_norm]
congr
ext r
apply eq_of_le_of_ge
Β· apply iSup_mono'
intro C
use βp 0β β (C * r)
apply iSup_mono'
intro h
simp only [le_refl, le_sup_iff, exists_prop, and_true]
intro n
rcases n with - | m
Β· simp
right
rw [pow_succ, β mul_assoc]
gcongr; apply h
Β· apply iSup_mono'
intro C
use βp 1β β C / r
apply iSup_mono'
intro h
simp only [le_refl, le_sup_iff, exists_prop, and_true]
intro n
cases eq_zero_or_pos r with
| inl hr =>
rw [hr]
cases n <;> simp
| inr hr =>
right
rw [β NNReal.coe_pos] at hr
specialize h (n + 1)
rw [le_div_iffβ hr]
rwa [pow_succ, β mul_assoc] at h
@[simp]
theorem radius_unshift (p : FormalMultilinearSeries π E (E βL[π] F)) (z : F) :
(p.unshift z).radius = p.radius := by
rw [β radius_shift, unshift_shift]
protected theorem hasSum [CompleteSpace F] (p : FormalMultilinearSeries π E F) {x : E}
(hx : x β Metric.eball (0 : E) p.radius) : HasSum (fun n : β => p n fun _ => x) (p.sum x) :=
(p.summable hx).hasSum
theorem radius_le_radius_continuousLinearMap_comp (p : FormalMultilinearSeries π E F)
(f : F βL[π] G) : p.radius β€ (f.compFormalMultilinearSeries p).radius := by
refine ENNReal.le_of_forall_nnreal_lt fun r hr => ?_
apply le_radius_of_isBigO
apply (IsBigO.trans_isLittleO _ (p.isLittleO_one_of_lt_radius hr)).isBigO
refine IsBigO.mul (@IsBigOWith.isBigO _ _ _ _ _ βfβ _ _ _ ?_) (isBigO_refl _ _)
refine IsBigOWith.of_bound (Eventually.of_forall fun n => ?_)
simpa only [norm_norm] using f.norm_compContinuousMultilinearMap_le (p n)
end FormalMultilinearSeries