import Definitions.Def_NumberField_AdelicBox import Mathlib.RingTheory.DedekindDomain.Factorization import Mathlib.RingTheory.Ideal.Norm.AbsNorm import Mathlib.NumberTheory.NumberField.Basic import Mathlib.RingTheory.Trace.Basic import Mathlib.Topology.Algebra.RestrictedProduct.Basic import Mathlib.Topology.Algebra.IsUniformGroup.Basic import Mathlib.Topology.UniformSpace.UniformEmbedding import Mathlib.Topology.DenseEmbedding set_option autoImplicit false namespace NumberField.AdelicTrace open IsDedekindDomain IsDedekindDomain.HeightOneSpectrum NumberField NumberField.AdelicBox Topology Filter Set open scoped nonZeroDivisors variable (F : Type) [Field F] [NumberField F] def valBox (N : β„•) : Set (Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F) := {z | βˆ€ v, Valued.v ((z v : v.adicCompletion F)) ≀ Valued.v (algebraMap (π“ž F) (v.adicCompletion F) (N : π“ž F))} variable {F} theorem mem_valBox {N : β„•} {z : Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F} : z ∈ valBox F N ↔ βˆ€ v, Valued.v ((z v : v.adicCompletion F)) ≀ Valued.v (algebraMap (π“ž F) (v.adicCompletion F) (N : π“ž F)) := Iff.rfl theorem algebraMap_adicCompletion_eq (v : HeightOneSpectrum (π“ž F)) (a : π“ž F) : algebraMap (π“ž F) (v.adicCompletion F) a = ((a : F) : v.adicCompletion F) := IsScalarTower.algebraMap_apply (π“ž F) F (v.adicCompletion F) a theorem valued_algebraMap (v : HeightOneSpectrum (π“ž F)) (a : π“ž F) : Valued.v (algebraMap (π“ž F) (v.adicCompletion F) a) = v.intValuation a := by rw [algebraMap_adicCompletion_eq, valuedAdicCompletion_eq_valuation', valuation_of_algebraMap] theorem coe_algebraMap_adicCompletionIntegers (v : HeightOneSpectrum (π“ž F)) (a : π“ž F) : ((algebraMap (π“ž F) (v.adicCompletionIntegers F) a : v.adicCompletion F)) = algebraMap (π“ž F) (v.adicCompletion F) a := by rw [algebraMap_adicCompletionIntegers_apply, algebraMap_adicCompletion_eq] theorem algebraMap_adicCompletion_injective (v : HeightOneSpectrum (π“ž F)) : Function.Injective (algebraMap (π“ž F) (v.adicCompletion F)) := fun a b h => by rw [algebraMap_adicCompletion_eq, algebraMap_adicCompletion_eq] at h exact RingOfIntegers.coe_injective ((algebraMap F (v.adicCompletion F)).injective h) theorem natCast_ringOfIntegers_ne_zero {N : β„•} (hN : N β‰  0) : (N : π“ž F) β‰  0 := Nat.cast_ne_zero.mpr hN theorem zero_mem_valBox (N : β„•) : (0 : Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F) ∈ valBox F N := fun v => by simp only [Pi.zero_apply, ZeroMemClass.coe_zero, map_zero, zero_le'] theorem add_mem_valBox {N : β„•} {x y : Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F} (hx : x ∈ valBox F N) (hy : y ∈ valBox F N) : x + y ∈ valBox F N := fun v => by simp only [Pi.add_apply, AddMemClass.coe_add] exact Valuation.map_add_le _ (hx v) (hy v) theorem neg_mem_valBox {N : β„•} {x : Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F} (hx : x ∈ valBox F N) : -x ∈ valBox F N := fun v => by simp only [Pi.neg_apply, NegMemClass.coe_neg, Valuation.map_neg] exact hx v theorem sub_mem_valBox {N : β„•} {x y : Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F} (hx : x ∈ valBox F N) (hy : y ∈ valBox F N) : x - y ∈ valBox F N := by rw [sub_eq_add_neg]; exact add_mem_valBox hx (neg_mem_valBox hy) theorem valBox_subset_of_dvd {M N : β„•} (h : M ∣ N) : valBox F N βŠ† valBox F M := by intro z hz v obtain ⟨k, rfl⟩ := h refine (hz v).trans ?_ rw [Nat.cast_mul, map_mul, Valuation.map_mul, valued_algebraMap (a := (k : π“ž F))] exact mul_le_of_le_one_right' (intValuation_le_one v _) theorem natCast_dvd_of_mem_valBox {N : β„•} (hN : N β‰  0) {a : π“ž F} (h : (fun v : HeightOneSpectrum (π“ž F) => algebraMap (π“ž F) (v.adicCompletionIntegers F) a) ∈ valBox F N) : (N : π“ž F) ∣ a := by have hNF : ((N : π“ž F) : F) β‰  0 := RingOfIntegers.coe_ne_zero_iff.mpr (natCast_ringOfIntegers_ne_zero hN) set y : F := (a : F) / ((N : π“ž F) : F) with hy have hyint : βˆ€ v : HeightOneSpectrum (π“ž F), v.valuation F y ≀ 1 := fun v => by have hv := h v rw [coe_algebraMap_adicCompletionIntegers, valued_algebraMap, valued_algebraMap] at hv have hN0 : v.intValuation (N : π“ž F) β‰  0 := intValuation_ne_zero v _ (natCast_ringOfIntegers_ne_zero hN) rw [hy, map_divβ‚€, valuation_of_algebraMap, valuation_of_algebraMap] exact (div_le_oneβ‚€ (zero_lt_iff.mpr hN0)).mpr hv obtain ⟨c, hc⟩ := mem_integers_of_valuation_le_one F y hyint refine ⟨c, RingOfIntegers.coe_injective ?_⟩ change (a : F) = ((N : π“ž F) * c : π“ž F) rw [RingOfIntegers.coe_eq_algebraMap ((N : π“ž F) * c), map_mul, hc, hy, ← RingOfIntegers.coe_eq_algebraMap, mul_div_cancelβ‚€ _ hNF] theorem natCast_dvd_trace_sub {N : β„•} (hN : N β‰  0) {a b : π“ž F} (h : (fun v : HeightOneSpectrum (π“ž F) => algebraMap (π“ž F) (v.adicCompletionIntegers F) (a - b)) ∈ valBox F N) : (N : β„€) ∣ Algebra.trace β„€ (π“ž F) a - Algebra.trace β„€ (π“ž F) b := by obtain ⟨c, hc⟩ := natCast_dvd_of_mem_valBox hN h refine ⟨Algebra.trace β„€ (π“ž F) c, ?_⟩ rw [← map_sub, hc, show ((N : π“ž F) * c : π“ž F) = (N : β„€) β€’ c by rw [zsmul_eq_mul, Int.cast_natCast], map_zsmul, smul_eq_mul] theorem valBox_mem_nhds_zero {N : β„•} (hN : N β‰  0) : valBox F N ∈ 𝓝 (0 : Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F) := by set S : Set (HeightOneSpectrum (π“ž F)) := {v | v.asIdeal ∣ Ideal.span {(N : π“ž F)}} with hS have hSfin : S.Finite := Ideal.finite_factors (by intro h0 rw [Ideal.zero_eq_bot, Ideal.span_singleton_eq_bot] at h0 exact natCast_ringOfIntegers_ne_zero hN h0) let B : βˆ€ v : HeightOneSpectrum (π“ž F), Set (v.adicCompletionIntegers F) := fun v => {x | Valued.v ((x : v.adicCompletion F)) < Valued.v (algebraMap (π“ž F) (v.adicCompletion F) (N : π“ž F))} have hB : βˆ€ v, B v ∈ 𝓝 (0 : v.adicCompletionIntegers F) := fun v => by have hN0 : algebraMap (π“ž F) (v.adicCompletion F) (N : π“ž F) β‰  0 := fun h0 => natCast_ringOfIntegers_ne_zero hN (algebraMap_adicCompletion_injective v (h0.trans (map_zero _).symm)) have h1 := ball_mem_nhds (π“ž F) F v (0 : v.adicCompletion F) _ hN0 simp only [sub_zero] at h1 have h2 : (fun x : v.adicCompletionIntegers F => (x : v.adicCompletion F)) ⁻¹' {z | Valued.v z < Valued.v (algebraMap (π“ž F) (v.adicCompletion F) (N : π“ž F))} ∈ 𝓝 (0 : v.adicCompletionIntegers F) := continuous_subtype_val.continuousAt.preimage_mem_nhds (by simpa using h1) exact h2 refine mem_of_superset (set_pi_mem_nhds hSfin fun v _ => hB v) fun z hz v => ?_ by_cases hv : v ∈ S Β· exact le_of_lt (hz v hv) Β· have hN1 : Valued.v (algebraMap (π“ž F) (v.adicCompletion F) (N : π“ž F)) = 1 := by rw [valued_algebraMap] refine intValuation_eq_one_iff.mpr fun hmem => hv ?_ rw [hS, Set.mem_setOf_eq, Ideal.dvd_span_singleton] exact hmem rw [hN1] exact (mem_adicCompletionIntegers _ _ _).mp (z v).2 theorem isClosed_setOf_valued_le (v : HeightOneSpectrum (π“ž F)) (r : WithZero (Multiplicative β„€)) : IsClosed {y : v.adicCompletion F | Valued.v y ≀ r} := by rw [← isOpen_compl_iff, isOpen_iff_mem_nhds] intro y hy simp only [Set.mem_compl_iff, Set.mem_setOf_eq, not_le] at hy have hy0 : y β‰  0 := fun h0 => by rw [h0, map_zero] at hy; exact not_lt_zero' hy refine mem_of_superset (ball_mem_nhds (π“ž F) F v y y hy0) fun z hz => ?_ simp only [Set.mem_setOf_eq] at hz simp only [Set.mem_compl_iff, Set.mem_setOf_eq, not_le] have : Valued.v z = Valued.v y := by have := Valuation.map_add_eq_of_lt_left (v := (Valued.v : Valuation (v.adicCompletion F) _)) hz rwa [add_sub_cancel] at this rwa [this] theorem isClosed_valBox (N : β„•) : IsClosed (valBox F N) := by have : valBox F N = β‹‚ v, (fun z : (Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F) => (z v : v.adicCompletion F)) ⁻¹' {y | Valued.v y ≀ Valued.v (algebraMap (π“ž F) (v.adicCompletion F) (N : π“ž F))} := by ext z; simp only [valBox, Set.mem_setOf_eq, Set.mem_iInter, Set.mem_preimage] rw [this] exact isClosed_iInter fun v => (isClosed_setOf_valued_le v _).preimage (continuous_subtype_val.comp (continuous_apply v)) theorem eq_zero_of_forall_mem_valBox {z : Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F} (hz : βˆ€ N : β„•, N β‰  0 β†’ z ∈ valBox F N) : z = 0 := by funext v apply Subtype.ext change (z v : v.adicCompletion F) = 0 have hle : βˆ€ n : β„•, Valued.v (z v : v.adicCompletion F) ≀ WithZero.exp (-(n : β„€)) := by intro n have hI : (v.asIdeal ^ n : Ideal (π“ž F)) β‰  βŠ₯ := pow_ne_zero _ v.ne_bot set N : β„• := Ideal.absNorm (v.asIdeal ^ n : Ideal (π“ž F)) with hN have hN0 : N β‰  0 := by rw [hN, Ne, Ideal.absNorm_eq_zero_iff]; exact hI have hNmem : (N : π“ž F) ∈ v.asIdeal ^ n := by rw [hN]; exact Ideal.absNorm_mem _ refine (hz N hN0 v).trans ?_ rw [valued_algebraMap] exact (intValuation_le_pow_iff_mem v _ n).mpr hNmem by_contra hne have hne' : Valued.v (z v : v.adicCompletion F) β‰  0 := (Valuation.ne_zero_iff _).mpr hne obtain ⟨m, hm⟩ : βˆƒ m : β„€, Valued.v (z v : v.adicCompletion F) = WithZero.exp m := ⟨WithZero.log (Valued.v (z v : v.adicCompletion F)), (WithZero.exp_log hne').symm⟩ have := hle ((-m).toNat + 1) rw [hm, WithZero.exp_le_exp] at this omega theorem exists_valBox_subset {U : Set (Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F)} (hU : U ∈ 𝓝 (0 : Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F)) : βˆƒ N : β„•, N β‰  0 ∧ valBox F N βŠ† U := by haveI : Nonempty {N : β„• // N β‰  0} := ⟨⟨1, one_ne_zero⟩⟩ have hdir : Directed (Β· βŠ‡ Β·) (fun N : {N : β„• // N β‰  0} => valBox F N.1) := by rintro ⟨M, hM⟩ ⟨N, hN⟩ exact ⟨⟨M * N, mul_ne_zero hM hN⟩, valBox_subset_of_dvd (Dvd.intro _ rfl), valBox_subset_of_dvd (Dvd.intro_left _ rfl)⟩ obtain ⟨⟨N, hN⟩, h⟩ := exists_subset_nhds_of_isCompact' hdir (fun N => (isClosed_valBox N.1).isCompact) (fun N => isClosed_valBox N.1) (U := U) (fun x hx => by have hx0 : x = 0 := eq_zero_of_forall_mem_valBox fun N hN => Set.mem_iInter.mp hx ⟨N, hN⟩ rwa [hx0]) exact ⟨N, hN, h⟩ theorem exists_sub_algebraMap_mem_valBox (z : Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F) {N : β„•} (hN : N β‰  0) : βˆƒ a : π“ž F, (z - fun v : HeightOneSpectrum (π“ž F) => algebraMap (π“ž F) (v.adicCompletionIntegers F) a) ∈ valBox F N := by let x : FiniteAdeleRing (π“ž F) F := RestrictedProduct.structureMap (fun v : HeightOneSpectrum (π“ž F) => v.adicCompletion F) (fun v => (v.adicCompletionIntegers F : Set (v.adicCompletion F))) Filter.cofinite z have hx : βˆ€ v, x v = (z v : v.adicCompletion F) := fun v => rfl have hxint : x ∈ integralFiniteAdeles (π“ž F) F := fun v => by rw [hx]; exact (z v).2 obtain ⟨a, ha⟩ := exists_forall_valued_sub_le (π“ž F) F hxint (natCast_ringOfIntegers_ne_zero hN) refine ⟨a, fun v => ?_⟩ have h := ha v rw [hx, ← IsScalarTower.algebraMap_apply, ← IsScalarTower.algebraMap_apply] at h simpa only [Pi.sub_apply, AddSubgroupClass.coe_sub, coe_algebraMap_adicCompletionIntegers] using h noncomputable section section Extension open Topology Filter variable (K : Type) [Field K] [NumberField K] def diag : π“ž K β†’+* (Ξ  v : HeightOneSpectrum (π“ž K), v.adicCompletionIntegers K) := RingHom.pi fun v => algebraMap (π“ž K) (v.adicCompletionIntegers K) @[simp] theorem diag_apply (a : π“ž K) (v : HeightOneSpectrum (π“ž K)) : diag K a v = algebraMap (π“ž K) (v.adicCompletionIntegers K) a := rfl theorem diag_eq (a : π“ž K) : diag K a = fun v : HeightOneSpectrum (π“ž K) => algebraMap (π“ž K) (v.adicCompletionIntegers K) a := rfl theorem nonempty_heightOneSpectrum : Nonempty (HeightOneSpectrum (π“ž K)) := by obtain ⟨M, hM⟩ := Ideal.exists_maximal (π“ž K) exact ⟨⟨M, hM.isPrime, Ring.ne_bot_of_isMaximal_of_not_isField hM (RingOfIntegers.not_isField K)⟩⟩ theorem diag_injective : Function.Injective (diag K) := by intro a b hab obtain ⟨v⟩ := nonempty_heightOneSpectrum K exact algebraMap_adicCompletion_injective v (by have h := congrFun hab v simp only [diag_apply] at h have := congrArg (fun x : v.adicCompletionIntegers K => (x : v.adicCompletion K)) h simpa [coe_algebraMap_adicCompletionIntegers] using this) theorem diag_mem_valBox_of_dvd {N : β„•} {a : π“ž K} (h : (N : π“ž K) ∣ a) : diag K a ∈ valBox K N := by obtain ⟨c, rfl⟩ := h intro v simp only [diag_apply, map_mul] change Valued.v (((algebraMap (π“ž K) (v.adicCompletionIntegers K) (N : π“ž K) : v.adicCompletion K)) * ((algebraMap (π“ž K) (v.adicCompletionIntegers K) c : v.adicCompletion K))) ≀ _ rw [map_mul] have hc : Valued.v ((algebraMap (π“ž K) (v.adicCompletionIntegers K) c : v.adicCompletion K)) ≀ 1 := (algebraMap (π“ž K) (v.adicCompletionIntegers K) c).2 calc _ ≀ Valued.v ((algebraMap (π“ž K) (v.adicCompletionIntegers K) (N : π“ž K) : v.adicCompletion K)) * 1 := mul_le_mul' le_rfl hc _ = _ := by rw [mul_one]; rfl theorem denseRange_diag : DenseRange (diag K) := by intro z rw [mem_closure_iff_nhds] intro U hU have hU0 : (fun y => y + z) ⁻¹' U ∈ 𝓝 (0 : Ξ  v : HeightOneSpectrum (π“ž K), v.adicCompletionIntegers K) := by have : Continuous fun y : (Ξ  v : HeightOneSpectrum (π“ž K), v.adicCompletionIntegers K) => y + z := continuous_id.add continuous_const exact this.continuousAt.preimage_mem_nhds (by simpa using hU) obtain ⟨N, hN, hsub⟩ := exists_valBox_subset hU0 obtain ⟨a, ha⟩ := exists_sub_algebraMap_mem_valBox z hN refine ⟨diag K a, ?_, ⟨a, rfl⟩⟩ have hmem : diag K a - z ∈ valBox K N := by have := neg_mem_valBox ha simpa [diag_eq] using this have := hsub hmem simpa using this end Extension section Trace open Topology Filter variable (F : Type) [Field F] [NumberField F] def traceDiag : π“ž F β†’+ (Ξ  w : HeightOneSpectrum (π“ž β„š), w.adicCompletionIntegers β„š) := (diag β„š).toAddMonoidHom.comp ((algebraMap β„€ (π“ž β„š)).toAddMonoidHom.comp (Algebra.trace β„€ (π“ž F)).toAddMonoidHom) @[simp] theorem traceDiag_apply (a : π“ž F) : traceDiag F a = diag β„š (algebraMap β„€ (π“ž β„š) (Algebra.trace β„€ (π“ž F) a)) := rfl theorem traceDiag_sub_mem_valBox {N : β„•} (hN : N β‰  0) {a b : π“ž F} (h : diag F (a - b) ∈ valBox F N) : traceDiag F a - traceDiag F b ∈ valBox β„š N := by rw [← map_sub, traceDiag_apply] apply diag_mem_valBox_of_dvd obtain ⟨t, ht⟩ := natCast_dvd_trace_sub hN h refine ⟨algebraMap β„€ (π“ž β„š) t, ?_⟩ rw [LinearMap.map_sub, ht, map_mul] congr 1 private def S : AddSubgroup (Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F) := (diag F).toAddMonoidHom.range private theorem dense_S : Dense ((S F : AddSubgroup (Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F)) : Set (Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F)) := by have : ((S F : AddSubgroup _) : Set (Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F)) = Set.range (diag F) := by ext x; simp [S] rw [this] exact denseRange_diag F private def eS : π“ž F ≃+ S F := AddMonoidHom.ofInjective (f := (diag F).toAddMonoidHom) (diag_injective F) private theorem eS_apply_coe (a : π“ž F) : ((eS F a : S F) : Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F) = diag F a := rfl private def fβ‚€ : S F β†’+ (Ξ  w : HeightOneSpectrum (π“ž β„š), w.adicCompletionIntegers β„š) := (traceDiag F).comp (eS F).symm.toAddMonoidHom private theorem fβ‚€_eS (a : π“ž F) : fβ‚€ F (eS F a) = traceDiag F a := by simp [fβ‚€] private theorem continuous_fβ‚€ : Continuous (fβ‚€ F) := by apply continuous_of_continuousAt_zero rw [ContinuousAt, map_zero] intro U hU obtain ⟨N, hN, hsub⟩ := exists_valBox_subset hU have hV : (Subtype.val ⁻¹' valBox F N : Set (S F)) ∈ 𝓝 (0 : S F) := continuous_subtype_val.continuousAt.preimage_mem_nhds (by simpa using valBox_mem_nhds_zero (F := F) hN) refine Filter.mem_map.mpr (Filter.mem_of_superset hV fun s hs => hsub ?_) obtain ⟨a, rfl⟩ := (eS F).surjective s show fβ‚€ F (eS F a) ∈ valBox β„š N rw [fβ‚€_eS] have : diag F (a - 0) ∈ valBox F N := by simpa [eS_apply_coe] using hs simpa using traceDiag_sub_mem_valBox F hN this private theorem uniformContinuous_fβ‚€ : UniformContinuous (fβ‚€ F) := uniformContinuous_addMonoidHom_of_continuous (continuous_fβ‚€ F) private theorem di : IsDenseInducing (Subtype.val : S F β†’ Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F) := (dense_S F).isDenseInducing_val private theorem tendsto_fβ‚€ (b : Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F) : βˆƒ c, Tendsto (fβ‚€ F) (comap Subtype.val (𝓝 b)) (𝓝 c) := uniformly_extend_exists isUniformEmbedding_subtype_val.isUniformInducing (dense_S F).denseRange_val (uniformContinuous_fβ‚€ F) b def traceInt : (Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F) β†’+ (Ξ  w : HeightOneSpectrum (π“ž β„š), w.adicCompletionIntegers β„š) where toFun := (di F).extend (fβ‚€ F) map_zero' := by have := (di F).extend_eq (continuous_fβ‚€ F) (0 : S F) simpa using this map_add' := by have hc : Continuous ((di F).extend (fβ‚€ F)) := (di F).continuous_extend (tendsto_fβ‚€ F) intro x y refine DenseRange.induction_onβ‚‚ (p := fun x y => (di F).extend (fβ‚€ F) (x + y) = (di F).extend (fβ‚€ F) x + (di F).extend (fβ‚€ F) y) (dense_S F).denseRange_val ?_ ?_ x y Β· exact isClosed_eq (hc.comp (continuous_fst.add continuous_snd)) ((hc.comp continuous_fst).add (hc.comp continuous_snd)) Β· intro s t rw [← AddSubgroup.coe_add, (di F).extend_eq (continuous_fβ‚€ F), (di F).extend_eq (continuous_fβ‚€ F), (di F).extend_eq (continuous_fβ‚€ F), map_add] theorem continuous_traceInt : Continuous (traceInt F) := (di F).continuous_extend (tendsto_fβ‚€ F) theorem traceInt_diag (a : π“ž F) : traceInt F (diag F a) = fun w : HeightOneSpectrum (π“ž β„š) => algebraMap (π“ž β„š) (w.adicCompletionIntegers β„š) (algebraMap β„€ (π“ž β„š) (Algebra.trace β„€ (π“ž F) a)) := by show (di F).extend (fβ‚€ F) ((eS F a : S F) : Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F) = _ rw [(di F).extend_eq (continuous_fβ‚€ F), fβ‚€_eS] rfl theorem eq_traceInt {T : (Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F) β†’+ (Ξ  w : HeightOneSpectrum (π“ž β„š), w.adicCompletionIntegers β„š)} (hT : Continuous T) (h : βˆ€ a : π“ž F, T (diag F a) = traceInt F (diag F a)) : T = traceInt F := by refine AddMonoidHom.ext fun x => ?_ exact DenseRange.induction_on (denseRange_diag F) x (isClosed_eq hT (continuous_traceInt F)) h theorem existsUnique_traceInt : βˆƒ! T : (Ξ  v : HeightOneSpectrum (π“ž F), v.adicCompletionIntegers F) β†’+ (Ξ  w : HeightOneSpectrum (π“ž β„š), w.adicCompletionIntegers β„š), Continuous T ∧ βˆ€ a : π“ž F, T (fun v => algebraMap (π“ž F) (v.adicCompletionIntegers F) a) = fun w : HeightOneSpectrum (π“ž β„š) => algebraMap (π“ž β„š) (w.adicCompletionIntegers β„š) (algebraMap β„€ (π“ž β„š) (Algebra.trace β„€ (π“ž F) a)) := by refine ⟨traceInt F, ⟨continuous_traceInt F, fun a => traceInt_diag F a⟩, ?_⟩ rintro T ⟨hT, hTa⟩ exact eq_traceInt F hT fun a => (hTa a).trans (traceInt_diag F a).symm end Trace end end NumberField.AdelicTrace