Definitions/Def_LanglandsTunnell_NormClass.lean
Norm character on the narrow ray class group mod q
Throughout, K is a number field and q a natural number. The central definition is normClass K q, the function on the height-one spectrum of \mathcal{O}_K sending a finite place v to the unit of \mathbb{Z}/q given by the absolute norm N(v)= Ideal.absNorm v.asIdeal whenever that natural number is coprime to q, and to 1 otherwise; normClass_coe records that in the coprime case its image in \mathbb{Z}/q is the reduction of N(v). Three arithmetic lemmas support it: absNorm_coprime_of_not_dvd, that N(v) is coprime to q as soon as v does not divide the ideal (q) (proved via the residue field being of prime-power order); norm_int_cast_eq_one_of_sub_one_mem, that \alpha-1\in(q) implies \mathrm{N}_{\mathbb{Z}}(\alpha)\equiv 1 \bmod q, through reduction of the multiplication matrix in an integral basis; and norm_int_pos_of_totPos, that a nonzero \alpha with \tau(\alpha)>0 for every ring homomorphism \tau:K\to\mathbb{R} has \mathrm{N}_{\mathbb{Z}}(\alpha)>0, obtained by grouping complex embeddings into fibres over infinite places.
The ray symbol of normClass K q, i.e. the finitely supported product \prod_v \mathrm{normClass}(v)^{\,\mathrm{count}_v}, is computed on integral ideals: raySymbol_normClass_coe says that for I\neq 0 with I+(q)=\mathcal{O}_K its value reduces to N(I) \bmod q. Consequently normClassKillsRay shows that when (q)\mid\mathfrak{f}, every nonzero \alpha with \alpha-1\in\mathfrak{f} that is positive at all real ring homomorphisms has ray symbol 1 on (\alpha). This lets the symbol descend: normClassChar K q is the resulting homomorphism \mathrm{NarrowRayClassGroup}\,K\,\mathfrak{f}\to(\mathbb{Z}/q)^\times, and normClassChar_primeClass evaluates it at the class of a prime v\nmid\mathfrak{f} as normClass K q v.
Relation to Mathlib
The narrow ray class group, the ray symbol \prod_v f(v)^{\mathrm{count}_v} and its descent are the project's own notions, taken from the imported number-theory support module; the ingredients used here — Ideal.absNorm, Algebra.norm, factorisation counts of fractional ideals, infinite places and ZMod.unitOfCoprime — are Mathlib's.
Where it is used
This supplies the norm character modulo q on narrow ray class groups used in the Langlands–Tunnell part of the argument; no relation to Frobenius or Artin symbols is asserted at this stage.
References
- J. Neukirch, Algebraic Number Theory, Grundlehren der mathematischen Wissenschaften 322, Springer, 1999, Chapter VI
- S. Lang, Algebraic Number Theory, 2nd edition, Graduate Texts in Mathematics 110, Springer, 1994
References are suggested automatically and have not been individually verified.
English text generated automatically from the Lean source; the Lean statement is authoritative.
- 292 lines
- 9 declarations
- used in the statements of 0 theorems and imported by 4 proofs
- imports 1 definition modules
Source file: Definitions/Def_LanglandsTunnell_NormClass.lean
Imports
Imported by
Declarations
- theorem
LanglandsTunnell.P2.Artin.norm_int_cast_eq_one_of_sub_one_mem - theorem
LanglandsTunnell.P2.Artin.norm_int_pos_of_totPos - theorem
LanglandsTunnell.P2.Artin.absNorm_coprime_of_not_dvd - def
LanglandsTunnell.P2.Artin.normClass - theorem
LanglandsTunnell.P2.Artin.normClass_coe - theorem
LanglandsTunnell.P2.Artin.raySymbol_normClass_coe - theorem
LanglandsTunnell.P2.Artin.normClassKillsRay - def
LanglandsTunnell.P2.Artin.normClassChar - theorem
LanglandsTunnell.P2.Artin.normClassChar_primeClass
Source
import Definitions.Def_NarrowRayClassGroup set_option autoImplicit false set_option maxHeartbeats 800000 noncomputable section namespace LanglandsTunnell.P2.Artin open NumberField nonZeroDivisors IsDedekindDomain Deep.NTSupply variable (K : Type*) [Field K] [NumberField K] (q : ℕ) theorem norm_int_cast_eq_one_of_sub_one_mem {α : 𝓞 K} (hα : α - 1 ∈ Ideal.span {(q : 𝓞 K)}) : ((Algebra.norm ℤ α : ℤ) : ZMod q) = 1 := by classical obtain ⟨γ, hγ⟩ := Ideal.mem_span_singleton'.mp hα have hsm : q • γ = γ * (q : 𝓞 K) := by rw [nsmul_eq_mul, mul_comm] have hαeq : α = 1 + q • γ := by rw [hsm, hγ]; ring let b := RingOfIntegers.basis K have h1 : ((Algebra.norm ℤ α : ℤ) : ZMod q) = ((Int.castRingHom (ZMod q)).mapMatrix (Algebra.leftMulMatrix b α)).det := by rw [Algebra.norm_eq_matrix_det b, ← RingHom.map_det]; rfl have h0 : (q • (Int.castRingHom (ZMod q)).mapMatrix (Algebra.leftMulMatrix b γ) : Matrix (Module.Free.ChooseBasisIndex ℤ (𝓞 K)) (Module.Free.ChooseBasisIndex ℤ (𝓞 K)) (ZMod q)) = 0 := by ext i j simp [Matrix.smul_apply, nsmul_eq_mul] rw [h1, hαeq, map_add, map_one, map_nsmul, map_add, map_one, map_nsmul, h0, add_zero, Matrix.det_one] theorem norm_int_pos_of_totPos {α : 𝓞 K} (h0 : α ≠ 0) (hpos : ∀ τ : K →+* ℝ, 0 < τ (algebraMap (𝓞 K) K α)) : 0 < Algebra.norm ℤ α := by classical set x : K := algebraMap (𝓞 K) K α with hxdef have hx0 : x ≠ 0 := by rw [hxdef, map_ne_zero_iff _ (IsFractionRing.injective (𝓞 K) K)] exact h0 have hper : ∀ w : InfinitePlace K, ∃ r : ℝ, 0 < r ∧ (∏ φ ∈ ({φ | InfinitePlace.mk φ = w} : Finset (K →+* ℂ)), φ x) = (r : ℂ) := by intro w have hfibset : ({φ | InfinitePlace.mk φ = w} : Finset (K →+* ℂ)) = {w.embedding, NumberField.ComplexEmbedding.conjugate w.embedding} := by ext φ simp only [Finset.mem_filter, Finset.mem_univ, true_and, Finset.mem_insert, Finset.mem_singleton] constructor · intro h have h' : InfinitePlace.mk φ = InfinitePlace.mk w.embedding := h.trans (InfinitePlace.mk_embedding w).symm rcases InfinitePlace.mk_eq_iff.mp h' with h1 | h2 · exact Or.inl h1 · exact Or.inr ((star_star φ).symm.trans (congrArg star h2)) · rintro (h | h) · rw [h, InfinitePlace.mk_embedding] · rw [h, InfinitePlace.mk_conjugate_eq, InfinitePlace.mk_embedding] by_cases hw : InfinitePlace.IsReal w · have hre : NumberField.ComplexEmbedding.conjugate w.embedding = w.embedding := NumberField.ComplexEmbedding.isReal_iff.mp (InfinitePlace.isReal_iff.mp hw) refine ⟨(InfinitePlace.embedding_of_isReal hw) x, hpos _, ?_⟩ rw [hfibset, hre, Finset.insert_eq_self.mpr (Finset.mem_singleton_self _), Finset.prod_singleton, InfinitePlace.embedding_of_isReal_apply hw] · have hne : w.embedding ≠ NumberField.ComplexEmbedding.conjugate w.embedding := by intro h exact hw (InfinitePlace.isReal_iff.mpr (NumberField.ComplexEmbedding.isReal_iff.mpr h.symm)) have hval0 : w.embedding x ≠ 0 := by rw [← map_zero w.embedding] exact fun h => hx0 (w.embedding.injective h) refine ⟨Complex.normSq (w.embedding x), Complex.normSq_pos.mpr hval0, ?_⟩ rw [hfibset, Finset.prod_pair hne, NumberField.ComplexEmbedding.conjugate_coe_eq, Complex.mul_conj] choose r hrpos hreq using hper have htot : algebraMap ℚ ℂ (Algebra.norm ℚ x) = ((∏ w : InfinitePlace K, r w : ℝ) : ℂ) := by rw [Algebra.norm_eq_prod_embeddings ℚ ℂ x, ← Fintype.prod_equiv (RingHom.equivRatAlgHom K ℂ) (fun φ : K →+* ℂ => φ x) (fun σ : K →ₐ[ℚ] ℂ => σ x) (fun φ => by simp [RingHom.equivRatAlgHom_apply]), ← Finset.prod_fiberwise Finset.univ InfinitePlace.mk (fun φ : K →+* ℂ => φ x), Finset.prod_congr rfl fun w _ => hreq w, ← Complex.ofReal_prod] have hofreal : (((Algebra.norm ℚ x : ℚ) : ℝ) : ℂ) = ((∏ w : InfinitePlace K, r w : ℝ) : ℂ) := by rw [← htot, eq_ratCast (algebraMap ℚ ℂ) (Algebra.norm ℚ x), Complex.ofReal_ratCast] have hQpos : 0 < Algebra.norm ℚ x := by have hreal : ((Algebra.norm ℚ x : ℚ) : ℝ) = ∏ w : InfinitePlace K, r w := Complex.ofReal_inj.mp hofreal have hP : 0 < ∏ w : InfinitePlace K, r w := Finset.prod_pos fun w _ => hrpos w rw [← Rat.cast_pos (K := ℝ), hreal] exact hP have hcoe : ((Algebra.norm ℤ α : ℤ) : ℚ) = Algebra.norm ℚ x := Algebra.coe_norm_int α have : (0 : ℚ) < ((Algebra.norm ℤ α : ℤ) : ℚ) := by rw [hcoe]; exact hQpos exact_mod_cast this theorem absNorm_coprime_of_not_dvd (v : HeightOneSpectrum (𝓞 K)) (hv : ¬ v.asIdeal ∣ Ideal.span {(q : 𝓞 K)}) : Nat.Coprime (Ideal.absNorm v.asIdeal) q := by classical haveI hmax : v.asIdeal.IsMaximal := Ideal.IsPrime.isMaximal v.isPrime v.ne_bot letI : Field (𝓞 K ⧸ v.asIdeal) := Ideal.Quotient.field v.asIdeal haveI : Finite (𝓞 K ⧸ v.asIdeal) := Ideal.finiteQuotientOfFreeOfNeBot v.asIdeal v.ne_bot haveI : Fintype (𝓞 K ⧸ v.asIdeal) := Fintype.ofFinite _ obtain ⟨n, hp, hcard⟩ := FiniteField.card (𝓞 K ⧸ v.asIdeal) (ringChar (𝓞 K ⧸ v.asIdeal)) have habs : Ideal.absNorm v.asIdeal = ringChar (𝓞 K ⧸ v.asIdeal) ^ (n : ℕ) := by rw [Ideal.absNorm_apply, Submodule.cardQuot_apply, Nat.card_eq_fintype_card, ← hcard] rw [habs] refine Nat.Coprime.pow_left _ ?_ by_contra hnc have hpq : ringChar (𝓞 K ⧸ v.asIdeal) ∣ q := by by_contra hdvd exact hnc ((Nat.Prime.coprime_iff_not_dvd hp).mpr hdvd) apply hv rw [Ideal.dvd_iff_le, Ideal.span_le, Set.singleton_subset_iff] have hpmem : ((ringChar (𝓞 K ⧸ v.asIdeal) : ℕ) : 𝓞 K) ∈ v.asIdeal := by rw [← Ideal.Quotient.eq_zero_iff_mem] rw [map_natCast (Ideal.Quotient.mk v.asIdeal), CharP.cast_eq_zero] obtain ⟨t, ht⟩ := hpq have hqt : ((q : ℕ) : 𝓞 K) = ((ringChar (𝓞 K ⧸ v.asIdeal) : ℕ) : 𝓞 K) * ((t : ℕ) : 𝓞 K) := by rw [← Nat.cast_mul, ← ht] rw [SetLike.mem_coe, hqt] exact Ideal.mul_mem_right _ _ hpmem def normClass (v : HeightOneSpectrum (𝓞 K)) : (ZMod q)ˣ := if h : Nat.Coprime (Ideal.absNorm v.asIdeal) q then ZMod.unitOfCoprime _ h else 1 theorem normClass_coe (v : HeightOneSpectrum (𝓞 K)) (h : Nat.Coprime (Ideal.absNorm v.asIdeal) q) : ((normClass K q v : (ZMod q)ˣ) : ZMod q) = (Ideal.absNorm v.asIdeal : ZMod q) := by rw [normClass, dif_pos h, ZMod.coe_unitOfCoprime] theorem raySymbol_normClass_coe {I : Ideal (𝓞 K)} (hI : I ≠ ⊥) (hcop : I ⊔ Ideal.span {(q : 𝓞 K)} = ⊤) : ((raySymbol K (normClass K q) (I : FractionalIdeal ((𝓞 K)⁰) K) : (ZMod q)ˣ) : ZMod q) = (Ideal.absNorm I : ZMod q) := by classical have hI0 : I ≠ 0 := by simpa using hI have hvcop : ∀ v : HeightOneSpectrum (𝓞 K), v.asIdeal ∣ I → Nat.Coprime (Ideal.absNorm v.asIdeal) q := by intro v hvI refine absNorm_coprime_of_not_dvd K q v fun hdvd => ?_ have h1 : I ≤ v.asIdeal := Ideal.le_of_dvd hvI have h2 : Ideal.span {(q : 𝓞 K)} ≤ v.asIdeal := Ideal.le_of_dvd hdvd have htop : (⊤ : Ideal (𝓞 K)) ≤ v.asIdeal := hcop ▸ sup_le h1 h2 exact v.isPrime.ne_top (top_le_iff.mp htop) have hdvd_of_n : ∀ v : HeightOneSpectrum (𝓞 K), (Associates.mk v.asIdeal).count (Associates.mk I).factors ≠ 0 → v.asIdeal ∣ I := by intro v hv rwa [← Associates.count_ne_zero_iff_dvd hI0 v.irreducible] have hfuneq : (fun v : HeightOneSpectrum (𝓞 K) => normClass K q v ^ FractionalIdeal.count K v (I : FractionalIdeal ((𝓞 K)⁰) K)) = fun v => normClass K q v ^ (Associates.mk v.asIdeal).count (Associates.mk I).factors := by funext v rw [FractionalIdeal.count_coe K v hI0, zpow_natCast] have hfin := hasFiniteMulSupport_raySymbol_factors K (normClass K q) (I : FractionalIdeal ((𝓞 K)⁰) K) rw [hfuneq] at hfin have hsym : raySymbol K (normClass K q) (I : FractionalIdeal ((𝓞 K)⁰) K) = ∏ᶠ v : HeightOneSpectrum (𝓞 K), normClass K q v ^ (Associates.mk v.asIdeal).count (Associates.mk I).factors := by rw [raySymbol, hfuneq] have hcoe : ((∏ᶠ v : HeightOneSpectrum (𝓞 K), normClass K q v ^ (Associates.mk v.asIdeal).count (Associates.mk I).factors : (ZMod q)ˣ) : ZMod q) = ∏ᶠ v : HeightOneSpectrum (𝓞 K), ((normClass K q v : ZMod q)) ^ (Associates.mk v.asIdeal).count (Associates.mk I).factors := by rw [show ((∏ᶠ v : HeightOneSpectrum (𝓞 K), normClass K q v ^ (Associates.mk v.asIdeal).count (Associates.mk I).factors : (ZMod q)ˣ) : ZMod q) = Units.coeHom (ZMod q) (∏ᶠ v : HeightOneSpectrum (𝓞 K), normClass K q v ^ (Associates.mk v.asIdeal).count (Associates.mk I).factors) from rfl, MonoidHom.map_finprod (Units.coeHom (ZMod q)) hfin] exact finprod_congr fun v => by rw [Units.coeHom_apply, Units.val_pow_eq_pow_val] have hval : (fun v : HeightOneSpectrum (𝓞 K) => ((normClass K q v : ZMod q)) ^ (Associates.mk v.asIdeal).count (Associates.mk I).factors) = fun v => ((Ideal.absNorm v.asIdeal : ZMod q)) ^ (Associates.mk v.asIdeal).count (Associates.mk I).factors := by funext v by_cases hv : (Associates.mk v.asIdeal).count (Associates.mk I).factors = 0 · rw [hv, pow_zero, pow_zero] · rw [normClass_coe K q v (hvcop v (hdvd_of_n v hv))] have hnfin : Function.HasFiniteMulSupport (fun v : HeightOneSpectrum (𝓞 K) => Ideal.absNorm v.asIdeal ^ (Associates.mk v.asIdeal).count (Associates.mk I).factors) := by show (Function.mulSupport _).Finite refine ((Filter.eventually_cofinite.mp (FractionalIdeal.finite_factors (I : FractionalIdeal ((𝓞 K)⁰) K))).subset ?_) intro v hv rw [Function.mem_mulSupport] at hv simp only [Set.mem_setOf_eq] intro hcount apply hv rw [FractionalIdeal.count_coe K v hI0, Nat.cast_eq_zero] at hcount show Ideal.absNorm v.asIdeal ^ (Associates.mk v.asIdeal).count (Associates.mk I).factors = 1 rw [hcount, pow_zero] have hmfin : Function.HasFiniteMulSupport (fun v : HeightOneSpectrum (𝓞 K) => v.maxPowDividing I) := by show (Function.mulSupport _).Finite refine ((Filter.eventually_cofinite.mp (FractionalIdeal.finite_factors (I : FractionalIdeal ((𝓞 K)⁰) K))).subset ?_) intro v hv rw [Function.mem_mulSupport] at hv simp only [Set.mem_setOf_eq] intro hcount apply hv rw [FractionalIdeal.count_coe K v hI0, Nat.cast_eq_zero] at hcount show v.asIdeal ^ (Associates.mk v.asIdeal).count (Associates.mk I).factors = 1 rw [hcount, pow_zero] have hcast : ((∏ᶠ v : HeightOneSpectrum (𝓞 K), Ideal.absNorm v.asIdeal ^ (Associates.mk v.asIdeal).count (Associates.mk I).factors : ℕ) : ZMod q) = ∏ᶠ v : HeightOneSpectrum (𝓞 K), ((Ideal.absNorm v.asIdeal : ZMod q)) ^ (Associates.mk v.asIdeal).count (Associates.mk I).factors := by rw [show ((∏ᶠ v : HeightOneSpectrum (𝓞 K), Ideal.absNorm v.asIdeal ^ (Associates.mk v.asIdeal).count (Associates.mk I).factors : ℕ) : ZMod q) = (Nat.castRingHom (ZMod q)) (∏ᶠ v : HeightOneSpectrum (𝓞 K), Ideal.absNorm v.asIdeal ^ (Associates.mk v.asIdeal).count (Associates.mk I).factors) from rfl, map_finprod (Nat.castRingHom (ZMod q)) hnfin] exact finprod_congr fun v => by rw [map_pow]; rfl have hnat : (∏ᶠ v : HeightOneSpectrum (𝓞 K), Ideal.absNorm v.asIdeal ^ (Associates.mk v.asIdeal).count (Associates.mk I).factors) = Ideal.absNorm I := by conv_rhs => rw [← Ideal.finprod_heightOneSpectrum_factorization hI0] rw [map_finprod Ideal.absNorm hmfin] refine finprod_congr fun v => ?_ show Ideal.absNorm v.asIdeal ^ (Associates.mk v.asIdeal).count (Associates.mk I).factors = Ideal.absNorm (v.asIdeal ^ (Associates.mk v.asIdeal).count (Associates.mk I).factors) exact (map_pow Ideal.absNorm _ _).symm rw [hsym, hcoe, hval, ← hcast, hnat] theorem normClassKillsRay {𝔣 : Ideal (𝓞 K)} (hq𝔣 : Ideal.span {(q : 𝓞 K)} ∣ 𝔣) : ∀ α : 𝓞 K, α ≠ 0 → α - 1 ∈ 𝔣 → (∀ τ : K →+* ℝ, 0 < τ (algebraMap (𝓞 K) K α)) → raySymbol K (normClass K q) ((Ideal.span {α} : Ideal (𝓞 K)) : FractionalIdeal ((𝓞 K)⁰) K) = 1 := by intro α hα0 hα1 hpos have hspan : (Ideal.span {α} : Ideal (𝓞 K)) ≠ ⊥ := by simpa [Ideal.span_singleton_eq_bot] using hα0 have hα1q : α - 1 ∈ Ideal.span {(q : 𝓞 K)} := Ideal.le_of_dvd hq𝔣 hα1 have hcop : (Ideal.span {α} : Ideal (𝓞 K)) ⊔ Ideal.span {(q : 𝓞 K)} = ⊤ := by rw [Ideal.eq_top_iff_one] have h1 : α - (α - 1) = 1 := by ring exact h1 ▸ Submodule.sub_mem _ (Ideal.mem_sup_left (Ideal.subset_span rfl)) (Ideal.mem_sup_right hα1q) have h1 := raySymbol_normClass_coe K q hspan hcop rw [Ideal.absNorm_span_singleton] at h1 have hpos' : 0 < Algebra.norm ℤ α := norm_int_pos_of_totPos K hα0 hpos have hnat : (((Algebra.norm ℤ α).natAbs : ℕ) : ZMod q) = 1 := by rw [← Int.cast_natCast (R := ZMod q), Int.natAbs_of_nonneg hpos'.le, norm_int_cast_eq_one_of_sub_one_mem K q hα1q] rw [hnat] at h1 exact Units.val_eq_one.mp h1 def normClassChar {𝔣 : Ideal (𝓞 K)} (hq𝔣 : Ideal.span {(q : 𝓞 K)} ∣ 𝔣) : NarrowRayClassGroup K 𝔣 →* (ZMod q)ˣ := raySymbolDescend K (normClass K q) (normClassKillsRay K q hq𝔣) theorem normClassChar_primeClass {𝔣 : Ideal (𝓞 K)} (hq𝔣 : Ideal.span {(q : 𝓞 K)} ∣ 𝔣) (v : HeightOneSpectrum (𝓞 K)) (hv : ¬ v.asIdeal ∣ 𝔣) : normClassChar K q hq𝔣 (primeClass K 𝔣 v hv) = normClass K q v := raySymbolDescend_primeClass K (normClass K q) (normClassKillsRay K q hq𝔣) hv #print axioms LanglandsTunnell.P2.Artin.norm_int_cast_eq_one_of_sub_one_mem #print axioms LanglandsTunnell.P2.Artin.norm_int_pos_of_totPos #print axioms LanglandsTunnell.P2.Artin.absNorm_coprime_of_not_dvd #print axioms LanglandsTunnell.P2.Artin.normClass #print axioms LanglandsTunnell.P2.Artin.normClass_coe #print axioms LanglandsTunnell.P2.Artin.raySymbol_normClass_coe #print axioms LanglandsTunnell.P2.Artin.normClassKillsRay #print axioms LanglandsTunnell.P2.Artin.normClassChar #print axioms LanglandsTunnell.P2.Artin.normClassChar_primeClass end LanglandsTunnell.P2.Artin end
Statements phrased using this module (0)
No statement module imports it directly (it is used through other definition modules or by proofs).