Skip to content

Commit e3f00ac

Browse files
WilliamCoramReemMelamed
authored andcommitted
feat: lemmas towards showing gaussNorm on MvPowerSeries is an absolute value (leanprover-community#38049)
We prove lemmas: ``gaussNorm_mul_le`` and ``gaussNorm_le_mul`` which will allow us to show it is an absolute value on Mv restricted power series. Co-authored-by: WilliamCoram <williamecoram@gmail.com>
1 parent 5245172 commit e3f00ac

5 files changed

Lines changed: 173 additions & 51 deletions

File tree

Mathlib/Algebra/Order/Ring/IsNonarchimedean.lean

Lines changed: 58 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ nonarchimedean functions.
1919

2020
public section
2121

22+
/- TODO: Remove the Funlike hypothesis on these statements and turn them all into the form
23+
{f : α → R} + properties on f. -/
24+
2225
namespace IsNonarchimedean
2326

2427
variable {R : Type*} [Semiring R] [LinearOrder R] {a b : R} {m n : ℕ}
@@ -112,6 +115,37 @@ theorem add_eq_max_of_ne {F α : Type*} [AddGroup α] [FunLike F α R]
112115
· rw [add_eq_left_of_lt hna h_lt]
113116
exact (max_eq_left_of_lt h_lt).symm
114117

118+
/- TODO: Remove the funlike conditions on the lemmas required for add_max_of_ne, this will allow us
119+
to remove the CommGroup part in the below which is unnecessary. -/
120+
121+
lemma add_eq_max_of_ne' {α S : Type*} [Semiring S] [LinearOrder S] [AddCommGroup α]
122+
(f : α → S) (fna : IsNonarchimedean f) (Neg : ∀ a, f a = f (-a)) {a b : α}
123+
(hne : f a ≠ f b) : f (a + b) = max (f a) (f b) := by
124+
wlog hab : f a > f b generalizing a b with H
125+
· simpa [add_comm, max_comm] using (H hne.symm ((not_lt.mp hab).lt_of_ne hne))
126+
apply le_antisymm (fna a b)
127+
rcases le_max_iff.mp (fna (a + b) (-b)) with h | h
128+
· simpa [max_eq_left (le_of_lt hab)] using h
129+
· exact absurd h (not_le.mpr (by simpa [Neg b] using hab))
130+
131+
omit [Semiring R] in
132+
open Finset in
133+
/-- Ultrametric inequality with `Finset.sum`. -/
134+
lemma apply_sum_le_sup {α β : Type*} [AddCommMonoid α] {f : α → R}
135+
(nonarch : IsNonarchimedean f) {s : Finset β} (hnonempty : s.Nonempty) {l : β → α} :
136+
f (∑ i ∈ s, l i) ≤ s.sup' hnonempty fun i => f (l i) := by
137+
induction hnonempty using Nonempty.cons_induction with
138+
| singleton i => simp
139+
| cons i s _ hs hind =>
140+
simp only [sum_cons, le_sup'_iff, mem_cons, exists_eq_or_imp]
141+
rw [← le_sup'_iff hs]
142+
rcases le_max_iff.mp <| nonarch (l i) (∑ i ∈ s, l i) with h₁ | h₂
143+
· exact .inl h₁
144+
· exact .inr <| le_trans h₂ hind
145+
146+
@[deprecated (since := "2026-04-27")]
147+
alias apply_sum_le_sup_of_isNonarchimedean := apply_sum_le_sup
148+
115149
omit [Semiring R] in
116150
/-- Given a nonarchimedean function `α → R`, a function `g : β → α` and a nonempty multiset
117151
`s : Multiset β`, we can always find `b : β` belonging to `s` such that
@@ -133,11 +167,10 @@ theorem multiset_image_add_of_nonempty {α β : Type*} [AddCommMonoid α] [Nonem
133167
omit [Semiring R] in
134168
/-- Given a nonarchimedean function `α → R`, a function `g : β → α` and a nonempty finset
135169
`t : Finset β`, we can always find `b : β` belonging to `t` such that `f (t.sum g) ≤ f (g b)` . -/
136-
theorem finset_image_add_of_nonempty {α β : Type*} [AddCommMonoid α] [Nonempty β] {f : α → R}
170+
theorem finset_image_add_of_nonempty {α β : Type*} [AddCommMonoid α] {f : α → R}
137171
(hna : IsNonarchimedean f) (g : β → α) {t : Finset β} (ht : t.Nonempty) :
138172
∃ b ∈ t, f (t.sum g) ≤ f (g b) := by
139-
apply multiset_image_add_of_nonempty hna
140-
simp_all [Finset.nonempty_iff_ne_empty]
173+
simpa [Finset.le_sup'_iff] using IsNonarchimedean.apply_sum_le_sup hna ht
141174

142175
/-- Given a nonnegative nonarchimedean function `α → R` such that `f 0 = 0`, a function `g : β → α`
143176
and a multiset `s : Multiset β`, we can always find `b : β`, belonging to `s` if `s` is nonempty,
@@ -155,13 +188,13 @@ theorem multiset_image_add {F α β : Type*} [AddCommMonoid α] [FunLike F α R]
155188
/-- Given a nonnegative nonarchimedean function `α → R` such that `f 0 = 0`, a function `g : β → α`
156189
and a finset `t : Finset β`, we can always find `b : β`, belonging to `t` if `t` is nonempty,
157190
such that `f (t.sum g) ≤ f (g b)` . -/
158-
theorem finset_image_add {F α β : Type*} [AddCommMonoid α] [FunLike F α R]
159-
[ZeroHomClass F α R] [NonnegHomClass F α R] [Nonempty β] {f : F} (hna : IsNonarchimedean f)
160-
(g : βα) (t : Finset β) :
161-
∃ b : β, (t.Nonempty → b ∈ t) ∧ f (t.sum g) ≤ f (g b) := by
162-
have h1 : t.Nonempty ↔ t.val ≠ 0 := by simp [Finset.nonempty_iff_ne_empty]
163-
rw [h1]
164-
exact multiset_image_add hna g t.val
191+
lemma finset_image_add {α β : Type*} [AddCommMonoid α] [Nonempty β] {f : α → R} (f_zero : f 0 = 0)
192+
(f_nonneg : ∀ x, 0 ≤ f x) (hna : IsNonarchimedean f) (g : β → α) (t : Finset β) :
193+
∃ i, (t.Nonemptyi ∈ t) ∧ f (t.sum g) ≤ f (g i) := by
194+
rcases t.eq_empty_or_nonempty with rfl | ht
195+
· simp [f_zero, f_nonneg]
196+
· exact (fun ⟨i, h, h'⟩ => ⟨i, fun _ ↦ h, h'⟩) <|
197+
IsNonarchimedean.finset_image_add_of_nonempty hna g ht
165198

166199
open Multiset in
167200
theorem multiset_powerset_image_add [IsStrictOrderedRing R]
@@ -186,50 +219,30 @@ theorem finset_powerset_image_add [IsStrictOrderedRing R]
186219
f ((powersetCard (s.card - m) s).sum fun t : Finset β ↦
187220
t.prod fun i : β ↦ -b i) ≤ f (u.val.prod fun i : β ↦ -b i) := by
188221
set g := fun t : Finset β ↦ t.prod fun i : β ↦ - b i
189-
obtain ⟨b, hb_in, hb⟩ := hf_na.finset_image_add g (powersetCard (s.card - m) s)
222+
obtain ⟨b, hb_in, hb⟩ := hf_na.finset_image_add (by grind) (apply_nonneg f)
223+
g (powersetCard (s.card - m) s)
190224
exact ⟨⟨b, hb_in (powersetCard_nonempty.mpr (Nat.sub_le s.card m))⟩, hb⟩
191225

192-
omit [Semiring R] in
193-
open Finset in
194-
/-- Ultrametric inequality with `Finset.sum`. -/
195-
lemma apply_sum_le_sup {α β : Type*} [AddCommMonoid α] {f : α → R}
196-
(nonarch : IsNonarchimedean f) {s : Finset β} (hnonempty : s.Nonempty) {l : β → α} :
197-
f (∑ i ∈ s, l i) ≤ s.sup' hnonempty fun i => f (l i) := by
198-
induction hnonempty using Nonempty.cons_induction with
199-
| singleton i => simp
200-
| cons i s _ hs hind =>
201-
simp only [sum_cons, le_sup'_iff, mem_cons, exists_eq_or_imp]
202-
rw [← le_sup'_iff hs]
203-
rcases le_max_iff.mp <| nonarch (l i) (∑ i ∈ s, l i) with h₁ | h₂
204-
· exact .inl h₁
205-
· exact .inr <| le_trans h₂ hind
206-
207-
@[deprecated (since := "2026-04-27")]
208-
alias apply_sum_le_sup_of_isNonarchimedean := apply_sum_le_sup
209-
210-
open Finset in
211-
lemma apply_sum_eq_of_lt {α β F : Type*} [AddCommGroup α] [FunLike F α R]
212-
[AddGroupSeminormClass F α R] {f : F} (nonarch : IsNonarchimedean f) {s : Finset β} {l : β → α}
213-
{k : β} (hk : k ∈ s) (hmax : ∀ j ∈ s, j ≠ k → f (l j) < f (l k)) :
214-
f (∑ i ∈ s, l i) = f (l k) := by
215-
have : s.Nonempty := by use k
216-
induction this using Nonempty.cons_induction generalizing k with
217-
| singleton a => simp_all
218-
| cons a s _ hs _ =>
219-
by_cases ha : k = a
220-
· rw [sum_cons, ha]
221-
apply add_eq_left_of_lt nonarch
222-
grw [apply_sum_le_sup nonarch hs]
223-
grind [sup'_lt_iff]
224-
· grind [add_eq_right_of_lt nonarch]
226+
lemma apply_sum_eq_of_lt {α β : Type*} [AddCommGroup α] {f : α → R} (fna : IsNonarchimedean f)
227+
(f_neg : ∀ a, f a = f (-a)) {s : Finset β} {l : β → α} {k : β} (hk : k ∈ s)
228+
(hmax : ∀ j ∈ s, j ≠ k → f (l j) < f (l k)) : f (∑ i ∈ s, l i) = f (l k) := by
229+
by_cases hcard : s.card = 1
230+
· grind [Finset.card_eq_one.mp hcard]
231+
· classical
232+
rw [← Finset.add_sum_erase _ _ hk]
233+
have hNonempty : (s.erase k).Nonempty :=
234+
Finset.Nontrivial.erase_nonempty (Finset.one_lt_card_iff_nontrivial.mp (by grind))
235+
have hrest_le := IsNonarchimedean.apply_sum_le_sup fna hNonempty (l := l)
236+
simp only [Finset.le_sup'_iff, Finset.mem_erase, ne_eq] at hrest_le
237+
rw [add_eq_max_of_ne' f fna f_neg (by grind), max_eq_left (le_of_lt (by grind))]
225238

226239
/-- If `f` is a nonarchimedean additive group seminorm on a commutative ring `α`, `n : ℕ`, and
227240
`a b : α`, then we can find `m : ℕ` such that `m ≤ n` and
228241
`f ((a + b) ^ n) ≤ (f (a ^ m)) * (f (b ^ (n - m)))`. -/
229242
theorem add_pow_le {F α : Type*} [CommRing α] [FunLike F α R] [ZeroHomClass F α R]
230243
[NonnegHomClass F α R] [SubmultiplicativeHomClass F α R] {f : F} (hna : IsNonarchimedean f)
231244
(n : ℕ) (a b : α) : ∃ m < n + 1, f ((a + b) ^ n) ≤ f (a ^ m) * f (b ^ (n - m)) := by
232-
obtain ⟨m, hm_lt, hM⟩ := finset_image_add hna
245+
obtain ⟨m, hm_lt, hM⟩ := finset_image_add (by aesop) (by aesop) hna
233246
(fun m => a ^ m * b ^ (n - m) * ↑(n.choose m)) (Finset.range (n + 1))
234247
simp only [Finset.nonempty_range_iff, ne_eq, Nat.succ_ne_zero, not_false_iff, Finset.mem_range,
235248
forall_true_left] at hm_lt

Mathlib/Analysis/Normed/Unbundled/FiniteExtension.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ theorem norm_mul_le_const_mul_norm {i : ι} (hBi : B i = (1 : L))
120120
obtain ⟨k, -, (hk : ‖∑ i : ι, (B.repr x i • ∑ i_1 : ι,
121121
B.repr y i_1 • B.repr (B i * B i_1)) ixy‖ ≤
122122
‖(B.repr x k • ∑ j : ι, B.repr y j • B.repr (B k * B j)) ixy‖)⟩ :=
123-
IsNonarchimedean.finset_image_add hna'
123+
IsNonarchimedean.finset_image_add (map_zero _) (apply_nonneg _) hna'
124124
(fun i ↦ (B.repr x i • ∑ i_1 : ι, B.repr y i_1 • B.repr (B i * B i_1)) ixy)
125125
(univ : Finset ι)
126126
simp only [Finsupp.coe_smul, Finsupp.coe_finsetSum, Pi.smul_apply, Finset.sum_apply,
@@ -130,7 +130,7 @@ theorem norm_mul_le_const_mul_norm {i : ι} (hBi : B i = (1 : L))
130130
obtain ⟨k', hk'⟩ : ∃ (k' : ι),
131131
‖∑ j : ι, B.repr y j • B.repr (B k * B j) ixy‖ ≤
132132
‖B.repr y k' • B.repr (B k * B k') ixy‖ := by
133-
obtain ⟨k, hk0, hk⟩ := IsNonarchimedean.finset_image_add hna'
133+
obtain ⟨k, hk0, hk⟩ := IsNonarchimedean.finset_image_add (map_zero _) (apply_nonneg _) hna'
134134
(fun i ↦ B.repr y i • B.repr (B k * B i) ixy) (univ : Finset ι)
135135
exact ⟨k, hk⟩
136136
apply le_trans (mul_le_mul_of_nonneg_left hk' (norm_nonneg _))

Mathlib/Analysis/Normed/Unbundled/SpectralNorm.lean

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,8 @@ theorem norm_root_le_spectralValue {f : AlgebraNorm K L} (hf_pm : IsPowMul f)
271271
set g := fun i : ℕ ↦ p.coeff i • x ^ i
272272
obtain ⟨m, hm_in, hm⟩ : ∃ (m : ℕ) (_ : 0 < p.natDegree → m < p.natDegree),
273273
f ((Finset.range p.natDegree).sum g) ≤ f (g m) := by
274-
obtain ⟨m, hm, h⟩ := IsNonarchimedean.finset_image_add hf_na g (Finset.range p.natDegree)
274+
obtain ⟨m, hm, h⟩ := IsNonarchimedean.finset_image_add (map_zero _) (apply_nonneg _) hf_na g
275+
(Finset.range p.natDegree)
275276
rw [Finset.nonempty_range_iff, ← zero_lt_iff, Finset.mem_range] at hm
276277
exact ⟨m, hm, h⟩
277278
exact lt_of_le_of_lt hm (hn' m (hm_in h_deg))

Mathlib/RingTheory/MvPowerSeries/GaussNorm.lean

Lines changed: 110 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ module
88
public import Mathlib.Analysis.Normed.Ring.Basic
99
public import Mathlib.RingTheory.MvPowerSeries.Basic
1010

11+
public import Mathlib.Algebra.Order.Ring.IsNonarchimedean
12+
1113
/-!
1214
# Gauss norm for multivariate power series
1315
@@ -37,7 +39,11 @@ the set of all values of `v (coeff t f) * ∏ i : t.support, c i` for all `t :
3739

3840
namespace MvPowerSeries
3941

40-
variable {R σ : Type*} [Semiring R] (v : R → ℝ) (c : σ → ℝ) (f : MvPowerSeries σ R)
42+
variable {R σ : Type*} (v : R → ℝ) (c : σ → ℝ) (f : MvPowerSeries σ R)
43+
44+
section Semiring
45+
46+
variable [Semiring R]
4147

4248
/-- Given a multivariate power series `f` in, a function `v : R → ℝ` and a tuple `c` of real
4349
numbers, the Gauss norm is defined as the supremum of the set of all values of
@@ -81,7 +87,7 @@ lemma gaussNorm_eq_zero_iff (vZero : v 0 = 0) (vNonneg : ∀ a, v a ≥ 0)
8187
_ ≤ _ := le_gaussNorm v c f hbd n
8288

8389
lemma gaussNorm_add_le_max (f g : MvPowerSeries σ R) (hc : 0 ≤ c)
84-
(vNonneg : ∀ a, v a ≥ 0) (hv : ∀ x y, v (x + y) ≤ max (v x) (v y))
90+
(vNonneg : ∀ a, v a ≥ 0) (hv : IsNonarchimedean v)
8591
(hbfd : HasGaussNorm v c f) (hbgd : HasGaussNorm v c g) :
8692
gaussNorm v c (f + g) ≤ max (gaussNorm v c f) (gaussNorm v c g) := by
8793
have H (t : σ →₀ ℕ) : 0 ≤ ∏ i ∈ t.support, c i ^ t i :=
@@ -120,4 +126,106 @@ lemma gaussNorm_add_le_max (f g : MvPowerSeries σ R) (hc : 0 ≤ c)
120126
left
121127
exact gaussNorm_nonneg v c f vNonneg
122128

129+
private lemma c_prod_nonneg (hc : 0 ≤ c) (t : σ →₀ ℕ) : 0 ≤ t.prod (c · ^ ·) :=
130+
Finset.prod_nonneg (fun i _ ↦ pow_nonneg (hc i) (t i))
131+
132+
lemma gaussNorm_mul_le (f g : MvPowerSeries σ R) (hc : 0 ≤ c) (vNonneg : ∀ a, v a ≥ 0)
133+
(vMul : ∀ a b, v (a * b) ≤ v a * v b) (vna : IsNonarchimedean v)
134+
(vZero : v 0 = 0) (hbfd : HasGaussNorm v c f) (hbgd : HasGaussNorm v c g) :
135+
gaussNorm v c (f * g) ≤ gaussNorm v c f * gaussNorm v c g := by
136+
classical
137+
refine Real.iSup_le ?_ ?_
138+
· intro t
139+
obtain ⟨k, hk, hsum⟩ := IsNonarchimedean.finset_image_add vZero vNonneg vna
140+
(fun a ↦ coeff a.1 f * coeff a.2 g) (Finset.antidiagonal t)
141+
have hk' : k.1 + k.2 = t := by
142+
simpa [Finset.mem_antidiagonal] using hk (Finset.nonempty_def.mpr ⟨(t, 0), by simp⟩)
143+
have hprod : t.prod (c · ^ ·) = k.1.prod (c · ^ ·) * k.2.prod (c · ^ ·) := by
144+
simp [← hk', Finsupp.prod_add_index' (h := (c · ^ ·)) (by grind) (by grind)]
145+
rw [hprod]
146+
refine (mul_le_mul hsum (by rfl) (mul_nonneg (c_prod_nonneg c hc k.1) (c_prod_nonneg c hc k.2))
147+
(vNonneg _)).trans ?_
148+
have : v ((coeff k.1) f * (coeff k.2) g) * (k.1.prod (c · ^ ·) * k.2.prod (c · ^ ·)) ≤
149+
(v (coeff k.1 f) * k.1.prod (c · ^ ·)) * (v (coeff k.2 g) * k.2.prod (c · ^ ·)) := by
150+
calc
151+
_ ≤ v (coeff k.1 f) * v (coeff k.2 g) * (k.1.prod (c · ^ ·) * k.2.prod (c · ^ ·)) :=
152+
mul_le_mul (vMul _ _) (by rfl) (mul_nonneg (c_prod_nonneg c hc k.1)
153+
(c_prod_nonneg c hc k.2)) (mul_nonneg (vNonneg _) (vNonneg _))
154+
_ = _ := by ring
155+
exact this.trans (mul_le_mul (le_gaussNorm v c f hbfd k.1) (le_gaussNorm v c g hbgd k.2)
156+
(mul_nonneg (vNonneg _) (c_prod_nonneg c hc k.2)) (gaussNorm_nonneg v c f vNonneg))
157+
· exact mul_nonneg (gaussNorm_nonneg v c f vNonneg) (gaussNorm_nonneg v c g vNonneg)
158+
159+
end Semiring
160+
161+
variable [Ring R]
162+
163+
/-- Predicate for when the gaussNorm is achieved by an index. -/
164+
abbrev AchievesGaussNorm (i : σ →₀ ℕ) : Prop :=
165+
v (coeff i f) * i.prod (c · ^ ·) = gaussNorm v c f
166+
167+
section absoluteValue
168+
169+
variable {α S : Type*} [LinearOrder S] [AddCommGroup α] (f : α → S)
170+
171+
lemma ultrametric_strict (na : IsNonarchimedean f)
172+
(Neg : ∀ a, f a = f (-a)) {a b : α} (hne : f a ≠ f b) : f (a + b) = max (f a) (f b) := by
173+
wlog hab : f a > f b generalizing a b with H
174+
· simpa [add_comm, max_comm] using (H hne.symm ((not_lt.mp hab).lt_of_ne hne))
175+
apply le_antisymm (na a b)
176+
rcases le_max_iff.mp (na (a + b) (-b)) with h | h
177+
· simpa [max_eq_left (le_of_lt hab)] using h
178+
· exact absurd h (not_le.mpr (by simpa [Neg b] using hab))
179+
180+
variable [Semiring S]
181+
182+
lemma Finset.Nonempty.map_sum_le_sup'_map
183+
{α S : Type*} [Semiring S] [LinearOrder S] [AddCommMonoid α] (g : α → S)
184+
{ι : Type*} {s : Finset ι} (hs : s.Nonempty) (f : ι → α)
185+
(na : ∀ a b, g (a + b) ≤ max (g a) (g b)) :
186+
g (∑ i ∈ s, f i) ≤ s.sup' hs fun x ↦ g (f x) := by
187+
simp only [Finset.le_sup'_iff]
188+
induction hs using Finset.Nonempty.cons_induction with
189+
| singleton j => simp only [Finset.mem_singleton, Finset.sum_singleton, exists_eq_left, le_refl]
190+
| cons j s hj _ IH =>
191+
simp only [Finset.sum_cons, Finset.mem_cons, exists_eq_or_imp]
192+
refine (le_total (g (∑ i ∈ s, f i)) (g (f j))).imp ?_ ?_ <;> intro h
193+
· exact (na _ _).trans (max_eq_left h).le
194+
· exact ⟨_, IH.choose_spec.left, (na _ _).trans <|
195+
((max_eq_right h).le.trans IH.choose_spec.right)⟩
196+
197+
variable [DecidableEq σ] (f g : MvPowerSeries σ R)
198+
199+
lemma antidiagonal_dominant (i j : σ →₀ ℕ) (vna : IsNonarchimedean v)
200+
(vMulEq : ∀ a b, v (a * b) = v a * v b) (vNeg : ∀ a, v a = v (-a))
201+
(hdom : ∀ p ∈ Finset.antidiagonal (i + j), p ≠ (i, j) →
202+
v (coeff p.1 f * coeff p.2 g) < v (coeff i f) * v (coeff j g)) :
203+
v (coeff (i + j) (f * g)) = v (coeff i f * coeff j g) := by
204+
rw [← vMulEq] at hdom
205+
rw [coeff_mul, IsNonarchimedean.apply_sum_eq_of_lt vna (by grind) (k := (i, j))
206+
(s := Finset.antidiagonal (i + j)) (Finset.mem_antidiagonal.mpr rfl) hdom]
207+
208+
lemma gaussNorm_le_mul (vMulEq : ∀ a b, v (a * b) = v a * v b)
209+
(vna : IsNonarchimedean v) (vNeg : ∀ a, v a = v (-a))
210+
(hbfg : HasGaussNorm v c (f * g))
211+
(hdom : ∃ i j, AchievesGaussNorm v c f i ∧ AchievesGaussNorm v c g j ∧
212+
∀ p ∈ Finset.antidiagonal (i + j), p ≠ (i, j) →
213+
v (coeff p.1 f * coeff p.2 g) < v (coeff i f) * v (coeff j g)) :
214+
gaussNorm v c f * gaussNorm v c g ≤ gaussNorm v c (f * g) := by
215+
obtain ⟨i₀, j₀, hi₀, hj₀, hdom'⟩ := hdom
216+
unfold AchievesGaussNorm at hi₀ hj₀
217+
calc
218+
_ = (v (coeff i₀ f) * i₀.prod (c · ^ ·)) * (v (coeff j₀ g) * j₀.prod (c · ^ ·)) := by
219+
rw [← hi₀, ← hj₀]
220+
_ = v (coeff i₀ f) * v (coeff j₀ g) * ((i₀ + j₀).prod (c · ^ ·)) := by
221+
have hprod : (i₀ + j₀).prod (c · ^ ·) = i₀.prod (c · ^ ·) * j₀.prod (c · ^ ·) := by
222+
simp [Finsupp.prod_add_index', pow_add]
223+
rw [hprod]; ring
224+
_ = v (coeff i₀ f * coeff j₀ g) * (i₀ + j₀).prod (c · ^ ·) := by rw [vMulEq]
225+
_ = v (coeff (i₀ + j₀) (f * g)) * (i₀ + j₀).prod (c · ^ ·) := by
226+
rw [antidiagonal_dominant v f g i₀ j₀ vna vMulEq vNeg hdom']
227+
_ ≤ gaussNorm v c (f * g) := le_gaussNorm v c (f * g) hbfg (i₀ + j₀)
228+
229+
end absoluteValue
230+
123231
end MvPowerSeries

Mathlib/RingTheory/Polynomial/GaussNorm.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ private theorem mul_gaussNorm_le_gaussNorm_mul (p q : R[X]) :
235235
apply le_of_eq_of_le _ <| (p * q).le_gaussNorm v hc0 (i + j)
236236
-- gaussNorm v c p * gaussNorm v c q is actually equal to v ((p * q).coeff (i + j)) * c ^ (i + j)
237237
rw [hi_p, hj_q, coeff_mul, Nat.sum_antidiagonal_eq_sum_range_succ_mk,
238-
IsNonarchimedean.apply_sum_eq_of_lt hna (k := i) (by simp)]
238+
IsNonarchimedean.apply_sum_eq_of_lt hna (k := i) (by simp) (by simp)]
239239
/- IsNonarchimedean.apply_sum_eq_of_lt makes the goal almost trivial so we are left to prove
240240
the hmax hypothesis -/
241241
· grind

0 commit comments

Comments
 (0)