import Definitions.Def_NumberField_AdelicTraceProducer import Definitions.Def_NumberField_IntegralAdelicTrace import Definitions.Def_NumberField_AdelicBox import Mathlib.Topology.Algebra.RestrictedProduct.TopologicalSpace set_option synthInstance.maxHeartbeats 100000 namespace NumberField.StandardAddChar noncomputable section open IsDedekindDomain NumberField NumberField.AdelicBox NumberField.AdelicTrace Topology Filter section FiniteTrace variable (K : Type) [Field K] [NumberField K] private def sm (z : Ξ  v : HeightOneSpectrum (π“ž K), v.adicCompletionIntegers K) : FiniteAdeleRing (π“ž K) K := RestrictedProduct.structureMap (fun v : HeightOneSpectrum (π“ž K) => v.adicCompletion K) (fun v => (v.adicCompletionIntegers K : Set (v.adicCompletion K))) Filter.cofinite z private theorem sm_apply (z : Ξ  v : HeightOneSpectrum (π“ž K), v.adicCompletionIntegers K) (v : HeightOneSpectrum (π“ž K)) : sm K z v = (z v : v.adicCompletion K) := rfl private theorem sm_add (x y : Ξ  v : HeightOneSpectrum (π“ž K), v.adicCompletionIntegers K) : sm K (x + y) = sm K x + sm K y := RestrictedProduct.ext _ _ fun v => rfl private theorem sm_zero : sm K 0 = 0 := RestrictedProduct.ext _ _ fun v => rfl private def smHom : (Ξ  v : HeightOneSpectrum (π“ž K), v.adicCompletionIntegers K) β†’+ FiniteAdeleRing (π“ž K) K where toFun := sm K map_zero' := sm_zero K map_add' := sm_add K private theorem continuous_sm : Continuous (sm K) := (RestrictedProduct.isEmbedding_structureMap).continuous private theorem sm_mem (z : Ξ  v : HeightOneSpectrum (π“ž K), v.adicCompletionIntegers K) : sm K z ∈ integralFiniteAdeles (π“ž K) K := fun v => (z v).2 private theorem sm_diag (a : π“ž K) : sm K (diag K a) = algebraMap K (FiniteAdeleRing (π“ž K) K) (a : K) := RestrictedProduct.ext _ _ fun v => by change ((algebraMap (π“ž K) (v.adicCompletionIntegers K) a : v.adicCompletion K)) = _ rw [coe_algebraMap_adicCompletionIntegers] rfl private def pre (z : FiniteAdeleRing (π“ž K) K) (hz : z ∈ integralFiniteAdeles (π“ž K) K) : Ξ  v : HeightOneSpectrum (π“ž K), v.adicCompletionIntegers K := fun v => ⟨z v, hz v⟩ private theorem sm_pre (z : FiniteAdeleRing (π“ž K) K) (hz : z ∈ integralFiniteAdeles (π“ž K) K) : sm K (pre K z hz) = z := RestrictedProduct.ext _ _ fun v => rfl private theorem pre_sm (w : Ξ  v : HeightOneSpectrum (π“ž K), v.adicCompletionIntegers K) : pre K (sm K w) (sm_mem K w) = w := funext fun v => Subtype.ext rfl private theorem pre_add (z₁ zβ‚‚ : FiniteAdeleRing (π“ž K) K) (h₁ : z₁ ∈ integralFiniteAdeles (π“ž K) K) (hβ‚‚ : zβ‚‚ ∈ integralFiniteAdeles (π“ž K) K) (h : z₁ + zβ‚‚ ∈ integralFiniteAdeles (π“ž K) K) : pre K (z₁ + zβ‚‚) h = pre K z₁ h₁ + pre K zβ‚‚ hβ‚‚ := funext fun v => Subtype.ext rfl private theorem exists_eq_of_algebraMap_mem {ΞΎ : K} (h : algebraMap K (FiniteAdeleRing (π“ž K) K) ΞΎ ∈ integralFiniteAdeles (π“ž K) K) : βˆƒ a : π“ž K, (a : K) = ΞΎ := by have hint : βˆ€ v : HeightOneSpectrum (π“ž K), v.valuation K ΞΎ ≀ 1 := fun v => by have hv : (algebraMap K (FiniteAdeleRing (π“ž K) K) ΞΎ) v ∈ v.adicCompletionIntegers K := h v rwa [HeightOneSpectrum.mem_adicCompletionIntegers, show (algebraMap K (FiniteAdeleRing (π“ž K) K) ΞΎ) v = (ΞΎ : v.adicCompletion K) from rfl, HeightOneSpectrum.valuedAdicCompletion_eq_valuation'] at hv obtain ⟨a, ha⟩ := HeightOneSpectrum.mem_integers_of_valuation_le_one K ΞΎ hint exact ⟨a, by rw [RingOfIntegers.coe_eq_algebraMap]; exact ha⟩ variable (F : Type) [Field F] [NumberField F] private def traceFinAux (x : FiniteAdeleRing (π“ž F) F) (k : F) (hk : algebraMap F (FiniteAdeleRing (π“ž F) F) k + x ∈ integralFiniteAdeles (π“ž F) F) : FiniteAdeleRing (π“ž β„š) β„š := sm β„š (traceInt F (pre F _ hk)) - algebraMap β„š (FiniteAdeleRing (π“ž β„š) β„š) (Algebra.trace β„š F k) private theorem sm_traceInt_diag (a : π“ž F) : sm β„š (traceInt F (diag F a)) = algebraMap β„š (FiniteAdeleRing (π“ž β„š) β„š) (Algebra.trace β„š F (a : F)) := by rw [traceInt_diag, ← diag_eq, sm_diag, ← Algebra.coe_trace_int] congr 1 private theorem traceFinAux_eq (x : FiniteAdeleRing (π“ž F) F) (k k' : F) (hk : algebraMap F (FiniteAdeleRing (π“ž F) F) k + x ∈ integralFiniteAdeles (π“ž F) F) (hk' : algebraMap F (FiniteAdeleRing (π“ž F) F) k' + x ∈ integralFiniteAdeles (π“ž F) F) : traceFinAux F x k hk = traceFinAux F x k' hk' := by have hdiff : algebraMap F (FiniteAdeleRing (π“ž F) F) (k - k') ∈ integralFiniteAdeles (π“ž F) F := by have : algebraMap F (FiniteAdeleRing (π“ž F) F) (k - k') = (algebraMap F _ k + x) - (algebraMap F _ k' + x) := by rw [(algebraMap F (FiniteAdeleRing (π“ž F) F)).map_sub]; ring rw [this] exact fun v => sub_mem (hk v) (hk' v) obtain ⟨a, ha⟩ := exists_eq_of_algebraMap_mem F hdiff have hpre : pre F _ hk = pre F _ hk' + diag F a := by funext v apply Subtype.ext show (algebraMap F (FiniteAdeleRing (π“ž F) F) k + x) v = (algebraMap F (FiniteAdeleRing (π“ž F) F) k' + x) v + (diag F a v : v.adicCompletion F) rw [diag_apply, coe_algebraMap_adicCompletionIntegers] have hk_eq : k = k' + (a : F) := by rw [ha]; ring rw [hk_eq, (algebraMap F (FiniteAdeleRing (π“ž F) F)).map_add] show ((algebraMap F _ k' + algebraMap F _ (a : F)) + x) v = _ rw [add_right_comm] rfl unfold traceFinAux rw [hpre, (traceInt F).map_add, sm_add, sm_traceInt_diag, ha, (Algebra.trace β„š F).map_sub, (algebraMap β„š (FiniteAdeleRing (π“ž β„š) β„š)).map_sub] ring def traceFinHom : FiniteAdeleRing (π“ž F) F β†’+ FiniteAdeleRing (π“ž β„š) β„š := AddMonoidHom.mk' (fun x => traceFinAux F x (Classical.choose (exists_algebraMap_add_mem_integralFiniteAdeles (π“ž F) F x)) (Classical.choose_spec (exists_algebraMap_add_mem_integralFiniteAdeles (π“ž F) F x))) (by intro x y set kx := Classical.choose (exists_algebraMap_add_mem_integralFiniteAdeles (π“ž F) F x) have hkx := Classical.choose_spec (exists_algebraMap_add_mem_integralFiniteAdeles (π“ž F) F x) set ky := Classical.choose (exists_algebraMap_add_mem_integralFiniteAdeles (π“ž F) F y) have hky := Classical.choose_spec (exists_algebraMap_add_mem_integralFiniteAdeles (π“ž F) F y) have hkxy : algebraMap F (FiniteAdeleRing (π“ž F) F) (kx + ky) + (x + y) ∈ integralFiniteAdeles (π“ž F) F := by have : algebraMap F (FiniteAdeleRing (π“ž F) F) (kx + ky) + (x + y) = (algebraMap F _ kx + x) + (algebraMap F _ ky + y) := by rw [(algebraMap F (FiniteAdeleRing (π“ž F) F)).map_add]; ring rw [this]; exact fun v => add_mem (hkx v) (hky v) show traceFinAux F (x + y) _ _ = traceFinAux F x kx hkx + traceFinAux F y ky hky rw [traceFinAux_eq F (x + y) _ (kx + ky) _ hkxy] unfold traceFinAux have hpre : pre F _ hkxy = pre F _ hkx + pre F _ hky := by funext v; apply Subtype.ext show (algebraMap F (FiniteAdeleRing (π“ž F) F) (kx + ky) + (x + y)) v = _ rw [show algebraMap F (FiniteAdeleRing (π“ž F) F) (kx + ky) + (x + y) = (algebraMap F _ kx + x) + (algebraMap F _ ky + y) by rw [(algebraMap F (FiniteAdeleRing (π“ž F) F)).map_add]; ring] rfl rw [hpre, (traceInt F).map_add, sm_add, (Algebra.trace β„š F).map_add, (algebraMap β„š (FiniteAdeleRing (π“ž β„š) β„š)).map_add] ring) private theorem traceFinHom_eq (x : FiniteAdeleRing (π“ž F) F) (k : F) (hk : algebraMap F (FiniteAdeleRing (π“ž F) F) k + x ∈ integralFiniteAdeles (π“ž F) F) : traceFinHom F x = sm β„š (traceInt F (pre F _ hk)) - algebraMap β„š (FiniteAdeleRing (π“ž β„š) β„š) (Algebra.trace β„š F k) := traceFinAux_eq F x _ k _ hk theorem traceFinHom_algebraMap (q : F) : traceFinHom F (algebraMap F (FiniteAdeleRing (π“ž F) F) q) = algebraMap β„š (FiniteAdeleRing (π“ž β„š) β„š) (Algebra.trace β„š F q) := by have h0 : algebraMap F (FiniteAdeleRing (π“ž F) F) (-q) + algebraMap F (FiniteAdeleRing (π“ž F) F) q ∈ integralFiniteAdeles (π“ž F) F := by rw [(algebraMap F (FiniteAdeleRing (π“ž F) F)).map_neg, neg_add_cancel]; exact fun v => zero_mem _ rw [traceFinHom_eq F _ (-q) h0] have hpre : pre F _ h0 = 0 := by funext v; apply Subtype.ext show (algebraMap F (FiniteAdeleRing (π“ž F) F) (-q) + algebraMap F (FiniteAdeleRing (π“ž F) F) q) v = _ rw [(algebraMap F (FiniteAdeleRing (π“ž F) F)).map_neg, neg_add_cancel]; rfl rw [hpre, (traceInt F).map_zero, sm_zero, (Algebra.trace β„š F).map_neg, (algebraMap β„š (FiniteAdeleRing (π“ž β„š) β„š)).map_neg, zero_sub, neg_neg] private theorem traceFinHom_sm (w : Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F) : traceFinHom F (sm F w) = sm β„š (traceInt F w) := by have h0 : algebraMap F (FiniteAdeleRing (π“ž F) F) 0 + sm F w ∈ integralFiniteAdeles (π“ž F) F := by rw [(algebraMap F (FiniteAdeleRing (π“ž F) F)).map_zero, zero_add]; exact sm_mem F w rw [traceFinHom_eq F _ 0 h0] have hpre : pre F _ h0 = w := by funext v; apply Subtype.ext show (algebraMap F (FiniteAdeleRing (π“ž F) F) 0 + sm F w) v = (w v : v.adicCompletion F) rw [(algebraMap F (FiniteAdeleRing (π“ž F) F)).map_zero, zero_add]; rfl rw [hpre, (Algebra.trace β„š F).map_zero, (algebraMap β„š (FiniteAdeleRing (π“ž β„š) β„š)).map_zero, sub_zero] theorem traceFinHom_structureMap (w : Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F) : traceFinHom F (RestrictedProduct.structureMap (fun v : HeightOneSpectrum (π“ž F) => v.adicCompletion F) (fun v => (v.adicCompletionIntegers F : Set (v.adicCompletion F))) Filter.cofinite w) = RestrictedProduct.structureMap (fun v : HeightOneSpectrum (π“ž β„š) => v.adicCompletion β„š) (fun v => (v.adicCompletionIntegers β„š : Set (v.adicCompletion β„š))) Filter.cofinite (traceInt F w) := traceFinHom_sm F w theorem continuous_traceFinHom : Continuous (traceFinHom F) := by apply continuous_of_continuousAt_zero rw [ContinuousAt, (traceFinHom F).map_zero] have hopen : βˆ€ v : HeightOneSpectrum (π“ž F), IsOpen ((v.adicCompletionIntegers F : Set (v.adicCompletion F))) := fun v => Valued.isOpen_valuationSubring _ have h0 : (0 : FiniteAdeleRing (π“ž F) F) = sm F 0 := (sm_zero F).symm have hnhds : 𝓝 (0 : FiniteAdeleRing (π“ž F) F) = Filter.map (sm F) (𝓝 0) := by rw [h0] exact RestrictedProduct.nhds_zero_eq_map_structureMap (fun v : HeightOneSpectrum (π“ž F) => v.adicCompletion F) (B := fun v => v.adicCompletionIntegers F) hopen rw [hnhds, Filter.tendsto_map'_iff] have : (traceFinHom F) ∘ sm F = sm β„š ∘ traceInt F := funext fun w => traceFinHom_sm F w rw [this] have hc : Continuous (sm β„š ∘ traceInt F) := (continuous_sm β„š).comp (continuous_traceInt F) have h00 : (sm β„š ∘ traceInt F) 0 = 0 := by show sm β„š (traceInt F 0) = 0 rw [(traceInt F).map_zero, sm_zero] have ht := hc.tendsto 0 rwa [h00] at ht def adelicTraceData : AdelicTraceData F := archTraceDataOf F (traceFinHom F) (traceFinHom_algebraMap F) (continuous_traceFinHom F) abbrev stdAddChar : AddChar (AdeleRing (π“ž F) F) β„‚ := (adelicTraceData F).psiK end FiniteTrace end end NumberField.StandardAddChar