import Mathlib.Algebra.Polynomial.Basic import Mathlib.Algebra.BigOperators.Finprod import Mathlib.RingTheory.DedekindDomain.Ideal.Lemmas import Mathlib.RingTheory.Ideal.Norm.AbsNorm import Mathlib.NumberTheory.RamificationInertia.Inertia import Mathlib.NumberTheory.NumberField.Basic import Mathlib.Tactic.Ring import Definitions.Def_LanglandsTunnell_HonestLDatum noncomputable section open Polynomial IsDedekindDomain NumberField namespace LanglandsTunnell.RankinSelberg section Induced variable (F : Type*) [Field F] {K : Type*} [Field K] [Algebra (๐“ž F) (๐“ž K)] [Algebra.IsIntegral (๐“ž F) (๐“ž K)] {R : Type*} [CommRing R] variable (K) in def primeFibre (p : HeightOneSpectrum (๐“ž F)) : Set (HeightOneSpectrum (๐“ž K)) := {๐”“ | ๐”“.under (๐“ž F) = p} @[simp] theorem mem_primeFibre (p : HeightOneSpectrum (๐“ž F)) (๐”“ : HeightOneSpectrum (๐“ž K)) : ๐”“ โˆˆ primeFibre F K p โ†” ๐”“.under (๐“ž F) = p := Iff.rfl def inducedFactor (c : HeightOneSpectrum (๐“ž K) โ†’ R) (๐”“ : HeightOneSpectrum (๐“ž K)) : R[X] := C 1 - C (c ๐”“) * X ^ ((๐”“.under (๐“ž F)).asIdeal.inertiaDeg' ๐”“.asIdeal) def inducedEulerPoly (c : HeightOneSpectrum (๐“ž K) โ†’ R) (p : HeightOneSpectrum (๐“ž F)) : R[X] := โˆแถ  ๐”“ โˆˆ primeFibre F K p, inducedFactor F c ๐”“ def inducedE1 (c : HeightOneSpectrum (๐“ž K) โ†’ R) (p : HeightOneSpectrum (๐“ž F)) : R := -(inducedEulerPoly F c p).coeff 1 def inducedE2 (c : HeightOneSpectrum (๐“ž K) โ†’ R) (p : HeightOneSpectrum (๐“ž F)) : R := (inducedEulerPoly F c p).coeff 2 def inducedE3 (c : HeightOneSpectrum (๐“ž K) โ†’ R) (p : HeightOneSpectrum (๐“ž F)) : R := -(inducedEulerPoly F c p).coeff 3 end Induced section RankinSelberg variable {R : Type*} [CommRing R] def rsEulerPoly (a b eโ‚ eโ‚‚ eโ‚ƒ : R) : R[X] := C 1 + C (-(a * eโ‚)) * X + C (a ^ 2 * eโ‚‚ + b * eโ‚ ^ 2 - 2 * b * eโ‚‚) * X ^ 2 + C (-(a ^ 3 * eโ‚ƒ) - a * b * eโ‚ * eโ‚‚ + 3 * a * b * eโ‚ƒ) * X ^ 3 + C (a ^ 2 * b * eโ‚ * eโ‚ƒ - 2 * b ^ 2 * eโ‚ * eโ‚ƒ + b ^ 2 * eโ‚‚ ^ 2) * X ^ 4 + C (-(a * b ^ 2 * eโ‚‚ * eโ‚ƒ)) * X ^ 5 + C (b ^ 3 * eโ‚ƒ ^ 2) * X ^ 6 private theorem rsEulerPoly_eq_prod (ฮฑโ‚ ฮฑโ‚‚ ฮฒโ‚ ฮฒโ‚‚ ฮฒโ‚ƒ : R) : rsEulerPoly (ฮฑโ‚ + ฮฑโ‚‚) (ฮฑโ‚ * ฮฑโ‚‚) (ฮฒโ‚ + ฮฒโ‚‚ + ฮฒโ‚ƒ) (ฮฒโ‚ * ฮฒโ‚‚ + ฮฒโ‚ * ฮฒโ‚ƒ + ฮฒโ‚‚ * ฮฒโ‚ƒ) (ฮฒโ‚ * ฮฒโ‚‚ * ฮฒโ‚ƒ) = (C 1 - C (ฮฑโ‚ * ฮฒโ‚) * X) * (C 1 - C (ฮฑโ‚ * ฮฒโ‚‚) * X) * (C 1 - C (ฮฑโ‚ * ฮฒโ‚ƒ) * X) * ((C 1 - C (ฮฑโ‚‚ * ฮฒโ‚) * X) * (C 1 - C (ฮฑโ‚‚ * ฮฒโ‚‚) * X) * (C 1 - C (ฮฑโ‚‚ * ฮฒโ‚ƒ) * X)) := by simp only [rsEulerPoly, map_add, map_sub, map_neg, map_mul, map_pow, map_ofNat, map_one] ring end RankinSelberg section Datum variable (F : Type*) [Field F] [NumberField F] {K : Type*} [Field K] [Algebra (๐“ž F) (๐“ž K)] [Algebra.IsIntegral (๐“ž F) (๐“ž K)] def rsDatum (S : Finset (HeightOneSpectrum (๐“ž F))) (a b : HeightOneSpectrum (๐“ž F) โ†’ โ„‚) (c : HeightOneSpectrum (๐“ž K) โ†’ โ„‚) (gammaR gammaC gammaRDual gammaCDual : Multiset โ„‚) : LDatum {p : HeightOneSpectrum (๐“ž F) // p โˆ‰ S} where norm := fun p => Ideal.absNorm p.1.asIdeal euler := fun p => rsEulerPoly (a p.1) (b p.1) (inducedE1 F c p.1) (inducedE2 F c p.1) (inducedE3 F c p.1) dual := fun p => rsEulerPoly (a p.1 / b p.1) (b p.1)โปยน (inducedE1 F (fun ๐”“ => (c ๐”“)โปยน) p.1) (inducedE2 F (fun ๐”“ => (c ๐”“)โปยน) p.1) (inducedE3 F (fun ๐”“ => (c ๐”“)โปยน) p.1) gammaR := gammaR gammaC := gammaC gammaRDual := gammaRDual gammaCDual := gammaCDual abscissa := 1 center := 1 / 2 degree := 6 end Datum end LanglandsTunnell.RankinSelberg end