@@ -5,6 +5,7 @@ Authors: SΓ©bastien GouΓ«zel
5
5
-/
6
6
import Mathlib.Analysis.Analytic.Linear
7
7
import Mathlib.Analysis.Analytic.Composition
8
+ import Mathlib.Analysis.Analytic.Constructions
8
9
import Mathlib.Analysis.Normed.Module.Completion
9
10
import Mathlib.Analysis.Analytic.ChangeOrigin
10
11
@@ -21,7 +22,137 @@ variable {π : Type*} [NontriviallyNormedField π] {E : Type*} [NormedAddCom
21
22
22
23
open Set
23
24
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
25
156
26
157
namespace AnalyticOn
27
158
0 commit comments