Skip to content

Commit

Permalink
feat(RingTheory/HahnSeries): define powerSeriesFamily (#20205)
Browse files Browse the repository at this point in the history
This PR defines a summable family of power series whose elements are non-negative powers of a fixed Hahn series times the coefficients of a formal power series. We will use it to define algebra homomorphisms from rings of formal power series to Hahn series.
  • Loading branch information
ScottCarnahan committed Jan 30, 2025
1 parent 14589bd commit e6b6302
Show file tree
Hide file tree
Showing 3 changed files with 132 additions and 3 deletions.
1 change: 1 addition & 0 deletions Mathlib.lean
Original file line number Diff line number Diff line change
Expand Up @@ -4543,6 +4543,7 @@ import Mathlib.RingTheory.GradedAlgebra.Noetherian
import Mathlib.RingTheory.GradedAlgebra.Radical
import Mathlib.RingTheory.HahnSeries.Addition
import Mathlib.RingTheory.HahnSeries.Basic
import Mathlib.RingTheory.HahnSeries.HEval
import Mathlib.RingTheory.HahnSeries.Multiplication
import Mathlib.RingTheory.HahnSeries.PowerSeries
import Mathlib.RingTheory.HahnSeries.Summable
Expand Down
20 changes: 17 additions & 3 deletions Mathlib/RingTheory/HahnSeries/Addition.lean
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ Copyright (c) 2021 Aaron Anderson. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Aaron Anderson
-/
import Mathlib.RingTheory.HahnSeries.Basic
import Mathlib.Algebra.BigOperators.Group.Finset.Basic
import Mathlib.Algebra.Module.Basic
import Mathlib.Algebra.Module.LinearMap.Defs
import Mathlib.RingTheory.HahnSeries.Basic

/-!
# Additive properties of Hahn series
Expand All @@ -26,7 +27,7 @@ open Finset Function

noncomputable section

variable {Γ Γ' R S U V : Type*}
variable {Γ Γ' R S U V α : Type*}

namespace HahnSeries

Expand Down Expand Up @@ -233,12 +234,25 @@ end Domain

end AddMonoid

instance [AddCommMonoid R] : AddCommMonoid (HahnSeries Γ R) :=
section AddCommMonoid

variable [AddCommMonoid R]

instance : AddCommMonoid (HahnSeries Γ R) :=
{ inferInstanceAs (AddMonoid (HahnSeries Γ R)) with
add_comm := fun x y => by
ext
apply add_comm }

open BigOperators

@[simp]
theorem coeff_sum {s : Finset α} {x : α → HahnSeries Γ R} (g : Γ) :
(∑ i ∈ s, x i).coeff g = ∑ i ∈ s, (x i).coeff g :=
cons_induction rfl (fun i s his hsum => by rw [sum_cons, sum_cons, add_coeff, hsum]) s

end AddCommMonoid

section AddGroup

variable [AddGroup R]
Expand Down
114 changes: 114 additions & 0 deletions Mathlib/RingTheory/HahnSeries/HEval.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
/-
Copyright (c) 2024 Scott Carnahan. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Scott Carnahan
-/
import Mathlib.RingTheory.HahnSeries.Summable
import Mathlib.RingTheory.PowerSeries.Basic

/-!
# A summable family given by a power series
## Main Definitions
* `HahnSeries.SummableFamily.powerSeriesFamily`: A summable family of Hahn series whose elements
are non-negative powers of a fixed positive-order Hahn series multiplied by the coefficients of a
formal power series.
## TODO
* `PowerSeries.heval`: An `R`-algebra homomorphism from `PowerSeries R` to `HahnSeries Γ R` taking
`X` to a positive order Hahn Series.
-/

open Finset Function

open Pointwise

noncomputable section

variable {Γ Γ' R V α β σ : Type*}

namespace HahnSeries

namespace SummableFamily

section PowerSeriesFamily

variable [LinearOrderedCancelAddCommMonoid Γ] [CommRing R]

variable [CommRing V] [Algebra R V] {x : HahnSeries Γ V} (hx : 0 < x.orderTop) (f : PowerSeries R)

/-- A summable family given by scalar multiples of powers of a positive order Hahn series.
The scalar multiples are given by the coefficients of a power series. -/
abbrev powerSeriesFamily : SummableFamily Γ V ℕ :=
smulFamily (fun n => f.coeff R n) (powers x hx)

@[simp]
theorem powerSeriesFamily_apply (n : ℕ) :
powerSeriesFamily hx f n = f.coeff R n • x ^ n :=
rfl

theorem powerSeriesFamily_add (g : PowerSeries R) :
powerSeriesFamily hx (f + g) = powerSeriesFamily hx f + powerSeriesFamily hx g := by
ext1 n
simp [add_smul]

theorem powerSeriesFamily_smul (r : R) :
powerSeriesFamily hx (r • f) = HahnSeries.single (0 : Γ) r • powerSeriesFamily hx f := by
ext1 n
simp [mul_smul]

theorem support_powerSeriesFamily_subset (hx : 0 < x.orderTop) (a b : PowerSeries R) (g : Γ) :
((powerSeriesFamily hx (a * b)).coeff g).support ⊆
(((powerSeriesFamily hx a).mul (powerSeriesFamily hx b)).coeff g).support.image
fun i => i.1 + i.2 := by
simp only [coeff_support, smulFamily_toFun, HahnSeries.smul_coeff, Set.Finite.toFinset_subset,
coe_image, support_subset_iff, Set.mem_image, Prod.exists]
intro n hn
simp_rw [PowerSeries.coeff_mul, sum_smul, mul_smul] at hn
have he := exists_ne_zero_of_sum_ne_zero hn
simp only [powers_toFun, mem_antidiagonal] at he
use he.choose.1, he.choose.2
refine ⟨?_, he.choose_spec.1
simp only [mul_toFun, smulFamily_toFun, powers_toFun, Algebra.mul_smul_comm,
Algebra.smul_mul_assoc, HahnSeries.smul_coeff, Set.Finite.coe_toFinset, ne_eq, Prod.mk.eta,
Function.mem_support]
rw [← pow_add, smul_comm, he.choose_spec.1]
exact he.choose_spec.2

theorem hsum_powerSeriesFamily_mul (hx : 0 < x.orderTop) (a b : PowerSeries R) :
(powerSeriesFamily hx (a * b)).hsum =
((powerSeriesFamily hx a).mul (powerSeriesFamily hx b)).hsum := by
ext g
simp only [powerSeriesFamily_apply, PowerSeries.coeff_mul, Finset.sum_smul, ← Finset.sum_product,
hsum_coeff_eq_sum, mul_toFun]
rw [sum_subset (support_powerSeriesFamily_subset hx a b g)]
· rw [← coeff_sum, sum_sigma', coeff_sum]
refine (Finset.sum_of_injOn (fun x => ⟨x.1 + x.2, x⟩) (fun _ _ _ _ => by simp_all) ?_ ?_
(fun _ _ => by simp only [smul_mul_smul_comm, pow_add])).symm
· intro ij hij
simp only [coe_sigma, coe_image, Set.mem_sigma_iff, Set.mem_image, Prod.exists, mem_coe,
mem_antidiagonal, and_true]
use ij.1, ij.2
simp_all
· intro i hi his
have hisc : ∀ j k : ℕ, ⟨j + k, (j, k)⟩ = i → (PowerSeries.coeff R k) b •
(PowerSeries.coeff R j a • (x ^ j * x ^ k).coeff g) = 0 := by
intro m n
contrapose!
simp only [coeff_support, mul_toFun, smulFamily_toFun, Algebra.mul_smul_comm,
Algebra.smul_mul_assoc, Set.Finite.coe_toFinset, Set.mem_image,
Prod.exists, not_exists, not_and] at his
exact his m n
simp only [mem_sigma, mem_antidiagonal] at hi
rw [mul_comm ((PowerSeries.coeff R i.snd.1) a), ← hi.2, mul_smul, pow_add]
exact hisc i.snd.1 i.snd.2 <| Sigma.eq hi.2 (by simp)
· intro i hi his
simpa [PowerSeries.coeff_mul, sum_smul] using his

end PowerSeriesFamily

end SummableFamily

end HahnSeries

0 comments on commit e6b6302

Please sign in to comment.