Skip to content

Commit c92d338

Browse files
committed
feat(RingTheory/PowerSeries/Order): PowerSeries.divXPowOrder_pow (#31331)
* Deprecate `divXPowOrder_mul_divXPowerOrder` in favour of `divXPowOrder_mul` (the same equality in reverse, the conventional direction for monoid homs) * Define MonoidHom versions of `order` and `divXPowOrder` and use them to prove `order_pow` and `order_prod`, `divXPowOrder_pow` and `divXPowOrder_prod` (in a nontrivial semiring with no zero divisors).
1 parent 5300519 commit c92d338

File tree

2 files changed

+53
-29
lines changed

2 files changed

+53
-29
lines changed

Mathlib/RingTheory/PowerSeries/Inverse.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ instance : NormalizationMonoid k⟦X⟧ where
327327
simp only [← mul_inv, inv_inj]
328328
simp only [Unit_of_divided_by_X_pow_order_nonzero (mul_ne_zero hf hg),
329329
Unit_of_divided_by_X_pow_order_nonzero hf, Unit_of_divided_by_X_pow_order_nonzero hg,
330-
Units.ext_iff, Units.val_mul, divXPowOrder_mul_divXPowOrder]
330+
Units.ext_iff, Units.val_mul, ← divXPowOrder_mul]
331331
normUnit_coe_units := by
332332
intro u
333333
set u₀ := u.1 with hu

Mathlib/RingTheory/PowerSeries/Order.lean

Lines changed: 52 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,10 @@ theorem divXPowOrder_X :
346346
ext n
347347
simp [coeff_X]
348348

349+
theorem divXPowOrder_one : divXPowOrder 1 = (1 : R⟦X⟧) := by
350+
ext k
351+
simp
352+
349353
end OrderZeroNeOne
350354

