Skip to content

Commit 0738b05

Browse files
committed
feat(NumberField/CanonicalEmbedding/NormLeOne): Prove a change of variable formula for expMapBasis (#22756)
In this PR, we prove a change of variable formula for `expMapBasis` that we will use in the next PR to compute the volume of the set `normLeOne`. This PR is part of the proof of the Analytic Class Number Formula. Co-authored-by: Xavier Roblot <46200072+xroblot@users.noreply.github.com>
1 parent ff7c929 commit 0738b05

File tree

3 files changed

+138
-4
lines changed

3 files changed

+138
-4
lines changed

Mathlib/NumberTheory/NumberField/CanonicalEmbedding/NormLeOne.lean

Lines changed: 133 additions & 3 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.Units.Regulator
78

89
/-!
910
# Fundamental Cone: set of elements of norm ≤ 1
@@ -43,7 +44,8 @@ The proof is loosely based on the strategy given in [D. Marcus, *Number Fields*]
4344
4445
5. At this point, we can construct the map `expMapBasis` that plays a crucial part in the proof.
4546
It is the map that sends `x : realSpace K` to `Real.exp (x w₀) * ∏_{i ≠ w₀} |ηᵢ| ^ x i`, see
46-
`expMapBasis_apply'`.
47+
`expMapBasis_apply'`. Then, we prove a change of variable formula for `expMapBasis`, see
48+
`setLIntegral_expMapBasis_image`.
4749
4850
## Spaces and maps
4951
@@ -176,6 +178,18 @@ def expMap_single (w : InfinitePlace K) : PartialHomeomorph ℝ ℝ where
176178
continuousOn_toFun := (continuousOn_const.mul continuousOn_id).rexp
177179
continuousOn_invFun := continuousOn_const.mul (Real.continuousOn_log.mono (by aesop))
178180

181+
/--
182+
The derivative of `expMap_single`, see `hasDerivAt_expMap_single`.
183+
-/
184+
abbrev deriv_expMap_single (w : InfinitePlace K) (x : ℝ) : ℝ :=
185+
(expMap_single w x) * (w.mult : ℝ)⁻¹
186+
187+
theorem hasDerivAt_expMap_single (w : InfinitePlace K) (x : ℝ) :
188+
HasDerivAt (expMap_single w) (deriv_expMap_single w x) x := by
189+
simpa [expMap_single, mul_comm] using
190+
(HasDerivAt.comp x (Real.hasDerivAt_exp _) (hasDerivAt_mul_const (w.mult : ℝ)⁻¹))
191+
192+
179193
variable [NumberField K]
180194

181195
/--
@@ -196,6 +210,14 @@ theorem expMap_target :
196210
expMap.target = Set.univ.pi fun (_ : InfinitePlace K) ↦ Set.Ioi 0 := by
197211
simp_rw [expMap, PartialHomeomorph.pi_toPartialEquiv, PartialEquiv.pi_target, expMap_single]
198212

213+
theorem injective_expMap :
214+
Function.Injective (expMap : realSpace K → realSpace K) :=
215+
Set.injective_iff_injOn_univ.mpr ((expMap_source K) ▸ expMap.injOn)
216+
217+
theorem continuous_expMap :
218+
Continuous (expMap : realSpace K → realSpace K) :=
219+
continuous_iff_continuousOn_univ.mpr <| (expMap_source K) ▸ expMap.continuousOn
220+
199221
variable {K}
200222

201223
@[simp]
@@ -237,6 +259,18 @@ theorem sum_expMap_symm_apply {x : K} (hx : x ≠ 0) :
237259
simp_rw [← prod_eq_abs_norm, Real.log_prod _ _ (fun _ _ ↦ pow_ne_zero _ ((map_ne_zero _).mpr hx)),
238260
Real.log_pow, expMap_symm_apply, normAtAllPlaces_mixedEmbedding]
239261

262+
/--
263+
The derivative of `expMap`, see `hasFDerivAt_expMap`.
264+
-/
265+
abbrev fderiv_expMap (x : realSpace K) : realSpace K →L[ℝ] realSpace K :=
266+
.pi fun w ↦ (ContinuousLinearMap.smulRight (1 : ℝ →L[ℝ] ℝ) (deriv_expMap_single w (x w))).comp
267+
(.proj w)
268+
269+
theorem hasFDerivAt_expMap (x : realSpace K): HasFDerivAt expMap (fderiv_expMap x) x := by
270+
simpa [expMap, fderiv_expMap, hasFDerivAt_pi', PartialHomeomorph.pi_apply,
271+
ContinuousLinearMap.proj_pi] using
272+
fun w ↦ (hasDerivAt_expMap_single w _).hasFDerivAt.comp x (hasFDerivAt_apply w x)
273+
240274
end expMap
241275

242276
noncomputable section completeBasis
@@ -353,13 +387,28 @@ theorem expMap_basis_of_eq :
353387
theorem expMap_basis_of_ne (i : {w : InfinitePlace K // w ≠ w₀}) :
354388
expMap (completeBasis K i) =
355389
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])]
390+
rw [completeBasis_apply_of_ne, expMap.right_inv (by simp [expMap_target, pos_at_place])]
391+
392+
theorem abs_det_completeBasis_equivFunL_symm :
393+
|((completeBasis K).equivFunL.symm : realSpace K →L[ℝ] realSpace K).det| =
394+
Module.finrank ℚ K * regulator K := by
395+
classical
396+
rw [ContinuousLinearMap.det, ← LinearMap.det_toMatrix (completeBasis K), ← Matrix.det_transpose,
397+
finrank_mul_regulator_eq_det K w₀ equivFinRank.symm]
398+
congr 2 with w i
399+
rw [Matrix.transpose_apply, LinearMap.toMatrix_apply, Matrix.of_apply, ← Basis.equivFunL_apply,
400+
ContinuousLinearMap.coe_coe, ContinuousLinearEquiv.coe_apply,
401+
(completeBasis K).equivFunL.apply_symm_apply]
402+
split_ifs with hw
403+
· rw [hw, completeBasis_apply_of_eq]
404+
· simp_rw [completeBasis_apply_of_ne K ⟨w, hw⟩, expMap_symm_apply, normAtAllPlaces_mixedEmbedding]
358405

