Definitions/Def_ModularCurve_CharacterLatticePairings.lean
Pairings and functoriality of the degree-zero character lattice
For a finite type S, ModularCurve.characterLattice S is the kernel of \mathrm{degreeOn}\,S : (S \to \mathbb{Z}) \to \mathbb{Z}, a \mapsto \sum_{s} a(s), i.e. the lattice \mathbb{Z}[S]^{0} of degree-zero functions. This module equips it with two pairings and with functoriality in S. On the multiplicative side, for a commutative group G, a : S \to \mathbb{Z} and w : S \to G, zpowProd a w is \prod_{s} w(s)^{a(s)}; it is additive in a, sends -a to the inverse, is multiplicative in w, and on a constant family w \equiv c equals c^{\deg a}, hence equals 1 as soon as \deg a = 0. Accordingly zpowProdHom a is the monoid homomorphism (S \to G) \to G so given, and evalHom, defined on an element a of characterLattice S, is this homomorphism for the underlying function, killing the constant families and additive in a. On the additive side, for a module M over a commutative ring R, smulSum given by \mathrm{smulSum}\,a\,v = \sum_{s} a(s) \bullet v(s) is additive in each variable, R-linear in v, equals (\deg a)\bullet m on the constant family v \equiv m, and vanishes on constants when a lies in the lattice.
For functoriality, IsDegreeScaling f d is the predicate on a \mathbb{Z}-linear map f : (S \to \mathbb{Z}) \to (S' \to \mathbb{Z}) asserting \deg(f a) = d \cdot \deg a for all a; such an f carries the degree-zero lattice into the degree-zero lattice, and restrictDegZero is the induced map \mathbb{Z}[S]^{0} \to \mathbb{Z}[S']^{0}. Two instances are provided: permMapFun \sigma, transport along a bijection \sigma : S \simeq S' (value a(\sigma^{-1}s')), which scales degree by 1, and corrMapFun B, given by a matrix B : S \to S' \to \mathbb{Z} via (fa)(s') = \sum_{s} a(s)B(s,s'), which scales degree by d whenever every row sum \sum_{s'} B(s,s') equals d; permMap and corrMap are the resulting maps on lattices. Two compatibilities record that pairing against a transported function is pairing against the precomposed family w \circ \sigma, and against \mathrm{corrMapFun}\,B\,a is pairing a against s \mapsto \prod_{s'} w(s')^{B(s,s')}. Auxiliary lemmas compute \deg on a single indicator and on constants, note that differences of indicators lie in the lattice, and expand g^{\sum_i e_i} as a product.
Relation to Mathlib
Built on Mathlib's LinearMap, Submodule and big-operator API; the lattice itself and degreeOn come from the project's component-group definitions, and the pairings and degree-scaling predicate here are the project's own.
Where it is used
The degree-zero lattice \mathbb{Z}[S]^{0} plays the role of the character lattice of the torus (S \to G)/G attached to the set S of components of a fibre, so that the pairings here give the evaluation of characters on torus points and on the associated R-module of logarithms, while permMap and corrMap supply the action of bijections and of correspondences (Hecke-type data with constant row sums) on the lattice. These are the algebraic ingredients underlying the component-group computations on modular curves used in level lowering.
References
- S. Bosch, W. Lütkebohmert and M. Raynaud, Néron Models, Ergebnisse der Mathematik und ihrer Grenzgebiete 21, Springer, 1990
References are suggested automatically and have not been individually verified.
English text generated automatically from the Lean source; the Lean statement is authoritative.
- 210 lines
- 42 declarations
- used in the statements of 31 theorems and imported by 36 proofs
- imports 1 definition modules
Source file: Definitions/Def_ModularCurve_CharacterLatticePairings.lean
Imported by
Declarations
- theorem
ModularCurve.degreeOn_single - theorem
ModularCurve.degreeOn_const - theorem
ModularCurve.single_sub_single_mem - theorem
ModularCurve.CharacterLattice.zpow_finset_sum - def
ModularCurve.CharacterLattice.zpowProd - theorem
ModularCurve.CharacterLattice.zpowProd_def - theorem
ModularCurve.CharacterLattice.zpowProd_add - theorem
ModularCurve.CharacterLattice.zpowProd_zero_left - theorem
ModularCurve.CharacterLattice.zpowProd_neg - theorem
ModularCurve.CharacterLattice.zpowProd_mul - theorem
ModularCurve.CharacterLattice.zpowProd_one_right - theorem
ModularCurve.CharacterLattice.zpowProd_const - theorem
ModularCurve.CharacterLattice.zpowProd_const_of_mem - def
ModularCurve.CharacterLattice.zpowProdHom - theorem
ModularCurve.CharacterLattice.zpowProdHom_apply - def
ModularCurve.CharacterLattice.evalHom - theorem
ModularCurve.CharacterLattice.evalHom_apply - theorem
ModularCurve.CharacterLattice.evalHom_const - theorem
ModularCurve.CharacterLattice.evalHom_add - def
ModularCurve.CharacterLattice.smulSum - theorem
ModularCurve.CharacterLattice.smulSum_def - theorem
ModularCurve.CharacterLattice.smulSum_add_left - theorem
ModularCurve.CharacterLattice.smulSum_add_right - theorem
ModularCurve.CharacterLattice.smulSum_smul_right - theorem
ModularCurve.CharacterLattice.smulSum_const - theorem
ModularCurve.CharacterLattice.smulSum_const_of_mem - def
ModularCurve.CharacterLattice.IsDegreeScaling - theorem
ModularCurve.CharacterLattice.IsDegreeScaling.map_mem - def
ModularCurve.CharacterLattice.restrictDegZero - theorem
ModularCurve.CharacterLattice.coe_restrictDegZero_apply - def
ModularCurve.CharacterLattice.permMapFun - theorem
ModularCurve.CharacterLattice.permMapFun_apply - theorem
ModularCurve.CharacterLattice.isDegreeScaling_permMapFun - def
ModularCurve.CharacterLattice.permMap - theorem
ModularCurve.CharacterLattice.coe_permMap_apply - def
ModularCurve.CharacterLattice.corrMapFun - theorem
ModularCurve.CharacterLattice.corrMapFun_apply - theorem
ModularCurve.CharacterLattice.isDegreeScaling_corrMapFun - def
ModularCurve.CharacterLattice.corrMap - theorem
ModularCurve.CharacterLattice.coe_corrMap_apply - theorem
ModularCurve.CharacterLattice.zpowProd_permMapFun - theorem
ModularCurve.CharacterLattice.zpowProd_corrMapFun
Source
import Mathlib import Definitions.Def_ModularCurve_ComponentGroup set_option autoImplicit false namespace ModularCurve open Finset variable (S : Type*) [Fintype S] theorem degreeOn_single [DecidableEq S] (s : S) (n : ℤ) : degreeOn S (Pi.single s n) = n := by simp [degreeOn_apply] theorem degreeOn_const (n : ℤ) : degreeOn S (fun _ => n) = Fintype.card S • n := by simp [degreeOn_apply] variable {S} theorem single_sub_single_mem [DecidableEq S] (s t : S) : Pi.single s (1 : ℤ) - Pi.single t 1 ∈ characterLattice S := by rw [characterLattice, LinearMap.mem_ker, map_sub, degreeOn_single, degreeOn_single, sub_self] namespace CharacterLattice section MultiplicativePairing variable {G : Type*} [CommGroup G] theorem zpow_finset_sum {ι : Type*} (g : G) (e : ι → ℤ) (t : Finset ι) : g ^ (∑ i ∈ t, e i) = ∏ i ∈ t, g ^ e i := by classical induction t using Finset.induction_on with | empty => simp | insert a t ha ih => rw [Finset.sum_insert ha, Finset.prod_insert ha, zpow_add, ih] def zpowProd (a : S → ℤ) (w : S → G) : G := ∏ s, w s ^ a s @[simp] theorem zpowProd_def (a : S → ℤ) (w : S → G) : zpowProd a w = ∏ s, w s ^ a s := rfl theorem zpowProd_add (a b : S → ℤ) (w : S → G) : zpowProd (a + b) w = zpowProd a w * zpowProd b w := by simp [zpowProd, zpow_add, Finset.prod_mul_distrib] theorem zpowProd_zero_left (w : S → G) : zpowProd (0 : S → ℤ) w = 1 := by simp [zpowProd] theorem zpowProd_neg (a : S → ℤ) (w : S → G) : zpowProd (-a) w = (zpowProd a w)⁻¹ := by simp [zpowProd, Finset.prod_inv_distrib] theorem zpowProd_mul (a : S → ℤ) (w w' : S → G) : zpowProd a (w * w') = zpowProd a w * zpowProd a w' := by simp [zpowProd, mul_zpow, Finset.prod_mul_distrib] theorem zpowProd_one_right (a : S → ℤ) : zpowProd a (1 : S → G) = 1 := by simp [zpowProd] theorem zpowProd_const (a : S → ℤ) (c : G) : zpowProd a (fun _ => c) = c ^ degreeOn S a := by rw [zpowProd_def, degreeOn_apply, zpow_finset_sum] theorem zpowProd_const_of_mem {a : S → ℤ} (ha : a ∈ characterLattice S) (c : G) : zpowProd a (fun _ => c) = 1 := by rw [zpowProd_const, show degreeOn S a = 0 from ha, zpow_zero] def zpowProdHom (a : S → ℤ) : (S → G) →* G where toFun := zpowProd a map_one' := zpowProd_one_right a map_mul' := zpowProd_mul a @[simp] theorem zpowProdHom_apply (a : S → ℤ) (w : S → G) : zpowProdHom a w = zpowProd a w := rfl def evalHom (a : characterLattice S) : (S → G) →* G := zpowProdHom (a : S → ℤ) @[simp] theorem evalHom_apply (a : characterLattice S) (w : S → G) : evalHom a w = ∏ s, w s ^ (a : S → ℤ) s := rfl theorem evalHom_const (a : characterLattice S) (c : G) : evalHom a (fun _ => c) = 1 := zpowProd_const_of_mem a.2 c theorem evalHom_add (a b : characterLattice S) (w : S → G) : evalHom (a + b) w = evalHom a w * evalHom b w := zpowProd_add _ _ w end MultiplicativePairing section AdditivePairing variable {R : Type*} [CommRing R] {M : Type*} [AddCommGroup M] [Module R M] def smulSum (a : S → ℤ) (v : S → M) : M := ∑ s, a s • v s @[simp] theorem smulSum_def (a : S → ℤ) (v : S → M) : smulSum a v = ∑ s, a s • v s := rfl theorem smulSum_add_left (a b : S → ℤ) (v : S → M) : smulSum (a + b) v = smulSum a v + smulSum b v := by simp [smulSum, add_smul, Finset.sum_add_distrib] theorem smulSum_add_right (a : S → ℤ) (v v' : S → M) : smulSum a (v + v') = smulSum a v + smulSum a v' := by simp [smulSum, smul_add, Finset.sum_add_distrib] theorem smulSum_smul_right (a : S → ℤ) (r : R) (v : S → M) : smulSum a (r • v) = r • smulSum a v := by simp only [smulSum_def, Pi.smul_apply, Finset.smul_sum] exact Finset.sum_congr rfl fun s _ => smul_comm _ _ _ theorem smulSum_const (a : S → ℤ) (m : M) : smulSum a (fun _ => m) = degreeOn S a • m := by simp [smulSum, degreeOn_apply, Finset.sum_smul] theorem smulSum_const_of_mem {a : S → ℤ} (ha : a ∈ characterLattice S) (m : M) : smulSum a (fun _ => m) = 0 := by rw [smulSum_const, show degreeOn S a = 0 from ha, zero_smul] end AdditivePairing section Functoriality variable {S' : Type*} [Fintype S'] def IsDegreeScaling (f : (S → ℤ) →ₗ[ℤ] (S' → ℤ)) (d : ℤ) : Prop := ∀ a, degreeOn S' (f a) = d * degreeOn S a theorem IsDegreeScaling.map_mem {f : (S → ℤ) →ₗ[ℤ] (S' → ℤ)} {d : ℤ} (hf : IsDegreeScaling f d) {a : S → ℤ} (ha : a ∈ characterLattice S) : f a ∈ characterLattice S' := by rw [characterLattice, LinearMap.mem_ker, hf a, show degreeOn S a = 0 from ha, mul_zero] def restrictDegZero (f : (S → ℤ) →ₗ[ℤ] (S' → ℤ)) (d : ℤ) (hf : IsDegreeScaling f d) : characterLattice S →ₗ[ℤ] characterLattice S' := f.restrict fun _ ha => hf.map_mem ha @[simp] theorem coe_restrictDegZero_apply (f : (S → ℤ) →ₗ[ℤ] (S' → ℤ)) (d : ℤ) (hf : IsDegreeScaling f d) (a : characterLattice S) : (restrictDegZero f d hf a : S' → ℤ) = f a := rfl omit [Fintype S] [Fintype S'] in def permMapFun (σ : S ≃ S') : (S → ℤ) →ₗ[ℤ] (S' → ℤ) := LinearMap.funLeft ℤ ℤ σ.symm omit [Fintype S] [Fintype S'] in @[simp] theorem permMapFun_apply (σ : S ≃ S') (a : S → ℤ) (s' : S') : permMapFun σ a s' = a (σ.symm s') := rfl theorem isDegreeScaling_permMapFun (σ : S ≃ S') : IsDegreeScaling (permMapFun σ) 1 := by intro a simp only [degreeOn_apply, permMapFun_apply, one_mul] exact Fintype.sum_equiv σ.symm _ _ fun _ => rfl def permMap (σ : S ≃ S') : characterLattice S →ₗ[ℤ] characterLattice S' := restrictDegZero (permMapFun σ) 1 (isDegreeScaling_permMapFun σ) @[simp] theorem coe_permMap_apply (σ : S ≃ S') (a : characterLattice S) (s' : S') : (permMap σ a : S' → ℤ) s' = (a : S → ℤ) (σ.symm s') := rfl omit [Fintype S'] in def corrMapFun (B : S → S' → ℤ) : (S → ℤ) →ₗ[ℤ] (S' → ℤ) where toFun a s' := ∑ s, a s * B s s' map_add' a b := by ext s'; simp [add_mul, Finset.sum_add_distrib] map_smul' c a := by ext s'; simp [Finset.mul_sum, mul_assoc] omit [Fintype S'] in @[simp] theorem corrMapFun_apply (B : S → S' → ℤ) (a : S → ℤ) (s' : S') : corrMapFun B a s' = ∑ s, a s * B s s' := rfl theorem isDegreeScaling_corrMapFun (B : S → S' → ℤ) (d : ℤ) (hB : ∀ s, ∑ s', B s s' = d) : IsDegreeScaling (corrMapFun B) d := by intro a simp only [degreeOn_apply, corrMapFun_apply] rw [Finset.sum_comm, Finset.mul_sum] refine Finset.sum_congr rfl fun s _ => ?_ rw [← Finset.mul_sum, hB s, mul_comm] def corrMap (B : S → S' → ℤ) (d : ℤ) (hB : ∀ s, ∑ s', B s s' = d) : characterLattice S →ₗ[ℤ] characterLattice S' := restrictDegZero (corrMapFun B) d (isDegreeScaling_corrMapFun B d hB) @[simp] theorem coe_corrMap_apply (B : S → S' → ℤ) (d : ℤ) (hB : ∀ s, ∑ s', B s s' = d) (a : characterLattice S) (s' : S') : (corrMap B d hB a : S' → ℤ) s' = ∑ s, (a : S → ℤ) s * B s s' := rfl theorem zpowProd_permMapFun {G : Type*} [CommGroup G] (σ : S ≃ S') (a : S → ℤ) (w : S' → G) : zpowProd (permMapFun σ a) w = zpowProd a (w ∘ σ) := by simp only [zpowProd, permMapFun_apply, Function.comp_apply] exact Fintype.prod_equiv σ.symm _ _ fun _ => by simp theorem zpowProd_corrMapFun {G : Type*} [CommGroup G] (B : S → S' → ℤ) (a : S → ℤ) (w : S' → G) : zpowProd (corrMapFun B a) w = zpowProd a (fun s => ∏ s', w s' ^ B s s') := by simp only [zpowProd_def, corrMapFun_apply] calc (∏ s', w s' ^ ∑ s, a s * B s s') = ∏ s', ∏ s, w s' ^ (a s * B s s') := Finset.prod_congr rfl fun s' _ => zpow_finset_sum (w s') _ _ _ = ∏ s, ∏ s', w s' ^ (a s * B s s') := Finset.prod_comm _ = ∏ s, (∏ s', w s' ^ B s s') ^ a s := by refine Finset.prod_congr rfl fun s _ => ?_ rw [← Finset.prod_zpow] exact Finset.prod_congr rfl fun s' _ => by rw [zpow_mul'] end Functoriality end CharacterLattice end ModularCurve
Statements phrased using this module (31)
- Toric-by-finite filtration of Tₚ J_H(M) at p ∥ M
ModularCurve.JHNeronObjectAtP.exists_toricFiniteFiltration_tateModule_jH_self70 below · depth 11 - Frobenius acts as Uₚ on toric ℓ^k-torsion
ModularCurve.JHNeronObjectAtP.genOpH_U_smul_eq_cyclotomicCharacter_toZModPow_smul_of_mem_toricPts123 below · depth 11 - Frobenius on node units: p-th power twisted by the crossing permutation
ModularCurve.JHNeronObjectAtP.ptsSp_symm_eq_nodeUnit_pow_comp_frobPerm_of_isFrobeniusAt100 below · depth 11 - Comparison of the H=top and Igusa integral models
ModularCurve.exists_iso_xHDRLevel_top_drLevel_epsInf_pointEquivPlace191 below · depth 11 - Finite and toric parts transport from Jₜop(N₀p) to J₀(N₀p)
ModularCurve.map_finPts_jHNeronObjectAtP_top_eq_and_map_toricPts_eq_of_pic0Congr_of_bridge136 below · depth 11 - Prime-to-p toric points as Hom(ℤ[SS]⁰,μ_m)
ModularCurve.JHNeronObjectAtP.exists_addEquiv_toricPts_characterLattice_hom_of_ptsSp_nodeUnit6 below · depth 12 - Pull-back along φ⁻¹ intertwines the two Abel–Jacobi dictionaries
ModularCurve.jZeroNeronObjectAtP_pts_pic0Congr_eq_pts_comp_pullbackHom_of_modelIso_levelData66 below · depth 12 - Characters of the degree-zero lattice are evaluations at node data
ModularCurve.characterLattice_evalHom_surjective_and_trivial_iff_const0 below · depth 13 - Inertia-invariant torsion of J_H(M) bounded by finite part
ModularCurve.JHNeronObjectAtP.exists_forall_natCard_torsion_inf_inertiaInvariants_le_natCard_finPts_mul_of_abelJacobiPin_of_wgen2,584 below · depth 23 - Reduction of the finite part of T_ℓ J_H(M) and Uₚ
ModularCurve.JHNeronObjectAtP.exists_linearMap_finiteSubmodule_tateModule_jH_toPic0Pair_of_ne121 below · depth 23 - p-old lattice in T_ℓ J_H(M) for p ∥ M
ModularCurve.JHNeronObjectAtP.exists_oldLattice_inf_toricLattice_eq_bot_and_finiteLattice_le_sup_tateModule_jH_of_ne1,445 below · depth 23 - The p-old lattice in Tₚ J_H(M) at p ∥ M
ModularCurve.JHNeronObjectAtP.exists_oldLattice_inf_toricLattice_eq_bot_and_finiteLattice_le_sup_tateModule_jH_self1,489 below · depth 23 - Toric Tate vectors as inertia coboundaries up to bounded ℓ-power
ModularCurve.JHNeronObjectAtP.exists_pow_smul_mem_span_inertia_sub_of_mem_toricLattice_tateModule_jH_of_abelJacobiPin_of_atkinLehner3,373 below · depth 23 - Uₚ and Frobenius on the toric lattice at ℓ=p
ModularCurve.JHNeronObjectAtP.tateGenOpH_U_comp_tateGaloisRep_frobenius_eq_cyclotomicCharacter_smul_of_mem_toricLattice_of_eq71 below · depth 23 - Transport between two Néron objects for J_H(M) at p ∥ M
ModularCurve.JHNeronObjectAtP.exists_addEquiv_galois_map_toricPts_eq_map_finPts_eq_of_representsRelSubPic_of_abelianScheme73 below · depth 24 - Inertia reaches the toric part of J_H(M)
ModularCurve.JHNeronObjectAtP.exists_forall_mem_toricPts_exists_smul_sub_eq_of_coprime_of_abelJacobiPin_of_atkinLehner3,370 below · depth 24 - Bounded exponent for the degeneracy push–pull kernel on torsion
ModularCurve.JHNeronObjectAtP.exists_nsmul_eq_zero_of_forall_degPts_pull_add_pull_eq_zero1,247 below · depth 24 - Galois-equivariant transport between two Néron objects at p
ModularCurve.JHNeronObjectAtP.exists_addEquiv_galois_map_toricPts_eq_map_finPts_eq_of_representsRelSubPic_of_ptsLaw_of_abelianScheme71 below · depth 25 - Transport of the torus along an isomorphism of Néron objects
ModularCurve.JHNeronObjectAtP.exists_baseChange_comp_fst_eq_and_torusFibre_comp_eq_mapDomain_of_iso_of_representsRelSubPic_of_abelianScheme69 below · depth 25 - Orthogonal of the toric lattice in Tₚ J_H(M)
ModularCurve.JHNeronObjectAtP.exists_pow_smul_mem_toricLattice_sup_oldLattice_of_forall_weilPairing_eq_zero469 below · depth 25 - Two relative group laws with equal unit agree at genPt
ModularCurve.JHNeronObjectAtP.relativeGroupLaw_mul_eq_mul_genPt_of_one_eq19 below · depth 25 - Transport of toric lifts along an isomorphism of Néron objects
ModularCurve.JHNeronObjectAtP.exists_equiv_forall_toricLift_comp_eq_of_iso_of_representsRelSubPic_of_abelianScheme69 below · depth 26 - Ordinary corner: reduction to identity iff inertia acts cyclotomically
ModularCurve.JHNeronObjectAtP.reducesToOne_iff_inertia_cyclotomic_of_mem_corner_of_mem_finPts_of_ordinary_of_abelJacobiPin_of_inertF_of_levelData_of_algEquiv3,537 below · depth 30 - Idempotent and μₚ-pairing between corner and adjoint corner
ModularCurve.JHNeronObjectAtP.exists_idempotent_pairing_corner_adjointCorner_perfect_galois_radical_ncard_toric_cyclotomic_eq_of_abelJacobiPin_of_levelData_of_algEquiv3,182 below · depth 32 - Toric and finite p-torsion as mutual annihilators
ModularCurve.JHNeronObjectAtP.toricPts_finPts_mutual_annihilator_weilDatum_pairing_residueChar_of_abelJacobiPin_of_degeneracy3,116 below · depth 33 - Toric p-torsion pairs trivially with finite p-torsion
ModularCurve.JHNeronObjectAtP.weilDatum_pairing_eq_one_of_mem_toricPts_of_mem_finPts_of_abelJacobiPin_of_degeneracy_of_representsRelSubPicLevel3,100 below · depth 34 - Finite p-torsion splits off the two degeneracy pull-backs
ModularCurve.JHNeronObjectAtP.exists_eq_add_pull_add_pull_of_mem_finPts_of_abelJacobiPin771 below · depth 35 - Toric p-torsion pairs trivially with old p-torsion
ModularCurve.JHNeronObjectAtP.weilDatum_pairing_eq_one_of_mem_toricPts_of_eq_mk_pullbackAlong_of_abelJacobiPin232 below · depth 35 - Toric p-torsion pairs trivially with identity-reduction classes
ModularCurve.JHNeronObjectAtP.weilDatum_pairing_eq_one_of_mem_toricPts_of_resPt_eq_one_of_abelJacobiPin_of_representsRelSubPicLevel3,083 below · depth 35 - Lifting p^k-torsion along a level-(M/p) Néron datum
ModularCurve.JHNeronObjectAtP.LevelData.exists_pts_eq_barPt_comp_and_ptsSp_symm_eq_of_smul_eq_zero_of_abelianScheme737 below · depth 36 - Group law, reduction and rigidity for A-sections of G
ModularCurve.JHNeronObjectAtP.exists_section_mul_inv_one_and_ptsSp_symm_eq0 below · depth 36