@@ -33,6 +33,8 @@ with the action of `HahnSeries Γ R` on `HahnModule Γ' R V`.
3333* `HahnSeries.C` is the `constant term` ring homomorphism `R →+* HahnSeries Γ R`.
3434* `HahnSeries.embDomainRingHom` is the ring homomorphism `HahnSeries Γ R →+* HahnSeries Γ' R`
3535 induced by an order embedding `Γ ↪o Γ'`.
36+ * `HahnSeries.orderTopSubOnePos` is the group of invertible Hahn series close to 1, i.e., those
37+ series such that subtracting one yields a series with strictly positive `orderTop`.
3638
3739 ## Main results
3840* If `R` is a (commutative) (semi-)ring, then so is `HahnSeries Γ R`.
@@ -85,7 +87,7 @@ theorem support_one [MulZeroOneClass R] [Nontrivial R] : support (1 : HahnSeries
8587 support_single_of_ne one_ne_zero
8688
8789@[simp]
88- theorem orderTop_one [MulZeroOneClass R] [Nontrivial R ] : orderTop (1 : HahnSeries Γ R) = 0 := by
90+ theorem orderTop_one [Zero R] [One R] [NeZero ( 1 : R) ] : orderTop (1 : HahnSeries Γ R) = 0 := by
8991 rw [← single_zero_one, orderTop_single one_ne_zero, WithTop.coe_eq_zero]
9092
9193@[simp]
@@ -391,10 +393,12 @@ end DistribSMul
391393
392394end HahnModule
393395
394- variable [AddCommMonoid Γ] [PartialOrder Γ] [IsOrderedCancelAddMonoid Γ]
395-
396396namespace HahnSeries
397397
398+ section mul
399+
400+ variable [AddCommMonoid Γ] [PartialOrder Γ] [IsOrderedCancelAddMonoid Γ]
401+
398402instance [NonUnitalNonAssocSemiring R] : Mul (HahnSeries Γ R) where
399403 mul x y := (HahnModule.of R).symm (x • HahnModule.of R y)
400404
@@ -492,16 +496,41 @@ theorem support_mul_subset_add_support [NonUnitalNonAssocSemiring R] {x y : Hahn
492496 rw [← of_symm_smul_of_eq_mul, ← vadd_eq_add]
493497 exact HahnModule.support_smul_subset_vadd_support
494498
499+ instance [NonUnitalNonAssocSemiring R] : NonUnitalNonAssocSemiring (HahnSeries Γ R) :=
500+ { inferInstanceAs (AddCommMonoid (HahnSeries Γ R)),
501+ inferInstanceAs (Distrib (HahnSeries Γ R)) with
502+ zero_mul := fun _ => by
503+ ext
504+ simp [coeff_mul]
505+ mul_zero := fun _ => by
506+ ext
507+ simp [coeff_mul] }
508+
509+ end mul
510+
495511section orderLemmas
496512
497- variable {Γ : Type *} [AddCommMonoid Γ] [LinearOrder Γ] [IsOrderedCancelAddMonoid Γ]
513+ variable [AddCommMonoid Γ] [LinearOrder Γ] [IsOrderedCancelAddMonoid Γ]
498514 [NonUnitalNonAssocSemiring R]
499515
500516theorem coeff_mul_order_add_order (x y : HahnSeries Γ R) :
501517 (x * y).coeff (x.order + y.order) = x.leadingCoeff * y.leadingCoeff := by
502518 simp only [← of_symm_smul_of_eq_mul]
503519 exact HahnModule.coeff_smul_order_add_order x y
504520
521+ theorem orderTop_mul_of_nonzero {x y : HahnSeries Γ R} (h : x.leadingCoeff * y.leadingCoeff ≠ 0 ) :
522+ (x * y).orderTop = x.orderTop + y.orderTop := by
523+ by_cases hx : x = 0 ; · simp [hx]
524+ by_cases hy : y = 0 ; · simp [hy]
525+ have : (x * y).coeff (x.order + y.order) ≠ 0 := by rwa [coeff_mul_order_add_order x y]
526+ have hxy : x * y ≠ 0 := fun h ↦ (by simp [h] at this)
527+ rw [← order_eq_orderTop_of_ne_zero hx, ← order_eq_orderTop_of_ne_zero hy,
528+ ← order_eq_orderTop_of_ne_zero hxy, ← WithTop.coe_add, WithTop.coe_eq_coe]
529+ refine le_antisymm (order_le_of_coeff_ne_zero this) ?_
530+ rw [HahnSeries.order_of_ne hx, HahnSeries.order_of_ne hy, HahnSeries.order_of_ne hxy,
531+ ← Set.IsWF.min_add]
532+ exact Set.IsWF.min_le_min_of_subset support_mul_subset_add_support
533+
505534theorem orderTop_add_le_mul {x y : HahnSeries Γ R} :
506535 x.orderTop + y.orderTop ≤ (x * y).orderTop := by
507536 rw [← smul_eq_mul]
@@ -519,6 +548,11 @@ theorem order_mul_of_nonzero {x y : HahnSeries Γ R}
519548 order_of_ne <| ne_zero_of_coeff_ne_zero hxy, ← Set.IsWF.min_add]
520549 exact Set.IsWF.min_le_min_of_subset support_mul_subset_add_support
521550
551+ theorem leadingCoeff_mul_of_nonzero {x y : HahnSeries Γ R}
552+ (h : x.leadingCoeff * y.leadingCoeff ≠ 0 ) :
553+ (x * y).leadingCoeff = x.leadingCoeff * y.leadingCoeff := by
554+ simp only [leadingCoeff_eq, order_mul_of_nonzero h, coeff_mul_order_add_order]
555+
522556theorem order_single_mul_of_isRegular {g : Γ} {r : R} (hr : IsRegular r)
523557 {x : HahnSeries Γ R} (hx : x ≠ 0 ) : (((single g) r) * x).order = g + x.order := by
524558 obtain _ | _ := subsingleton_or_nontrivial R
@@ -529,6 +563,10 @@ theorem order_single_mul_of_isRegular {g : Γ} {r : R} (hr : IsRegular r)
529563
530564end orderLemmas
531565
566+ section ring
567+
568+ variable [AddCommMonoid Γ] [PartialOrder Γ] [IsOrderedCancelAddMonoid Γ]
569+
532570private theorem mul_assoc' [NonUnitalSemiring R] (x y z : HahnSeries Γ R) :
533571 x * y * z = x * (y * z) := by
534572 ext b
@@ -539,16 +577,6 @@ private theorem mul_assoc' [NonUnitalSemiring R] (x y z : HahnSeries Γ R) :
539577 (fun ⟨⟨i, _j⟩, ⟨k, l⟩⟩ ↦ ⟨(i + k, l), (i, k)⟩) <;>
540578 aesop (add safe Set.add_mem_add) (add simp [add_assoc, mul_assoc])
541579
542- instance [NonUnitalNonAssocSemiring R] : NonUnitalNonAssocSemiring (HahnSeries Γ R) :=
543- { inferInstanceAs (AddCommMonoid (HahnSeries Γ R)),
544- inferInstanceAs (Distrib (HahnSeries Γ R)) with
545- zero_mul := fun _ => by
546- ext
547- simp [coeff_mul]
548- mul_zero := fun _ => by
549- ext
550- simp [coeff_mul] }
551-
552580instance [NonUnitalSemiring R] : NonUnitalSemiring (HahnSeries Γ R) :=
553581 { inferInstanceAs (NonUnitalNonAssocSemiring (HahnSeries Γ R)) with
554582 mul_assoc := mul_assoc' }
@@ -603,15 +631,18 @@ instance [CommRing R] : CommRing (HahnSeries Γ R) :=
603631 { inferInstanceAs (CommSemiring (HahnSeries Γ R)),
604632 inferInstanceAs (Ring (HahnSeries Γ R)) with }
605633
606- theorem orderTop_nsmul_le_orderTop_pow {Γ}
607- [AddCommMonoid Γ] [LinearOrder Γ] [IsOrderedCancelAddMonoid Γ]
608- [Semiring R] {x : HahnSeries Γ R} {n : ℕ} : n • x.orderTop ≤ (x ^ n).orderTop := by
634+ end ring
635+
636+ theorem orderTop_nsmul_le_orderTop_pow [AddCommMonoid Γ] [LinearOrder Γ]
637+ [IsOrderedCancelAddMonoid Γ] [Semiring R] {x : HahnSeries Γ R} {n : ℕ} :
638+ n • x.orderTop ≤ (x ^ n).orderTop := by
609639 induction n with
610640 | zero =>
611641 simp only [zero_smul, pow_zero]
612- by_cases h : (0 : R) = 1
613- · simp [subsingleton_iff_zero_eq_one.mp h]
614- · simp [nontrivial_of_ne 0 1 h]
642+ by_cases h : NeZero (1 : R)
643+ · simp
644+ · have : Subsingleton R := not_nontrivial_iff_subsingleton.mp fun _ ↦ h NeZero.one
645+ simp
615646 | succ n ih =>
616647 rw [add_nsmul, pow_add]
617648 calc
@@ -620,8 +651,64 @@ theorem orderTop_nsmul_le_orderTop_pow {Γ}
620651 (x ^ n).orderTop + x.orderTop ≤ (x ^ n * x).orderTop := orderTop_add_le_mul
621652 (x ^ n * x).orderTop ≤ (x ^ n * x ^ 1 ).orderTop := by rw [pow_one]
622653
654+ theorem orderTop_self_sub_one_pos_iff [LinearOrder Γ] [Zero Γ] [NonAssocRing R] [Nontrivial R]
655+ (x : HahnSeries Γ R) :
656+ 0 < (x - 1 ).orderTop ↔ x.orderTop = 0 ∧ x.leadingCoeff = 1 := by
657+ constructor
658+ · intro hx
659+ constructor
660+ · rw [← sub_add_cancel x 1 , add_comm, ← orderTop_one (R := R)]
661+ exact orderTop_add_eq_left (Γ := Γ) (R := R) (orderTop_one (R := R) (Γ := Γ) ▸ hx)
662+ · rw [← sub_add_cancel x 1 , add_comm, ← leadingCoeff_one (Γ := Γ) (R := R)]
663+ exact leadingCoeff_add_eq_left (Γ := Γ) (R := R) (orderTop_one (R := R) (Γ := Γ) ▸ hx)
664+ · intro h
665+ refine lt_of_le_of_ne (le_of_eq_of_le (by simp_all)
666+ (min_orderTop_le_orderTop_sub (Γ := Γ) (R := R))) <| Ne.symm <|
667+ orderTop_sub_ne h.1 orderTop_one ?_
668+ rw [h.2 , leadingCoeff_one]
669+
670+ theorem orderTop_sub_pos [PartialOrder Γ] [Zero Γ] [AddCommGroup R] [One R] {g : Γ} (hg : 0 < g)
671+ (r : R) :
672+ 0 < ((1 + single g r) - 1 ).orderTop := by
673+ by_cases hr : r = 0 <;> simp [hr, hg]
674+
675+ /-- The group of invertible Hahn series close to 1, i.e., those series such that subtracting 1
676+ yields a series with strictly positive `orderTop`. -/
677+ def orderTopSubOnePos (Γ R) [LinearOrder Γ] [AddCommMonoid Γ] [IsOrderedCancelAddMonoid Γ]
678+ [CommRing R] : Subgroup (HahnSeries Γ R)ˣ where
679+ carrier := { x : (HahnSeries Γ R)ˣ | 0 < (x.val - 1 ).orderTop}
680+ mul_mem' := by
681+ intro x y hx hy
682+ obtain (_|_) := subsingleton_or_nontrivial R
683+ · simp
684+ · simp_all only [Set.mem_setOf_eq, orderTop_self_sub_one_pos_iff]
685+ have h1 : x.val.leadingCoeff * y.val.leadingCoeff = 1 := by rw [hx.2 , hy.2 , mul_one]
686+ constructor
687+ · rw [Units.val_mul, orderTop_mul_of_nonzero (by simp [h1]), hx.1 , hy.1 , add_zero]
688+ · rw [Units.val_mul, leadingCoeff_mul_of_nonzero (h1 ▸ one_ne_zero), h1]
689+ one_mem' := by simp
690+ inv_mem' {y} h := by
691+ suffices 0 < (y.inv - 1 ).orderTop by exact this
692+ obtain (_|_) := subsingleton_or_nontrivial R
693+ · simp
694+ · have : 0 < (y.val - 1 ).orderTop := h
695+ rw [orderTop_self_sub_one_pos_iff] at this
696+ have nz : y.val.leadingCoeff * y.inv.leadingCoeff ≠ 0 := by
697+ rw [this.2 , one_mul]
698+ exact leadingCoeff_ne_zero.mpr (by simp)
699+ refine y.inv.orderTop_self_sub_one_pos_iff.mpr ⟨?_, ?_⟩
700+ · simpa [this.1 , y.val_inv] using (orderTop_mul_of_nonzero nz).symm
701+ · simpa [this.2 , y.val_inv] using (leadingCoeff_mul_of_nonzero nz).symm
702+
703+ @[simp]
704+ theorem mem_orderTopSubOnePos_iff [LinearOrder Γ] [AddCommMonoid Γ] [IsOrderedCancelAddMonoid Γ]
705+ [CommRing R] (x : (HahnSeries Γ R)ˣ) :
706+ x ∈ orderTopSubOnePos Γ R ↔ 0 < (x.val - 1 ).orderTop := .rfl
707+
623708end HahnSeries
624709
710+ variable [AddCommMonoid Γ] [PartialOrder Γ] [IsOrderedCancelAddMonoid Γ]
711+
625712namespace HahnModule
626713
627714variable [PartialOrder Γ'] [AddAction Γ Γ'] [IsOrderedCancelVAdd Γ Γ'] [AddCommMonoid V]
0 commit comments