import Definitions.Def_LanglandsTunnell_StandardLocalConstantsAt import Definitions.Def_LanglandsTunnell_ArchEpsilon import Definitions.Def_LanglandsTunnell_HonestLDatum import Definitions.Def_NumberField_TateGlobalZeta import Definitions.Def_AutomorphicForm_HeckeEigenfunction set_option autoImplicit false noncomputable section namespace LanglandsTunnell.Converse open NumberField IsDedekindDomain AutomorphicForm open NumberField.TateGlobal NumberField.StandardAddChar LanglandsTunnell.TateLocal variable (K : Type) [Field K] [NumberField K] def pinnedExp (ฮผ : (AdeleRing (๐“ž K) K)หฃ โ†’* โ„‚หฃ) (v : HeightOneSpectrum (๐“ž K)) : โ„ค := (conductorExponentAt K v (localChar ฮผ v) : โ„ค) + addCharLevel (psiLocal K v) def goodPlaceRootNumber (Pi : HeckeEigensystem K โ„‚) (ฮผ : (AdeleRing (๐“ž K) K)หฃ โ†’* โ„‚หฃ) (v : HeightOneSpectrum (๐“ž K)) : โ„‚ := (Pi.b v : โ„‚) ^ (pinnedExp K ฮผ v) * (stdRootNumberAt K v (localChar ฮผ v)) ^ 2 open Classical in def finiteRootNumber (Pi : HeckeEigensystem K โ„‚) (ฮผ : (AdeleRing (๐“ž K) K)หฃ โ†’* โ„‚หฃ) (S : Finset (HeightOneSpectrum (๐“ž K))) : โ„‚ := โˆแถ  v : HeightOneSpectrum (๐“ž K), if v โˆˆ S then 1 else goodPlaceRootNumber K Pi ฮผ v open Classical in def finiteConductor (ฮผ : (AdeleRing (๐“ž K) K)หฃ โ†’* โ„‚หฃ) (S : Finset (HeightOneSpectrum (๐“ž K))) : โ„ := โˆแถ  v : HeightOneSpectrum (๐“ž K), if v โˆˆ S then 1 else (Ideal.absNorm v.asIdeal : โ„) ^ (2 * pinnedExp K ฮผ v) open Classical in def archRootNumber (archR : โˆ€ w : InfinitePlace K, w.IsReal โ†’ RealArchParam) (archC : โˆ€ w : InfinitePlace K, w.IsComplex โ†’ ComplexArchParam) (uR : โˆ€ w : InfinitePlace K, w.IsReal โ†’ โ„‚) (aR : โˆ€ w : InfinitePlace K, w.IsReal โ†’ ZMod 2) (uC : โˆ€ w : InfinitePlace K, w.IsComplex โ†’ โ„‚) (kC : โˆ€ w : InfinitePlace K, w.IsComplex โ†’ โ„ค) : โ„‚ := ((Finset.univ : Finset {w : InfinitePlace K // w.IsReal}).prod fun w => ((archR w.1 w.2).twist (uR w.1 w.2) (aR w.1 w.2)).epsilonFactor) * ((Finset.univ : Finset {w : InfinitePlace K // w.IsComplex}).prod fun w => ((archC w.1 w.2).twist (uC w.1 w.2) (kC w.1 w.2)).epsilonFactor) def pinnedRootNumber (Pi : HeckeEigensystem K โ„‚) (ฮผ : (AdeleRing (๐“ž K) K)หฃ โ†’* โ„‚หฃ) (S : Finset (HeightOneSpectrum (๐“ž K))) (archR : โˆ€ w : InfinitePlace K, w.IsReal โ†’ RealArchParam) (archC : โˆ€ w : InfinitePlace K, w.IsComplex โ†’ ComplexArchParam) (uR : โˆ€ w : InfinitePlace K, w.IsReal โ†’ โ„‚) (aR : โˆ€ w : InfinitePlace K, w.IsReal โ†’ ZMod 2) (uC : โˆ€ w : InfinitePlace K, w.IsComplex โ†’ โ„‚) (kC : โˆ€ w : InfinitePlace K, w.IsComplex โ†’ โ„ค) : โ„‚ := archRootNumber K archR archC uR aR uC kC * finiteRootNumber K Pi ฮผ S end LanglandsTunnell.Converse end noncomputable section open NumberField AutomorphicForm IsDedekindDomain LanglandsTunnell Polynomial open NumberField.TateGlobal NumberField.InfinitePlace.Completion namespace LanglandsTunnell.Converse variable (K : Type) [Field K] [NumberField K] (Pi : HeckeEigensystem K โ„‚) def IsAdmissibleTwist (ฮผ : (AdeleRing (๐“ž K) K)หฃ โ†’* โ„‚หฃ) : Prop := IsIdeleClassChar (๐“ž K) K ฮผ โˆง Continuous ฮผ โˆง IsUnitaryChar (๐“ž K) K ฮผ def IsArchCompAt (ฮผ : (AdeleRing (๐“ž K) K)หฃ โ†’* โ„‚หฃ) (w : InfinitePlace K) (u : โ„‚) (a : โ„ค) : Prop := โˆ€ x : (w.Completion)หฃ, ((archLocalChar ฮผ w x : โ„‚หฃ) : โ„‚) = ((โ€–(x : w.Completion)โ€– : โ„‚) ^ ((w.mult : โ„‚) * u)) * (extensionEmbedding w (x : w.Completion) / (โ€–(x : w.Completion)โ€– : โ„‚)) ^ a open Classical in def twistedGammaR (archR : โˆ€ w : InfinitePlace K, w.IsReal โ†’ RealArchParam) (uR : โˆ€ w : InfinitePlace K, w.IsReal โ†’ โ„‚) (aR : โˆ€ w : InfinitePlace K, w.IsReal โ†’ ZMod 2) : Multiset โ„‚ := (Finset.univ : Finset {w : InfinitePlace K // w.IsReal}).sum fun w => ((archR w.1 w.2).twist (uR w.1 w.2) (aR w.1 w.2)).gammaR open Classical in def twistedGammaC (archR : โˆ€ w : InfinitePlace K, w.IsReal โ†’ RealArchParam) (archC : โˆ€ w : InfinitePlace K, w.IsComplex โ†’ ComplexArchParam) (uR : โˆ€ w : InfinitePlace K, w.IsReal โ†’ โ„‚) (aR : โˆ€ w : InfinitePlace K, w.IsReal โ†’ ZMod 2) (uC : โˆ€ w : InfinitePlace K, w.IsComplex โ†’ โ„‚) (kC : โˆ€ w : InfinitePlace K, w.IsComplex โ†’ โ„ค) : Multiset โ„‚ := ((Finset.univ : Finset {w : InfinitePlace K // w.IsReal}).sum fun w => ((archR w.1 w.2).twist (uR w.1 w.2) (aR w.1 w.2)).gammaC) + ((Finset.univ : Finset {w : InfinitePlace K // w.IsComplex}).sum fun w => ((archC w.1 w.2).twist (uC w.1 w.2) (kC w.1 w.2)).gammaC) def twistedDatum (S : Finset (HeightOneSpectrum (๐“ž K))) (archR : โˆ€ w : InfinitePlace K, w.IsReal โ†’ RealArchParam) (archC : โˆ€ w : InfinitePlace K, w.IsComplex โ†’ ComplexArchParam) (ฮผ : (AdeleRing (๐“ž K) K)หฃ โ†’* โ„‚หฃ) (uR : โˆ€ w : InfinitePlace K, w.IsReal โ†’ โ„‚) (aR : โˆ€ w : InfinitePlace K, w.IsReal โ†’ ZMod 2) (uC : โˆ€ w : InfinitePlace K, w.IsComplex โ†’ โ„‚) (kC : โˆ€ w : InfinitePlace K, w.IsComplex โ†’ โ„ค) : LDatum {v : HeightOneSpectrum (๐“ž K) // v โˆ‰ S} where norm := fun v => Ideal.absNorm v.1.asIdeal euler := open scoped Classical in fun v => if IsUnramifiedCharAt ฮผ v.1 then C 1 - C (((ฮผ (uniformizerIdele K v.1) : โ„‚หฃ) : โ„‚) * Pi.a v.1) * X + C ((((ฮผ (uniformizerIdele K v.1))^2 : โ„‚หฃ) : โ„‚) * Pi.b v.1) * X ^ 2 else C 1 dual := open scoped Classical in fun v => if IsUnramifiedCharAt ฮผ v.1 then C 1 - C ((((ฮผ (uniformizerIdele K v.1))โปยน : โ„‚หฃ) : โ„‚) * (Pi.a v.1 / Pi.b v.1)) * X + C ((((ฮผ (uniformizerIdele K v.1))^(-2 : โ„ค) : โ„‚หฃ) : โ„‚) * (Pi.b v.1)โปยน) * X ^ 2 else C 1 gammaR := twistedGammaR K archR uR aR gammaC := twistedGammaC K archR archC uR aR uC kC gammaRDual := twistedGammaR K (fun w hw => (archR w hw).dual) (fun w hw => -uR w hw) aR gammaCDual := twistedGammaC K (fun w hw => (archR w hw).dual) (fun w hw => (archC w hw).dual) (fun w hw => -uR w hw) aR (fun w hw => -uC w hw) (fun w hw => -kC w hw) abscissa := 1 center := 1 / 2 degree := 2 def eisensteinTableOf (N : Ideal (๐“ž K)) (hN : N โ‰  โŠฅ) (ฮผโ‚ ฮผโ‚‚ : (AdeleRing (๐“ž K) K)หฃ โ†’* โ„‚หฃ) : HeckeEigensystem K โ„‚ where level := N level_ne_bot := hN a := fun v => ((ฮผโ‚ (uniformizerIdele K v) : โ„‚หฃ) : โ„‚) + ((ฮผโ‚‚ (uniformizerIdele K v) : โ„‚หฃ) : โ„‚) b := fun v => ((ฮผโ‚ (uniformizerIdele K v) : โ„‚หฃ) : โ„‚) * ((ฮผโ‚‚ (uniformizerIdele K v) : โ„‚หฃ) : โ„‚) def IsNicePinned {ฮน : Type*} (D : LDatum ฮน) (ฮ›S ฮ›Sd : โ„‚ โ†’ โ„‚) (ฮต : โ„‚) (N : โ„) : Prop := D.WellFormed โˆง D.Converges โˆง 0 < N โˆง โˆƒ ฮ› ฮ›d : โ„‚ โ†’ โ„‚, Differentiable โ„‚ ฮ› โˆง Differentiable โ„‚ ฮ›d โˆง LDatum.BoundedOnStrips ฮ› โˆง LDatum.BoundedOnStrips ฮ›d โˆง (โˆ€ s : โ„‚, D.abscissa < s.re โ†’ ฮ› s = ฮ›S s * D.archFactor s * D.LFun s) โˆง (โˆ€ s : โ„‚, D.abscissa < s.re โ†’ ฮ›d s = ฮ›Sd s * D.archFactorDual s * D.LFunDual s) โˆง (โˆ€ s : โ„‚, ฮ› s = ฮต * (N : โ„‚) ^ ((D.center : โ„‚) - s) * ฮ›d (2 * (D.center : โ„‚) - s)) def sPart (S : Finset (HeightOneSpectrum (๐“ž K))) (A : (โ†ฅS โ†’ โ„ค) โ†’ โ„‚) (ฮผ : (AdeleRing (๐“ž K) K)หฃ โ†’* โ„‚หฃ) (s : โ„‚) : โ„‚ := โˆ‘' n : โ†ฅS โ†’ โ„ค, A n * โˆ v : โ†ฅS, (((ฮผ (uniformizerIdele K v.1) : โ„‚หฃ) : โ„‚) * ((Ideal.absNorm v.1.asIdeal : โ„•) : โ„‚) ^ ((1 : โ„‚) / 2 - s)) ^ (n v) def sPartDual (S : Finset (HeightOneSpectrum (๐“ž K))) (Ad : (โ†ฅS โ†’ โ„ค) โ†’ โ„‚) (ฮผ : (AdeleRing (๐“ž K) K)หฃ โ†’* โ„‚หฃ) (s : โ„‚) : โ„‚ := โˆ‘' n : โ†ฅS โ†’ โ„ค, Ad n * โˆ v : โ†ฅS, ((((ฮผ (uniformizerIdele K v.1))โปยน : โ„‚หฃ) : โ„‚) * ((Ideal.absNorm v.1.asIdeal : โ„•) : โ„‚) ^ ((1 : โ„‚) / 2 - s)) ^ (n v) end LanglandsTunnell.Converse end noncomputable section open NumberField AutomorphicForm IsDedekindDomain LanglandsTunnell open NumberField.TateGlobal namespace LanglandsTunnell.Converse variable (K : Type) [Field K] [NumberField K] theorem sPartDual_const_mul (S : Finset (HeightOneSpectrum (๐“ž K))) (Ad : (โ†ฅS โ†’ โ„ค) โ†’ โ„‚) (ฮผ : (AdeleRing (๐“ž K) K)หฃ โ†’* โ„‚หฃ) (s c : โ„‚) : c * sPartDual K S Ad ฮผ s = sPartDual K S (fun n => c * Ad n) ฮผ s := by unfold sPartDual rw [โ† tsum_mul_left] exact tsum_congr fun n => by ring theorem sPart_empty (A : (โ†ฅ(โˆ… : Finset (HeightOneSpectrum (๐“ž K))) โ†’ โ„ค) โ†’ โ„‚) (ฮผ : (AdeleRing (๐“ž K) K)หฃ โ†’* โ„‚หฃ) (s : โ„‚) (nโ‚€ : โ†ฅ(โˆ… : Finset (HeightOneSpectrum (๐“ž K))) โ†’ โ„ค) : sPart K โˆ… A ฮผ s = A nโ‚€ := by haveI : IsEmpty โ†ฅ(โˆ… : Finset (HeightOneSpectrum (๐“ž K))) := โŸจfun v => Finset.notMem_empty v.1 v.2โŸฉ have hsub : โˆ€ n : โ†ฅ(โˆ… : Finset (HeightOneSpectrum (๐“ž K))) โ†’ โ„ค, n = nโ‚€ := fun n => funext fun v => isEmptyElim v unfold sPart rw [tsum_eq_single nโ‚€ (fun n hn => (hn (hsub n)).elim), Fintype.prod_empty, mul_one] end LanglandsTunnell.Converse end