@@ -33,6 +33,13 @@ the set of all values of `v (coeff t f) * ∏ i : t.support, c i` for all `t :
3333* `MvPowerSeries.gaussNorm_add_le_max`: if `v` is a non-negative non-archimedean function and the
3434 set of values `v (coeff t f) * ∏ i : t.support, c i` is bounded above (similarly for `g`), then
3535 the Gauss norm has the non-archimedean property.
36+
37+ * `MvPowerSeries.AchievesGaussNorm`: a type `i` is said to achieve gauss norm if
38+ `v (coeff i f) * i.prod (c · ^ ·) = gaussNorm v c f`.
39+
40+ * `MvPowerSeries.gaussNorm_neg`: if `v` has the property that `∀ i, v i = v (-i)` then
41+ `gaussNorm v c (-f) = gaussNorm v c f `.
42+
3643 -/
3744
3845@[expose] public section
@@ -164,6 +171,12 @@ variable [Ring R]
164171abbrev AchievesGaussNorm (i : σ →₀ ℕ) : Prop :=
165172 v (coeff i f) * i.prod (c · ^ ·) = gaussNorm v c f
166173
174+ lemma gaussNorm_neg (vNeg : ∀ x, v (-x) = v x) (f : MvPowerSeries σ R) :
175+ gaussNorm v c (-f) = gaussNorm v c f := by
176+ simp_rw [gaussNorm]
177+ have (t : σ →₀ ℕ) : (coeff t) (-f) = - (coeff t) f := by rfl
178+ simp_rw [this , vNeg]
179+
167180section absoluteValue
168181
169182variable {α S : Type *} [LinearOrder S] [AddCommGroup α] (f : α → S)
@@ -226,6 +239,30 @@ lemma gaussNorm_le_mul (vMulEq : ∀ a b, v (a * b) = v a * v b)
226239 rw [antidiagonal_dominant v f g i₀ j₀ vna vMulEq vNeg hdom']
227240 _ ≤ gaussNorm v c (f * g) := le_gaussNorm v c (f * g) hbfg (i₀ + j₀)
228241
242+ lemma gaussNorm_mul_eq_mul (f g : MvPowerSeries σ R) (hf : HasGaussNorm v c f)
243+ (hg : HasGaussNorm v c g) (hfg : HasGaussNorm v c (f * g))
244+ (vNonneg : ∀ a, v a ≥ 0 ) (vZero : v 0 = 0 ) (vNA : IsNonarchimedean v)
245+ (vMulEq : ∀ (a b : R), v (a * b) = v a * v b) (vNeg : ∀ (a : R), v (-a) = v a)
246+ (h_eq_zero : ∀ (x : R), v x = 0 → x = 0 ) (hc : ∀ (i : σ), 0 < c i)
247+ (hdom : ∃ i j, AchievesGaussNorm v c f i ∧ AchievesGaussNorm v c g j ∧
248+ ∀ p ∈ Finset.antidiagonal (i + j), p ≠ (i, j) → v (coeff p.1 f * coeff p.2 g) <
249+ v (coeff i f) * v (coeff j g)) :
250+ gaussNorm v c (f * g) = gaussNorm v c f * gaussNorm v c g := by
251+ by_cases hf' : f = 0
252+ · simp [hf', gaussNorm_zero v c vZero]
253+ by_cases hg' : g = 0
254+ · simp [hg', gaussNorm_zero v c vZero]
255+ have hf1 : gaussNorm v c f ≠ 0 := by
256+ convert gaussNorm_eq_zero_iff v c f vZero vNonneg h_eq_zero hc hf
257+ grind
258+ have hg1 : gaussNorm v c g ≠ 0 := by
259+ convert gaussNorm_eq_zero_iff v c g vZero vNonneg h_eq_zero hc hg
260+ grind
261+ apply ge_antisymm_iff.mpr
262+ constructor
263+ · exact gaussNorm_le_mul v c f g vMulEq vNA (by grind) hfg hdom
264+ · exact gaussNorm_mul_le v c f g (StrongLT.le hc) vNonneg (by grind) vNA vZero hf hg
265+
229266end absoluteValue
230267
231268end MvPowerSeries
0 commit comments