359406
end completeBasis
360407

361408
noncomputable section expMapBasis
362409

410+
open ENNReal MeasureTheory
411+
363412
variable [NumberField K]
364413

365414
variable {K}
@@ -378,6 +427,14 @@ theorem expMapBasis_source :
378427
expMapBasis.source = (Set.univ : Set (realSpace K)) := by
379428
simp [expMapBasis, expMap_source]
380429

430+
theorem injective_expMapBasis :
431+
Function.Injective (expMapBasis : realSpace K → realSpace K) :=
432+
(injective_expMap K).comp (completeBasis K).equivFun.symm.injective
433+
434+
theorem continuous_expMapBasis :
435+
Continuous (expMapBasis : realSpace K → realSpace K) :=
436+
(continuous_expMap K).comp (ContinuousLinearEquiv.continuous _)
437+
381438
variable {K}
382439

383440
theorem expMapBasis_pos (x : realSpace K) (w : InfinitePlace K) :
@@ -399,6 +456,79 @@ theorem expMapBasis_apply' (x : realSpace K) :
399456
expMap_sum, expMap_smul, expMap_basis_of_ne, Pi.smul_def, smul_eq_mul, prod_apply, Pi.pow_apply,
400457
normAtAllPlaces_mixedEmbedding]
401458

