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