@@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
44Authors: Xavier Roblot
55-/
66import Mathlib.NumberTheory.NumberField.CanonicalEmbedding.FundamentalCone
7+ import Mathlib.NumberTheory.NumberField.CanonicalEmbedding.PolarCoord
78import Mathlib.NumberTheory.NumberField.Units.Regulator
89
910/-!
@@ -12,7 +13,7 @@ import Mathlib.NumberTheory.NumberField.Units.Regulator
1213In 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
5259To help understand the proof, we make a list of (almost) all the spaces and maps used and
@@ -127,6 +134,11 @@ variable {K} in
127134theorem 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+
130142theorem 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
408420noncomputable section expMapBasis
409421
410- open ENNReal MeasureTheory
411-
412422variable [NumberField K]
413423
414424variable {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+
459477theorem 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+
468524open scoped Classical in
469525theorem 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
510568open scoped Classical in
511569theorem 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
532590end 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+
534675end NumberField.mixedEmbedding.fundamentalCone
0 commit comments