Definitions/Def_NarrowRayClassGroup.lean
Narrow ray class groups, finiteness, and ray symbols
For a number field K and an ideal \mathfrak f \subseteq \mathcal O_K, the module works inside the group of units of the fractional ideals of \mathcal O_K in K. coprimeToModulus K π£ is the subgroup of those invertible fractional ideals I with FractionalIdeal.count K v I = 0 at every height-one prime v of \mathcal O_K with v.\mathrm{asIdeal} \mid \mathfrak f; narrowRaySet K π£ is the set of invertible fractional ideals of the shape (\alpha) for some \alpha \in \mathcal O_K with \alpha \neq 0, \alpha - 1 \in \mathfrak f, and \tau(\alpha) > 0 for every ring homomorphism \tau : K \to \mathbb R, and narrowRaySubgroup K π£ is the subgroup it generates. NarrowRayClassGroup K π£ is the quotient of coprimeToModulus K π£ by the pullback of narrowRaySubgroup K π£, with projection NarrowRayClassGroup.mk; membership criteria, a criterion for two classes to agree, the unit class of a prime not dividing \mathfrak f (primeUnit, primeClass), and the degenerate computation coprimeToModulus_top accompany it.
The finiteness theorem finite asserts that NarrowRayClassGroup K π£ is finite whenever \mathfrak f \neq \bot. It is reached through raySet (the same condition without the positivity at real places), the subgroup rayClassSubgroup generated by the classes of its members β these classes square to 1 and are parametrised by sign vectors in (K \to_{+*} \mathbb R) \to \mathrm{Bool}, hence finitely many β the homomorphisms to ClassGroup (π K) induced by I \mapsto [I], the finiteness of \mathcal O_K/\mathfrak f, and the predicate MovingLemma K π£: every nonzero x_0 \in K whose principal fractional ideal has vanishing counts at the primes dividing \mathfrak f can be multiplied by some \beta \in \mathcal O_K, \beta \neq 0, \beta - 1 \in \mathfrak f, so as to become integral. movingLemma proves this predicate for \mathfrak f \neq \bot using the Dedekind approximation theorem.
Finally, for a commutative group M and f a function on height-one primes, raySymbol K f I is the finitary product \prod_v f(v)^{\mathrm{count}_v I}; it gives homomorphisms on the unit group, on coprimeToModulus K π£, and on the nonzero ideals, sends primeUnit K v to f(v), and raySymbolDescend descends it to NarrowRayClassGroup K π£ under the hypothesis that it kills every (\alpha) with \alpha \neq 0, \alpha - 1 \in \mathfrak f and \alpha positive at all real embeddings. A general group-theoretic lemma, that the subgroup generated by a finite set of involutions in a commutative group is finite, is proved here as well.
Relation to Mathlib
Mathlib supplies the ambient objects used here β fractional ideals and their unit group, the height-one spectrum with its count valuations, and ClassGroup β while the narrow ray class group at a modulus, its finiteness, the moving-lemma predicate and the ray symbol are the project's own constructions on top of them.
Where it is used
The module is background number theory: it supplies a finite abelian group of narrow ray classes modulo a nonzero ideal, together with a multiplicative symbol on ideals coprime to the modulus determined by arbitrary prescribed values at the primes and descending to the class group whenever it is trivial on the narrow ray. It is imported widely across the tree wherever characters of a number field specified prime by prime are needed.
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.
- 987 lines
- 67 declarations
- used in the statements of 27 theorems and imported by 39 proofs
- imports 0 definition modules
Source file: Definitions/Def_NarrowRayClassGroup.lean
Imports
- only Mathlib
Declarations
- theorem
Deep.NTSupply.finite_closure_of_involutions - theorem
Deep.NTSupply.finite_closure_of_involutions' - def
Deep.NTSupply.coprimeToModulus - theorem
Deep.NTSupply.mem_coprimeToModulus_iff - def
Deep.NTSupply.narrowRaySet - theorem
Deep.NTSupply.mem_narrowRaySet_iff - def
Deep.NTSupply.narrowRaySubgroup - theorem
Deep.NTSupply.count_span_singleton_eq_zero_of_sub_one_mem - theorem
Deep.NTSupply.narrowRaySubgroup_le_coprimeToModulus - abbrev
Deep.NTSupply.NarrowRayClassGroup - def
Deep.NTSupply.NarrowRayClassGroup.mk - theorem
Deep.NTSupply.one_mem_narrowRaySet - def
Deep.NTSupply.raySymbol - theorem
Deep.NTSupply.hasFiniteMulSupport_raySymbol_factors - theorem
Deep.NTSupply.raySymbol_mul - def
Deep.NTSupply.raySymbolUnitsHom - def
Deep.NTSupply.raySymbolHom - theorem
Deep.NTSupply.raySymbolHom_apply - def
Deep.NTSupply.raySet - theorem
Deep.NTSupply.narrowRaySet_subset_raySet - theorem
Deep.NTSupply.raySet_subset_coprimeToModulus - def
Deep.NTSupply.rayClasses - def
Deep.NTSupply.rayClassSubgroup - instance
Deep.NTSupply.instNormalRayClassSubgroup - theorem
Deep.NTSupply.NarrowRayClassGroup.mk_eq_one_of_mem - theorem
Deep.NTSupply.NarrowRayClassGroup.mk_eq_mk_iff - theorem
Deep.NTSupply.rayClass_mul_self_eq_one - theorem
Deep.NTSupply.mul_mem_narrowRaySet_of_sameSign - theorem
Deep.NTSupply.NarrowRayClassGroup.mk_eq_of_sameSign - theorem
Deep.NTSupply.rayClasses_finite - theorem
Deep.NTSupply.finite_rayClassSubgroup - def
Deep.NTSupply.principalUnit - theorem
Deep.NTSupply.principalUnit_val - def
Deep.NTSupply.toClassGroup - theorem
Deep.NTSupply.classGroupMk_eq_one_of_principal - theorem
Deep.NTSupply.toClassGroup_eq_one_of_principal - theorem
Deep.NTSupply.narrowRaySubgroupOf_le_ker - def
Deep.NTSupply.narrowRayClassGroupToClassGroup - theorem
Deep.NTSupply.narrowRayClassGroupToClassGroup_mk - theorem
Deep.NTSupply.rayClassSubgroup_le_ker - def
Deep.NTSupply.rayClassGroupToClassGroup - theorem
Deep.NTSupply.rayClassGroupToClassGroup_mk_mk - def
Deep.NTSupply.MovingLemma - theorem
Deep.NTSupply.le_one_of_forall_count_nonneg - theorem
Deep.NTSupply.movingLemma - theorem
Deep.NTSupply.exists_mul_sub_one_mem_of_counts_zero - theorem
Deep.NTSupply.principalUnit_mem_coprimeToModulus - theorem
Deep.NTSupply.mk_mk_eq_one_of_raySet - theorem
Deep.NTSupply.exists_integral_ray_rep - theorem
Deep.NTSupply.mk_mk_eq_of_residue_eq - theorem
Deep.NTSupply.finite_ker_rayClassGroupToClassGroup - theorem
Deep.NTSupply.finite_rayClassQuotient_of_movingLemma - theorem
Deep.NTSupply.finite_of_movingLemma - theorem
Deep.NTSupply.finite - def
Deep.NTSupply.primeUnit - theorem
Deep.NTSupply.primeUnit_val - theorem
Deep.NTSupply.primeUnit_mem_coprimeToModulus - def
Deep.NTSupply.primeClass - theorem
Deep.NTSupply.raySymbol_primeUnit - theorem
Deep.NTSupply.raySymbolHom_prime - theorem
Deep.NTSupply.narrowRaySubgroupOf_le_ker_raySymbolHom - def
Deep.NTSupply.raySymbolDescend - theorem
Deep.NTSupply.raySymbolDescend_mk - theorem
Deep.NTSupply.raySymbolDescend_primeClass - def
Deep.NTSupply.raySymbolIdealHom - theorem
Deep.NTSupply.raySymbolIdealHom_apply - theorem
Deep.NTSupply.coprimeToModulus_top
Source
import Mathlib.NumberTheory.NumberField.InfinitePlace.Embeddings β import Mathlib.NumberTheory.NumberField.ClassNumber β import Mathlib.RingTheory.DedekindDomain.Factorization β import Mathlib.RingTheory.DedekindDomain.Ideal.Lemmas β import Mathlib.RingTheory.ClassGroup β import Mathlib.LinearAlgebra.FreeModule.IdealQuotient β import Mathlib.GroupTheory.QuotientGroup.Finite β import Mathlib.Data.Fintype.Units β open NumberField nonZeroDivisors IsDedekindDomain noncomputable section namespace Deep.NTSupply section Involutions theorem finite_closure_of_involutions {G : Type*} [CommGroup G] {S : Set G} (hS : S.Finite) (hsq : β s β S, s * s = 1) : ((Subgroup.closure S : Subgroup G) : Set G).Finite := by classical let F : Finset G := hS.toFinset let g : (F β Bool) β G := fun e => β t β F.attach, if e t then (t : G) else 1 have hsqF : β t : F, (t : G) * (t : G) = 1 := fun t => hsq t (hS.mem_toFinset.mp t.2) have key : β (t : F) (b b' : Bool), (if b then (t : G) else 1) * (if b' then (t : G) else 1) = if (b != b') then (t : G) else 1 := by intro t b b' cases b <;> cases b' <;> simp [hsqF t] have hmul : β e e' : F β Bool, g e * g e' = g (fun t => e t != e' t) := by intro e e' rw [β Finset.prod_mul_distrib] exact Finset.prod_congr rfl fun t _ => key t (e t) (e' t) have hone : g (fun _ => false) = 1 := by simp [g] have hrange : (Set.range g).Finite := Set.finite_range g refine hrange.subset ?_ intro x hx replace hx : x β Subgroup.closure S := hx induction hx using Subgroup.closure_induction with | mem s hs => refine β¨fun t => decide ((t : G) = s), ?_β© have hsF : s β F := hS.mem_toFinset.mpr hs show (β t β F.attach, if decide ((t : G) = s) then (t : G) else 1) = s rw [Finset.prod_eq_single β¨s, hsFβ©] Β· simp Β· intro t _ ht have : ((t : G) = s) = False := by have : (t : G) β s := fun h => ht (Subtype.ext h) exact eq_false this simp [this] Β· intro h exact absurd (Finset.mem_attach F β¨s, hsFβ©) h | one => exact β¨fun _ => false, honeβ© | mul a b ha hb iha ihb => obtain β¨e, rflβ© := iha obtain β¨e', rflβ© := ihb exact β¨fun t => e t != e' t, (hmul e e').symmβ© | inv a ha iha => obtain β¨e, rflβ© := iha have hself : g e * g e = 1 := by rw [hmul e e] have : (fun t : F => e t != e t) = fun _ => false := by funext t; simp rw [this, hone] exact β¨e, (inv_eq_of_mul_eq_one_right hself).symmβ© theorem finite_closure_of_involutions' {G : Type*} [CommGroup G] {S : Set G} (hS : S.Finite) (hsq : β s β S, s * s = 1) : Finite (Subgroup.closure S) := (finite_closure_of_involutions hS hsq).to_subtype end Involutions section Carriers variable (K : Type*) [Field K] [NumberField K] def coprimeToModulus (π£ : Ideal (π K)) : Subgroup (FractionalIdeal ((π K)β°) K)Λ£ where carrier := {I | β v : HeightOneSpectrum (π K), v.asIdeal β£ π£ β FractionalIdeal.count K v (I : FractionalIdeal ((π K)β°) K) = 0} mul_mem' := by intro I J hI hJ v hv have h : ((I * J : (FractionalIdeal ((π K)β°) K)Λ£) : FractionalIdeal ((π K)β°) K) = (I : FractionalIdeal ((π K)β°) K) * (J : FractionalIdeal ((π K)β°) K) := Units.val_mul I J rw [h, FractionalIdeal.count_mul K v I.ne_zero J.ne_zero, hI v hv, hJ v hv, add_zero] one_mem' := by intro v _ rw [Units.val_one, FractionalIdeal.count_one] inv_mem' := by intro I hI v hv rw [Units.val_inv_eq_inv_val, FractionalIdeal.count_inv, hI v hv, neg_zero] theorem mem_coprimeToModulus_iff {π£ : Ideal (π K)} {I : (FractionalIdeal ((π K)β°) K)Λ£} : I β coprimeToModulus K π£ β β v : HeightOneSpectrum (π K), v.asIdeal β£ π£ β FractionalIdeal.count K v (I : FractionalIdeal ((π K)β°) K) = 0 := Iff.rfl def narrowRaySet (π£ : Ideal (π K)) : Set (FractionalIdeal ((π K)β°) K)Λ£ := {I | β Ξ± : π K, Ξ± β 0 β§ Ξ± - 1 β π£ β§ (β Ο : K β+* β, 0 < Ο (algebraMap (π K) K Ξ±)) β§ (I : FractionalIdeal ((π K)β°) K) = ((Ideal.span {Ξ±} : Ideal (π K)) : FractionalIdeal ((π K)β°) K)} theorem mem_narrowRaySet_iff {π£ : Ideal (π K)} {I : (FractionalIdeal ((π K)β°) K)Λ£} : I β narrowRaySet K π£ β β Ξ± : π K, Ξ± β 0 β§ Ξ± - 1 β π£ β§ (β Ο : K β+* β, 0 < Ο (algebraMap (π K) K Ξ±)) β§ (I : FractionalIdeal ((π K)β°) K) = ((Ideal.span {Ξ±} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) := Iff.rfl def narrowRaySubgroup (π£ : Ideal (π K)) : Subgroup (FractionalIdeal ((π K)β°) K)Λ£ := Subgroup.closure (narrowRaySet K π£) theorem count_span_singleton_eq_zero_of_sub_one_mem {π£ : Ideal (π K)} {Ξ± : π K} (hΞ±0 : Ξ± β 0) (hΞ±1 : Ξ± - 1 β π£) {v : HeightOneSpectrum (π K)} (hv : v.asIdeal β£ π£) : FractionalIdeal.count K v ((Ideal.span {Ξ±} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) = 0 := by classical have hJ0 : (Ideal.span {Ξ±} : Ideal (π K)) β 0 := by rw [Ne, Submodule.zero_eq_bot, Ideal.span_singleton_eq_bot] exact hΞ±0 have hndvd : Β¬ v.asIdeal β£ (Ideal.span {Ξ±} : Ideal (π K)) := by intro hdvd have hΞ±v : Ξ± β v.asIdeal := Ideal.dvd_span_singleton.mp hdvd have hΞ±1v : Ξ± - 1 β v.asIdeal := Ideal.le_of_dvd hv hΞ±1 have h1 : (1 : π K) β v.asIdeal := by have := v.asIdeal.sub_mem hΞ±v hΞ±1v simpa using this exact v.isPrime.ne_top ((Ideal.eq_top_iff_one _).mpr h1) rw [FractionalIdeal.count_coe K v hJ0] have hc : (Associates.mk v.asIdeal).count (Associates.mk (Ideal.span {Ξ±} : Ideal (π K))).factors = 0 := by by_contra h exact hndvd ((Associates.count_ne_zero_iff_dvd hJ0 v.irreducible).mp h) rw [hc, Nat.cast_zero] theorem narrowRaySubgroup_le_coprimeToModulus (π£ : Ideal (π K)) : narrowRaySubgroup K π£ β€ coprimeToModulus K π£ := by rw [narrowRaySubgroup, Subgroup.closure_le] rintro I β¨Ξ±, hΞ±0, hΞ±1, -, hIβ© rw [SetLike.mem_coe, mem_coprimeToModulus_iff] intro v hv rw [hI] exact count_span_singleton_eq_zero_of_sub_one_mem K hΞ±0 hΞ±1 hv abbrev NarrowRayClassGroup (π£ : Ideal (π K)) : Type _ := β₯(coprimeToModulus K π£) β§Έ (narrowRaySubgroup K π£).subgroupOf (coprimeToModulus K π£) def NarrowRayClassGroup.mk (π£ : Ideal (π K)) : β₯(coprimeToModulus K π£) β* NarrowRayClassGroup K π£ := QuotientGroup.mk' _ theorem one_mem_narrowRaySet (π£ : Ideal (π K)) : (1 : (FractionalIdeal ((π K)β°) K)Λ£) β narrowRaySet K π£ := by refine β¨1, one_ne_zero, by simp, ?_, ?_β© Β· intro Ο rw [map_one, map_one] exact one_pos Β· rw [Units.val_one, Ideal.span_singleton_one, FractionalIdeal.coeIdeal_top] end Carriers section Symbol variable (K : Type*) [Field K] [NumberField K] {M : Type*} [CommGroup M] def raySymbol (f : HeightOneSpectrum (π K) β M) (I : FractionalIdeal ((π K)β°) K) : M := βαΆ v : HeightOneSpectrum (π K), f v ^ FractionalIdeal.count K v I theorem hasFiniteMulSupport_raySymbol_factors (f : HeightOneSpectrum (π K) β M) (I : FractionalIdeal ((π K)β°) K) : Function.HasFiniteMulSupport (fun v : HeightOneSpectrum (π K) => f v ^ FractionalIdeal.count K v I) := by show (Function.mulSupport _).Finite refine (Filter.eventually_cofinite.mp (FractionalIdeal.finite_factors I)).subset ?_ intro v hv simp only [Function.mem_mulSupport, ne_eq] at hv simp only [Set.mem_setOf_eq] intro h exact hv (by rw [h, zpow_zero]) theorem raySymbol_mul (f : HeightOneSpectrum (π K) β M) {I J : FractionalIdeal ((π K)β°) K} (hI : I β 0) (hJ : J β 0) : raySymbol K f (I * J) = raySymbol K f I * raySymbol K f J := by unfold raySymbol rw [β finprod_mul_distrib (hasFiniteMulSupport_raySymbol_factors K f I) (hasFiniteMulSupport_raySymbol_factors K f J)] refine finprod_congr fun v => ?_ rw [FractionalIdeal.count_mul K v hI hJ, zpow_add] def raySymbolUnitsHom (f : HeightOneSpectrum (π K) β M) : (FractionalIdeal ((π K)β°) K)Λ£ β* M where toFun I := raySymbol K f (I : FractionalIdeal ((π K)β°) K) map_one' := by simp [raySymbol, FractionalIdeal.count_one] map_mul' I J := by simp only [Units.val_mul] exact raySymbol_mul K f I.ne_zero J.ne_zero def raySymbolHom (π£ : Ideal (π K)) (f : HeightOneSpectrum (π K) β M) : β₯(coprimeToModulus K π£) β* M := (raySymbolUnitsHom K f).comp (coprimeToModulus K π£).subtype theorem raySymbolHom_apply (π£ : Ideal (π K)) (f : HeightOneSpectrum (π K) β M) (I : β₯(coprimeToModulus K π£)) : raySymbolHom K π£ f I = raySymbol K f ((I : (FractionalIdeal ((π K)β°) K)Λ£) : FractionalIdeal ((π K)β°) K) := rfl end Symbol section Finiteness variable (K : Type*) [Field K] [NumberField K] def raySet (π£ : Ideal (π K)) : Set (FractionalIdeal ((π K)β°) K)Λ£ := {I | β Ξ± : π K, Ξ± β 0 β§ Ξ± - 1 β π£ β§ (I : FractionalIdeal ((π K)β°) K) = ((Ideal.span {Ξ±} : Ideal (π K)) : FractionalIdeal ((π K)β°) K)} theorem narrowRaySet_subset_raySet (π£ : Ideal (π K)) : narrowRaySet K π£ β raySet K π£ := by rintro I β¨Ξ±, hΞ±0, hΞ±1, -, hIβ© exact β¨Ξ±, hΞ±0, hΞ±1, hIβ© theorem raySet_subset_coprimeToModulus (π£ : Ideal (π K)) : raySet K π£ β (coprimeToModulus K π£ : Set (FractionalIdeal ((π K)β°) K)Λ£) := by rintro I β¨Ξ±, hΞ±0, hΞ±1, hIβ© rw [SetLike.mem_coe, mem_coprimeToModulus_iff] intro v hv rw [hI] exact count_span_singleton_eq_zero_of_sub_one_mem K hΞ±0 hΞ±1 hv def rayClasses (π£ : Ideal (π K)) : Set (NarrowRayClassGroup K π£) := (NarrowRayClassGroup.mk K π£) '' {y : β₯(coprimeToModulus K π£) | (y : (FractionalIdeal ((π K)β°) K)Λ£) β raySet K π£} def rayClassSubgroup (π£ : Ideal (π K)) : Subgroup (NarrowRayClassGroup K π£) := Subgroup.closure (rayClasses K π£) example (π£ : Ideal (π K)) : CommGroup (NarrowRayClassGroup K π£) := inferInstance instance instNormalRayClassSubgroup (π£ : Ideal (π K)) : (rayClassSubgroup K π£).Normal := β¨fun n hn g => by rwa [mul_comm g n, mul_inv_cancel_right]β© theorem NarrowRayClassGroup.mk_eq_one_of_mem {π£ : Ideal (π K)} {y : β₯(coprimeToModulus K π£)} (hy : (y : (FractionalIdeal ((π K)β°) K)Λ£) β narrowRaySubgroup K π£) : NarrowRayClassGroup.mk K π£ y = 1 := by rw [NarrowRayClassGroup.mk, QuotientGroup.mk'_apply, QuotientGroup.eq_one_iff, Subgroup.mem_subgroupOf] exact hy theorem NarrowRayClassGroup.mk_eq_mk_iff {π£ : Ideal (π K)} {y y' : β₯(coprimeToModulus K π£)} : NarrowRayClassGroup.mk K π£ y = NarrowRayClassGroup.mk K π£ y' β ((y : (FractionalIdeal ((π K)β°) K)Λ£))β»ΒΉ * (y' : (FractionalIdeal ((π K)β°) K)Λ£) β narrowRaySubgroup K π£ := by rw [NarrowRayClassGroup.mk, QuotientGroup.mk'_apply, QuotientGroup.mk'_apply, QuotientGroup.eq, Subgroup.mem_subgroupOf, Subgroup.coe_mul, Subgroup.coe_inv] theorem rayClass_mul_self_eq_one {π£ : Ideal (π K)} {g : NarrowRayClassGroup K π£} (hg : g β rayClasses K π£) : g * g = 1 := by obtain β¨y, β¨Ξ±, hΞ±0, hΞ±1, hyβ©, rflβ© := hg rw [β map_mul] apply NarrowRayClassGroup.mk_eq_one_of_mem apply Subgroup.subset_closure have hΞ±' : (algebraMap (π K) K) Ξ± β 0 := (map_ne_zero_iff _ (IsFractionRing.injective (π K) K)).mpr hΞ±0 refine β¨Ξ± * Ξ±, mul_ne_zero hΞ±0 hΞ±0, ?_, ?_, ?_β© Β· have : Ξ± * Ξ± - 1 = (Ξ± + 1) * (Ξ± - 1) := by ring rw [this] exact Ideal.mul_mem_left _ _ hΞ±1 Β· intro Ο rw [map_mul, map_mul] exact mul_self_pos.mpr ((map_ne_zero Ο).mpr hΞ±') Β· rw [Subgroup.coe_mul, Units.val_mul, hy, β FractionalIdeal.coeIdeal_mul, Ideal.span_singleton_mul_span_singleton] theorem mul_mem_narrowRaySet_of_sameSign {π£ : Ideal (π K)} {y y' : β₯(coprimeToModulus K π£)} {Ξ± Ξ±' : π K} (hΞ±0 : Ξ± β 0) (hΞ±1 : Ξ± - 1 β π£) (hy : ((y : (FractionalIdeal ((π K)β°) K)Λ£) : FractionalIdeal ((π K)β°) K) = ((Ideal.span {Ξ±} : Ideal (π K)) : FractionalIdeal ((π K)β°) K)) (hΞ±0' : Ξ±' β 0) (hΞ±1' : Ξ±' - 1 β π£) (hy' : ((y' : (FractionalIdeal ((π K)β°) K)Λ£) : FractionalIdeal ((π K)β°) K) = ((Ideal.span {Ξ±'} : Ideal (π K)) : FractionalIdeal ((π K)β°) K)) (hsgn : β Ο : K β+* β, (0 < Ο (algebraMap (π K) K Ξ±)) β (0 < Ο (algebraMap (π K) K Ξ±'))) : ((y * y' : β₯(coprimeToModulus K π£)) : (FractionalIdeal ((π K)β°) K)Λ£) β narrowRaySet K π£ := by have hΞ± : (algebraMap (π K) K) Ξ± β 0 := (map_ne_zero_iff _ (IsFractionRing.injective (π K) K)).mpr hΞ±0 have hΞ±'' : (algebraMap (π K) K) Ξ±' β 0 := (map_ne_zero_iff _ (IsFractionRing.injective (π K) K)).mpr hΞ±0' refine β¨Ξ± * Ξ±', mul_ne_zero hΞ±0 hΞ±0', ?_, ?_, ?_β© Β· have : Ξ± * Ξ±' - 1 = Ξ± * (Ξ±' - 1) + (Ξ± - 1) := by ring rw [this] exact Ideal.add_mem _ (Ideal.mul_mem_left _ _ hΞ±1') hΞ±1 Β· intro Ο rw [map_mul, map_mul] rcases lt_or_gt_of_ne ((map_ne_zero Ο).mpr hΞ±).symm with hpos | hneg Β· exact mul_pos hpos ((hsgn Ο).mp hpos) Β· have hneg' : Ο (algebraMap (π K) K Ξ±') < 0 := by rcases lt_or_gt_of_ne ((map_ne_zero Ο).mpr hΞ±'').symm with hpos' | hneg' Β· exact absurd ((hsgn Ο).mpr hpos') (not_lt.mpr hneg.le) Β· exact hneg' exact mul_pos_of_neg_of_neg hneg hneg' Β· rw [Subgroup.coe_mul, Units.val_mul, hy, hy', β FractionalIdeal.coeIdeal_mul, Ideal.span_singleton_mul_span_singleton] theorem NarrowRayClassGroup.mk_eq_of_sameSign {π£ : Ideal (π K)} {y y' : β₯(coprimeToModulus K π£)} {Ξ± Ξ±' : π K} (hΞ±0 : Ξ± β 0) (hΞ±1 : Ξ± - 1 β π£) (hy : ((y : (FractionalIdeal ((π K)β°) K)Λ£) : FractionalIdeal ((π K)β°) K) = ((Ideal.span {Ξ±} : Ideal (π K)) : FractionalIdeal ((π K)β°) K)) (hΞ±0' : Ξ±' β 0) (hΞ±1' : Ξ±' - 1 β π£) (hy' : ((y' : (FractionalIdeal ((π K)β°) K)Λ£) : FractionalIdeal ((π K)β°) K) = ((Ideal.span {Ξ±'} : Ideal (π K)) : FractionalIdeal ((π K)β°) K)) (hsgn : β Ο : K β+* β, (0 < Ο (algebraMap (π K) K Ξ±)) β (0 < Ο (algebraMap (π K) K Ξ±'))) : NarrowRayClassGroup.mk K π£ y = NarrowRayClassGroup.mk K π£ y' := by rw [NarrowRayClassGroup.mk_eq_mk_iff] have h1 : ((y * y' : β₯(coprimeToModulus K π£)) : (FractionalIdeal ((π K)β°) K)Λ£) β narrowRaySubgroup K π£ := Subgroup.subset_closure (mul_mem_narrowRaySet_of_sameSign K hΞ±0 hΞ±1 hy hΞ±0' hΞ±1' hy' hsgn) have h2 : ((y * y : β₯(coprimeToModulus K π£)) : (FractionalIdeal ((π K)β°) K)Λ£) β narrowRaySubgroup K π£ := Subgroup.subset_closure (mul_mem_narrowRaySet_of_sameSign K hΞ±0 hΞ±1 hy hΞ±0 hΞ±1 hy (fun _ => Iff.rfl)) rw [Subgroup.coe_mul] at h1 h2 have e : ((y : (FractionalIdeal ((π K)β°) K)Λ£))β»ΒΉ * (y' : (FractionalIdeal ((π K)β°) K)Λ£) = (((y : (FractionalIdeal ((π K)β°) K)Λ£)) * (y : (FractionalIdeal ((π K)β°) K)Λ£))β»ΒΉ * (((y : (FractionalIdeal ((π K)β°) K)Λ£)) * (y' : (FractionalIdeal ((π K)β°) K)Λ£)) := by group rw [e] exact mul_mem (inv_mem h2) h1 theorem rayClasses_finite (π£ : Ideal (π K)) : (rayClasses K π£).Finite := by classical refine (Set.finite_range (fun s : (K β+* β) β Bool => if h : β (y : β₯(coprimeToModulus K π£)) (Ξ± : π K), Ξ± β 0 β§ Ξ± - 1 β π£ β§ ((y : (FractionalIdeal ((π K)β°) K)Λ£) : FractionalIdeal ((π K)β°) K) = ((Ideal.span {Ξ±} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) β§ (fun Ο : K β+* β => decide (0 < Ο (algebraMap (π K) K Ξ±))) = s then NarrowRayClassGroup.mk K π£ (Classical.choose h) else 1)).subset ?_ rintro _ β¨y, β¨Ξ±, hΞ±0, hΞ±1, hyβ©, rflβ© refine β¨fun Ο : K β+* β => decide (0 < Ο (algebraMap (π K) K Ξ±)), ?_β© have hex : β (y : β₯(coprimeToModulus K π£)) (Ξ±' : π K), Ξ±' β 0 β§ Ξ±' - 1 β π£ β§ ((y : (FractionalIdeal ((π K)β°) K)Λ£) : FractionalIdeal ((π K)β°) K) = ((Ideal.span {Ξ±'} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) β§ (fun Ο : K β+* β => decide (0 < Ο (algebraMap (π K) K Ξ±'))) = (fun Ο : K β+* β => decide (0 < Ο (algebraMap (π K) K Ξ±))) := β¨y, Ξ±, hΞ±0, hΞ±1, hy, rflβ© simp only [dif_pos hex] obtain β¨Ξ±β, hΞ±β0, hΞ±β1, hyβ, hsββ© := Classical.choose_spec hex apply NarrowRayClassGroup.mk_eq_of_sameSign K hΞ±β0 hΞ±β1 hyβ hΞ±0 hΞ±1 hy intro Ο have h : decide (0 < Ο (algebraMap (π K) K Ξ±β)) = decide (0 < Ο (algebraMap (π K) K Ξ±)) := congrFun hsβ Ο exact decide_eq_decide.mp h theorem finite_rayClassSubgroup (π£ : Ideal (π K)) : Finite (rayClassSubgroup K π£) := finite_closure_of_involutions' (rayClasses_finite K π£) (fun _ hg => rayClass_mul_self_eq_one K hg) def principalUnit (a : π K) (ha : a β 0) : (FractionalIdeal ((π K)β°) K)Λ£ := FractionalIdeal.mk0 K β¨Ideal.span {a}, mem_nonZeroDivisors_of_ne_zero (by rw [Ne, Submodule.zero_eq_bot, Ideal.span_singleton_eq_bot] exact ha)β© theorem principalUnit_val (a : π K) (ha : a β 0) : ((principalUnit K a ha : (FractionalIdeal ((π K)β°) K)Λ£) : FractionalIdeal ((π K)β°) K) = ((Ideal.span {a} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) := FractionalIdeal.coe_mk0 K _ def toClassGroup (π£ : Ideal (π K)) : β₯(coprimeToModulus K π£) β* ClassGroup (π K) := (ClassGroup.mk (R := π K) (K := K)).comp (coprimeToModulus K π£).subtype theorem classGroupMk_eq_one_of_principal {I : (FractionalIdeal ((π K)β°) K)Λ£} {Ξ± : π K} (hI : (I : FractionalIdeal ((π K)β°) K) = ((Ideal.span {Ξ±} : Ideal (π K)) : FractionalIdeal ((π K)β°) K)) : ClassGroup.mk (R := π K) (K := K) I = 1 := by rw [ClassGroup.mk_eq_one_iff, hI, FractionalIdeal.coeIdeal_span_singleton] exact (FractionalIdeal.isPrincipal_iff _).mpr β¨algebraMap (π K) K Ξ±, rflβ© theorem toClassGroup_eq_one_of_principal {π£ : Ideal (π K)} {y : β₯(coprimeToModulus K π£)} {Ξ± : π K} (hy : ((y : (FractionalIdeal ((π K)β°) K)Λ£) : FractionalIdeal ((π K)β°) K) = ((Ideal.span {Ξ±} : Ideal (π K)) : FractionalIdeal ((π K)β°) K)) : toClassGroup K π£ y = 1 := by rw [toClassGroup, MonoidHom.coe_comp, Function.comp_apply, Subgroup.coe_subtype] exact classGroupMk_eq_one_of_principal K hy theorem narrowRaySubgroupOf_le_ker (π£ : Ideal (π K)) : (narrowRaySubgroup K π£).subgroupOf (coprimeToModulus K π£) β€ (toClassGroup K π£).ker := by intro y hy rw [Subgroup.mem_subgroupOf] at hy rw [MonoidHom.mem_ker] have hle : narrowRaySubgroup K π£ β€ ((ClassGroup.mk (R := π K) (K := K)) : (FractionalIdeal ((π K)β°) K)Λ£ β* ClassGroup (π K)).ker := by rw [narrowRaySubgroup, Subgroup.closure_le] rintro I β¨Ξ±, hΞ±0, hΞ±1, -, hIβ© rw [SetLike.mem_coe, MonoidHom.mem_ker] exact classGroupMk_eq_one_of_principal K hI exact MonoidHom.mem_ker.mp (hle hy) def narrowRayClassGroupToClassGroup (π£ : Ideal (π K)) : NarrowRayClassGroup K π£ β* ClassGroup (π K) := QuotientGroup.lift ((narrowRaySubgroup K π£).subgroupOf (coprimeToModulus K π£)) (toClassGroup K π£) (narrowRaySubgroupOf_le_ker K π£) theorem narrowRayClassGroupToClassGroup_mk (π£ : Ideal (π K)) (y : β₯(coprimeToModulus K π£)) : narrowRayClassGroupToClassGroup K π£ (NarrowRayClassGroup.mk K π£ y) = toClassGroup K π£ y := by rw [NarrowRayClassGroup.mk, QuotientGroup.mk'_apply] exact QuotientGroup.lift_mk' _ (narrowRaySubgroupOf_le_ker K π£) y theorem rayClassSubgroup_le_ker (π£ : Ideal (π K)) : rayClassSubgroup K π£ β€ (narrowRayClassGroupToClassGroup K π£).ker := by rw [rayClassSubgroup, Subgroup.closure_le] rintro _ β¨y, β¨Ξ±, hΞ±0, hΞ±1, hyβ©, rflβ© rw [SetLike.mem_coe, MonoidHom.mem_ker, narrowRayClassGroupToClassGroup_mk] exact toClassGroup_eq_one_of_principal K hy def rayClassGroupToClassGroup (π£ : Ideal (π K)) : NarrowRayClassGroup K π£ β§Έ rayClassSubgroup K π£ β* ClassGroup (π K) := QuotientGroup.lift (rayClassSubgroup K π£) (narrowRayClassGroupToClassGroup K π£) (rayClassSubgroup_le_ker K π£) theorem rayClassGroupToClassGroup_mk_mk (π£ : Ideal (π K)) (y : β₯(coprimeToModulus K π£)) : rayClassGroupToClassGroup K π£ (QuotientGroup.mk (NarrowRayClassGroup.mk K π£ y) : NarrowRayClassGroup K π£ β§Έ rayClassSubgroup K π£) = toClassGroup K π£ y := by show (QuotientGroup.lift (rayClassSubgroup K π£) (narrowRayClassGroupToClassGroup K π£) (rayClassSubgroup_le_ker K π£)) (QuotientGroup.mk (NarrowRayClassGroup.mk K π£ y)) = _ rw [QuotientGroup.lift_mk] exact narrowRayClassGroupToClassGroup_mk K π£ y def MovingLemma (π£ : Ideal (π K)) : Prop := β xβ : K, xβ β 0 β (β v : HeightOneSpectrum (π K), v.asIdeal β£ π£ β FractionalIdeal.count K v (FractionalIdeal.spanSingleton ((π K)β°) xβ) = 0) β β Ξ² : π K, Ξ² β 0 β§ Ξ² - 1 β π£ β§ β a : π K, algebraMap (π K) K a = algebraMap (π K) K Ξ² * xβ theorem le_one_of_forall_count_nonneg {I : FractionalIdeal ((π K)β°) K} (hI : I β 0) (h : β v : HeightOneSpectrum (π K), 0 β€ FractionalIdeal.count K v I) : I β€ 1 := by classical rw [β FractionalIdeal.finprod_heightOneSpectrum_factorization' K hI] have hfin : (Function.mulSupport fun v : HeightOneSpectrum (π K) => (v.asIdeal : FractionalIdeal ((π K)β°) K) ^ FractionalIdeal.count K v I).Finite := by refine (Filter.eventually_cofinite.mp (FractionalIdeal.finite_factors I)).subset ?_ intro v hv simp only [Function.mem_mulSupport, ne_eq] at hv simp only [Set.mem_setOf_eq] intro h0 exact hv (by rw [h0, zpow_zero]) rw [finprod_eq_prod_of_mulSupport_subset _ (s := hfin.toFinset) (by rw [Set.Finite.coe_toFinset])] apply Finset.prod_induction _ (fun x => x β€ 1) Β· intro a b ha hb calc a * b β€ a * 1 := by gcongr _ = a := mul_one a _ β€ 1 := ha Β· exact le_rfl Β· intro v _ obtain β¨n, hnβ© := Int.eq_ofNat_of_zero_le (h v) rw [hn, zpow_natCast, β FractionalIdeal.coeIdeal_pow] exact FractionalIdeal.coeIdeal_le_one theorem movingLemma {π£ : Ideal (π K)} (hπ£ : π£ β β₯) : MovingLemma K π£ := by classical intro xβ hxβ hcop by_cases htop : π£ = β€ Β· obtain β¨n, s, hs, hnsβ© := IsFractionRing.div_surjective (A := π K) xβ have hs0 : s β 0 := nonZeroDivisors.ne_zero hs have hs0' : (algebraMap (π K) K) s β 0 := (map_ne_zero_iff _ (IsFractionRing.injective (π K) K)).mpr hs0 refine β¨s, hs0, by rw [htop]; exact Submodule.mem_top, n, ?_β© rw [β hns, mul_div_cancelβ _ hs0'] Β· have hπ£0 : (π£ : Ideal (π K)) β 0 := by rwa [Ne, Submodule.zero_eq_bot] obtain β¨T, hTβ© : β T : Finset (HeightOneSpectrum (π K)), β v, v β T β v.asIdeal β£ π£ := β¨(Ideal.finite_factors hπ£0).toFinset, fun v => (Set.Finite.mem_toFinset _).trans Iff.rflβ© have hWfin : {w : HeightOneSpectrum (π K) | FractionalIdeal.count K w (FractionalIdeal.spanSingleton ((π K)β°) xβ) < 0}.Finite := by refine (Filter.eventually_cofinite.mp (FractionalIdeal.finite_factors (FractionalIdeal.spanSingleton ((π K)β°) xβ))).subset ?_ intro w hw simp only [Set.mem_setOf_eq] at hw β’ exact ne_of_lt hw obtain β¨W, hWβ© : β W : Finset (HeightOneSpectrum (π K)), β w, w β W β FractionalIdeal.count K w (FractionalIdeal.spanSingleton ((π K)β°) xβ) < 0 := β¨hWfin.toFinset, fun w => (Set.Finite.mem_toFinset _).trans Iff.rflβ© obtain β¨e, heβ© : β e : HeightOneSpectrum (π K) β β, β v, e v = if v.asIdeal β£ π£ then (Associates.mk v.asIdeal).count (Associates.mk π£).factors else (-(FractionalIdeal.count K v (FractionalIdeal.spanSingleton ((π K)β°) xβ))).toNat := β¨_, fun v => rflβ© obtain β¨Ξ², hΞ²β© := IsDedekindDomain.exists_forall_sub_mem_ideal (s := T βͺ W) (fun v => v.asIdeal) e (fun v _ => v.prime) (fun i _ j _ hij h => hij (by cases i; cases j; simpa using h)) (fun v : β₯(T βͺ W) => if v.1 β T then (1 : π K) else 0) have hΞ²T : β v β T, Ξ² - 1 β v.asIdeal ^ e v := by intro v hvT have := hΞ² v (Finset.mem_union_left _ hvT) simpa [hvT] using this have hinf : (T.inf fun v => v.asIdeal ^ e v) = β v β T, v.asIdeal ^ e v := IsDedekindDomain.HeightOneSpectrum.inf_pow_eq_prod T e id (fun i _ j _ hij => hij) have hprod : β v β T, v.asIdeal ^ e v = π£ := by rw [β Ideal.finprod_heightOneSpectrum_factorization hπ£0, finprod_eq_prod_of_mulSupport_subset _ (s := T) ?_] Β· refine Finset.prod_congr rfl fun v hv => ?_ rw [he v, if_pos ((hT v).mp hv)] rfl Β· intro v hv rw [Function.mem_mulSupport] at hv rw [Finset.mem_coe, hT] by_contra hndvd apply hv have hcnt : (Associates.mk v.asIdeal).count (Associates.mk π£).factors = 0 := by by_contra hne exact hndvd ((Associates.count_ne_zero_iff_dvd hπ£0 v.irreducible).mp hne) show v.asIdeal ^ (Associates.mk v.asIdeal).count (Associates.mk π£).factors = 1 rw [hcnt, pow_zero] have hΞ²1 : Ξ² - 1 β π£ := by have hle : Ideal.span {Ξ² - 1} β€ T.inf fun v => v.asIdeal ^ e v := Finset.le_inf fun v hv => (Ideal.span_singleton_le_iff_mem _).mpr (hΞ²T v hv) have := hle (Ideal.mem_span_singleton_self _) rwa [hinf, hprod] at this obtain β¨m, hm, hmπ£β© := Ideal.exists_le_maximal π£ htop have hmbot : m β β₯ := by rintro rfl exact hπ£ (le_bot_iff.mp hmπ£) obtain β¨vβ, hvββ© : β vβ : HeightOneSpectrum (π K), vβ.asIdeal = m := β¨β¨m, hm.isPrime, hmbotβ©, rflβ© have hvβT : vβ β T := (hT vβ).mpr (by rw [hvβ]; exact Ideal.dvd_iff_le.mpr hmπ£) have hevβ : e vβ β 0 := by rw [he vβ, if_pos ((hT vβ).mp hvβT)] exact (Associates.count_ne_zero_iff_dvd hπ£0 vβ.irreducible).mpr ((hT vβ).mp hvβT) have hΞ²0 : Ξ² β 0 := by rintro rfl have h1 := hΞ²T vβ hvβT rw [zero_sub] at h1 have h2 : (-1 : π K) β vβ.asIdeal := Ideal.pow_le_self hevβ h1 rw [hvβ] at h2 exact hm.ne_top ((Ideal.eq_top_iff_one _).mpr (by simpa using neg_mem_iff.mp h2)) have hΞ²0' : (algebraMap (π K) K) Ξ² β 0 := (map_ne_zero_iff _ (IsFractionRing.injective (π K) K)).mpr hΞ²0 have hΞ²span : ((Ideal.span {Ξ²} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) β 0 := by rw [Ne, FractionalIdeal.coeIdeal_eq_zero, Ideal.span_singleton_eq_bot] exact hΞ²0 have hΞ²span0 : (Ideal.span {Ξ²} : Ideal (π K)) β 0 := by rw [Ne, Submodule.zero_eq_bot, Ideal.span_singleton_eq_bot] exact hΞ²0 have hx0' : FractionalIdeal.spanSingleton ((π K)β°) xβ β 0 := by rw [Ne, FractionalIdeal.spanSingleton_eq_zero_iff] exact hxβ have hI0 : FractionalIdeal.spanSingleton ((π K)β°) (algebraMap (π K) K Ξ² * xβ) β 0 := by rw [Ne, FractionalIdeal.spanSingleton_eq_zero_iff] exact mul_ne_zero hΞ²0' hxβ have hsplit : FractionalIdeal.spanSingleton ((π K)β°) (algebraMap (π K) K Ξ² * xβ) = ((Ideal.span {Ξ²} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) * FractionalIdeal.spanSingleton ((π K)β°) xβ := by rw [FractionalIdeal.coeIdeal_span_singleton, FractionalIdeal.spanSingleton_mul_spanSingleton] have hnonneg : β w : HeightOneSpectrum (π K), 0 β€ FractionalIdeal.count K w (FractionalIdeal.spanSingleton ((π K)β°) (algebraMap (π K) K Ξ² * xβ)) := by intro w rw [hsplit, FractionalIdeal.count_mul K w hΞ²span hx0'] have hΞ²w : 0 β€ FractionalIdeal.count K w ((Ideal.span {Ξ²} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) := FractionalIdeal.count_coe_nonneg K w _ by_cases hwW : w β W Β· have hwlt : FractionalIdeal.count K w (FractionalIdeal.spanSingleton ((π K)β°) xβ) < 0 := (hW w).mp hwW have hwT : w β T := by intro hwT have h0 := hcop w ((hT w).mp hwT) rw [h0] at hwlt exact lt_irrefl _ hwlt have hndvd : Β¬ w.asIdeal β£ π£ := by rwa [β hT] have hmem := hΞ² w (Finset.mem_union_right _ hwW) simp only [hwT, ite_false, sub_zero] at hmem have hew : (e w : β€) = -(FractionalIdeal.count K w (FractionalIdeal.spanSingleton ((π K)β°) xβ)) := by rw [he w, if_neg hndvd, Int.toNat_of_nonneg (by omega)] have hdvd : w.asIdeal ^ e w β£ (Ideal.span {Ξ²} : Ideal (π K)) := (Ideal.dvd_span_singleton).mpr hmem have hle : e w β€ (Associates.mk w.asIdeal).count (Associates.mk (Ideal.span {Ξ²} : Ideal (π K))).factors := by rw [β Associates.prime_pow_dvd_iff_le (Associates.mk_ne_zero.mpr hΞ²span0) w.associates_irreducible, β Associates.mk_pow] exact Associates.mk_dvd_mk.mpr hdvd have hcoe : FractionalIdeal.count K w ((Ideal.span {Ξ²} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) = ((Associates.mk w.asIdeal).count (Associates.mk (Ideal.span {Ξ²} : Ideal (π K))).factors : β€) := FractionalIdeal.count_coe K w hΞ²span0 have hle' : (e w : β€) β€ FractionalIdeal.count K w ((Ideal.span {Ξ²} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) := by rw [hcoe] exact_mod_cast hle omega Β· have hwge : 0 β€ FractionalIdeal.count K w (FractionalIdeal.spanSingleton ((π K)β°) xβ) := by by_contra hlt exact hwW ((hW w).mpr (lt_of_not_ge hlt)) exact add_nonneg hΞ²w hwge have hle1 : FractionalIdeal.spanSingleton ((π K)β°) (algebraMap (π K) K Ξ² * xβ) β€ 1 := le_one_of_forall_count_nonneg K hI0 hnonneg have hmem1 : algebraMap (π K) K Ξ² * xβ β (1 : FractionalIdeal ((π K)β°) K) := hle1 (FractionalIdeal.mem_spanSingleton_self _ _) obtain β¨a, haβ© := (FractionalIdeal.mem_one_iff _).mp hmem1 exact β¨Ξ², hΞ²0, hΞ²1, a, haβ© theorem exists_mul_sub_one_mem_of_counts_zero {π£ : Ideal (π K)} (hπ£ : π£ β β₯) {a : π K} (ha : a β 0) (hcop : β v : HeightOneSpectrum (π K), v.asIdeal β£ π£ β FractionalIdeal.count K v ((Ideal.span {a} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) = 0) : β c : π K, a * c - 1 β π£ := by classical have hsup : (Ideal.span {a} : Ideal (π K)) β π£ = β€ := by by_contra hne obtain β¨m, hm, hleβ© := Ideal.exists_le_maximal _ hne have hmπ£ : π£ β€ m := le_trans le_sup_right hle have hma : (Ideal.span {a} : Ideal (π K)) β€ m := le_trans le_sup_left hle have hmbot : m β β₯ := by rintro rfl exact hπ£ (le_bot_iff.mp hmπ£) set v : HeightOneSpectrum (π K) := β¨m, hm.isPrime, hmbotβ© have hvdvd : v.asIdeal β£ π£ := (Ideal.dvd_iff_le.mpr hmπ£) have hva : v.asIdeal β£ (Ideal.span {a} : Ideal (π K)) := (Ideal.dvd_iff_le.mpr hma) have hJ0 : (Ideal.span {a} : Ideal (π K)) β 0 := by rw [Ne, Submodule.zero_eq_bot, Ideal.span_singleton_eq_bot] exact ha have hcnt := hcop v hvdvd rw [FractionalIdeal.count_coe K v hJ0] at hcnt have hz : (Associates.mk v.asIdeal).count (Associates.mk (Ideal.span {a} : Ideal (π K))).factors = 0 := by exact_mod_cast hcnt exact ((Associates.count_ne_zero_iff_dvd hJ0 v.irreducible).mpr hva) hz have h1 : (1 : π K) β (Ideal.span {a} : Ideal (π K)) β π£ := by rw [hsup]; exact Submodule.mem_top obtain β¨t, ht, f, hf, htfβ© := Submodule.mem_sup.mp h1 obtain β¨c, rflβ© := Ideal.mem_span_singleton'.mp ht refine β¨c, ?_β© have : a * c - 1 = -f := by rw [mul_comm]; linear_combination htf rw [this] exact neg_mem_iff.mpr hf theorem principalUnit_mem_coprimeToModulus {π£ : Ideal (π K)} {Ξ² : π K} (hΞ²0 : Ξ² β 0) (hΞ²1 : Ξ² - 1 β π£) : principalUnit K Ξ² hΞ²0 β coprimeToModulus K π£ := by rw [mem_coprimeToModulus_iff] intro v hv rw [principalUnit_val] exact count_span_singleton_eq_zero_of_sub_one_mem K hΞ²0 hΞ²1 hv theorem mk_mk_eq_one_of_raySet {π£ : Ideal (π K)} {z : β₯(coprimeToModulus K π£)} (hz : (z : (FractionalIdeal ((π K)β°) K)Λ£) β raySet K π£) : (QuotientGroup.mk (NarrowRayClassGroup.mk K π£ z) : NarrowRayClassGroup K π£ β§Έ rayClassSubgroup K π£) = 1 := by rw [QuotientGroup.eq_one_iff] exact Subgroup.subset_closure β¨z, hz, rflβ© private theorem exists_integral_ray_rep {π£ : Ideal (π K)} (hmove : MovingLemma K π£) (y : β₯(coprimeToModulus K π£)) (hprinc : toClassGroup K π£ y = 1) : β (a : π K), a β 0 β§ β (ya : β₯(coprimeToModulus K π£)), ((ya : (FractionalIdeal ((π K)β°) K)Λ£) : FractionalIdeal ((π K)β°) K) = ((Ideal.span {a} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) β§ (QuotientGroup.mk (NarrowRayClassGroup.mk K π£ ya) : NarrowRayClassGroup K π£ β§Έ rayClassSubgroup K π£) = QuotientGroup.mk (NarrowRayClassGroup.mk K π£ y) := by have hprinc' : ClassGroup.mk (R := π K) (K := K) (y : (FractionalIdeal ((π K)β°) K)Λ£) = 1 := hprinc rw [ClassGroup.mk_eq_one_iff] at hprinc' obtain β¨xβ, hxββ© := (FractionalIdeal.isPrincipal_iff _).mp hprinc' have hy0 : ((y : (FractionalIdeal ((π K)β°) K)Λ£) : FractionalIdeal ((π K)β°) K) β 0 := Units.ne_zero _ have hx0 : xβ β 0 := by intro h rw [h, FractionalIdeal.spanSingleton_zero] at hxβ exact hy0 hxβ have hcop : β v : HeightOneSpectrum (π K), v.asIdeal β£ π£ β FractionalIdeal.count K v (FractionalIdeal.spanSingleton ((π K)β°) xβ) = 0 := by intro v hv rw [β hxβ] exact (mem_coprimeToModulus_iff K).mp y.2 v hv obtain β¨Ξ², hΞ²0, hΞ²1, a, haβ© := hmove xβ hx0 hcop have hΞ²' : (algebraMap (π K) K) Ξ² β 0 := (map_ne_zero_iff _ (IsFractionRing.injective (π K) K)).mpr hΞ²0 have ha0 : a β 0 := by intro h rw [h, map_zero] at ha exact mul_ne_zero hΞ²' hx0 ha.symm refine β¨a, ha0, β¨principalUnit K Ξ² hΞ²0 * (y : (FractionalIdeal ((π K)β°) K)Λ£), mul_mem (principalUnit_mem_coprimeToModulus K hΞ²0 hΞ²1) y.2β©, ?_, ?_β© Β· rw [Units.val_mul, principalUnit_val, hxβ, FractionalIdeal.coeIdeal_span_singleton, FractionalIdeal.coeIdeal_span_singleton, FractionalIdeal.spanSingleton_mul_spanSingleton, ha] Β· have hsplit : (β¨principalUnit K Ξ² hΞ²0 * (y : (FractionalIdeal ((π K)β°) K)Λ£), mul_mem (principalUnit_mem_coprimeToModulus K hΞ²0 hΞ²1) y.2β© : β₯(coprimeToModulus K π£)) = β¨principalUnit K Ξ² hΞ²0, principalUnit_mem_coprimeToModulus K hΞ²0 hΞ²1β© * y := rfl rw [hsplit, map_mul, QuotientGroup.mk_mul, mk_mk_eq_one_of_raySet K β¨Ξ², hΞ²0, hΞ²1, principalUnit_val K Ξ² hΞ²0β©, one_mul] theorem mk_mk_eq_of_residue_eq {π£ : Ideal (π K)} (hπ£ : π£ β β₯) (htop : π£ β β€) {a a' : π K} (ha : a β 0) (ha' : a' β 0) (ya ya' : β₯(coprimeToModulus K π£)) (hya : ((ya : (FractionalIdeal ((π K)β°) K)Λ£) : FractionalIdeal ((π K)β°) K) = ((Ideal.span {a} : Ideal (π K)) : FractionalIdeal ((π K)β°) K)) (hya' : ((ya' : (FractionalIdeal ((π K)β°) K)Λ£) : FractionalIdeal ((π K)β°) K) = ((Ideal.span {a'} : Ideal (π K)) : FractionalIdeal ((π K)β°) K)) (hres : Ideal.Quotient.mk π£ a = Ideal.Quotient.mk π£ a') : (QuotientGroup.mk (NarrowRayClassGroup.mk K π£ ya) : NarrowRayClassGroup K π£ β§Έ rayClassSubgroup K π£) = QuotientGroup.mk (NarrowRayClassGroup.mk K π£ ya') := by classical have hcopa : β v : HeightOneSpectrum (π K), v.asIdeal β£ π£ β FractionalIdeal.count K v ((Ideal.span {a} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) = 0 := by intro v hv rw [β hya] exact (mem_coprimeToModulus_iff K).mp ya.2 v hv obtain β¨c, hacβ© := exists_mul_sub_one_mem_of_counts_zero K hπ£ ha hcopa have ha'a : a' - a β π£ := by have := (Ideal.Quotient.eq (I := π£)).mp hres have h' : a' - a = -(a - a') := by ring rw [h'] exact neg_mem_iff.mpr this have ha'c : a' * c - 1 β π£ := by have : a' * c - 1 = (a' - a) * c + (a * c - 1) := by ring rw [this] exact Ideal.add_mem _ (Ideal.mul_mem_right _ _ ha'a) hac have hc0 : c β 0 := by rintro rfl rw [mul_zero, zero_sub] at hac exact htop ((Ideal.eq_top_iff_one _).mpr (by simpa using neg_mem_iff.mp hac)) have hac0 : a * c β 0 := mul_ne_zero ha hc0 have hcopc : β v : HeightOneSpectrum (π K), v.asIdeal β£ π£ β FractionalIdeal.count K v ((Ideal.span {c} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) = 0 := by intro v hv have hprod : FractionalIdeal.count K v ((Ideal.span {a * c} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) = 0 := count_span_singleton_eq_zero_of_sub_one_mem K hac0 hac hv have hA : ((Ideal.span {a} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) β 0 := by rw [Ne, FractionalIdeal.coeIdeal_eq_zero, Ideal.span_singleton_eq_bot] exact ha have hC : ((Ideal.span {c} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) β 0 := by rw [Ne, FractionalIdeal.coeIdeal_eq_zero, Ideal.span_singleton_eq_bot] exact hc0 rw [β Ideal.span_singleton_mul_span_singleton, FractionalIdeal.coeIdeal_mul, FractionalIdeal.count_mul K v hA hC, hcopa v hv, zero_add] at hprod exact hprod set yc : β₯(coprimeToModulus K π£) := β¨principalUnit K c hc0, (mem_coprimeToModulus_iff K).mpr (fun v hv => by rw [principalUnit_val]; exact hcopc v hv)β© with hyc have hvc : ((yc : (FractionalIdeal ((π K)β°) K)Λ£) : FractionalIdeal ((π K)β°) K) = ((Ideal.span {c} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) := by rw [hyc]; exact principalUnit_val K c hc0 have h1 : (QuotientGroup.mk (NarrowRayClassGroup.mk K π£ (ya * yc)) : NarrowRayClassGroup K π£ β§Έ rayClassSubgroup K π£) = 1 := by apply mk_mk_eq_one_of_raySet refine β¨a * c, hac0, hac, ?_β© rw [Subgroup.coe_mul, Units.val_mul, hya, hvc, β FractionalIdeal.coeIdeal_mul, Ideal.span_singleton_mul_span_singleton] have h2 : (QuotientGroup.mk (NarrowRayClassGroup.mk K π£ (ya' * yc)) : NarrowRayClassGroup K π£ β§Έ rayClassSubgroup K π£) = 1 := by apply mk_mk_eq_one_of_raySet refine β¨a' * c, mul_ne_zero ha' hc0, ha'c, ?_β© rw [Subgroup.coe_mul, Units.val_mul, hya', hvc, β FractionalIdeal.coeIdeal_mul, Ideal.span_singleton_mul_span_singleton] rw [map_mul, QuotientGroup.mk_mul] at h1 h2 exact mul_right_cancel (h1.trans h2.symm) private theorem finite_ker_rayClassGroupToClassGroup {π£ : Ideal (π K)} (hπ£ : π£ β β₯) (hmove : MovingLemma K π£) : Finite ((rayClassGroupToClassGroup K π£).ker) := by classical haveI : Finite (π K β§Έ π£) := Ideal.finiteQuotientOfFreeOfNeBot π£ hπ£ apply Set.Finite.to_subtype refine ((Set.finite_range (fun q : π K β§Έ π£ => if h : β (a : π K) (ya : β₯(coprimeToModulus K π£)), a β 0 β§ ((ya : (FractionalIdeal ((π K)β°) K)Λ£) : FractionalIdeal ((π K)β°) K) = ((Ideal.span {a} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) β§ Ideal.Quotient.mk π£ a = q then (QuotientGroup.mk (NarrowRayClassGroup.mk K π£ (Classical.choose (Classical.choose_spec h))) : NarrowRayClassGroup K π£ β§Έ rayClassSubgroup K π£) else 1)).union (Set.finite_singleton 1)).subset ?_ intro x hx rw [SetLike.mem_coe, MonoidHom.mem_ker] at hx obtain β¨x', rflβ© := QuotientGroup.mk_surjective x obtain β¨y, rflβ© := QuotientGroup.mk_surjective x' replace hx : rayClassGroupToClassGroup K π£ (QuotientGroup.mk (NarrowRayClassGroup.mk K π£ y)) = 1 := hx have hprinc : toClassGroup K π£ y = 1 := by rw [β rayClassGroupToClassGroup_mk_mk] exact hx obtain β¨a, ha, ya, hya, hclsβ© := exists_integral_ray_rep K hmove y hprinc by_cases htop : π£ = β€ Β· right rw [Set.mem_singleton_iff] exact hcls.symm.trans (mk_mk_eq_one_of_raySet K β¨a, ha, by rw [htop]; exact Submodule.mem_top, hyaβ©) Β· left refine β¨Ideal.Quotient.mk π£ a, ?_β© have hdite : β (a' : π K) (ya' : β₯(coprimeToModulus K π£)), a' β 0 β§ ((ya' : (FractionalIdeal ((π K)β°) K)Λ£) : FractionalIdeal ((π K)β°) K) = ((Ideal.span {a'} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) β§ Ideal.Quotient.mk π£ a' = Ideal.Quotient.mk π£ a := β¨a, ya, ha, hya, rflβ© simp only [dif_pos hdite] obtain β¨haβ, hyaβ, hresββ© := Classical.choose_spec (Classical.choose_spec hdite) exact (mk_mk_eq_of_residue_eq K hπ£ htop haβ ha (Classical.choose (Classical.choose_spec hdite)) ya hyaβ hya hresβ).trans hcls private theorem finite_rayClassQuotient_of_movingLemma {π£ : Ideal (π K)} (hπ£ : π£ β β₯) (hmove : MovingLemma K π£) : Finite (NarrowRayClassGroup K π£ β§Έ rayClassSubgroup K π£) := by have h1 : Finite ((rayClassGroupToClassGroup K π£).ker) := finite_ker_rayClassGroupToClassGroup K hπ£ hmove have h2 : Finite ((NarrowRayClassGroup K π£ β§Έ rayClassSubgroup K π£) β§Έ (rayClassGroupToClassGroup K π£).ker) := Finite.of_equiv _ (QuotientGroup.quotientKerEquivRange (rayClassGroupToClassGroup K π£)).symm.toEquiv exact (finite_iff_subgroup_quotient (rayClassGroupToClassGroup K π£).ker).mpr β¨h1, h2β© private theorem finite_of_movingLemma {π£ : Ideal (π K)} (hπ£ : π£ β β₯) (hmove : MovingLemma K π£) : Finite (NarrowRayClassGroup K π£) := (finite_iff_subgroup_quotient (rayClassSubgroup K π£)).mpr β¨finite_rayClassSubgroup K π£, finite_rayClassQuotient_of_movingLemma K hπ£ hmoveβ© theorem finite {π£ : Ideal (π K)} (hπ£ : π£ β β₯) : Finite (NarrowRayClassGroup K π£) := finite_of_movingLemma K hπ£ (movingLemma K hπ£) end Finiteness section Packaging variable (K : Type*) [Field K] [NumberField K] {M : Type*} [CommGroup M] def primeUnit (v : HeightOneSpectrum (π K)) : (FractionalIdeal ((π K)β°) K)Λ£ := FractionalIdeal.mk0 K β¨v.asIdeal, mem_nonZeroDivisors_of_ne_zero (by rw [Ne, Submodule.zero_eq_bot] exact v.ne_bot)β© theorem primeUnit_val (v : HeightOneSpectrum (π K)) : ((primeUnit K v : (FractionalIdeal ((π K)β°) K)Λ£) : FractionalIdeal ((π K)β°) K) = (v.asIdeal : FractionalIdeal ((π K)β°) K) := FractionalIdeal.coe_mk0 K _ theorem primeUnit_mem_coprimeToModulus {π£ : Ideal (π K)} {v : HeightOneSpectrum (π K)} (hv : Β¬ v.asIdeal β£ π£) : primeUnit K v β coprimeToModulus K π£ := by rw [mem_coprimeToModulus_iff] intro w hw rw [primeUnit_val] exact FractionalIdeal.count_maximal_coprime K w (fun h => hv (h βΈ hw)) def primeClass (π£ : Ideal (π K)) (v : HeightOneSpectrum (π K)) (hv : Β¬ v.asIdeal β£ π£) : NarrowRayClassGroup K π£ := NarrowRayClassGroup.mk K π£ β¨primeUnit K v, primeUnit_mem_coprimeToModulus K hvβ© theorem raySymbol_primeUnit (f : HeightOneSpectrum (π K) β M) (v : HeightOneSpectrum (π K)) : raySymbol K f ((primeUnit K v : (FractionalIdeal ((π K)β°) K)Λ£) : FractionalIdeal ((π K)β°) K) = f v := by rw [primeUnit_val, raySymbol, finprod_eq_single _ v] Β· rw [FractionalIdeal.count_self, zpow_one] Β· intro w hw rw [FractionalIdeal.count_maximal_coprime K w (Ne.symm hw), zpow_zero] theorem raySymbolHom_prime (π£ : Ideal (π K)) (f : HeightOneSpectrum (π K) β M) {v : HeightOneSpectrum (π K)} (hv : Β¬ v.asIdeal β£ π£) : raySymbolHom K π£ f β¨primeUnit K v, primeUnit_mem_coprimeToModulus K hvβ© = f v := by rw [raySymbolHom_apply] exact raySymbol_primeUnit K f v theorem narrowRaySubgroupOf_le_ker_raySymbolHom {π£ : Ideal (π K)} (f : HeightOneSpectrum (π K) β M) (hkill : β Ξ± : π K, Ξ± β 0 β Ξ± - 1 β π£ β (β Ο : K β+* β, 0 < Ο (algebraMap (π K) K Ξ±)) β raySymbol K f ((Ideal.span {Ξ±} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) = 1) : (narrowRaySubgroup K π£).subgroupOf (coprimeToModulus K π£) β€ (raySymbolHom K π£ f).ker := by intro y hy rw [Subgroup.mem_subgroupOf] at hy rw [MonoidHom.mem_ker, raySymbolHom_apply] have hle : narrowRaySubgroup K π£ β€ (raySymbolUnitsHom K f).ker := by rw [narrowRaySubgroup, Subgroup.closure_le] rintro I β¨Ξ±, hΞ±0, hΞ±1, hpos, hIβ© rw [SetLike.mem_coe, MonoidHom.mem_ker] show raySymbol K f (I : FractionalIdeal ((π K)β°) K) = 1 rw [hI] exact hkill Ξ± hΞ±0 hΞ±1 hpos exact MonoidHom.mem_ker.mp (hle hy) def raySymbolDescend {π£ : Ideal (π K)} (f : HeightOneSpectrum (π K) β M) (hkill : β Ξ± : π K, Ξ± β 0 β Ξ± - 1 β π£ β (β Ο : K β+* β, 0 < Ο (algebraMap (π K) K Ξ±)) β raySymbol K f ((Ideal.span {Ξ±} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) = 1) : NarrowRayClassGroup K π£ β* M := QuotientGroup.lift ((narrowRaySubgroup K π£).subgroupOf (coprimeToModulus K π£)) (raySymbolHom K π£ f) (narrowRaySubgroupOf_le_ker_raySymbolHom K f hkill) theorem raySymbolDescend_mk {π£ : Ideal (π K)} (f : HeightOneSpectrum (π K) β M) (hkill : β Ξ± : π K, Ξ± β 0 β Ξ± - 1 β π£ β (β Ο : K β+* β, 0 < Ο (algebraMap (π K) K Ξ±)) β raySymbol K f ((Ideal.span {Ξ±} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) = 1) (y : β₯(coprimeToModulus K π£)) : raySymbolDescend K f hkill (NarrowRayClassGroup.mk K π£ y) = raySymbolHom K π£ f y := by rw [NarrowRayClassGroup.mk, QuotientGroup.mk'_apply] exact QuotientGroup.lift_mk' _ (narrowRaySubgroupOf_le_ker_raySymbolHom K f hkill) y theorem raySymbolDescend_primeClass {π£ : Ideal (π K)} (f : HeightOneSpectrum (π K) β M) (hkill : β Ξ± : π K, Ξ± β 0 β Ξ± - 1 β π£ β (β Ο : K β+* β, 0 < Ο (algebraMap (π K) K Ξ±)) β raySymbol K f ((Ideal.span {Ξ±} : Ideal (π K)) : FractionalIdeal ((π K)β°) K) = 1) {v : HeightOneSpectrum (π K)} (hv : Β¬ v.asIdeal β£ π£) : raySymbolDescend K f hkill (primeClass K π£ v hv) = f v := by rw [primeClass, raySymbolDescend_mk] exact raySymbolHom_prime K π£ f hv def raySymbolIdealHom (f : HeightOneSpectrum (π K) β M) : β₯(Ideal (π K))β° β* M := (raySymbolUnitsHom K f).comp (FractionalIdeal.mk0 K) theorem raySymbolIdealHom_apply (f : HeightOneSpectrum (π K) β M) (I : β₯(Ideal (π K))β°) : raySymbolIdealHom K f I = raySymbol K f ((I : Ideal (π K)) : FractionalIdeal ((π K)β°) K) := by rw [raySymbolIdealHom, MonoidHom.comp_apply] show raySymbol K f ((FractionalIdeal.mk0 K I : (FractionalIdeal ((π K)β°) K)Λ£) : FractionalIdeal ((π K)β°) K) = _ rw [FractionalIdeal.coe_mk0] end Packaging section Degenerate variable (K : Type*) [Field K] [NumberField K] theorem coprimeToModulus_top : coprimeToModulus K (β€ : Ideal (π K)) = β€ := by rw [eq_top_iff] intro I _ rw [mem_coprimeToModulus_iff] intro v hv exact absurd (top_le_iff.mp (Ideal.dvd_iff_le.mp hv)) v.isPrime.ne_top end Degenerate #print axioms Deep.NTSupply.coprimeToModulus #print axioms Deep.NTSupply.mem_coprimeToModulus_iff #print axioms Deep.NTSupply.narrowRaySet #print axioms Deep.NTSupply.narrowRaySubgroup #print axioms Deep.NTSupply.narrowRaySubgroup_le_coprimeToModulus #print axioms Deep.NTSupply.NarrowRayClassGroup #print axioms Deep.NTSupply.NarrowRayClassGroup.mk #print axioms Deep.NTSupply.one_mem_narrowRaySet #print axioms Deep.NTSupply.raySymbol #print axioms Deep.NTSupply.raySymbol_mul #print axioms Deep.NTSupply.raySymbolHom #print axioms Deep.NTSupply.raySymbolHom_prime #print axioms Deep.NTSupply.raySymbolDescend #print axioms Deep.NTSupply.raySymbolDescend_mk #print axioms Deep.NTSupply.raySymbolDescend_primeClass #print axioms Deep.NTSupply.raySymbolIdealHom #print axioms Deep.NTSupply.primeUnit #print axioms Deep.NTSupply.primeClass #print axioms Deep.NTSupply.movingLemma #print axioms Deep.NTSupply.finite #print axioms Deep.NTSupply.coprimeToModulus_top #print axioms Deep.NTSupply.finite_closure_of_involutions end Deep.NTSupply
Statements phrased using this module (27)
- Automorphic induction of a ray class character of E/F
LanglandsTunnell.exists_agreesAwayFromFinite_isGenuineCusp_of_raySymbol_eq_one355 below Β· depth 13 - Ray class character realising the Qβ seed table
LanglandsTunnell.exists_quadratic_rayClassChar_table_liftTraceSeed_quatH_of_detDictionaryRow96 below Β· depth 13 - Seed table over the cubic resolvent as a theta table
LanglandsTunnell.exists_quadratic_rayClassChar_table_liftTraceSeed_sylowH_of_detDictionaryRow93 below Β· depth 13 - Automorphic induction of a ray class symbol to weight one
LanglandsTunnell.exists_isGenuineCusp_archWeightOne_a_eq_of_raySymbol_eq_prod_of_finrank_eq_two353 below Β· depth 14 - Archimedean signs of a narrow ray class symbol
NumberField.exists_sq_eq_one_and_raySymbol_span_singleton_eq_prod_of_forall_pos1 below Β· depth 14 - Finite-order Hecke character with prescribed values and signs
HeckeCharacter.exists_isFiniteOrderHeckeChar_apply_uniformizerIdele_eq_archLocalChar_neg_one_eq_of_raySymbol_eq_prod9 below Β· depth 15 - Norm-class index divides |Gal(E/k)| in 2-power degree
M4aKummer.normClassIndex_dvd_card_aut67 below Β· depth 15 - Second inequality for solvable Galois extensions
M4aKummer.normClassIndex_dvd_card_aut_of_isSolvable104 below Β· depth 15 - Twist relation for two eigensystems with a common base change
AutomorphicForm.HeckeEigensystem.exists_pow_twist_of_isBaseChangeOf_of_isArithGenuineCuspRealizable772 below Β· depth 16 - Partial RankinβSelberg L-function: simple pole at s=1
AutomorphicForm.exists_finset_forall_lt_one_meromorphicOn_meromorphicOrderAt_one_eq_neg_one_analyticAt_hasProd_rsEulerPoly_self702 below Β· depth 16 - Hecke characters realising narrow ray class characters
LT.HeckeChar.exists_heckeCharOfRayClassChar0 below Β· depth 16 - Second inequality in norm-class form, prime-power Galois degree
M4aKummer.normClassIndex_dvd_card_aut_of_prime_pow103 below Β· depth 16 - Tower divisibility for narrow ray norm-class indices
M4aKummer.normClassIndex_dvd_mul_of_tower0 below Β· depth 16 - Second inequality for quadratic extensions: index divides 2
M4aKummer.normClassIndex_dvd_two65 below Β· depth 16 - Fibre identity for base-change RankinβSelberg Euler products
AutomorphicForm.HeckeEigensystem.hasProd_rsEulerPoly_contragredient_fibre_eq_prod_twist_of_isBaseChangeOf0 below Β· depth 17 - Simple pole at s=1 of a partial RankinβSelberg Euler product
AutomorphicForm.exists_finset_lt_one_meromorphicOn_meromorphicOrderAt_one_eq_neg_one_analyticAt_hasProd_rsEulerPoly_self701 below Β· depth 17 - Twisting a cusp-realizable GLβ eigensystem by a ray class character
AutomorphicForm.exists_isArithGenuineCuspRealizable_rayClassChar_twist_of_coversModCentre96 below Β· depth 17 - Partial RankinβSelberg product: meromorphy and pole rigidity
AutomorphicForm.exists_lt_one_meromorphicOn_hasProd_rsEulerPoly_and_agreesAwayFromFinite_of_meromorphicOrderAt_one_neg735 below Β· depth 17 - Pole at s=1 of partial RankinβSelberg Euler products
AutomorphicForm.exists_lt_one_meromorphicOn_hasProd_rsEulerPoly_self_and_meromorphicOrderAt_one_neg703 below Β· depth 17 - Signed ray law for a finite-order Hecke character on principal ideals
HeckeCharacter.raySymbol_apply_uniformizerIdele_eq_prod_archLocalChar_neg_one_of_admitsModulus7 below Β· depth 17 - Genericity at places off the level and exceptional set
AutomorphicForm.SmoothCuspRealizationAt.a_sq_ne_b_mul_of_not_dvd_level_of_not_mem_exceptionalSet25 below Β· depth 18 - Partial RankinβSelberg product with a pole at s=1
AutomorphicForm.exists_finset_lt_one_meromorphicOn_analyticAt_hasProd_rsEulerPoly_self_and_eval_inv_absNorm_ne_zero702 below Β· depth 18 - Partial RankinβSelberg product for two cusp-realizable eigensystems
AutomorphicForm.exists_finset_lt_one_meromorphicOn_hasProd_rsEulerPoly_and_agreesAwayFromFinite_of_meromorphicOrderAt_one_neg734 below Β· depth 18 - RankinβSelberg Euler product for a cuspidal-constituent cusp realization
AutomorphicForm.SmoothCuspRealizationAt.exists_lt_one_meromorphicOn_analyticAt_hasProd_rsEulerPoly_self_of_isCuspConstituent553 below Β· depth 19 - Partial RankinβSelberg Euler product: meromorphy past s=1 and rigidity
AutomorphicForm.SmoothCuspRealizationAt.exists_lt_one_meromorphicOn_hasProd_rsEulerPoly_and_agreesAwayFromFinite_pair_of_isCuspConstituent595 below Β· depth 19 - Twisting a cusp realization by βdetβ_A^t
AutomorphicForm.SmoothCuspRealizationAt.exists_twist_rpow_absNorm_exceptionalSet_eq_toFun_eq_ideleNorm_det_rpow_mul10 below Β· depth 19 - Regularised partial RankinβSelberg product over β
AutomorphicForm.exists_finset_neg_analyticAt_ofReal_hasProd_rsEulerPoly_self_div_sub_one_rat663 below Β· depth 22