Skip to content

Commit 9c97e7a

Browse files
committed
feat(NumberField/CanonicalEmbedding/NormLeOne): compute the volume of NormLeOne (#22777)
We compute the volume of `normLeOne K`. This PR is part of the proof of the Analytic Class Number Formula.
1 parent 1a64c90 commit 9c97e7a

File tree

6 files changed

+206
-4
lines changed

6 files changed

+206
-4
lines changed

Mathlib/Analysis/SpecialFunctions/ImproperIntegrals.lean

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,16 @@ theorem integrableOn_exp_mul_complex_Iic {a : ℂ} (ha : 0 < a.re) (c : ℝ) :
7171
simpa using integrableOn_Iic_iff_integrableOn_Iio.mpr
7272
(integrableOn_exp_mul_complex_Ioi (a := -a) (by simpa) (-c)).comp_neg_Iio
7373

74+
theorem integrableOn_exp_mul_Ioi {a : ℝ} (ha : a < 0) (c : ℝ) :
75+
IntegrableOn (fun x : ℝ => Real.exp (a * x)) (Ioi c) := by
76+
have := Integrable.norm <| integrableOn_exp_mul_complex_Ioi (a := a) (by simpa using ha) c
77+
simpa [Complex.norm_exp] using this
78+
79+
theorem integrableOn_exp_mul_Iic {a : ℝ} (ha : 0 < a) (c : ℝ) :
80+
IntegrableOn (fun x : ℝ => Real.exp (a * x)) (Iic c) := by
81+
have := Integrable.norm <| integrableOn_exp_mul_complex_Iic (a := a) (by simpa using ha) c
82+
simpa [Complex.norm_exp] using this
83+
7484
theorem integral_exp_mul_complex_Ioi {a : ℂ} (ha : a.re < 0) (c : ℝ) :
7585
∫ x : ℝ in Set.Ioi c, Complex.exp (a * x) = - Complex.exp (a * c) / a := by
7686
refine tendsto_nhds_unique (intervalIntegral_tendsto_integral_Ioi c
@@ -86,6 +96,18 @@ theorem integral_exp_mul_complex_Iic {a : ℂ} (ha : 0 < a.re) (c : ℝ) :
8696
integral_comp_neg_Ioi (f := fun x : ℝ ↦ Complex.exp (a * x))]
8797
using integral_exp_mul_complex_Ioi (a := -a) (by simpa) (-c)
8898

99+
theorem integral_exp_mul_Ioi {a : ℝ} (ha : a < 0) (c : ℝ) :
100+
∫ x : ℝ in Set.Ioi c, Real.exp (a * x) = - Real.exp (a * c) / a := by
101+
simp_rw [Real.exp, ← RCLike.re_to_complex, Complex.ofReal_mul]
102+
rw [integral_re, integral_exp_mul_complex_Ioi (by simpa using ha), RCLike.re_to_complex,
103+
RCLike.re_to_complex, Complex.div_ofReal_re, Complex.neg_re]
104+
exact integrableOn_exp_mul_complex_Ioi (by simpa using ha) _
105+
106+
theorem integral_exp_mul_Iic {a : ℝ} (ha : 0 < a) (c : ℝ) :
107+
∫ x : ℝ in Set.Iic c, Real.exp (a * x) = Real.exp (a * c) / a := by
108+
simpa [neg_mul, ← mul_neg, integral_comp_neg_Ioi (f := fun x : ℝ ↦ Real.exp (a * x))]
109+
using integral_exp_mul_Ioi (a := -a) (by simpa) (-c)
110+
89111
/-- If `0 < c`, then `(fun t : ℝ ↦ t ^ a)` is integrable on `(c, ∞)` for all `a < -1`. -/
90112
theorem integrableOn_Ioi_rpow_of_lt {a : ℝ} (ha : a < -1) {c : ℝ} (hc : 0 < c) :
91113
IntegrableOn (fun t : ℝ => t ^ a) (Ioi c) := by

Mathlib/Data/ENNReal/Real.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,9 @@ theorem ofReal_pos {p : ℝ} : 0 < ENNReal.ofReal p ↔ 0 < p := by simp [ENNRea
170170
@[simp]
171171
theorem ofReal_eq_zero {p : ℝ} : ENNReal.ofReal p = 0 ↔ p ≤ 0 := by simp [ENNReal.ofReal]
172172

173+
theorem ofReal_ne_zero_iff {r : ℝ} : ENNReal.ofReal r ≠ 00 < r := by
174+
rw [← zero_lt_iff, ENNReal.ofReal_pos]
175+
173176
@[simp]
174177
theorem zero_eq_ofReal {p : ℝ} : 0 = ENNReal.ofReal p ↔ p ≤ 0 :=
175178
eq_comm.trans ofReal_eq_zero

Mathlib/MeasureTheory/Constructions/Pi.lean

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,12 @@ theorem pi_hyperplane (i : ι) [NoAtoms (μ i)] (x : α i) :
360360
theorem ae_eval_ne (i : ι) [NoAtoms (μ i)] (x : α i) : ∀ᵐ y : ∀ i, α i ∂Measure.pi μ, y i ≠ x :=
361361
compl_mem_ae_iff.2 (pi_hyperplane μ i x)
362362

363+
theorem restrict_pi_pi (s : (i : ι) → Set (α i)) :
364+
(Measure.pi μ).restrict (Set.univ.pi fun i ↦ s i) = .pi (fun i ↦ (μ i).restrict (s i)) := by
365+
refine (pi_eq fun _ h ↦ ?_).symm
366+
simp_rw [restrict_apply (MeasurableSet.univ_pi h), restrict_apply (h _),
367+
← Set.pi_inter_distrib, pi_pi]
368+
363369
variable {μ}
364370

365371
theorem tendsto_eval_ae_ae {i : ι} : Tendsto (eval i) (ae (Measure.pi μ)) (ae (μ i)) := fun _ hs =>

Mathlib/NumberTheory/NumberField/CanonicalEmbedding/Basic.lean

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,11 @@ theorem exists_normAtPlace_ne_zero_iff {x : mixedSpace K} :
379379
(∃ w, normAtPlace w x ≠ 0) ↔ x ≠ 0 := by
380380
rw [ne_eq, ← forall_normAtPlace_eq_zero_iff, not_forall]
381381

382+
theorem continuous_normAtPlace (w : InfinitePlace K) :
383+
Continuous (normAtPlace w) := by
384+
simp_rw [normAtPlace, MonoidWithZeroHom.coe_mk, ZeroHom.coe_mk]
385+
split_ifs <;> fun_prop
386+
382387
variable [NumberField K]
383388

384389
open scoped Classical in
@@ -459,6 +464,12 @@ theorem norm_eq_zero_iff' {x : mixedSpace K} (hx : x ∈ Set.range (mixedEmbeddi
459464
rw [norm_eq_norm, Rat.cast_abs, abs_eq_zero, Rat.cast_eq_zero, Algebra.norm_eq_zero_iff,
460465
map_eq_zero]
461466

467+
variable (K) in
468+
protected theorem continuous_norm : Continuous (mixedEmbedding.norm : (mixedSpace K) → ℝ) := by
469+
refine continuous_finset_prod Finset.univ fun _ _ ↦ ?_
470+
simp_rw [normAtPlace, MonoidWithZeroHom.coe_mk, ZeroHom.coe_mk, dite_pow]
471+
split_ifs <;> fun_prop
472+
462473
end norm
463474

464475
noncomputable section stdBasis
@@ -1228,6 +1239,14 @@ theorem normAtAllPlaces_eq_of_normAtComplexPlaces_eq {x y : mixedSpace K}
12281239
· simpa [normAtAllPlaces_apply, normAtPlace_apply_of_isComplex hw,
12291240
normAtComplexPlaces_apply_isComplex ⟨w, hw⟩] using congr_fun h w
12301241

1242+
theorem normAtAllPlaces_image_preimage_of_nonneg {s : Set (realSpace K)}
1243+
(hs : ∀ x ∈ s, ∀ w, 0 ≤ x w) :
1244+
normAtAllPlaces '' (normAtAllPlaces ⁻¹' s) = s := by
1245+
rw [Set.image_preimage_eq_iff]
1246+
rintro x hx
1247+
refine ⟨mixedSpaceOfRealSpace x, funext fun w ↦ ?_⟩
1248+
rw [normAtAllPlaces_apply, normAtPlace_mixedSpaceOfRealSpace (hs x hx w)]
1249+
12311250
end realSpace
12321251

12331252
end NumberField.mixedEmbedding

Mathlib/NumberTheory/NumberField/CanonicalEmbedding/FundamentalCone.lean

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,17 @@ def fundamentalCone : Set (mixedSpace K) :=
177177
logMap⁻¹' (ZSpan.fundamentalDomain ((basisUnitLattice K).ofZLatticeBasis ℝ _)) \
178178
{x | mixedEmbedding.norm x = 0}
179179

180+
theorem measurableSet_fundamentalCone :
181+
MeasurableSet (fundamentalCone K) := by
182+
classical
183+
refine MeasurableSet.diff ?_ ?_
184+
· unfold logMap
185+
refine MeasurableSet.preimage (ZSpan.fundamentalDomain_measurableSet _) <|
186+
measurable_pi_iff.mpr fun w ↦ measurable_const.mul ?_
187+
exact (continuous_normAtPlace _).measurable.log.sub <|
188+
(mixedEmbedding.continuous_norm _).measurable.log.mul measurable_const
189+
· exact measurableSet_eq_fun (mixedEmbedding.continuous_norm K).measurable measurable_const
190+
180191
namespace fundamentalCone
181192

182193
variable {K} {x y : mixedSpace K} {c : ℝ}

Mathlib/NumberTheory/NumberField/CanonicalEmbedding/NormLeOne.lean

Lines changed: 145 additions & 4 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: Xavier Roblot
55
-/
66
import Mathlib.NumberTheory.NumberField.CanonicalEmbedding.FundamentalCone
7+
import Mathlib.NumberTheory.NumberField.CanonicalEmbedding.PolarCoord
78
import Mathlib.NumberTheory.NumberField.Units.Regulator
89

910
/-!
@@ -12,7 +13,7 @@ import Mathlib.NumberTheory.NumberField.Units.Regulator
1213
In this file, we study the subset `NormLeOne` of the `fundamentalCone` of elements `x` with
1314
`mixedEmbedding.norm x ≤ 1`.
1415
15-
Mainly, we prove that this is bounded, its frontier has volume zero and compute its volume.
16+
Mainly, we prove that it is bounded, its frontier has volume zero and compute its volume.
1617
1718
## Strategy of proof
1819
@@ -47,6 +48,12 @@ The proof is loosely based on the strategy given in [D. Marcus, *Number Fields*]
4748
`expMapBasis_apply'`. Then, we prove a change of variable formula for `expMapBasis`, see
4849
`setLIntegral_expMapBasis_image`.
4950
51+
6. We define a set `paramSet` in `realSpace K` and prove that
52+
`normAtAllPlaces '' (normLeOne K) = expMapBasis (paramSet K)`, see
53+
`normAtAllPlaces_normLeOne_eq_image`. Using this, `setLIntegral_expMapBasis_image` and the results
54+
from `mixedEmbedding.polarCoord`, we can then compute the volume of `normLeOne K`, see
55+
`volume_normLeOne`.
56+
5057
## Spaces and maps
5158
5259
To help understand the proof, we make a list of (almost) all the spaces and maps used and
@@ -127,6 +134,11 @@ variable {K} in
127134
theorem mem_normLeOne {x : mixedSpace K} :
128135
x ∈ normLeOne K ↔ x ∈ fundamentalCone K ∧ mixedEmbedding.norm x ≤ 1 := Set.mem_sep_iff
129136

137+
theorem measurableSet_normLeOne :
138+
MeasurableSet (normLeOne K) :=
139+
(measurableSet_fundamentalCone K).inter <|
140+
measurableSet_le (mixedEmbedding.continuous_norm K).measurable measurable_const
141+
130142
theorem normLeOne_eq_primeage_image :
131143
normLeOne K = normAtAllPlaces⁻¹' (normAtAllPlaces '' (normLeOne K)) := by
132144
refine subset_antisymm (Set.subset_preimage_image _ _) ?_
@@ -407,8 +419,6 @@ end completeBasis
407419

408420
noncomputable section expMapBasis
409421

410-
open ENNReal MeasureTheory
411-
412422
variable [NumberField K]
413423

414424
variable {K}
@@ -456,6 +466,14 @@ theorem expMapBasis_apply' (x : realSpace K) :
456466
expMap_sum, expMap_smul, expMap_basis_of_ne, Pi.smul_def, smul_eq_mul, prod_apply, Pi.pow_apply,
457467
normAtAllPlaces_mixedEmbedding]
458468

469+
open scoped Classical in
470+
theorem expMapBasis_apply'' (x : realSpace K) :
471+
expMapBasis x = Real.exp (x w₀) • expMapBasis (fun i ↦ if i = w₀ then 0 else x i) := by
472+
rw [expMapBasis_apply', expMapBasis_apply', if_pos rfl, smul_smul, ← Real.exp_add, add_zero]
473+
conv_rhs =>
474+
enter [2, w, 2, i]
475+
rw [if_neg i.prop]
476+
459477
theorem prod_expMapBasis_pow (x : realSpace K) :
460478
∏ w, (expMapBasis x w) ^ w.mult = Real.exp (x w₀) ^ Module.finrank ℚ K := by
461479
simp_rw [expMapBasis_apply', Pi.smul_def, smul_eq_mul, mul_pow, prod_mul_distrib,
@@ -465,6 +483,44 @@ theorem prod_expMapBasis_pow (x : realSpace K) :
465483
fun _ _ ↦ pow_nonneg (apply_nonneg _ _) _, prod_eq_abs_norm, Units.norm, Rat.cast_one,
466484
Real.one_rpow, prod_const_one, mul_one]
467485

486+
theorem norm_expMapBasis (x : realSpace K) :
487+
mixedEmbedding.norm (mixedSpaceOfRealSpace (expMapBasis x)) =
488+
Real.exp (x w₀) ^ Module.finrank ℚ K := by
489+
simpa only [mixedEmbedding.norm_apply,
490+
normAtPlace_mixedSpaceOfRealSpace (expMapBasis_pos _ _).le] using prod_expMapBasis_pow x
491+
492+
theorem norm_expMapBasis_ne_zero (x : realSpace K) :
493+
mixedEmbedding.norm (mixedSpaceOfRealSpace (expMapBasis x)) ≠ 0 :=
494+
norm_expMapBasis x ▸ pow_ne_zero _ (Real.exp_ne_zero _)
495+
496+
open scoped Classical in
497+
theorem logMap_expMapBasis (x : realSpace K) :
498+
logMap (mixedSpaceOfRealSpace (expMapBasis x)) ∈
499+
ZSpan.fundamentalDomain ((basisUnitLattice K).ofZLatticeBasis ℝ (unitLattice K))
500+
↔ ∀ w, w ≠ w₀ → x w ∈ Set.Ico 0 1 := by
501+
classical
502+
simp_rw [ZSpan.mem_fundamentalDomain, equivFinRank.forall_congr_left, Subtype.forall]
503+
refine forall₂_congr fun w hw ↦ ?_
504+
rw [expMapBasis_apply'', map_smul, logMap_real_smul (norm_expMapBasis_ne_zero _)
505+
(Real.exp_ne_zero _), expMapBasis_apply, logMap_expMap (by rw [← expMapBasis_apply,
506+
norm_expMapBasis, if_pos rfl, Real.exp_zero, one_pow]), Basis.equivFun_symm_apply,
507+
Fintype.sum_eq_add_sum_subtype_ne _ w₀, if_pos rfl, zero_smul, zero_add]
508+
conv_lhs =>
509+
enter [2, 1, 2, w, 2, i]
510+
rw [if_neg i.prop]
511+
simp_rw [sum_apply, ← sum_fn, map_sum, Pi.smul_apply, ← Pi.smul_def, map_smul,
512+
completeBasis_apply_of_ne, expMap_symm_apply, normAtAllPlaces_mixedEmbedding,
513+
← logEmbedding_component, logEmbedding_fundSystem, Finsupp.coe_finset_sum, Finsupp.coe_smul,
514+
sum_apply, Pi.smul_apply, Basis.ofZLatticeBasis_repr_apply, Basis.repr_self,
515+
Finsupp.single_apply, EmbeddingLike.apply_eq_iff_eq, Int.cast_ite, Int.cast_one, Int.cast_zero,
516+
smul_ite, smul_eq_mul, mul_one, mul_zero, Fintype.sum_ite_eq']
517+
518+
theorem normAtAllPlaces_image_preimage_expMapBasis (s : Set (realSpace K)) :
519+
normAtAllPlaces '' (normAtAllPlaces ⁻¹' (expMapBasis '' s)) = expMapBasis '' s := by
520+
apply normAtAllPlaces_image_preimage_of_nonneg
521+
rintro _ ⟨x, _, rfl⟩ w
522+
exact (expMapBasis_pos _ _).le
523+
468524
open scoped Classical in
469525
theorem prod_deriv_expMap_single (x : realSpace K) :
470526
∏ w, deriv_expMap_single w ((completeBasis K).equivFun.symm x w) =
@@ -505,7 +561,9 @@ theorem abs_det_fderiv_expMapBasis (x : realSpace K) :
505561
abs_inv, abs_prod, abs_of_nonneg (expMapBasis_nonneg _ _), Nat.abs_ofNat]
506562
ring
507563

508-
variable {S}
564+
variable {K}
565+
566+
open ENNReal MeasureTheory
509567

510568
open scoped Classical in
511569
theorem setLIntegral_expMapBasis_image {s : Set (realSpace K)} (hs : MeasurableSet s)
@@ -531,4 +589,87 @@ theorem setLIntegral_expMapBasis_image {s : Set (realSpace K)} (hs : MeasurableS
531589

532590
end expMapBasis
533591

592+
section paramSet
593+
594+
variable [NumberField K]
595+
596+
open scoped Classical in
597+
/--
598+
The set that parametrizes `normAtAllPlaces '' (normLeOne K)`, see
599+
`normAtAllPlaces_normLeOne_eq_image`.
600+
-/
601+
abbrev paramSet : Set (realSpace K) :=
602+
Set.univ.pi fun w ↦ if w = w₀ then Set.Iic 0 else Set.Ico 0 1
603+
604+
theorem measurableSet_paramSet :
605+
MeasurableSet (paramSet K) := by
606+
refine MeasurableSet.univ_pi fun _ ↦ ?_
607+
split_ifs
608+
· exact measurableSet_Iic
609+
· exact measurableSet_Ico
610+
611+
theorem normAtAllPlaces_normLeOne_eq_image :
612+
normAtAllPlaces '' (normLeOne K) = expMapBasis '' (paramSet K) := by
613+
ext x
614+
by_cases hx : ∀ w, 0 < x w
615+
· rw [← expMapBasis.right_inv (Set.mem_univ_pi.mpr hx), (injective_expMapBasis K).mem_set_image]
616+
simp only [normAtAllPlaces_normLeOne, Set.mem_inter_iff, Set.mem_setOf_eq, expMapBasis_nonneg,
617+
Set.mem_preimage, logMap_expMapBasis, implies_true, and_true, norm_expMapBasis,
618+
pow_le_one_iff_of_nonneg (Real.exp_nonneg _) Module.finrank_pos.ne', Real.exp_le_one_iff,
619+
ne_eq, pow_eq_zero_iff', Real.exp_ne_zero, false_and, not_false_eq_true, Set.mem_univ_pi]
620+
refine ⟨fun ⟨h₁, h₂⟩ w ↦ ?_, fun h ↦ ⟨fun w hw ↦ by simpa [hw] using h w, by simpa using h w₀⟩⟩
621+
· split_ifs with hw
622+
· exact hw ▸ h₂
623+
· exact h₁ w hw
624+
· refine ⟨?_, ?_⟩
625+
· rintro ⟨a, ⟨ha, _⟩, rfl⟩
626+
exact (hx fun w ↦ fundamentalCone.normAtPlace_pos_of_mem ha w).elim
627+
· rintro ⟨a, _, rfl⟩
628+
exact (hx fun w ↦ expMapBasis_pos a w).elim
629+
630+
theorem normLeOne_eq_preimage :
631+
normLeOne K = normAtAllPlaces⁻¹' (expMapBasis '' (paramSet K)) := by
632+
rw [normLeOne_eq_primeage_image, normAtAllPlaces_normLeOne_eq_image]
633+
634+
open ENNReal MeasureTheory
635+
636+
theorem setLIntegral_paramSet_exp {n : ℕ} (hn : 0 < n) :
637+
∫⁻ (x : realSpace K) in paramSet K, .ofReal (Real.exp (x w₀ * n)) = (n : ℝ≥0∞)⁻¹ := by
638+
classical
639+
have hn : 0 < (n : ℝ) := Nat.cast_pos.mpr hn
640+
rw [volume_pi, paramSet, Measure.restrict_pi_pi, lintegral_eq_lmarginal_univ 0,
641+
lmarginal_erase' _ (by fun_prop) (Finset.mem_univ w₀), if_pos rfl]
642+
simp_rw [Function.update_self, lmarginal, lintegral_const, Measure.pi_univ, if_neg
643+
(Finset.ne_of_mem_erase (Subtype.prop _)), Measure.restrict_apply_univ, Real.volume_Ico,
644+
sub_zero, ofReal_one, prod_const_one, mul_one, mul_comm _ (n : ℝ)]
645+
rw [← ofReal_integral_eq_lintegral_ofReal (integrableOn_exp_mul_Iic hn _), integral_exp_mul_Iic
646+
hn, mul_zero, Real.exp_zero, ofReal_div_of_pos hn, ofReal_one, ofReal_natCast, one_div]
647+
filter_upwards with _ using Real.exp_nonneg _
648+
649+
end paramSet
650+
651+
section main_results
652+
653+
variable [NumberField K]
654+
655+
open ENNReal MeasureTheory
656+
657+
open scoped Classical in
658+
theorem volume_normLeOne : volume (normLeOne K) =
659+
2 ^ nrRealPlaces K * NNReal.pi ^ nrComplexPlaces K * .ofReal (regulator K) := by
660+
rw [volume_eq_two_pow_mul_two_pi_pow_mul_integral (normLeOne_eq_primeage_image K).symm
661+
(measurableSet_normLeOne K), normLeOne_eq_preimage,
662+
normAtAllPlaces_image_preimage_expMapBasis,
663+
setLIntegral_expMapBasis_image (measurableSet_paramSet K) (by fun_prop)]
664+
simp_rw [ENNReal.inv_mul_cancel_right
665+
(Finset.prod_ne_zero_iff.mpr fun _ _ ↦ ofReal_ne_zero_iff.mpr (expMapBasis_pos _ _))
666+
(prod_ne_top fun _ _ ↦ ofReal_ne_top)]
667+
rw [setLIntegral_paramSet_exp K Module.finrank_pos, ofReal_mul zero_le_two, mul_pow,
668+
ofReal_ofNat, ENNReal.mul_inv_cancel_right (Nat.cast_ne_zero.mpr Module.finrank_pos.ne')
669+
(natCast_ne_top _), coe_nnreal_eq, NNReal.coe_real_pi, mul_mul_mul_comm, ← ENNReal.inv_pow,
670+
← mul_assoc, ← mul_assoc, ENNReal.inv_mul_cancel_right (pow_ne_zero _ two_ne_zero)
671+
(pow_ne_top ENNReal.ofNat_ne_top)]
672+
673+
end main_results
674+
534675
end NumberField.mixedEmbedding.fundamentalCone

0 commit comments

Comments
 (0)