@@ -50,8 +50,58 @@ the rational circle `add_circle (1 : ℚ)`, and so we set things up more general
50
50
noncomputable theory
51
51
52
52
open set function add_subgroup topological_space
53
+ open_locale topological_space
53
54
54
- variables {𝕜 : Type *} {B : Type *}
55
+ variables {𝕜 B : Type *}
56
+
57
+ section continuity
58
+
59
+ variables [linear_ordered_add_comm_group 𝕜] [archimedean 𝕜]
60
+ [topological_space 𝕜] [order_topology 𝕜] (a : 𝕜) {p : 𝕜} (hp : 0 < p) (x : 𝕜)
61
+
62
+ lemma continuous_right_to_Ico_mod : continuous_within_at (to_Ico_mod a hp) (Ici x) x :=
63
+ begin
64
+ intros s h,
65
+ rw [filter.mem_map, mem_nhds_within_iff_exists_mem_nhds_inter],
66
+ haveI : nontrivial 𝕜 := ⟨⟨0 , p, hp.ne⟩⟩,
67
+ simp_rw mem_nhds_iff_exists_Ioo_subset at h ⊢,
68
+ obtain ⟨l, u, hxI, hIs⟩ := h,
69
+ let d := to_Ico_div a hp x • p,
70
+ have hd := to_Ico_mod_mem_Ico a hp x,
71
+ simp_rw [subset_def, mem_inter_iff],
72
+ refine ⟨_, ⟨l - d, min (a + p) u - d, _, λ x, id⟩, λ y, _⟩;
73
+ simp_rw [← add_mem_Ioo_iff_left, mem_Ioo, lt_min_iff],
74
+ { exact ⟨hxI.1 , hd.2 , hxI.2 ⟩ },
75
+ { rintro ⟨h, h'⟩, apply hIs,
76
+ rw [← to_Ico_mod_add_zsmul, (to_Ico_mod_eq_self _).2 ],
77
+ exacts [⟨h.1 , h.2 .2 ⟩, ⟨hd.1 .trans (add_le_add_right h' _), h.2 .1 ⟩] },
78
+ end
79
+
80
+ lemma continuous_left_to_Ioc_mod : continuous_within_at (to_Ioc_mod a hp) (Iic x) x :=
81
+ begin
82
+ rw (funext (λ y, eq.trans (by rw neg_neg) $ to_Ioc_mod_neg _ _ _) :
83
+ to_Ioc_mod a hp = (λ x, p - x) ∘ to_Ico_mod (-a) hp ∘ has_neg.neg),
84
+ exact ((continuous_sub_left _).continuous_at.comp_continuous_within_at $
85
+ (continuous_right_to_Ico_mod _ _ _).comp continuous_neg.continuous_within_at $ λ y, neg_le_neg),
86
+ end
87
+
88
+ variables {x} (hx : (x : 𝕜 ⧸ zmultiples p) ≠ a)
89
+
90
+ lemma to_Ico_mod_eventually_eq_to_Ioc_mod : to_Ico_mod a hp =ᶠ[𝓝 x] to_Ioc_mod a hp :=
91
+ is_open.mem_nhds (by {rw Ico_eq_locus_Ioc_eq_Union_Ioo, exact is_open_Union (λ i, is_open_Ioo)}) $
92
+ (mem_Ioo_mod_iff_to_Ico_mod_eq_to_Ioc_mod hp).1 ((mem_Ioo_mod_iff_eq_mod_zmultiples hp).2 hx)
93
+
94
+ lemma continuous_at_to_Ico_mod : continuous_at (to_Ico_mod a hp) x :=
95
+ let h := to_Ico_mod_eventually_eq_to_Ioc_mod a hp hx in continuous_at_iff_continuous_left_right.2 $
96
+ ⟨(continuous_left_to_Ioc_mod a hp x).congr_of_eventually_eq
97
+ (h.filter_mono nhds_within_le_nhds) h.eq_of_nhds, continuous_right_to_Ico_mod a hp x⟩
98
+
99
+ lemma continuous_at_to_Ioc_mod : continuous_at (to_Ioc_mod a hp) x :=
100
+ let h := to_Ico_mod_eventually_eq_to_Ioc_mod a hp hx in continuous_at_iff_continuous_left_right.2 $
101
+ ⟨continuous_left_to_Ioc_mod a hp x, (continuous_right_to_Ico_mod a hp x).congr_of_eventually_eq
102
+ (h.symm.filter_mono nhds_within_le_nhds) h.symm.eq_of_nhds⟩
103
+
104
+ end continuity
55
105
56
106
/-- The "additive circle": `𝕜 ⧸ (ℤ ∙ p)`. See also `circle` and `real.angle`. -/
57
107
@[derive [add_comm_group, topological_space, topological_add_group, inhabited, has_coe_t 𝕜] ,
93
143
lemma coe_period : (p : add_circle p) = 0 :=
94
144
(quotient_add_group.eq_zero_iff p).2 $ mem_zmultiples p
95
145
96
- @[simp] lemma coe_add_period (x : 𝕜) : ((( x + p) : 𝕜) : add_circle p) = x :=
146
+ @[simp] lemma coe_add_period (x : 𝕜) : ((x + p : 𝕜) : add_circle p) = x :=
97
147
by rw [coe_add, ←eq_sub_iff_add_eq', sub_self, coe_period]
98
148
99
149
@[continuity, nolint unused_arguments] protected lemma continuous_mk' :
@@ -105,12 +155,22 @@ include hp
105
155
106
156
variables (a : 𝕜) [archimedean 𝕜]
107
157
108
- /-- The natural equivalence between `add_circle p` and the half-open interval `[a, a + p)`. -/
158
+ /-- The equivalence between `add_circle p` and the half-open interval `[a, a + p)`, whose inverse
159
+ is the natural quotient map. -/
109
160
def equiv_Ico : add_circle p ≃ Ico a (a + p) := quotient_add_group.equiv_Ico_mod a hp.out
110
161
111
- /-- Given a function on `[a, a + p)`, lift it to `add_circle p`. -/
162
+ /-- The equivalence between `add_circle p` and the half-open interval `(a, a + p]`, whose inverse
163
+ is the natural quotient map. -/
164
+ def equiv_Ioc : add_circle p ≃ Ioc a (a + p) := quotient_add_group.equiv_Ioc_mod a hp.out
165
+
166
+ /-- Given a function on `𝕜`, return the unique function on `add_circle p` agreeing with `f` on
167
+ `[a, a + p)`. -/
112
168
def lift_Ico (f : 𝕜 → B) : add_circle p → B := restrict _ f ∘ add_circle.equiv_Ico p a
113
169
170
+ /-- Given a function on `𝕜`, return the unique function on `add_circle p` agreeing with `f` on
171
+ `(a, a + p]`. -/
172
+ def lift_Ioc (f : 𝕜 → B) : add_circle p → B := restrict _ f ∘ add_circle.equiv_Ioc p a
173
+
114
174
variables {p a}
115
175
116
176
lemma coe_eq_coe_iff_of_mem_Ico {x y : 𝕜}
@@ -132,16 +192,54 @@ begin
132
192
refl,
133
193
end
134
194
195
+ lemma lift_Ioc_coe_apply {f : 𝕜 → B} {x : 𝕜} (hx : x ∈ Ioc a (a + p)) : lift_Ioc p a f ↑x = f x :=
196
+ begin
197
+ have : (equiv_Ioc p a) x = ⟨x, hx⟩,
198
+ { rw equiv.apply_eq_iff_eq_symm_apply,
199
+ refl, },
200
+ rw [lift_Ioc, comp_apply, this ],
201
+ refl,
202
+ end
203
+
135
204
variables (p a)
136
205
206
+ section continuity
207
+
137
208
@[continuity] lemma continuous_equiv_Ico_symm : continuous (equiv_Ico p a).symm :=
138
209
continuous_quotient_mk.comp continuous_subtype_coe
139
210
211
+ @[continuity] lemma continuous_equiv_Ioc_symm : continuous (equiv_Ioc p a).symm :=
212
+ continuous_quotient_mk.comp continuous_subtype_coe
213
+
214
+ variables {x : add_circle p} (hx : x ≠ a)
215
+ include hx
216
+
217
+ lemma continuous_at_equiv_Ico : continuous_at (equiv_Ico p a) x :=
218
+ begin
219
+ induction x using quotient_add_group.induction_on',
220
+ rw [continuous_at, filter.tendsto, quotient_add_group.nhds_eq, filter.map_map],
221
+ apply continuous_at.cod_restrict, exact continuous_at_to_Ico_mod a hp.out hx,
222
+ end
223
+
224
+ lemma continuous_at_equiv_Ioc : continuous_at (equiv_Ioc p a) x :=
225
+ begin
226
+ induction x using quotient_add_group.induction_on',
227
+ rw [continuous_at, filter.tendsto, quotient_add_group.nhds_eq, filter.map_map],
228
+ apply continuous_at.cod_restrict, exact continuous_at_to_Ioc_mod a hp.out hx,
229
+ end
230
+
231
+ end continuity
232
+
140
233
/-- The image of the closed-open interval `[a, a + p)` under the quotient map `𝕜 → add_circle p` is
141
234
the entire space. -/
142
235
@[simp] lemma coe_image_Ico_eq : (coe : 𝕜 → add_circle p) '' Ico a (a + p) = univ :=
143
236
by { rw image_eq_range, exact (equiv_Ico p a).symm.range_eq_univ }
144
237
238
+ /-- The image of the closed-open interval `[a, a + p)` under the quotient map `𝕜 → add_circle p` is
239
+ the entire space. -/
240
+ @[simp] lemma coe_image_Ioc_eq : (coe : 𝕜 → add_circle p) '' Ioc a (a + p) = univ :=
241
+ by { rw image_eq_range, exact (equiv_Ioc p a).symm.range_eq_univ }
242
+
145
243
/-- The image of the closed interval `[0, p]` under the quotient map `𝕜 → add_circle p` is the
146
244
entire space. -/
147
245
@[simp] lemma coe_image_Icc_eq : (coe : 𝕜 → add_circle p) '' Icc a (a + p) = univ :=
@@ -357,14 +455,12 @@ local attribute [instance] fact_zero_lt_one
357
455
abbreviation unit_add_circle := add_circle (1 : ℝ)
358
456
359
457
section identify_Icc_ends
360
- /-! This section proves that for any `a`, the natural map from `[a, a + p] ⊂ ℝ ` to `add_circle p`
458
+ /-! This section proves that for any `a`, the natural map from `[a, a + p] ⊂ 𝕜 ` to `add_circle p`
361
459
gives an identification of `add_circle p`, as a topological space, with the quotient of `[a, a + p]`
362
460
by the equivalence relation identifying the endpoints. -/
363
461
364
462
namespace add_circle
365
463
366
- section linear_ordered_add_comm_group
367
-
368
464
variables [linear_ordered_add_comm_group 𝕜] [topological_space 𝕜] [order_topology 𝕜]
369
465
(p a : 𝕜) [hp : fact (0 < p)]
370
466
@@ -383,7 +479,7 @@ variables [archimedean 𝕜]
383
479
/-- The equivalence between `add_circle p` and the quotient of `[a, a + p]` by the relation
384
480
identifying the endpoints. -/
385
481
def equiv_Icc_quot : 𝕋 ≃ quot (endpoint_ident p a) :=
386
- { to_fun := λ x, quot.mk _ $ subtype.map id Ico_subset_Icc_self (equiv_Ico _ _ x),
482
+ { to_fun := λ x, quot.mk _ $ inclusion Ico_subset_Icc_self (equiv_Ico _ _ x),
387
483
inv_fun := λ x, quot.lift_on x coe $ by { rintro _ _ ⟨_⟩, exact (coe_add_period p a).symm },
388
484
left_inv := (equiv_Ico p a).symm_apply_apply,
389
485
right_inv := quot.ind $ by
@@ -396,54 +492,61 @@ def equiv_Icc_quot : 𝕋 ≃ quot (endpoint_ident p a) :=
396
492
congr, ext1,
397
493
apply congr_arg subtype.val ((equiv_Ico p a).right_inv ⟨x, hx.1 , hx.2 .lt_of_ne h⟩) } }
398
494
399
- end linear_ordered_add_comm_group
400
-
401
- section real
495
+ lemma equiv_Icc_quot_comp_mk_eq_to_Ico_mod : equiv_Icc_quot p a ∘ quotient.mk' =
496
+ λ x, quot.mk _ ⟨to_Ico_mod a hp.out x, Ico_subset_Icc_self $ to_Ico_mod_mem_Ico a _ x⟩ := rfl
402
497
403
- variables {p a : ℝ} [hp : fact (0 < p)]
404
- include hp
405
-
406
- local notation `𝕋 ` := add_circle p
407
-
408
- /- doesn't work if inlined in `homeo_of_equiv_compact_to_t2` -- why? -/
409
- private lemma continuous_equiv_Icc_quot_symm : continuous (equiv_Icc_quot p a).symm :=
410
- continuous_quot_lift _ $ (add_circle.continuous_mk' p).comp continuous_subtype_coe
498
+ lemma equiv_Icc_quot_comp_mk_eq_to_Ioc_mod : equiv_Icc_quot p a ∘ quotient.mk' =
499
+ λ x, quot.mk _ ⟨to_Ioc_mod a hp.out x, Ioc_subset_Icc_self $ to_Ioc_mod_mem_Ioc a _ x⟩ :=
500
+ begin
501
+ rw equiv_Icc_quot_comp_mk_eq_to_Ico_mod, funext,
502
+ by_cases mem_Ioo_mod a p x,
503
+ { simp_rw (mem_Ioo_mod_iff_to_Ico_mod_eq_to_Ioc_mod hp.out).1 h },
504
+ { simp_rw [not_imp_comm.1 (mem_Ioo_mod_iff_to_Ico_mod_ne_left hp.out).2 h,
505
+ not_imp_comm.1 (mem_Ioo_mod_iff_to_Ioc_mod_ne_right hp.out).2 h],
506
+ exact quot.sound endpoint_ident.mk },
507
+ end
411
508
412
- /-- The natural map from `[a, a + p] ⊂ ℝ ` with endpoints identified to `ℝ / ℤ • p`, as a
509
+ /-- The natural map from `[a, a + p] ⊂ 𝕜 ` with endpoints identified to `𝕜 / ℤ • p`, as a
413
510
homeomorphism of topological spaces. -/
414
- def homeo_Icc_quot : 𝕋 ≃ₜ quot (endpoint_ident p a) :=
415
- (continuous.homeo_of_equiv_compact_to_t2 continuous_equiv_Icc_quot_symm).symm
511
+ def homeo_Icc_quot : 𝕋 ≃ₜ quot (endpoint_ident p a) :=
512
+ { to_equiv := equiv_Icc_quot p a,
513
+ continuous_to_fun := begin
514
+ simp_rw [quotient_map_quotient_mk.continuous_iff,
515
+ continuous_iff_continuous_at, continuous_at_iff_continuous_left_right],
516
+ intro x, split,
517
+ work_on_goal 1 { erw equiv_Icc_quot_comp_mk_eq_to_Ioc_mod },
518
+ work_on_goal 2 { erw equiv_Icc_quot_comp_mk_eq_to_Ico_mod },
519
+ all_goals { apply continuous_quot_mk.continuous_at.comp_continuous_within_at,
520
+ rw inducing_coe.continuous_within_at_iff },
521
+ { apply continuous_left_to_Ioc_mod },
522
+ { apply continuous_right_to_Ico_mod },
523
+ end ,
524
+ continuous_inv_fun := continuous_quot_lift _
525
+ ((add_circle.continuous_mk' p).comp continuous_subtype_coe) }
526
+
527
+ /-! We now show that a continuous function on `[a, a + p]` satisfying `f a = f (a + p)` is the
528
+ pullback of a continuous function on `add_circle p`. -/
416
529
417
- /-! We now show that a continuous function on `[a, a + p]` satisfying `f a = f (a + p)` is
418
- the pullback of a continuous function on `unit_add_circle`. -/
419
-
420
- lemma eq_of_end_ident {f : ℝ → B} (hf : f a = f (a + p)) (x y : Icc a (a + p)) :
421
- endpoint_ident p a x y → f x = f y := by { rintro ⟨_⟩, exact hf }
530
+ variables {p a}
422
531
423
- lemma lift_Ico_eq_lift_Icc {f : ℝ → B} (h : f a = f (a + p)) :
424
- lift_Ico p a f = (quot.lift (restrict (Icc a $ a + p) f) $ eq_of_end_ident h)
425
- ∘ equiv_Icc_quot p a :=
426
- funext (λ x, by refl)
532
+ lemma lift_Ico_eq_lift_Icc {f : 𝕜 → B} (h : f a = f (a + p)) : lift_Ico p a f =
533
+ quot.lift (restrict (Icc a $ a + p) f) (by { rintro _ _ ⟨_⟩, exact h }) ∘ equiv_Icc_quot p a :=
534
+ rfl
427
535
428
- lemma lift_Ico_continuous [topological_space B] {f : ℝ → B} (hf : f a = f (a + p))
536
+ lemma lift_Ico_continuous [topological_space B] {f : 𝕜 → B} (hf : f a = f (a + p))
429
537
(hc : continuous_on f $ Icc a (a + p)) : continuous (lift_Ico p a f) :=
430
538
begin
431
539
rw lift_Ico_eq_lift_Icc hf,
432
- refine continuous.comp _ homeo_Icc_quot.continuous_to_fun,
540
+ refine continuous.comp _ ( homeo_Icc_quot p a) .continuous_to_fun,
433
541
exact continuous_coinduced_dom.mpr (continuous_on_iff_continuous_restrict.mp hc),
434
542
end
435
543
436
- end real
437
-
438
544
section zero_based
439
545
440
- variables {p : ℝ} [hp : fact (0 < p)]
441
- include hp
442
-
443
- lemma lift_Ico_zero_coe_apply {f : ℝ → B} {x : ℝ} (hx : x ∈ Ico 0 p) :
546
+ lemma lift_Ico_zero_coe_apply {f : 𝕜 → B} {x : 𝕜} (hx : x ∈ Ico 0 p) :
444
547
lift_Ico p 0 f ↑x = f x := lift_Ico_coe_apply (by rwa zero_add)
445
548
446
- lemma lift_Ico_zero_continuous [topological_space B] {f : ℝ → B}
549
+ lemma lift_Ico_zero_continuous [topological_space B] {f : 𝕜 → B}
447
550
(hf : f 0 = f p) (hc : continuous_on f $ Icc 0 p) : continuous (lift_Ico p 0 f) :=
448
551
lift_Ico_continuous (by rwa zero_add : f 0 = f (0 + p)) (by rwa zero_add)
449
552
0 commit comments