Skip to content

Commit c88a7c7

Browse files
committed
feat(NumberField/CanonicalEmbedding/NormLeOne): add expMapBasis (#22602)
We continue the study of the set `normLeOne`. In this PR, we define the map `expMapBasis` that we will use in a later PR to parametrize the set `normLeOne`. This PR is part of the proof of the Analytic Class Number Formula.
1 parent 20c260b commit c88a7c7

File tree

4 files changed

+248
-7
lines changed

4 files changed

+248
-7
lines changed

Mathlib/NumberTheory/NumberField/CanonicalEmbedding/Basic.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1204,6 +1204,10 @@ theorem normAtAllPlaces_mixedSpaceOfRealSpace {x : realSpace K} (hx : ∀ w, 0
12041204
ext
12051205
rw [normAtAllPlaces_apply, normAtPlace_mixedSpaceOfRealSpace (hx _)]
12061206

1207+
theorem normAtAllPlaces_mixedEmbedding (x : K) (w : InfinitePlace K) :
1208+
normAtAllPlaces (mixedEmbedding K x) w = w x := by
1209+
rw [normAtAllPlaces_apply, normAtPlace_apply]
1210+
12071211
theorem normAtAllPlaces_normAtAllPlaces (x : mixedSpace K) :
12081212
normAtAllPlaces (mixedSpaceOfRealSpace (normAtAllPlaces x)) = normAtAllPlaces x :=
12091213
normAtAllPlaces_mixedSpaceOfRealSpace fun _ ↦ (normAtAllPlaces_nonneg _ _)

Mathlib/NumberTheory/NumberField/CanonicalEmbedding/NormLeOne.lean

Lines changed: 240 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,62 @@ The proof is loosely based on the strategy given in [D. Marcus, *Number Fields*]
3232
`basisUnitLattice K`, we define the map `expMap : realSpace K → realSpace K` that is, in
3333
some way, the right inverse of `logMap`, see `logMap_expMap`.
3434
35+
4. Denote by `ηᵢ` (with `i ≠ w₀` where `w₀` is the distinguished infinite place,
36+
see the description of `logSpace` below) the fundamental system of units given by
37+
`fundSystem` and let `|ηᵢ|` denote `normAtAllPlaces (mixedEmbedding ηᵢ))`, that is the vector
38+
`(w (ηᵢ))_w` in `realSpace K`. Then, the image of `|ηᵢ|` by `expMap.symm` form a basis of the
39+
subspace `{x : realSpace K | ∑ w, x w = 0}`. We complete by adding the vector `(mult w)_w` to
40+
get a basis, called `completeBasis`, of `realSpace K`. The basis `completeBasis K` has
41+
the property that, for `i ≠ w₀`, the image of `completeBasis K i` by the
42+
natural restriction map `realSpace K → logSpace K` is `basisUnitLattice K`.
43+
44+
5. At this point, we can construct the map `expMapBasis` that plays a crucial part in the proof.
45+
It is the map that sends `x : realSpace K` to `Real.exp (x w₀) * ∏_{i ≠ w₀} |ηᵢ| ^ x i`, see
46+
`expMapBasis_apply'`.
47+
48+
## Spaces and maps
49+
50+
To help understand the proof, we make a list of (almost) all the spaces and maps used and
51+
their connections (as hinted above, we do not mention the map `mixedSpaceOfRealSpace` since we
52+
identify `realSpace K` with its image in `mixedSpace K`).
53+
54+
* `mixedSpace`: the set `({w // IsReal w} → ℝ) × (w // IsComplex w → ℂ)` where `w` denote the
55+
infinite places of `K`.
56+
57+
* `realSpace`: the set `w → ℝ` where `w` denote the infinite places of `K`
58+
59+
* `logSpace`: the set `{w // w ≠ w₀} → ℝ` where `w₀` is a distinguished place of `K`. It is the set
60+
used in the proof of Dirichlet Unit Theorem.
61+
62+
* `mixedEmbedding : K → mixedSpace K`: the map that sends `x : K` to `φ_w(x)` where, for all
63+
infinite place `w`, `φ_w : K → ℝ` or `ℂ`, resp. if `w` is real or if `w` is complex, denote a
64+
complex embedding associated to `w`.
65+
66+
* `logEmbedding : (𝓞 K)ˣ → logSpace K`: the map that sends the unit `u : (𝓞 K)ˣ` to
67+
`(mult w * log (w u))_w` for `w ≠ w₀`. Its image is `unitLattice K`, a `ℤ`-lattice of
68+
`logSpace K`, that admits `basisUnitLattice K` as a basis.
69+
70+
* `logMap : mixedSpace K → logSpace K`: this map is defined such that it factors `logEmbedding`,
71+
that is, for `u : (𝓞 K)ˣ`, `logMap (mixedEmbedding x) = logEmbedding x`, and that
72+
`logMap (c • x) = logMap x` for `c ≠ 0` and `norm x ≠ 0`. The inverse image of the fundamental
73+
domain of `basisUnitLattice K` by `logMap` (minus the elements of norm zero) is
74+
`fundamentalCone K`.
75+
76+
* `expMap : realSpace K → realSpace K`: the right inverse of `logMap` in the sense that
77+
`logMap (expMap x) = (x_w)_{w ≠ w₀}`.
78+
79+
* `expMapBasis : realSpace K → realSpace K`: the map that sends `x : realSpace K` to
80+
`Real.exp (x w₀) * ∏_{i ≠ w₀} |ηᵢ| ^ x i` where `|ηᵢ|` denote the vector of `realSpace K` given
81+
by `w (ηᵢ)` and `ηᵢ` denote the units in `fundSystem K`.
82+
3583
-/
3684

3785
variable (K : Type*) [Field K]
3886

39-
open NumberField NumberField.InfinitePlace NumberField.mixedEmbedding NumberField.Units
87+
open Finset NumberField NumberField.InfinitePlace NumberField.mixedEmbedding NumberField.Units
88+
NumberField.Units.dirichletUnitTheorem
4089

41-
namespace NumberField.mixedEmbedding
90+
namespace NumberField.mixedEmbedding.fundamentalCone
4291

4392
section normAtAllPlaces
4493

@@ -70,8 +119,7 @@ variable [NumberField K]
70119
/--
71120
The set of elements of the `fundamentalCone` of `norm ≤ 1`.
72121
-/
73-
abbrev normLeOne : Set (mixedSpace K) :=
74-
{x | x ∈ fundamentalCone K ∧ mixedEmbedding.norm x ≤ 1}
122+
abbrev normLeOne : Set (mixedSpace K) := fundamentalCone K ∩ {x | mixedEmbedding.norm x ≤ 1}
75123

76124
variable {K} in
77125
theorem mem_normLeOne {x : mixedSpace K} :
@@ -101,7 +149,7 @@ theorem normAtAllPlaces_normLeOne :
101149
· rwa [Set.mem_preimage, ← logMap_normAtAllPlaces] at h₁
102150
· exact fun w ↦ normAtPlace_nonneg w y
103151
· rwa [Set.mem_setOf_eq, ← norm_normAtAllPlaces] at h₂
104-
· rwa [← norm_normAtAllPlaces] at h₃
152+
· rwa [Set.mem_setOf_eq, ← norm_normAtAllPlaces] at h₃
105153
· exact ⟨mixedSpaceOfRealSpace x, ⟨⟨h₁, h₃⟩, h₄⟩, normAtAllPlaces_mixedSpaceOfRealSpace h₂⟩
106154

107155
end normLeOne_def
@@ -154,6 +202,24 @@ variable {K}
154202
theorem expMap_apply (x : realSpace K) (w : InfinitePlace K) :
155203
expMap x w = Real.exp ((↑w.mult)⁻¹ * x w) := rfl
156204

205+
theorem expMap_pos (x : realSpace K) (w : InfinitePlace K) :
206+
0 < expMap x w := Real.exp_pos _
207+
208+
theorem expMap_smul (c : ℝ) (x : realSpace K) :
209+
expMap (c • x) = (expMap x) ^ c := by
210+
ext
211+
simp [mul_comm c _, ← mul_assoc, Real.exp_mul]
212+
213+
theorem expMap_add (x y : realSpace K) :
214+
expMap (x + y) = expMap x * expMap y := by
215+
ext
216+
simp [mul_add, Real.exp_add]
217+
218+
theorem expMap_sum {ι : Type*} (s : Finset ι) (f : ι → realSpace K) :
219+
expMap (∑ i ∈ s, f i) = ∏ i ∈ s, expMap (f i) := by
220+
ext
221+
simp [← Real.exp_sum, ← mul_sum]
222+
157223
@[simp]
158224
theorem expMap_symm_apply (x : realSpace K) (w : InfinitePlace K) :
159225
expMap.symm x w = ↑w.mult * Real.log (x w) := rfl
@@ -165,6 +231,174 @@ theorem logMap_expMap {x : realSpace K}
165231
rw [logMap, normAtPlace_mixedSpaceOfRealSpace (Real.exp_nonneg _), expMap_apply, Real.log_exp,
166232
mul_sub, mul_inv_cancel_left₀ mult_coe_ne_zero, hx, Real.log_one, zero_mul, mul_zero, sub_zero]
167233

234+
theorem sum_expMap_symm_apply {x : K} (hx : x ≠ 0) :
235+
∑ w : InfinitePlace K, expMap.symm ((normAtAllPlaces (mixedEmbedding K x))) w =
236+
Real.log (|Algebra.norm ℚ x| : ℚ) := by
237+
simp_rw [← prod_eq_abs_norm, Real.log_prod _ _ (fun _ _ ↦ pow_ne_zero _ ((map_ne_zero _).mpr hx)),
238+
Real.log_pow, expMap_symm_apply, normAtAllPlaces_mixedEmbedding]
239+
168240
end expMap
169241

170-
end NumberField.mixedEmbedding
242+
noncomputable section completeBasis
243+
244+
variable [NumberField K]
245+
246+
variable {K}
247+
248+
open scoped Classical in
249+
/--
250+
A fixed equiv between `Fin (rank K)` and `{w : InfinitePlace K // w ≠ w₀}`.
251+
-/
252+
def equivFinRank : Fin (rank K) ≃ {w : InfinitePlace K // w ≠ w₀} :=
253+
Fintype.equivOfCardEq <| by
254+
rw [Fintype.card_subtype_compl, Fintype.card_ofSubsingleton, Fintype.card_fin, rank]
255+
256+
open scoped Classical in
257+
variable (K) in
258+
/--
259+
A family of elements in the `realSpace K` formed of the image of the fundamental units
260+
and the vector `(mult w)_w`. This family is in fact a basis of `realSpace K`, see `completeBasis`.
261+
-/
262+
def completeFamily : InfinitePlace K → realSpace K :=
263+
fun i ↦ if hi : i = w₀ then fun w ↦ mult w else
264+
expMap.symm <| normAtAllPlaces <| mixedEmbedding K <| fundSystem K <| equivFinRank.symm ⟨i, hi⟩
265+
266+
/--
267+
An auxiliary map from `realSpace K` to `logSpace K` used to prove that `completeFamily` is
268+
linearly independent, see `linearIndependent_completeFamily`.
269+
-/
270+
def realSpaceToLogSpace : realSpace K →ₗ[ℝ] {w : InfinitePlace K // w ≠ w₀} → ℝ where
271+
toFun := fun x w ↦ x w.1 - w.1.mult * (∑ w', x w') * (Module.finrank ℚ K : ℝ)⁻¹
272+
map_add' := fun _ _ ↦ funext fun _ ↦ by simpa [sum_add_distrib] using by ring
273+
map_smul' := fun _ _ ↦ funext fun _ ↦ by simpa [← mul_sum] using by ring
274+
275+
theorem realSpaceToLogSpace_apply (x :realSpace K) (w : {w : InfinitePlace K // w ≠ w₀}) :
276+
realSpaceToLogSpace x w = x w - w.1.mult * (∑ w', x w') * (Module.finrank ℚ K : ℝ)⁻¹ := rfl
277+
278+
theorem realSpaceToLogSpace_expMap_symm {x : K} (hx : x ≠ 0) :
279+
realSpaceToLogSpace (expMap.symm (normAtAllPlaces (mixedEmbedding K x))) =
280+
logMap (mixedEmbedding K x) := by
281+
ext w
282+
simp_rw [realSpaceToLogSpace_apply, sum_expMap_symm_apply hx, expMap_symm_apply,
283+
logMap, normAtPlace_apply, mul_sub, mul_assoc, norm_eq_norm]
284+
285+
theorem realSpaceToLogSpace_completeFamily_of_eq :
286+
realSpaceToLogSpace (completeFamily K w₀) = 0 := by
287+
ext
288+
rw [realSpaceToLogSpace_apply, completeFamily, dif_pos rfl, ← Nat.cast_sum, sum_mult_eq,
289+
mul_inv_cancel_right₀ (Nat.cast_ne_zero.mpr Module.finrank_pos.ne'), sub_self, Pi.zero_apply]
290+
291+
theorem realSpaceToLogSpace_completeFamily_of_ne (i : {w : InfinitePlace K // w ≠ w₀}) :
292+
realSpaceToLogSpace (completeFamily K i) = basisUnitLattice K (equivFinRank.symm i) := by
293+
ext
294+
rw [← logEmbedding_fundSystem, ← logMap_eq_logEmbedding, completeFamily, dif_neg,
295+
realSpaceToLogSpace_expMap_symm]
296+
exact coe_ne_zero _
297+
298+
theorem sum_eq_zero_of_mem_span_completeFamily {x : realSpace K}
299+
(hx : x ∈ Submodule.span ℝ (Set.range fun w : {w // w ≠ w₀} ↦ completeFamily K w.1)) :
300+
∑ w, x w = 0 := by
301+
induction hx using Submodule.span_induction with
302+
| mem _ h =>
303+
obtain ⟨w, rfl⟩ := h
304+
simp_rw [completeFamily, dif_neg w.prop, sum_expMap_symm_apply (coe_ne_zero _),
305+
Units.norm, Rat.cast_one, Real.log_one]
306+
| zero => simp
307+
| add _ _ _ _ hx hy => simp [sum_add_distrib, hx, hy]
308+
| smul _ _ _ hx => simp [← mul_sum, hx]
309+
310+
variable (K)
311+
312+
theorem linearIndependent_completeFamily :
313+
LinearIndependent ℝ (completeFamily K) := by
314+
classical
315+
have h₁ : LinearIndependent ℝ (fun w : {w // w ≠ w₀} ↦ completeFamily K w.1) := by
316+
refine LinearIndependent.of_comp realSpaceToLogSpace ?_
317+
simp_rw [Function.comp_def, realSpaceToLogSpace_completeFamily_of_ne]
318+
convert (((basisUnitLattice K).ofZLatticeBasis ℝ _).reindex equivFinRank).linearIndependent
319+
simp
320+
have h₂ : completeFamily K w₀ ∉ Submodule.span ℝ
321+
(Set.range (fun w : {w // w ≠ w₀} ↦ completeFamily K w.1)) := by
322+
intro h
323+
have := sum_eq_zero_of_mem_span_completeFamily h
324+
rw [completeFamily, dif_pos rfl, ← Nat.cast_sum, sum_mult_eq, Nat.cast_eq_zero] at this
325+
exact Module.finrank_pos.ne' this
326+
rw [← linearIndependent_equiv (Equiv.optionSubtypeNe w₀), linearIndependent_option]
327+
exact ⟨h₁, h₂⟩
328+
329+
/--
330+
A basis of `realSpace K` formed by the image of the fundamental units
331+
(which form a basis of a subspace `{x : realSpace K | ∑ w, x w = 0}`) and the vector `(mult w)_w`.
332+
For `i ≠ w₀`, the image of `completeBasis K i` by the natural restriction map
333+
`realSpace K → logSpace K` is `basisUnitLattice K`
334+
-/
335+
def completeBasis : Basis (InfinitePlace K) ℝ (realSpace K) :=
336+
basisOfLinearIndependentOfCardEqFinrank (linearIndependent_completeFamily K)
337+
(Module.finrank_fintype_fun_eq_card _).symm
338+
339+
theorem completeBasis_apply_of_eq :
340+
completeBasis K w₀ = fun w ↦ (mult w : ℝ) := by
341+
rw [completeBasis, coe_basisOfLinearIndependentOfCardEqFinrank, completeFamily, dif_pos rfl]
342+
343+
theorem completeBasis_apply_of_ne (i : {w : InfinitePlace K // w ≠ w₀}) :
344+
completeBasis K i =
345+
expMap.symm (normAtAllPlaces (mixedEmbedding K (fundSystem K (equivFinRank.symm i)))) := by
346+
rw [completeBasis, coe_basisOfLinearIndependentOfCardEqFinrank, completeFamily, dif_neg]
347+
348+
theorem expMap_basis_of_eq :
349+
expMap (completeBasis K w₀) = fun _ ↦ Real.exp 1 := by
350+
ext
351+
simp_rw [expMap_apply, completeBasis_apply_of_eq, inv_mul_cancel₀ mult_coe_ne_zero]
352+
353+
theorem expMap_basis_of_ne (i : {w : InfinitePlace K // w ≠ w₀}) :
354+
expMap (completeBasis K i) =
355+
normAtAllPlaces (mixedEmbedding K (fundSystem K (equivFinRank.symm i))) := by
356+
rw [completeBasis_apply_of_ne, PartialHomeomorph.right_inv _
357+
(by simp [expMap_target, pos_at_place])]
358+
359+
end completeBasis
360+
361+
noncomputable section expMapBasis
362+
363+
variable [NumberField K]
364+
365+
variable {K}
366+
367+
/--
368+
The map that sends `x : realSpace K` to
369+
`Real.exp (x w₀) * ∏_{i ≠ w₀} |ηᵢ| ^ x i` where `|ηᵢ|` denote the vector of `realSpace K` given
370+
by `w (ηᵢ)` and `ηᵢ` denote the units in `fundSystem K`, see `expMapBasis_apply'`.
371+
-/
372+
def expMapBasis : PartialHomeomorph (realSpace K) (realSpace K) :=
373+
(completeBasis K).equivFunL.symm.toHomeomorph.transPartialHomeomorph expMap
374+
375+
variable (K)
376+
377+
theorem expMapBasis_source :
378+
expMapBasis.source = (Set.univ : Set (realSpace K)) := by
379+
simp [expMapBasis, expMap_source]
380+
381+
variable {K}
382+
383+
theorem expMapBasis_pos (x : realSpace K) (w : InfinitePlace K) :
384+
0 < expMapBasis x w := expMap_pos _ _
385+
386+
theorem expMapBasis_nonneg (x : realSpace K) (w : InfinitePlace K) :
387+
0 ≤ expMapBasis x w := (expMapBasis_pos _ _).le
388+
389+
theorem expMapBasis_apply (x : realSpace K) :
390+
expMapBasis x = expMap ((completeBasis K).equivFun.symm x) := rfl
391+
392+
open scoped Classical in
393+
theorem expMapBasis_apply' (x : realSpace K) :
394+
expMapBasis x = Real.exp (x w₀) •
395+
fun w : InfinitePlace K ↦
396+
∏ i : {w // w ≠ w₀}, w (fundSystem K (equivFinRank.symm i)) ^ x i := by
397+
simp_rw [expMapBasis_apply, Basis.equivFun_symm_apply, Fintype.sum_eq_add_sum_subtype_ne _ w₀,
398+
expMap_add, expMap_smul, expMap_basis_of_eq, Pi.pow_def, Real.exp_one_rpow, Pi.mul_def,
399+
expMap_sum, expMap_smul, expMap_basis_of_ne, Pi.smul_def, smul_eq_mul, prod_apply, Pi.pow_apply,
400+
normAtAllPlaces_mixedEmbedding]
401+
402+
end expMapBasis
403+
404+
end NumberField.mixedEmbedding.fundamentalCone

Mathlib/NumberTheory/NumberField/Units/Basic.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ protected theorem norm [NumberField K] (x : (𝓞 K)ˣ) :
9696
|Algebra.norm ℚ (x : K)| = 1 := by
9797
rw [← RingOfIntegers.coe_norm, isUnit_iff_norm.mp x.isUnit]
9898

99+
theorem pos_at_place (x : (𝓞 K)ˣ) (w : InfinitePlace K) :
100+
0 < w x := pos_iff.mpr (coe_ne_zero x)
101+
99102
variable {K} in
100103
theorem sum_mult_mul_log [NumberField K] (x : (𝓞 K)ˣ) :
101104
∑ w : InfinitePlace K, w.mult * Real.log (w x) = 0 := by

Mathlib/NumberTheory/NumberField/Units/DirichletTheorem.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ theorem unitLattice_rank :
374374

375375
/-- The map obtained by quotienting by the kernel of `logEmbedding`. -/
376376
def logEmbeddingQuot :
377-
Additive ((𝓞 K)ˣ ⧸ (torsion K)) →+ (logSpace K) :=
377+
Additive ((𝓞 K)ˣ ⧸ (torsion K)) →+ logSpace K :=
378378
MonoidHom.toAdditive' <|
379379
(QuotientGroup.kerLift (AddMonoidHom.toMultiplicative' (logEmbedding K))).comp
380380
(QuotientGroup.quotientMulEquivOfEq (by

0 commit comments

Comments
 (0)