351355
section NoZeroDivisors
@@ -369,44 +373,64 @@ theorem order_mul (φ ψ : R⟦X⟧) : order (φ * ψ) = order φ + order ψ :=
369373
· rw [coeff_of_lt_order_toNat ij.1 h', zero_mul]
370374
· rw [coeff_of_lt_order_toNat ij.2 h', mul_zero]
371375

372-
theorem order_pow [Nontrivial R] (φ : R⟦X⟧) (n : ℕ) :
373-
order (φ ^ n) = n • order φ := by
374-
rcases subsingleton_or_nontrivial R with hR | hR
375-
· simp only [Subsingleton.eq_zero φ, order_zero, nsmul_eq_mul]
376-
by_cases hn : n = 0
377-
· simp [hn, pow_zero]
378-
· simp [zero_pow hn, ENat.mul_top', if_neg hn]
379-
induction n with
380-
| zero => simp
381-
| succ n hn =>
382-
simp only [add_smul, one_smul, pow_succ, order_mul, hn]
383-
384-
theorem order_prod {R : Type*} [CommSemiring R] [NoZeroDivisors R] [Nontrivial R] {ι : Type*}
385-
(φ : ι → R⟦X⟧) (s : Finset ι) : (∏ i ∈ s, φ i).order = ∑ i ∈ s, (φ i).order := by
386-
induction s using Finset.cons_induction with
387-
| empty => simp
388-
| cons a s ha ih => rw [Finset.sum_cons ha, Finset.prod_cons ha, order_mul, ih]
389-
390376
/-- The operation of dividing a power series by the largest possible power of `X`
391377
preserves multiplication. -/
392-
theorem divXPowOrder_mul_divXPowOrder {f g : R⟦X⟧} :
393-
divXPowOrder f * divXPowOrder g = divXPowOrder (f * g) := by
378+
theorem divXPowOrder_mul {f g : R⟦X⟧} :
379+
divXPowOrder (f * g) = divXPowOrder f * divXPowOrder g := by
394380
by_cases h : f = 0 ∨ g = 0
395381
· rcases h with (h | h) <;> simp [h]
396382
push_neg at h
397383
apply X_pow_mul_cancel (k := f.order.toNat + g.order.toNat)
398384
calc
399-
X ^ (f.order.toNat + g.order.toNat) * (f.divXPowOrder * g.divXPowOrder)
400-
_ = (X ^ f.order.toNat * f.divXPowOrder) * (X ^ g.order.toNat * g.divXPowOrder) := by
401-
conv_rhs =>
402-
rw [mul_assoc, X_pow_mul, X_pow_mul, ← mul_assoc, mul_assoc, ← pow_add]
403-
rw [X_pow_mul, add_comm]
385+
_ = X ^ ((f * g).order.toNat) * (f * g).divXPowOrder := by
386+
rw [order_mul, ENat.toNat_add (order_eq_top.not.mpr h.1) (order_eq_top.not.mpr h.2)]
404387
_ = f * g := by
405388
simp [X_pow_order_mul_divXPowOrder]
406-
_ = X ^ ((f * g).order.toNat) * (f * g).divXPowOrder := by
389+
_ = (X ^ f.order.toNat * f.divXPowOrder) * (X ^ g.order.toNat * g.divXPowOrder) := by
407390
simp [X_pow_order_mul_divXPowOrder]
408-
_ = X ^ (f.order.toNat + g.order.toNat) * (f * g).divXPowOrder := by
409-
rw [order_mul, ENat.toNat_add (order_eq_top.not.mpr h.1) (order_eq_top.not.mpr h.2)]
391+
_ = f.divXPowOrder * g.divXPowOrder * X ^ (g.order.toNat + f.order.toNat) := by
392+
rw [mul_assoc, X_pow_mul, X_pow_mul, ← mul_assoc, mul_assoc, ← pow_add]
393+
_ = X ^ (f.order.toNat + g.order.toNat) * (f.divXPowOrder * g.divXPowOrder) := by
394+
rw [X_pow_mul, add_comm]
395+
396+
@[deprecated divXPowOrder_mul "use `divXPowOrder_mul.symm` instead" (since := "2025-11-06")]
397+
theorem divXPowOrder_mul_divXPowOrder {f g : R⟦X⟧} :
398+
divXPowOrder f * divXPowOrder g = divXPowOrder (f * g) :=
399+
divXPowOrder_mul.symm
400+
401+
variable [Nontrivial R]
402+
403+
/-- `PowerSeries.order` as a `MonoidHom`. -/
404+
def orderHom : R⟦X⟧ →* Multiplicative ℕ∞ where
405+
toFun g := .ofAdd g.order
406+
map_one' := order_one
407+
map_mul' := order_mul
408+
409+
@[simp, norm_cast]
410+
lemma coe_orderHom : (orderHom : R⟦X⟧ → ℕ∞) = order := rfl
411+
412+
theorem order_pow (φ : R⟦X⟧) (n : ℕ) : order (φ ^ n) = n • order φ :=
413+
map_pow orderHom φ n
414+
415+
theorem order_prod {R : Type*} [CommSemiring R] [NoZeroDivisors R] [Nontrivial R] {ι : Type*}
416+
(φ : ι → R⟦X⟧) (s : Finset ι) : (∏ i ∈ s, φ i).order = ∑ i ∈ s, (φ i).order :=
417+
map_prod orderHom φ s
418+
419+
/-- `PowerSeries.divXPowOrder` as a `MonoidHom`. -/
420+
def divXPowOrderHom : R⟦X⟧ →* R⟦X⟧ where
421+
toFun g := g.divXPowOrder
422+
map_one' := divXPowOrder_one
423+
map_mul' f g := divXPowOrder_mul (f := f) (g := g)
424+
425+
@[simp, norm_cast]
426+
lemma coe_divXPowOrderHom : (divXPowOrderHom : R⟦X⟧ → R⟦X⟧) = divXPowOrder := rfl
427+
428+
theorem divXPowOrder_pow (φ : R⟦X⟧) (n : ℕ) : divXPowOrder (φ ^ n) = (divXPowOrder φ) ^ n :=
429+
map_pow divXPowOrderHom φ n
430+
431+
theorem divXPowOrder_prod {R : Type*} [CommSemiring R] [NoZeroDivisors R] [Nontrivial R] {ι : Type*}
432+
(φ : ι → R⟦X⟧) (s : Finset ι) : (∏ i ∈ s, φ i).divXPowOrder = ∏ i ∈ s, (φ i).divXPowOrder :=
433+
map_prod divXPowOrderHom φ s
410434

411435
end NoZeroDivisors
412436

0 commit comments

Comments
 (0)