459+
theorem prod_expMapBasis_pow (x : realSpace K) :
460+
∏ w, (expMapBasis x w) ^ w.mult = Real.exp (x w₀) ^ Module.finrank ℚ K := by
461+
simp_rw [expMapBasis_apply', Pi.smul_def, smul_eq_mul, mul_pow, prod_mul_distrib,
462+
prod_pow_eq_pow_sum, sum_mult_eq, ← prod_pow]
463+
rw [prod_comm]
464+
simp_rw [Real.rpow_pow_comm (apply_nonneg _ _), Real.finset_prod_rpow _ _
465+
fun _ _ ↦ pow_nonneg (apply_nonneg _ _) _, prod_eq_abs_norm, Units.norm, Rat.cast_one,
466+
Real.one_rpow, prod_const_one, mul_one]
467+
468+
open scoped Classical in
469+
theorem prod_deriv_expMap_single (x : realSpace K) :
470+
∏ w, deriv_expMap_single w ((completeBasis K).equivFun.symm x w) =
471+
Real.exp (x w₀) ^ Module.finrank ℚ K * (∏ w : {w // IsComplex w}, expMapBasis x w.1)⁻¹ *
472+
(2⁻¹) ^ nrComplexPlaces K := by
473+
simp only [deriv_expMap_single, expMap_single_apply]
474+
rw [Finset.prod_mul_distrib]
475+
congr 1
476+
· simp_rw [← prod_expMapBasis_pow, prod_eq_prod_mul_prod, expMapBasis_apply, expMap_apply,
477+
mult_isReal, mult_isComplex, pow_one, Finset.prod_pow, pow_two, mul_assoc, mul_inv_cancel₀
478+
(Finset.prod_ne_zero_iff.mpr <| fun _ _ ↦ Real.exp_ne_zero _), mul_one]
479+
· simp [prod_eq_prod_mul_prod, mult_isReal, mult_isComplex]
480+
481+
variable (K)
482+
483+
/--
484+
The derivative of `expMapBasis`, see `hasFDerivAt_expMapBasis`.
485+
-/
486+
abbrev fderiv_expMapBasis (x : realSpace K) : realSpace K →L[ℝ] realSpace K :=
487+
(fderiv_expMap ((completeBasis K).equivFun.symm x)).comp
488+
(completeBasis K).equivFunL.symm.toContinuousLinearMap
489+
490+
theorem hasFDerivAt_expMapBasis (x : realSpace K) :
491+
HasFDerivAt expMapBasis (fderiv_expMapBasis K x) x := by
492+
change HasFDerivAt (expMap ∘ (completeBasis K).equivFunL.symm) (fderiv_expMapBasis K x) x
493+
exact (hasFDerivAt_expMap _).comp x (completeBasis K).equivFunL.symm.hasFDerivAt
494+
495+
open Classical ContinuousLinearMap in
496+
theorem abs_det_fderiv_expMapBasis (x : realSpace K) :
497+
|(fderiv_expMapBasis K x).det| =
498+
Real.exp (x w₀ * Module.finrank ℚ K) *
499+
(∏ w : {w // IsComplex w}, expMapBasis x w.1)⁻¹ * 2⁻¹ ^ nrComplexPlaces K *
500+
(Module.finrank ℚ K) * regulator K := by
501+
simp_rw [fderiv_expMapBasis, det, coe_comp, LinearMap.det_comp, fderiv_expMap, coe_pi, coe_comp,
502+
coe_proj, LinearMap.det_pi, LinearMap.det_ring, ContinuousLinearMap.coe_coe, smulRight_apply,
503+
one_apply, one_smul, abs_mul, abs_det_completeBasis_equivFunL_symm, prod_deriv_expMap_single]
504+
simp_rw [abs_mul, Real.exp_mul, abs_pow, Real.rpow_natCast, abs_of_nonneg (Real.exp_nonneg _),
505+
abs_inv, abs_prod, abs_of_nonneg (expMapBasis_nonneg _ _), Nat.abs_ofNat]
506+
ring
507+
508+
variable {S}
509+
510+
open scoped Classical in
511+
theorem setLIntegral_expMapBasis_image {s : Set (realSpace K)} (hs : MeasurableSet s)
512+
{f : (InfinitePlace K → ℝ) → ℝ≥0∞} (hf : Measurable f) :
513+
∫⁻ x in expMapBasis '' s, f x =
514+
(2 : ℝ≥0∞)⁻¹ ^ nrComplexPlaces K * ENNReal.ofReal (regulator K) * (Module.finrank ℚ K) *
515+
∫⁻ x in s, ENNReal.ofReal (Real.exp (x w₀ * Module.finrank ℚ K)) *
516+
(∏ i : {w : InfinitePlace K // IsComplex w},
517+
.ofReal (expMapBasis (fun w ↦ x w) i))⁻¹ * f (expMapBasis x) := by
518+
rw [lintegral_image_eq_lintegral_abs_det_fderiv_mul volume hs
519+
(fun x _ ↦ (hasFDerivAt_expMapBasis K x).hasFDerivWithinAt) (injective_expMapBasis K).injOn]
520+
simp_rw [abs_det_fderiv_expMapBasis]
521+
have : Measurable expMapBasis := (continuous_expMapBasis K).measurable
522+
rw [← lintegral_const_mul _ (by fun_prop)]
523+
congr with x
524+
have : 0 ≤ (∏ w : {w // IsComplex w}, expMapBasis x w.1)⁻¹ :=
525+
inv_nonneg.mpr <| Finset.prod_nonneg fun _ _ ↦ (expMapBasis_pos _ _).le
526+
rw [ofReal_mul (by positivity), ofReal_mul (by positivity), ofReal_mul (by positivity),
527+
ofReal_mul (by positivity), ofReal_pow (by positivity), ofReal_inv_of_pos (Finset.prod_pos
528+
fun _ _ ↦ expMapBasis_pos _ _), ofReal_inv_of_pos zero_lt_two, ofReal_ofNat, ofReal_natCast,
529+
ofReal_prod_of_nonneg (fun _ _ ↦ (expMapBasis_pos _ _).le)]
530+
ring
531+
402532
end expMapBasis
403533

404534
end NumberField.mixedEmbedding.fundamentalCone

Mathlib/Topology/Algebra/Module/LinearMapPiProd.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,10 @@ theorem proj_apply (i : ι) (b : ∀ i, φ i) : (proj i : (∀ i, φ i) →L[R]
187187
@[simp]
188188
theorem proj_pi (f : ∀ i, M₂ →L[R] φ i) (i : ι) : (proj i).comp (pi f) = f i := rfl
189189

190+
@[simp]
191+
theorem coe_proj (i : ι) :
192+
(proj i).toLinearMap = (LinearMap.proj i : ((i : ι) → φ i) →ₗ[R] _) := rfl
193+
190194
@[simp]
191195
theorem pi_proj : pi proj = .id R (∀ i, φ i) := rfl
192196

Mathlib/Topology/PartialHomeomorph.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -946,7 +946,7 @@ variable {ι : Type*} [Finite ι] {X Y : ι → Type*} [∀ i, TopologicalSpace
946946
[∀ i, TopologicalSpace (Y i)] (ei : ∀ i, PartialHomeomorph (X i) (Y i))
947947

948948
/-- The product of a finite family of `PartialHomeomorph`s. -/
949-
@[simps toPartialEquiv]
949+
@[simps! toPartialEquiv apply symm_apply source target]
950950
def pi : PartialHomeomorph (∀ i, X i) (∀ i, Y i) where
951951
toPartialEquiv := PartialEquiv.pi fun i => (ei i).toPartialEquiv
952952
open_source := isOpen_set_pi finite_univ fun i _ => (ei i).open_source

0 commit comments

Comments
 (0)