English
If a polynomial p over a normed field K factors into linear factors in an extension L, then the spectral value equals the maximum of the norms of its roots in L.
Русский
Если многочлен p над нормированным полем K раскладывается в линейные множители в расширении L, то спектральное значение равно максимуму норм его корней в L.
LaTeX
$$$$\operatorname{spectralValue}(p)=\max_{i} \|\alpha_i\|,$$ где p = ∏(X - C(α_i)) в некотором разложении в полях/L.$$
Lean4
/-- If `f` is a nonarchimedean, power-multiplicative `K`-algebra norm on `L`, then the spectral
value of a polynomial `p : K[X]` that decomposes into linear factors in `L` is equal to the
maximum of the norms of the roots. See [S. Bosch, U. Güntzer, R. Remmert, *Non-Archimedean Analysis*
(Proposition 3.1.2/1(2))][bosch-guntzer-remmert]. -/
theorem max_norm_root_eq_spectralValue [DecidableEq L] {f : AlgebraNorm K L} (hf_pm : IsPowMul f)
(hf_na : IsNonarchimedean f) (hf1 : f 1 = 1) (p : K[X]) (s : Multiset L)
(hp : mapAlg K L p = (map (fun a : L ↦ X - C a) s).prod) : (⨆ x : L, if x ∈ s then f x else 0) = spectralValue p :=
by
have h_le : 0 ≤ ⨆ x : L, ite (x ∈ s) (f x) 0 :=
by
apply iSup_nonneg (fun _ ↦ ?_)
split_ifs
exacts [apply_nonneg _ _, le_refl _]
apply le_antisymm
· apply ciSup_le (fun x ↦ ?_)
by_cases hx : x ∈ s
· have hx0 : aeval x p = 0 := aeval_root_of_mapAlg_eq_multiset_prod_X_sub_C s hx hp
rw [if_pos hx]
exact norm_root_le_spectralValue hf_pm hf_na (monic_of_monic_mapAlg (hp ▸ monic_multisetProd_X_sub_C s)) hx0
· simp only [if_neg hx, spectralValue_nonneg _]
· apply ciSup_le (fun m ↦ ?_)
by_cases hm : m < p.natDegree
· rw [spectralValueTerms_of_lt_natDegree _ hm]
have h : 0 < (p.natDegree - m : ℝ) := by rw [sub_pos, Nat.cast_lt]; exact hm
rw [← rpow_le_rpow_iff (rpow_nonneg (norm_nonneg _) _) h_le h, ← rpow_mul (norm_nonneg _),
one_div_mul_cancel (ne_of_gt h), rpow_one, ← Nat.cast_sub (le_of_lt hm), rpow_natCast]
have hps : card s = p.natDegree := by
rw [← natDegree_map (algebraMap K L), ← mapAlg_eq_map, hp, natDegree_multiset_prod_X_sub_C_eq_card]
have hc : ‖p.coeff m‖ = f (((mapAlg K L) p).coeff m) := by
rw [← AlgebraNorm.extends_norm hf1, mapAlg_eq_map, coeff_map]
rw [hc, hp, prod_X_sub_C_coeff s (hps ▸ le_of_lt hm)]
have h : f ((-1) ^ (card s - m) * s.esymm (card s - m)) = f (s.esymm (card s - m)) :=
by
rcases neg_one_pow_eq_or L (card s - m) with h1 | hn1
· rw [h1, one_mul]
· rw [hn1, neg_mul, one_mul, map_neg_eq_map]
rw [h, esymm]
obtain ⟨t, ht_card, hts, ht_ge⟩ :
∃ t : Multiset L,
card t = card s - m ∧ (∀ x : L, x ∈ t → x ∈ s) ∧ f (map prod (powersetCard (card s - m) s)).sum ≤ f t.prod :=
hf_na.multiset_powerset_image_add s m
apply le_trans ht_ge
have h_pr : f t.prod ≤ (t.map f).prod :=
le_prod_of_submultiplicative_of_nonneg f (apply_nonneg _) (le_of_eq hf1) (map_mul_le_mul _) t
apply le_trans h_pr
have hs_ne : s ≠ 0 :=
have hpos : 0 < s.toFinset.card :=
by
have hs0 : 0 < s.card := hps ▸ lt_of_le_of_lt (zero_le _) hm
obtain ⟨x, hx⟩ := card_pos_iff_exists_mem.mp hs0
exact Finset.card_pos.mpr ⟨x, mem_toFinset.mpr hx⟩
toFinset_nonempty.mp (Finset.card_pos.mp hpos)
obtain ⟨y, hyx, hy_max⟩ : ∃ y : L, y ∈ s ∧ ∀ z : L, z ∈ s → f z ≤ f y := exists_max_image f hs_ne
have : (map f t).prod ≤ f y ^ (p.natDegree - m) :=
by
set g : L → NNReal := fun x ↦ ⟨f x, apply_nonneg f x⟩
have h_card : p.natDegree - m = card (t.map g) := by rw [card_map, ht_card, ← hps]
have hx_le : ∀ x : NNReal, x ∈ map g t → x ≤ g y :=
by
intro r hr
obtain ⟨_, hzt, hzr⟩ := mem_map.mp hr
exact hzr ▸ hy_max _ (hts _ hzt)
have : (map g t).prod ≤ g y ^ (p.natDegree - m) := h_card ▸ prod_le_pow_card _ _ hx_le
simpa [g, ← NNReal.coe_le_coe, NNReal.coe_pow, NNReal.coe_mk, NNReal.coe_multiset_prod, map_map,
Function.comp_apply, NNReal.coe_mk] using this
have h_bdd : BddAbove (Set.range fun x : L ↦ ite (x ∈ s) (f x) 0) :=
by
use f y
intro r hr
obtain ⟨z, hz⟩ := Set.mem_range.mpr hr
simp only at hz
rw [← hz]
split_ifs with h
· exact hy_max _ h
· exact apply_nonneg _ _
exact le_trans this (pow_le_pow_left₀ (apply_nonneg _ _) (le_trans (by rw [if_pos hyx]) (le_ciSup h_bdd y)) _)
· simp only [spectralValueTerms, if_neg hm, h_le]