Algebraic Combinatorics Blueprint

9. Non-Integer Powers🔗

Definition9.1
Group: Power series with constant term one, and the first logarithmic constructions on them. (2)
Hover another entry in this group to preview it.
Preview
Lemma 9.2
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 0

An FPS f\in K[[x]] has constant term one if \left[x^0\right]f=1. We write f\in K[[x]]_1 for this condition.

Lean code for Definition9.11 definition
  • def AlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. }
      [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1] (fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1) : PropThe universe of propositions. `Prop ≡ Sort 0`.
    
    Every proposition is propositionally equal to either `True` or `False`. 
    def AlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      (fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1) : PropThe universe of propositions. `Prop ≡ Sort 0`.
    
    Every proposition is propositionally equal to either `True` or `False`. 
    An FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
Lemma9.2
Group: Power series with constant term one, and the first logarithmic constructions on them. (2)
Hover another entry in this group to preview it.
Preview
Definition 9.1
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 0

If f,g\in K[[x]]_1, then fg\in K[[x]]_1.

Lean code for Lemma9.21 theorem
  • theorem AlgebraicCombinatorics.FPS.hasConstantTermOne_mul.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. }
      [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1] {fPowerSeries K gPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f : AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures.  fPowerSeries K)
      (hgAlgebraicCombinatorics.FPS.HasConstantTermOne g : AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures.  gPowerSeries K) :
      AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures.  (HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.fPowerSeries K *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. gPowerSeries K)HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
    theorem AlgebraicCombinatorics.FPS.hasConstantTermOne_mul.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      {fPowerSeries K gPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f :
        AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
          fPowerSeries K)
      (hgAlgebraicCombinatorics.FPS.HasConstantTermOne g :
        AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
          gPowerSeries K) :
      AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
        (HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.fPowerSeries K *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. gPowerSeries K)HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
Proof

\left[x^0\right](fg)=\left(\left[x^0\right]f\right)\left(\left[x^0\right]g\right)=1\cdot1=1.

Lemma9.3
Group: Power series with constant term one, and the first logarithmic constructions on them. (2)
Hover another entry in this group to preview it.
Preview
Definition 9.1
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 0

1+x\in K[[x]]_1.

Lean code for Lemma9.31 theorem
  • theorem AlgebraicCombinatorics.FPS.hasConstantTermOne_one_add_X.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1] :
      AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures.  (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.1 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. PowerSeries.XPowerSeries.X.{u_1} {R : Type u_1} [Semiring R] : PowerSeries RThe variable of the formal power series ring. )HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.
    theorem AlgebraicCombinatorics.FPS.hasConstantTermOne_one_add_X.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1] :
      AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
        (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.1 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. PowerSeries.XPowerSeries.X.{u_1} {R : Type u_1} [Semiring R] : PowerSeries RThe variable of the formal power series ring. )HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.
Proof

\left[x^0\right](1+x)=1.

Definition9.4
Group: The logarithm map on series with constant term one. (5)
Hover another entry in this group to preview it.
L∃∀Nused by 0

The logarithm series, or \overline{\log}, is the FPS \overline{\log} := \sum_{n\geq 1} \frac{(-1)^{n-1}}{n} x^n = x - \frac{x^2}{2} + \frac{x^3}{3} - \cdots \in K[[x]]. Its constant term is 0.

Lean code for Definition9.41 definition
  • def AlgebraicCombinatorics.FPS.logSeries.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1
    def AlgebraicCombinatorics.FPS.logSeries.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1
    The logarithm series: log(1+x) = x - x²/2 + x³/3 - x⁴/4 + ...
    This is `\overline{log}` in the source notation.
    Label: def.fps.logbar 
Lemma9.5
Group: The logarithm map on series with constant term one. (5)
Hover another entry in this group to preview it.
L∃∀Nused by 0

\left[x^0\right]\overline{\log}=0.

Lean code for Lemma9.51 theorem
  • theorem AlgebraicCombinatorics.FPS.constantCoeff_logSeries.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. }
      [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] :
      PowerSeries.constantCoeffPowerSeries.constantCoeff.{u_1} {R : Type u_1} [Semiring R] : PowerSeries R →+* RThe constant coefficient of a formal power series.  AlgebraicCombinatorics.FPS.logSeriesAlgebraicCombinatorics.FPS.logSeries.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] : PowerSeries KThe logarithm series: log(1+x) = x - x²/2 + x³/3 - x⁴/4 + ...
    This is `\overline{log}` in the source notation.
    Label: def.fps.logbar  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 0
    theorem AlgebraicCombinatorics.FPS.constantCoeff_logSeries.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] :
      PowerSeries.constantCoeffPowerSeries.constantCoeff.{u_1} {R : Type u_1} [Semiring R] : PowerSeries R →+* RThe constant coefficient of a formal power series. 
          AlgebraicCombinatorics.FPS.logSeriesAlgebraicCombinatorics.FPS.logSeries.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] : PowerSeries KThe logarithm series: log(1+x) = x - x²/2 + x³/3 - x⁴/4 + ...
    This is `\overline{log}` in the source notation.
    Label: def.fps.logbar  =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        0
    The constant term of the log series is 0 
Proof

Immediate from the definition.

Definition9.6
Group: The logarithm map on series with constant term one. (5)
Hover another entry in this group to preview it.
L∃∀Nused by 0

For f\in K[[x]]_1, define \operatorname{Log}(f) := \overline{\log}\circ (f-1). Since f has constant term 1, the FPS f-1 has constant term 0, so this substitution is well-defined.

Lean code for Definition9.61 definition
  • def AlgebraicCombinatorics.FPS.fpsLog.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] (fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1) : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1
    def AlgebraicCombinatorics.FPS.fpsLog.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] (fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1) :
      PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1
    The Log map: Log(f) = log_series(f-1) = logSeries.subst (f-1)
    This is well-defined when f has constant term 1.
    Label: def.fps.Exp-Log-maps 
Lemma9.7
Group: The logarithm map on series with constant term one. (5)
Hover another entry in this group to preview it.
L∃∀Nused by 0

\operatorname{Log}(1)=0.

Lean code for Lemma9.71 theorem
  • theorem AlgebraicCombinatorics.FPS.fpsLog_one.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] : AlgebraicCombinatorics.FPS.fpsLogAlgebraicCombinatorics.FPS.fpsLog.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) : PowerSeries KThe Log map: Log(f) = log_series(f-1) = logSeries.subst (f-1)
    This is well-defined when f has constant term 1.
    Label: def.fps.Exp-Log-maps  1 =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 0
    theorem AlgebraicCombinatorics.FPS.fpsLog_one.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] :
      AlgebraicCombinatorics.FPS.fpsLogAlgebraicCombinatorics.FPS.fpsLog.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) : PowerSeries KThe Log map: Log(f) = log_series(f-1) = logSeries.subst (f-1)
    This is well-defined when f has constant term 1.
    Label: def.fps.Exp-Log-maps  1 =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 0
    Log(1) = 0 
Proof

\operatorname{Log}(1)=\overline{\log}\circ(1-1)=\overline{\log}\circ 0=0, since every term in the substitution sum is zero.

Lemma9.8
Group: The logarithm map on series with constant term one. (5)
Hover another entry in this group to preview it.
L∃∀Nused by 0

For f\in K[[x]]_1, we have \left[x^0\right]\operatorname{Log}(f)=0.

Lean code for Lemma9.81 theorem
  • theorem AlgebraicCombinatorics.FPS.constantCoeff_fpsLog.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. }
      [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] {fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f : AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures.  fPowerSeries K) :
      PowerSeries.constantCoeffPowerSeries.constantCoeff.{u_1} {R : Type u_1} [Semiring R] : PowerSeries R →+* RThe constant coefficient of a formal power series.  (AlgebraicCombinatorics.FPS.fpsLogAlgebraicCombinatorics.FPS.fpsLog.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) : PowerSeries KThe Log map: Log(f) = log_series(f-1) = logSeries.subst (f-1)
    This is well-defined when f has constant term 1.
    Label: def.fps.Exp-Log-maps  fPowerSeries K) =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 0
    theorem AlgebraicCombinatorics.FPS.constantCoeff_fpsLog.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] {fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f :
        AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
          fPowerSeries K) :
      PowerSeries.constantCoeffPowerSeries.constantCoeff.{u_1} {R : Type u_1} [Semiring R] : PowerSeries R →+* RThe constant coefficient of a formal power series. 
          (AlgebraicCombinatorics.FPS.fpsLogAlgebraicCombinatorics.FPS.fpsLog.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) : PowerSeries KThe Log map: Log(f) = log_series(f-1) = logSeries.subst (f-1)
    This is well-defined when f has constant term 1.
    Label: def.fps.Exp-Log-maps 
            fPowerSeries K) =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        0
    The constant term of Log(f) is 0 when f has constant term 1 
Proof

The constant term of a substitution g\circ h where both \left[x^0\right]g=0 and \left[x^0\right]h=0 is again 0.

Theorem9.9
Group: The logarithm map on series with constant term one. (5)
Hover another entry in this group to preview it.
L∃∀Nused by 0

For f,g\in K[[x]]_1, \operatorname{Log}(fg)=\operatorname{Log}(f)+\operatorname{Log}(g).

Lean code for Theorem9.91 theorem
  • theorem AlgebraicCombinatorics.FPS.fpsLog_mul.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] {fPowerSeries K gPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f : AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures.  fPowerSeries K)
      (hgAlgebraicCombinatorics.FPS.HasConstantTermOne g : AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures.  gPowerSeries K) :
      AlgebraicCombinatorics.FPS.fpsLogAlgebraicCombinatorics.FPS.fpsLog.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) : PowerSeries KThe Log map: Log(f) = log_series(f-1) = logSeries.subst (f-1)
    This is well-defined when f has constant term 1.
    Label: def.fps.Exp-Log-maps  (HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.fPowerSeries K *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. gPowerSeries K)HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        AlgebraicCombinatorics.FPS.fpsLogAlgebraicCombinatorics.FPS.fpsLog.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) : PowerSeries KThe Log map: Log(f) = log_series(f-1) = logSeries.subst (f-1)
    This is well-defined when f has constant term 1.
    Label: def.fps.Exp-Log-maps  fPowerSeries K +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.
          AlgebraicCombinatorics.FPS.fpsLogAlgebraicCombinatorics.FPS.fpsLog.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) : PowerSeries KThe Log map: Log(f) = log_series(f-1) = logSeries.subst (f-1)
    This is well-defined when f has constant term 1.
    Label: def.fps.Exp-Log-maps  gPowerSeries K
    theorem AlgebraicCombinatorics.FPS.fpsLog_mul.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] {fPowerSeries K gPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f :
        AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
          fPowerSeries K)
      (hgAlgebraicCombinatorics.FPS.HasConstantTermOne g :
        AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
          gPowerSeries K) :
      AlgebraicCombinatorics.FPS.fpsLogAlgebraicCombinatorics.FPS.fpsLog.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) : PowerSeries KThe Log map: Log(f) = log_series(f-1) = logSeries.subst (f-1)
    This is well-defined when f has constant term 1.
    Label: def.fps.Exp-Log-maps 
          (HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.fPowerSeries K *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. gPowerSeries K)HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        AlgebraicCombinatorics.FPS.fpsLogAlgebraicCombinatorics.FPS.fpsLog.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) : PowerSeries KThe Log map: Log(f) = log_series(f-1) = logSeries.subst (f-1)
    This is well-defined when f has constant term 1.
    Label: def.fps.Exp-Log-maps  fPowerSeries K +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.
          AlgebraicCombinatorics.FPS.fpsLogAlgebraicCombinatorics.FPS.fpsLog.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) : PowerSeries KThe Log map: Log(f) = log_series(f-1) = logSeries.subst (f-1)
    This is well-defined when f has constant term 1.
    Label: def.fps.Exp-Log-maps  gPowerSeries K
    The logarithm product rule: Log(f * g) = Log(f) + Log(g)
    This is a fundamental property of the logarithm series.
    For power series f, g with constant term 1:
    log(f * g) = log(f) + log(g)
    Label: (log product rule)
    
    **Proof strategy** (from the textbook):
    Use the derivative characterization. Let h = log(fg) - log(f) - log(g).
    Then h' = (fg)'/(fg) - f'/f - g'/g = (f'g + fg')/(fg) - f'/f - g'/g = 0.
    Since h(0) = 0 and h' = 0, we have h = 0.
    
    **Alternative proof**:
    Use the inverse property: if Exp and Log are inverses, then
    Log(fg) = Log(Exp(Log f) * Exp(Log g)) = Log(Exp(Log f + Log g)) = Log f + Log g.
    
    **Dependency**: This proof requires either the derivative characterization
    or the inverse property `Exp_Log_inverse` from ExpLog.lean. 
Proof

Let h=\operatorname{Log}(fg)-\operatorname{Log}(f)-\operatorname{Log}(g). Using the derivative characterization \left(\dfrac{d}{dx}\right)\operatorname{Log}(f)=\left(\dfrac{d}{dx}\overline{\log}\right)\circ(f-1)\cdot f' together with the key identity \left(\dfrac{d}{dx}\overline{\log}\right)\circ(f-1)\cdot f=1, the Leibniz rule for (fg)' shows that h'=0. Also \left[x^0\right]h=0-0-0=0. By uniqueness from constant term and derivative, h=0, which is exactly the claim.

Definition9.10
Group: The exponential map on series with constant term zero. (3)
Hover another entry in this group to preview it.
L∃∀Nused by 0

For g\in K[[x]]_0, define \operatorname{Exp}(g) := \exp\circ g = \left(\sum_{n\in\mathbb{N}} \frac{x^n}{n!}\right)\circ g. Since g has constant term 0, the substitution is well-defined.

Lean code for Definition9.101 definition
  • def AlgebraicCombinatorics.FPS.fpsExp.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] (gPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1) : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1
    def AlgebraicCombinatorics.FPS.fpsExp.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] (gPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1) :
      PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1
    The Exp map: Exp(g) = exp(g) = (exp K).subst g
    This is well-defined when g has constant term 0.
    Label: def.fps.Exp-Log-maps 
Lemma9.11
Group: The exponential map on series with constant term zero. (3)
Hover another entry in this group to preview it.
Preview
Definition 9.10
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 0

\operatorname{Exp}(0)=1.

Lean code for Lemma9.111 theorem
  • theorem AlgebraicCombinatorics.FPS.fpsExp_zero.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] : AlgebraicCombinatorics.FPS.fpsExpAlgebraicCombinatorics.FPS.fpsExp.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (g : PowerSeries K) : PowerSeries KThe Exp map: Exp(g) = exp(g) = (exp K).subst g
    This is well-defined when g has constant term 0.
    Label: def.fps.Exp-Log-maps  0 =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1
    theorem AlgebraicCombinatorics.FPS.fpsExp_zero.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] :
      AlgebraicCombinatorics.FPS.fpsExpAlgebraicCombinatorics.FPS.fpsExp.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (g : PowerSeries K) : PowerSeries KThe Exp map: Exp(g) = exp(g) = (exp K).subst g
    This is well-defined when g has constant term 0.
    Label: def.fps.Exp-Log-maps  0 =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1
    Exp(0) = 1 
Proof

Only the m=0 term in the substitution sum is nonzero, so the value is 1.

Lemma9.12
Group: The exponential map on series with constant term zero. (3)
Hover another entry in this group to preview it.
Preview
Definition 9.10
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 0

For g\in K[[x]]_0, we have \operatorname{Exp}(g)\in K[[x]]_1.

Lean code for Lemma9.121 theorem
  • theorem AlgebraicCombinatorics.FPS.hasConstantTermOne_fpsExp.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] {gPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hgPowerSeries.constantCoeff g = 0 : PowerSeries.constantCoeffPowerSeries.constantCoeff.{u_1} {R : Type u_1} [Semiring R] : PowerSeries R →+* RThe constant coefficient of a formal power series.  gPowerSeries K =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 0) :
      AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
        (AlgebraicCombinatorics.FPS.fpsExpAlgebraicCombinatorics.FPS.fpsExp.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (g : PowerSeries K) : PowerSeries KThe Exp map: Exp(g) = exp(g) = (exp K).subst g
    This is well-defined when g has constant term 0.
    Label: def.fps.Exp-Log-maps  gPowerSeries K)
    theorem AlgebraicCombinatorics.FPS.hasConstantTermOne_fpsExp.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] {gPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hgPowerSeries.constantCoeff g = 0 : PowerSeries.constantCoeffPowerSeries.constantCoeff.{u_1} {R : Type u_1} [Semiring R] : PowerSeries R →+* RThe constant coefficient of a formal power series.  gPowerSeries K =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 0) :
      AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
        (AlgebraicCombinatorics.FPS.fpsExpAlgebraicCombinatorics.FPS.fpsExp.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (g : PowerSeries K) : PowerSeries KThe Exp map: Exp(g) = exp(g) = (exp K).subst g
    This is well-defined when g has constant term 0.
    Label: def.fps.Exp-Log-maps  gPowerSeries K)
    Exp(g) has constant term 1 when g has constant term 0 
Proof

The constant term of \operatorname{Exp}(g)=\exp\circ g is \left[x^0\right]\exp = 1/0! = 1, since all higher powers of g contribute 0 to the constant term.

Theorem9.13
Group: The exponential map on series with constant term zero. (3)
Hover another entry in this group to preview it.
Preview
Definition 9.10
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 0

For u,v\in K[[x]]_0, we have \operatorname{Exp}(u+v)=\operatorname{Exp}(u)\cdot\operatorname{Exp}(v).

Lean code for Theorem9.131 theorem
  • theorem AlgebraicCombinatorics.FPS.fpsExp_add.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] {xPowerSeries K yPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hxPowerSeries.constantCoeff x = 0 : PowerSeries.constantCoeffPowerSeries.constantCoeff.{u_1} {R : Type u_1} [Semiring R] : PowerSeries R →+* RThe constant coefficient of a formal power series.  xPowerSeries K =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 0)
      (hyPowerSeries.constantCoeff y = 0 : PowerSeries.constantCoeffPowerSeries.constantCoeff.{u_1} {R : Type u_1} [Semiring R] : PowerSeries R →+* RThe constant coefficient of a formal power series.  yPowerSeries K =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 0) :
      AlgebraicCombinatorics.FPS.fpsExpAlgebraicCombinatorics.FPS.fpsExp.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (g : PowerSeries K) : PowerSeries KThe Exp map: Exp(g) = exp(g) = (exp K).subst g
    This is well-defined when g has constant term 0.
    Label: def.fps.Exp-Log-maps  (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.xPowerSeries K +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. yPowerSeries K)HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        AlgebraicCombinatorics.FPS.fpsExpAlgebraicCombinatorics.FPS.fpsExp.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (g : PowerSeries K) : PowerSeries KThe Exp map: Exp(g) = exp(g) = (exp K).subst g
    This is well-defined when g has constant term 0.
    Label: def.fps.Exp-Log-maps  xPowerSeries K *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
          AlgebraicCombinatorics.FPS.fpsExpAlgebraicCombinatorics.FPS.fpsExp.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (g : PowerSeries K) : PowerSeries KThe Exp map: Exp(g) = exp(g) = (exp K).subst g
    This is well-defined when g has constant term 0.
    Label: def.fps.Exp-Log-maps  yPowerSeries K
    theorem AlgebraicCombinatorics.FPS.fpsExp_add.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] {xPowerSeries K yPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hxPowerSeries.constantCoeff x = 0 : PowerSeries.constantCoeffPowerSeries.constantCoeff.{u_1} {R : Type u_1} [Semiring R] : PowerSeries R →+* RThe constant coefficient of a formal power series.  xPowerSeries K =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 0)
      (hyPowerSeries.constantCoeff y = 0 : PowerSeries.constantCoeffPowerSeries.constantCoeff.{u_1} {R : Type u_1} [Semiring R] : PowerSeries R →+* RThe constant coefficient of a formal power series.  yPowerSeries K =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 0) :
      AlgebraicCombinatorics.FPS.fpsExpAlgebraicCombinatorics.FPS.fpsExp.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (g : PowerSeries K) : PowerSeries KThe Exp map: Exp(g) = exp(g) = (exp K).subst g
    This is well-defined when g has constant term 0.
    Label: def.fps.Exp-Log-maps 
          (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.xPowerSeries K +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. yPowerSeries K)HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        AlgebraicCombinatorics.FPS.fpsExpAlgebraicCombinatorics.FPS.fpsExp.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (g : PowerSeries K) : PowerSeries KThe Exp map: Exp(g) = exp(g) = (exp K).subst g
    This is well-defined when g has constant term 0.
    Label: def.fps.Exp-Log-maps  xPowerSeries K *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
          AlgebraicCombinatorics.FPS.fpsExpAlgebraicCombinatorics.FPS.fpsExp.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (g : PowerSeries K) : PowerSeries KThe Exp map: Exp(g) = exp(g) = (exp K).subst g
    This is well-defined when g has constant term 0.
    Label: def.fps.Exp-Log-maps  yPowerSeries K
    The exponential functional equation: Exp(x + y) = Exp(x) * Exp(y)
    This is a fundamental property of the exponential series.
    For power series x, y with constant term 0:
    exp(x + y) = exp(x) * exp(y)
    Label: (exp functional equation)
    
    **Proof strategy** (from the textbook):
    Both sides satisfy the same differential equation with the same initial condition.
    Let F(x,y) = exp(x+y) and G(x,y) = exp(x) * exp(y).
    - ∂F/∂x = exp(x+y) = F and ∂F/∂y = exp(x+y) = F
    - ∂G/∂x = exp(x) * exp(y) = G and ∂G/∂y = exp(x) * exp(y) = G
    - F(0,0) = exp(0) = 1 and G(0,0) = exp(0) * exp(0) = 1
    By uniqueness of solutions to the ODE, F = G.
    
    **Alternative proof** (coefficient comparison):
    Use the Cauchy product formula and the fact that
    [x^n](exp(x+y)) = ∑_{k=0}^n [x^k](exp x) * [x^{n-k}](exp y) * C(n,k)
    which equals [x^n](exp x * exp y) by the binomial theorem.
    
    **Mathlib note**: Mathlib's `exp_mul_exp_eq_exp_add` proves this for the special case
    where x = a • X and y = b • X (i.e., rescaling). The general case requires the
    derivative characterization or coefficient comparison. 
Proof

This is the multiplicativity of the exponential map for formal power series.

Definition9.14
Group: Defining non-integer powers using Exp and Log . (3)
Hover another entry in this group to preview it.
L∃∀Nused by 0

Assume that K is a commutative \mathbb{Q}-algebra. Let f\in K\left[\left[x\right]\right]_1 and c\in K. Define an FPS f^c := \operatorname{Exp}\left(c\operatorname{Log}f\right) \in K\left[\left[x\right]\right]_1.

Lean code for Definition9.141 definition
  • def AlgebraicCombinatorics.FPS.fpsPow.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] (fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1) (cK : KType u_1) : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1
    def AlgebraicCombinatorics.FPS.fpsPow.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] (fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1)
      (cK : KType u_1) : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1
    The c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c 
Lemma9.15
Group: Defining non-integer powers using Exp and Log . (3)
Hover another entry in this group to preview it.
Preview
Definition 9.14
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 0

For any f\in K[[x]], we have f^0 = 1.

Lean code for Lemma9.151 theorem
  • theorem AlgebraicCombinatorics.FPS.fpsPow_zero.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] (fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1) :
      AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K 0 =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1
    theorem AlgebraicCombinatorics.FPS.fpsPow_zero.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] (fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1) :
      AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K 0 =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        1
    f^0 = 1 for any f with constant term 1 
Proof

f^0=\operatorname{Exp}(0\cdot\operatorname{Log}f)=\operatorname{Exp}(0)=1.

Lemma9.16
Group: Defining non-integer powers using Exp and Log . (3)
Hover another entry in this group to preview it.
Preview
Definition 9.14
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 0

For f\in K[[x]]_1 and c\in K, we have f^c\in K[[x]]_1.

Lean code for Lemma9.161 theorem
  • theorem AlgebraicCombinatorics.FPS.hasConstantTermOne_fpsPow.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] {fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f : AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures.  fPowerSeries K) (cK : KType u_1) :
      AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
        (AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K cK)
    theorem AlgebraicCombinatorics.FPS.hasConstantTermOne_fpsPow.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] {fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f :
        AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
          fPowerSeries K)
      (cK : KType u_1) :
      AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
        (AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K
          cK)
    f^c has constant term 1 when f has constant term 1 
Proof

Since \left[x^0\right]\operatorname{Log}f = 0, we have \left[x^0\right](c\operatorname{Log}f)=0, so \operatorname{Exp}(c\operatorname{Log}f)\in K[[x]]_1.

Lemma9.17
Group: Defining non-integer powers using Exp and Log . (3)
Hover another entry in this group to preview it.
Preview
Definition 9.14
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 0

For f\in K[[x]]_1, we have f^1 = f.

Lean code for Lemma9.171 theorem
  • theorem AlgebraicCombinatorics.FPS.fpsPow_one.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] {fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f : AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures.  fPowerSeries K) :
      AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K 1 =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. fPowerSeries K
    theorem AlgebraicCombinatorics.FPS.fpsPow_one.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] {fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f :
        AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
          fPowerSeries K) :
      AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K 1 =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        fPowerSeries K
    f^1 = f for any f with constant term 1.
    This follows from the Exp-Log inverse property: Exp(Log(f)) = f.
    Label: (implicit in def.fps.power-c consistency) 
Proof

f^1=\operatorname{Exp}(1\cdot\operatorname{Log}f)=\operatorname{Exp}(\operatorname{Log}f)=f, using that \operatorname{Exp}\circ\operatorname{Log} is the identity on K[[x]]_1.

Theorem9.18
groupL∃∀Nused by 0

Assume that K is a commutative \mathbb{Q}-algebra. For any a,b\in K and f,g\in K\left[\left[x\right]\right]_1, we have f^{a+b}=f^a f^b,\qquad (fg)^a=f^a g^a,\qquad \left(f^a\right)^b=f^{ab}.

Lean code for Theorem9.183 theorems
  • theorem AlgebraicCombinatorics.FPS.fpsPow_add.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] {fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f : AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures.  fPowerSeries K) (aK bK : KType u_1) :
      AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.aK +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. bK)HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K aK *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
          AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K bK
    theorem AlgebraicCombinatorics.FPS.fpsPow_add.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] {fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f :
        AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
          fPowerSeries K)
      (aK bK : KType u_1) :
      AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K
          (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.aK +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. bK)HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K
            aK *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
          AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K
            bK
    Rule of exponents: f^{a+b} = f^a * f^b
    Label: eq.sec.gf.nips.rules-of-exps (first rule)
    
    **Proof**:
    f^{a+b} = Exp((a+b) • Log f)
           = Exp(a • Log f + b • Log f)    [by smul_add]
           = Exp(a • Log f) * Exp(b • Log f)  [by fpsExp_add]
           = f^a * f^b
    
    **Dependency**: Requires `fpsExp_add`. 
  • theorem AlgebraicCombinatorics.FPS.fpsPow_mul.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] {fPowerSeries K gPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f : AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures.  fPowerSeries K)
      (hgAlgebraicCombinatorics.FPS.HasConstantTermOne g : AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures.  gPowerSeries K) (aK : KType u_1) :
      AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  (HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.fPowerSeries K *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. gPowerSeries K)HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. aK =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K aK *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
          AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  gPowerSeries K aK
    theorem AlgebraicCombinatorics.FPS.fpsPow_mul.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] {fPowerSeries K gPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f :
        AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
          fPowerSeries K)
      (hgAlgebraicCombinatorics.FPS.HasConstantTermOne g :
        AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
          gPowerSeries K)
      (aK : KType u_1) :
      AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c 
          (HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.fPowerSeries K *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. gPowerSeries K)HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. aK =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K
            aK *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
          AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  gPowerSeries K
            aK
    Rule of exponents: (fg)^a = f^a * g^a
    Label: eq.sec.gf.nips.rules-of-exps (second rule) 
  • theorem AlgebraicCombinatorics.FPS.fpsPow_pow.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] {fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f : AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures.  fPowerSeries K) (aK bK : KType u_1) :
      AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c 
          (AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K aK) bK =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K (HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.aK *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. bK)HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
    theorem AlgebraicCombinatorics.FPS.fpsPow_pow.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] {fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f :
        AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
          fPowerSeries K)
      (aK bK : KType u_1) :
      AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c 
          (AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K
            aK)
          bK =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K
          (HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.aK *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. bK)HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
    Rule of exponents: (f^a)^b = f^{ab}
    Label: eq.sec.gf.nips.rules-of-exps (third rule)
    
    **Proof strategy**:
    (f^a)^b = Exp(b • Log(f^a))
           = Exp(b • Log(Exp(a • Log f)))
           = Exp(b • (a • Log f))         [by fpsLog_fpsExp: Log(Exp g) = g]
           = Exp((b * a) • Log f)         [by smul_smul]
           = Exp((a * b) • Log f)         [by mul_comm]
           = f^{ab}
    
    **Dependency**: Requires the inverse property `fpsLog (fpsExp g) = g`
    for g with constant term 0. This is proved in ExpLog.lean as `Log_Exp`. 
Proof

First rule: f^{a+b}=\operatorname{Exp}((a+b)\operatorname{Log}f) =\operatorname{Exp}(a\operatorname{Log}f+b\operatorname{Log}f) =\operatorname{Exp}(a\operatorname{Log}f)\operatorname{Exp}(b\operatorname{Log}f) =f^a f^b.

Second rule: (fg)^a=\operatorname{Exp}(a\operatorname{Log}(fg)) =\operatorname{Exp}(a(\operatorname{Log}f+\operatorname{Log}g)) =\operatorname{Exp}(a\operatorname{Log}f+a\operatorname{Log}g) =f^a g^a.

Third rule: (f^a)^b=\operatorname{Exp}(b\operatorname{Log}(f^a)) =\operatorname{Exp}(b\operatorname{Log}(\operatorname{Exp}(a\operatorname{Log}f))) =\operatorname{Exp}(b\cdot a\operatorname{Log}f) =\operatorname{Exp}((ab)\operatorname{Log}f)=f^{ab}.

Lemma9.19
groupL∃∀Nused by 0

For f\in K[[x]]_1 and n\in\mathbb{N}, we have f^n = \underbrace{f\cdot f\cdots f}_{n\text{ times}}. That is, the definition of f^c is consistent with the standard power when c\in\mathbb{N}.

Lean code for Lemma9.191 theorem
  • theorem AlgebraicCombinatorics.FPS.fpsPow_nat.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] [CharZeroCharZero.{u_1} (R : Type u_1) [AddMonoidWithOne R] : PropTypeclass for monoids with characteristic zero.
      (This is usually stated on fields but it makes sense for any additive monoid with 1.)
    
    *Warning*: for a semiring `R`, `CharZero R` and `CharP R 0` need not coincide.
    * `CharZero R` requires an injection `ℕ ↪ R`;
    * `CharP R 0` asks that only `0 : ℕ` maps to `0 : R` under the map `ℕ → R`.
      For instance, endowing `{0, 1}` with addition given by `max` (i.e. `1` is absorbing), shows that
      `CharZero {0, 1}` does not hold and yet `CharP {0, 1} 0` does.
      This example is formalized in `Counterexamples/CharPZeroNeCharZero.lean`.
     KType u_1] {fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f : AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures.  fPowerSeries K) (n : Nat : TypeThe natural numbers, starting at zero.
    
    This type is special-cased by both the kernel and the compiler, and overridden with an efficient
    implementation. Both use a fast arbitrary-precision arithmetic library (usually
    [GMP](https://gmplib.org/)); at runtime, `Nat` values that are sufficiently small are unboxed.
    ) :
      AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K n =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. fPowerSeries K ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. n
    theorem AlgebraicCombinatorics.FPS.fpsPow_nat.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] [CharZeroCharZero.{u_1} (R : Type u_1) [AddMonoidWithOne R] : PropTypeclass for monoids with characteristic zero.
      (This is usually stated on fields but it makes sense for any additive monoid with 1.)
    
    *Warning*: for a semiring `R`, `CharZero R` and `CharP R 0` need not coincide.
    * `CharZero R` requires an injection `ℕ ↪ R`;
    * `CharP R 0` asks that only `0 : ℕ` maps to `0 : R` under the map `ℕ → R`.
      For instance, endowing `{0, 1}` with addition given by `max` (i.e. `1` is absorbing), shows that
      `CharZero {0, 1}` does not hold and yet `CharP {0, 1} 0` does.
      This example is formalized in `Counterexamples/CharPZeroNeCharZero.lean`.
     KType u_1]
      {fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f :
        AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
          fPowerSeries K)
      (n : Nat : TypeThe natural numbers, starting at zero.
    
    This type is special-cased by both the kernel and the compiler, and overridden with an efficient
    implementation. Both use a fast arbitrary-precision arithmetic library (usually
    [GMP](https://gmplib.org/)); at runtime, `Nat` values that are sufficiently small are unboxed.
    ) :
      AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K n =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        fPowerSeries K ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. n
    For natural number exponents, fpsPow agrees with the standard power.
    This shows our definition is consistent with integer powers.
    Label: (consistency claim after def.fps.power-c) 
Proof

Induct on n. For the base case, f^0=1 by the zero-power lemma. For the induction step, f^{n+1}=f^n\cdot f^1=f^n\cdot f by the first exponent rule and the one-power lemma.

Theorem9.20
Group: The Newton binomial formula for arbitrary exponents. (2)
Hover another entry in this group to preview it.
Preview
Corollary 9.21
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 0

Assume that K is a commutative \mathbb{Q}-algebra. Let c\in K. Then \left(1+x\right)^c=\sum_{k\in\mathbb{N}}\dbinom{c}{k}x^k.

Lean code for Theorem9.201 theorem
  • theorem AlgebraicCombinatorics.FPS.generalizedNewtonBinomial.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] [BinomialRingBinomialRing.{u_1} (R : Type u_1) [AddCommMonoid R] [Pow R ℕ] : Type u_1A binomial ring is a ring for which ascending Pochhammer evaluations are uniquely divisible by
    suitable factorials. We define this notion as a mixin for additive commutative monoids with natural
    number powers, but retain the ring name. We introduce `Ring.multichoose` as the uniquely defined
    quotient.  KType u_1]
      [CharZeroCharZero.{u_1} (R : Type u_1) [AddMonoidWithOne R] : PropTypeclass for monoids with characteristic zero.
      (This is usually stated on fields but it makes sense for any additive monoid with 1.)
    
    *Warning*: for a semiring `R`, `CharZero R` and `CharP R 0` need not coincide.
    * `CharZero R` requires an injection `ℕ ↪ R`;
    * `CharP R 0` asks that only `0 : ℕ` maps to `0 : R` under the map `ℕ → R`.
      For instance, endowing `{0, 1}` with addition given by `max` (i.e. `1` is absorbing), shows that
      `CharZero {0, 1}` does not hold and yet `CharP {0, 1} 0` does.
      This example is formalized in `Counterexamples/CharPZeroNeCharZero.lean`.
     KType u_1] (cK : KType u_1) :
      AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.1 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. PowerSeries.XPowerSeries.X.{u_1} {R : Type u_1} [Semiring R] : PowerSeries RThe variable of the formal power series ring. )HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. cK =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        PowerSeries.binomialSeriesPowerSeries.binomialSeries.{u_1, u_3} {R : Type u_1} [CommRing R] [BinomialRing R] (A : Type u_3) [One A] [SMul R A]
      (r : R) : PowerSeries AThe power series for `(1 + X) ^ r`.  KType u_1 cK
    theorem AlgebraicCombinatorics.FPS.generalizedNewtonBinomial.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] [BinomialRingBinomialRing.{u_1} (R : Type u_1) [AddCommMonoid R] [Pow R ℕ] : Type u_1A binomial ring is a ring for which ascending Pochhammer evaluations are uniquely divisible by
    suitable factorials. We define this notion as a mixin for additive commutative monoids with natural
    number powers, but retain the ring name. We introduce `Ring.multichoose` as the uniquely defined
    quotient.  KType u_1]
      [CharZeroCharZero.{u_1} (R : Type u_1) [AddMonoidWithOne R] : PropTypeclass for monoids with characteristic zero.
      (This is usually stated on fields but it makes sense for any additive monoid with 1.)
    
    *Warning*: for a semiring `R`, `CharZero R` and `CharP R 0` need not coincide.
    * `CharZero R` requires an injection `ℕ ↪ R`;
    * `CharP R 0` asks that only `0 : ℕ` maps to `0 : R` under the map `ℕ → R`.
      For instance, endowing `{0, 1}` with addition given by `max` (i.e. `1` is absorbing), shows that
      `CharZero {0, 1}` does not hold and yet `CharP {0, 1} 0` does.
      This example is formalized in `Counterexamples/CharPZeroNeCharZero.lean`.
     KType u_1] (cK : KType u_1) :
      AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c 
          (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.1 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. PowerSeries.XPowerSeries.X.{u_1} {R : Type u_1} [Semiring R] : PowerSeries RThe variable of the formal power series ring. )HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. cK =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        PowerSeries.binomialSeriesPowerSeries.binomialSeries.{u_1, u_3} {R : Type u_1} [CommRing R] [BinomialRing R] (A : Type u_3) [One A] [SMul R A]
      (r : R) : PowerSeries AThe power series for `(1 + X) ^ r`.  KType u_1 cK
    The generalized Newton binomial formula: (1+x)^c = ∑_{k ∈ ℕ} C(c,k) x^k
    
    This extends the standard Newton binomial formula (Theorem thm.fps.newton-binom)
    from natural number exponents to arbitrary exponents in a ℚ-algebra.
    
    The proof uses the polynomial identity trick: both sides of the coefficient equality
    are polynomials in c that agree on ℕ (by the standard Newton formula), hence they
    agree everywhere.
    
    **Proof outline:**
    For each coefficient `k`, we need to show `coeff k ((1+X)^c) = Ring.choose c k`.
    
    1. Both sides are polynomial functions of `c` with rational coefficients:
       - `Ring.choose c k = descPochhammer(c, k) / k!` is a polynomial of degree `k`
       - `coeff k (fpsExp (c • logSeries))` is also a polynomial in `c` (by expanding
         the exponential series and collecting terms)
    
    2. For natural `c = n`, both sides equal `Nat.choose n k`:
       - `Ring.choose n k = Nat.choose n k` by `Ring.choose_natCast`
       - `coeff k ((1+X)^n) = Nat.choose n k` by the standard binomial theorem
    
    3. By the polynomial identity trick: two polynomials (over ℚ) that agree on all
       natural numbers must be equal. Hence the coefficients agree for all `c ∈ K`.
    
    Label: thm.fps.gen-newton 
Proof

The definition of \operatorname{Log} gives \operatorname{Log}(1+x)=\overline{\log}\circ x=\overline{\log}. Hence (1+x)^c =\operatorname{Exp}(c\operatorname{Log}(1+x)) =\operatorname{Exp}(c\,\overline{\log}) =\exp\circ(c\,\overline{\log}). Expanding this as a power series and collecting coefficients yields an expression for the coefficient of x^k as a polynomial in c. The usual binomial coefficient \dbinom{c}{k} is also polynomial in c.

For natural numbers c=n, the equality reduces to the ordinary Newton binomial formula, so these two polynomials agree on all natural numbers. By the polynomial identity trick, they are therefore equal for all c\in K.

Corollary9.21
Group: The Newton binomial formula for arbitrary exponents. (2)
Hover another entry in this group to preview it.
Preview
Theorem 9.20
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 0

For any c\in K and k\in\mathbb{N}, \left[x^k\right](1+x)^c=\dbinom{c}{k}.

Lean code for Corollary9.211 theorem
  • theorem AlgebraicCombinatorics.FPS.coeff_one_add_X_fpsPow.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. }
      [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] [BinomialRingBinomialRing.{u_1} (R : Type u_1) [AddCommMonoid R] [Pow R ℕ] : Type u_1A binomial ring is a ring for which ascending Pochhammer evaluations are uniquely divisible by
    suitable factorials. We define this notion as a mixin for additive commutative monoids with natural
    number powers, but retain the ring name. We introduce `Ring.multichoose` as the uniquely defined
    quotient.  KType u_1] [CharZeroCharZero.{u_1} (R : Type u_1) [AddMonoidWithOne R] : PropTypeclass for monoids with characteristic zero.
      (This is usually stated on fields but it makes sense for any additive monoid with 1.)
    
    *Warning*: for a semiring `R`, `CharZero R` and `CharP R 0` need not coincide.
    * `CharZero R` requires an injection `ℕ ↪ R`;
    * `CharP R 0` asks that only `0 : ℕ` maps to `0 : R` under the map `ℕ → R`.
      For instance, endowing `{0, 1}` with addition given by `max` (i.e. `1` is absorbing), shows that
      `CharZero {0, 1}` does not hold and yet `CharP {0, 1} 0` does.
      This example is formalized in `Counterexamples/CharPZeroNeCharZero.lean`.
     KType u_1] (cK : KType u_1)
      (k : Nat : TypeThe natural numbers, starting at zero.
    
    This type is special-cased by both the kernel and the compiler, and overridden with an efficient
    implementation. Both use a fast arbitrary-precision arithmetic library (usually
    [GMP](https://gmplib.org/)); at runtime, `Nat` values that are sufficiently small are unboxed.
    ) :
      (PowerSeries.coeffPowerSeries.coeff.{u_1} {R : Type u_1} [Semiring R] (n : ℕ) : PowerSeries R →ₗ[R] RThe `n`th coefficient of a formal power series.  k)
          (AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.1 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. PowerSeries.XPowerSeries.X.{u_1} {R : Type u_1} [Semiring R] : PowerSeries RThe variable of the formal power series ring. )HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. cK) =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        Ring.chooseRing.choose.{u_1} {R : Type u_1} [AddCommGroupWithOne R] [Pow R ℕ] [BinomialRing R] (r : R) (n : ℕ) : RThe binomial coefficient `choose r n` generalizes the natural number `Nat.choose` function,
    interpreted in terms of choosing without replacement.  cK k
    theorem AlgebraicCombinatorics.FPS.coeff_one_add_X_fpsPow.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] [BinomialRingBinomialRing.{u_1} (R : Type u_1) [AddCommMonoid R] [Pow R ℕ] : Type u_1A binomial ring is a ring for which ascending Pochhammer evaluations are uniquely divisible by
    suitable factorials. We define this notion as a mixin for additive commutative monoids with natural
    number powers, but retain the ring name. We introduce `Ring.multichoose` as the uniquely defined
    quotient.  KType u_1]
      [CharZeroCharZero.{u_1} (R : Type u_1) [AddMonoidWithOne R] : PropTypeclass for monoids with characteristic zero.
      (This is usually stated on fields but it makes sense for any additive monoid with 1.)
    
    *Warning*: for a semiring `R`, `CharZero R` and `CharP R 0` need not coincide.
    * `CharZero R` requires an injection `ℕ ↪ R`;
    * `CharP R 0` asks that only `0 : ℕ` maps to `0 : R` under the map `ℕ → R`.
      For instance, endowing `{0, 1}` with addition given by `max` (i.e. `1` is absorbing), shows that
      `CharZero {0, 1}` does not hold and yet `CharP {0, 1} 0` does.
      This example is formalized in `Counterexamples/CharPZeroNeCharZero.lean`.
     KType u_1] (cK : KType u_1) (k : Nat : TypeThe natural numbers, starting at zero.
    
    This type is special-cased by both the kernel and the compiler, and overridden with an efficient
    implementation. Both use a fast arbitrary-precision arithmetic library (usually
    [GMP](https://gmplib.org/)); at runtime, `Nat` values that are sufficiently small are unboxed.
    ) :
      (PowerSeries.coeffPowerSeries.coeff.{u_1} {R : Type u_1} [Semiring R] (n : ℕ) : PowerSeries R →ₗ[R] RThe `n`th coefficient of a formal power series.  k)
          (AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c 
            (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.1 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. PowerSeries.XPowerSeries.X.{u_1} {R : Type u_1} [Semiring R] : PowerSeries RThe variable of the formal power series ring. )HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. cK) =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        Ring.chooseRing.choose.{u_1} {R : Type u_1} [AddCommGroupWithOne R] [Pow R ℕ] [BinomialRing R] (r : R) (n : ℕ) : RThe binomial coefficient `choose r n` generalizes the natural number `Nat.choose` function,
    interpreted in terms of choosing without replacement.  cK k
    Corollary: coefficient of x^k in (1+x)^c is C(c,k)
    Label: thm.fps.gen-newton (coefficient form) 
Proof

Immediate from the generalized Newton formula by reading off coefficients.

Theorem9.22
Group: The Newton binomial formula for arbitrary exponents. (2)
Hover another entry in this group to preview it.
Preview
Theorem 9.20
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 0

For any n\in K, (1+x)^{-n}=\sum_{i\in\mathbb{N}}(-1)^i\dbinom{n+i-1}{i}x^i.

Lean code for Theorem9.221 theorem
  • theorem AlgebraicCombinatorics.FPS.antiNewtonBinomial.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. }
      [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] [BinomialRingBinomialRing.{u_1} (R : Type u_1) [AddCommMonoid R] [Pow R ℕ] : Type u_1A binomial ring is a ring for which ascending Pochhammer evaluations are uniquely divisible by
    suitable factorials. We define this notion as a mixin for additive commutative monoids with natural
    number powers, but retain the ring name. We introduce `Ring.multichoose` as the uniquely defined
    quotient.  KType u_1] [CharZeroCharZero.{u_1} (R : Type u_1) [AddMonoidWithOne R] : PropTypeclass for monoids with characteristic zero.
      (This is usually stated on fields but it makes sense for any additive monoid with 1.)
    
    *Warning*: for a semiring `R`, `CharZero R` and `CharP R 0` need not coincide.
    * `CharZero R` requires an injection `ℕ ↪ R`;
    * `CharP R 0` asks that only `0 : ℕ` maps to `0 : R` under the map `ℕ → R`.
      For instance, endowing `{0, 1}` with addition given by `max` (i.e. `1` is absorbing), shows that
      `CharZero {0, 1}` does not hold and yet `CharP {0, 1} 0` does.
      This example is formalized in `Counterexamples/CharPZeroNeCharZero.lean`.
     KType u_1] (nK : KType u_1) :
      AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.1 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. PowerSeries.XPowerSeries.X.{u_1} {R : Type u_1} [Semiring R] : PowerSeries RThe variable of the formal power series ring. )HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. (Neg.neg.{u} {α : Type u} [self : Neg α] : α → α`-a` computes the negative or opposite of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `neg` (when used as a unary operator).-Neg.neg.{u} {α : Type u} [self : Neg α] : α → α`-a` computes the negative or opposite of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `neg` (when used as a unary operator).nK)Neg.neg.{u} {α : Type u} [self : Neg α] : α → α`-a` computes the negative or opposite of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `neg` (when used as a unary operator). =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        PowerSeries.mkPowerSeries.mk.{u_2} {R : Type u_2} (f : ℕ → R) : PowerSeries RConstructor for formal power series.  fun i  (-1) ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. i *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`. Ring.chooseRing.choose.{u_1} {R : Type u_1} [AddCommGroupWithOne R] [Pow R ℕ] [BinomialRing R] (r : R) (n : ℕ) : RThe binomial coefficient `choose r n` generalizes the natural number `Nat.choose` function,
    interpreted in terms of choosing without replacement.  (HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).nK +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. i -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). 1)HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). i
    theorem AlgebraicCombinatorics.FPS.antiNewtonBinomial.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] [BinomialRingBinomialRing.{u_1} (R : Type u_1) [AddCommMonoid R] [Pow R ℕ] : Type u_1A binomial ring is a ring for which ascending Pochhammer evaluations are uniquely divisible by
    suitable factorials. We define this notion as a mixin for additive commutative monoids with natural
    number powers, but retain the ring name. We introduce `Ring.multichoose` as the uniquely defined
    quotient.  KType u_1]
      [CharZeroCharZero.{u_1} (R : Type u_1) [AddMonoidWithOne R] : PropTypeclass for monoids with characteristic zero.
      (This is usually stated on fields but it makes sense for any additive monoid with 1.)
    
    *Warning*: for a semiring `R`, `CharZero R` and `CharP R 0` need not coincide.
    * `CharZero R` requires an injection `ℕ ↪ R`;
    * `CharP R 0` asks that only `0 : ℕ` maps to `0 : R` under the map `ℕ → R`.
      For instance, endowing `{0, 1}` with addition given by `max` (i.e. `1` is absorbing), shows that
      `CharZero {0, 1}` does not hold and yet `CharP {0, 1} 0` does.
      This example is formalized in `Counterexamples/CharPZeroNeCharZero.lean`.
     KType u_1] (nK : KType u_1) :
      AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c 
          (HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`.1 +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. PowerSeries.XPowerSeries.X.{u_1} {R : Type u_1} [Semiring R] : PowerSeries RThe variable of the formal power series ring. )HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. (Neg.neg.{u} {α : Type u} [self : Neg α] : α → α`-a` computes the negative or opposite of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `neg` (when used as a unary operator).-Neg.neg.{u} {α : Type u} [self : Neg α] : α → α`-a` computes the negative or opposite of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `neg` (when used as a unary operator).nK)Neg.neg.{u} {α : Type u} [self : Neg α] : α → α`-a` computes the negative or opposite of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `neg` (when used as a unary operator). =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        PowerSeries.mkPowerSeries.mk.{u_2} {R : Type u_2} (f : ℕ → R) : PowerSeries RConstructor for formal power series.  fun i 
          (-1) ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. i *HMul.hMul.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HMul α β γ] : α → β → γ`a * b` computes the product of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `*` in identifiers is `mul`.
            Ring.chooseRing.choose.{u_1} {R : Type u_1} [AddCommGroupWithOne R] [Pow R ℕ] [BinomialRing R] (r : R) (n : ℕ) : RThe binomial coefficient `choose r n` generalizes the natural number `Nat.choose` function,
    interpreted in terms of choosing without replacement.  (HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator).nK +HAdd.hAdd.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HAdd α β γ] : α → β → γ`a + b` computes the sum of `a` and `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `+` in identifiers is `add`. i -HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). 1)HSub.hSub.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HSub α β γ] : α → β → γ`a - b` computes the difference of `a` and `b`.
    The meaning of this notation is type-dependent.
    * For natural numbers, this operator saturates at 0: `a - b = 0` when `a ≤ b`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `sub` (when used as a binary operator). i
    The anti-Newton binomial formula: (1+x)^{-n} = ∑_{i ∈ ℕ} (-1)^i C(n+i-1, i) x^i
    This is a consequence of the generalized Newton formula.
    Label: prop.fps.anti-newton-binom 
Proof

Apply the generalized Newton formula with c=-n and use the upper-negation identity \dbinom{-n}{i}=(-1)^i\dbinom{n+i-1}{i}.

Lemma9.23
Group: Further consequences of the exponent definition. (3)
Hover another entry in this group to preview it.
Preview
Lemma 9.24
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 0

For any c\in K, we have 1^c = 1.

Lean code for Lemma9.231 theorem
  • theorem AlgebraicCombinatorics.FPS.one_fpsPow.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] (cK : KType u_1) : AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  1 cK =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1
    theorem AlgebraicCombinatorics.FPS.one_fpsPow.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] (cK : KType u_1) :
      AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  1 cK =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        1
    1^c = 1 for any c 
Proof

1^c=\operatorname{Exp}(c\cdot\operatorname{Log}1) =\operatorname{Exp}(c\cdot 0)=\operatorname{Exp}(0)=1.

Lemma9.24
Group: Further consequences of the exponent definition. (3)
Hover another entry in this group to preview it.
Preview
Lemma 9.23
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 0

For f\in K[[x]]_1 and c\in K, we have \left[x^0\right](f^c)=1.

Lean code for Lemma9.241 theorem
  • theorem AlgebraicCombinatorics.FPS.constantCoeff_fpsPow.{u_1} {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. }
      [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1] [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] {fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f : AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures.  fPowerSeries K) (cK : KType u_1) :
      PowerSeries.constantCoeffPowerSeries.constantCoeff.{u_1} {R : Type u_1} [Semiring R] : PowerSeries R →+* RThe constant coefficient of a formal power series.  (AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K cK) =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`. 1
    theorem AlgebraicCombinatorics.FPS.constantCoeff_fpsPow.{u_1}
      {KType u_1 : Type u_1A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [CommRingCommRing.{u} (α : Type u) : Type uA commutative ring is a ring with commutative multiplication.  KType u_1]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     KType u_1] {fPowerSeries K : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  KType u_1}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f :
        AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
          fPowerSeries K)
      (cK : KType u_1) :
      PowerSeries.constantCoeffPowerSeries.constantCoeff.{u_1} {R : Type u_1} [Semiring R] : PowerSeries R →+* RThe constant coefficient of a formal power series. 
          (AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K
            cK) =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        1
    The constant term of f^c is 1 when f has constant term 1.
    This is a simp-friendly version of `hasConstantTermOne_fpsPow`.
    Label: def.fps.power-c (property) 
Proof

Immediate from the fact that f^c\in K[[x]]_1.

Lemma9.25
Group: Further consequences of the exponent definition. (3)
Hover another entry in this group to preview it.
Preview
Lemma 9.23
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 0

For f\in K'[[x]]_1 over a field K' and c\in K', we have f^{-c} = (f^c)^{-1}.

Lean code for Lemma9.251 theorem
  • theorem AlgebraicCombinatorics.FPS.fpsPow_neg.{u_2} {K'Type u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [FieldField.{u} (K : Type u) : Type uA `Field` is a `CommRing` with multiplicative inverses for nonzero elements.
    
    An instance of `Field K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.
    Those two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need
    to control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).
    See also note [forgetful inheritance].
    
    If the field has positive characteristic `p`, our division by zero convention forces
    `ratCast (1 / p) = 1 / 0 = 0`.  K'Type u_2]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     K'Type u_2] {fPowerSeries K' : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  K'Type u_2}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f : AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures.  fPowerSeries K') (cK' : K'Type u_2) :
      AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K' (Neg.neg.{u} {α : Type u} [self : Neg α] : α → α`-a` computes the negative or opposite of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `neg` (when used as a unary operator).-Neg.neg.{u} {α : Type u} [self : Neg α] : α → α`-a` computes the negative or opposite of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `neg` (when used as a unary operator).cK')Neg.neg.{u} {α : Type u} [self : Neg α] : α → α`-a` computes the negative or opposite of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `neg` (when used as a unary operator). =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        (AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K' cK')⁻¹Inv.inv.{u} {α : Type u} [self : Inv α] : α → α`a⁻¹` computes the inverse of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⁻¹` in identifiers is `inv`.
    theorem AlgebraicCombinatorics.FPS.fpsPow_neg.{u_2}
      {K'Type u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [FieldField.{u} (K : Type u) : Type uA `Field` is a `CommRing` with multiplicative inverses for nonzero elements.
    
    An instance of `Field K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.
    Those two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need
    to control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).
    See also note [forgetful inheritance].
    
    If the field has positive characteristic `p`, our division by zero convention forces
    `ratCast (1 / p) = 1 / 0 = 0`.  K'Type u_2]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     K'Type u_2] {fPowerSeries K' : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  K'Type u_2}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f :
        AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
          fPowerSeries K')
      (cK' : K'Type u_2) :
      AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K'
          (Neg.neg.{u} {α : Type u} [self : Neg α] : α → α`-a` computes the negative or opposite of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `neg` (when used as a unary operator).-Neg.neg.{u} {α : Type u} [self : Neg α] : α → α`-a` computes the negative or opposite of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `neg` (when used as a unary operator).cK')Neg.neg.{u} {α : Type u} [self : Neg α] : α → α`-a` computes the negative or opposite of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `neg` (when used as a unary operator). =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        (AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K'
            cK')⁻¹Inv.inv.{u} {α : Type u} [self : Inv α] : α → α`a⁻¹` computes the inverse of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⁻¹` in identifiers is `inv`.
    f^(-c) = (f^c)⁻¹ for f with constant term 1 (over a field).
    This extends the rules of exponents to negative powers.
    Label: def.fps.power-c (negative power property) 
Proof

We have f^{-c}\cdot f^c = f^{-c+c} = f^0 = 1, so f^{-c} is the inverse of f^c.

Lemma9.26
Group: Further consequences of the exponent definition. (3)
Hover another entry in this group to preview it.
Preview
Lemma 9.23
Loading preview
Hover a group entry to preview it.
L∃∀Nused by 0

For integer exponents, f^c agrees with the standard power: for n\ge 0, f^n is the usual nonnegative power, and for n<0, f^n = (f^{|n|})^{-1}.

Lean code for Lemma9.261 theorem
  • theorem AlgebraicCombinatorics.FPS.fpsPow_int.{u_2} {K'Type u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [FieldField.{u} (K : Type u) : Type uA `Field` is a `CommRing` with multiplicative inverses for nonzero elements.
    
    An instance of `Field K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.
    Those two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need
    to control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).
    See also note [forgetful inheritance].
    
    If the field has positive characteristic `p`, our division by zero convention forces
    `ratCast (1 / p) = 1 / 0 = 0`.  K'Type u_2]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     K'Type u_2] {fPowerSeries K' : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  K'Type u_2}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f : AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures.  fPowerSeries K') (n : Int : TypeThe integers.
    
    This type is special-cased by the compiler and overridden with an efficient implementation. The
    runtime has a special representation for `Int` that stores “small” signed numbers directly, while
    larger numbers use a fast arbitrary-precision arithmetic library (usually
    [GMP](https://gmplib.org/)). A “small number” is an integer that can be encoded with one fewer bits
    than the platform's pointer size (i.e. 63 bits on 64-bit architectures and 31 bits on 32-bit
    architectures).
    ) :
      AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K' n =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        ifite.{u} {α : Sort u} (c : Prop) [h : Decidable c] (t e : α) : α`if c then t else e` is notation for `ite c t e`, "if-then-else", which decides to
    return `t` or `e` depending on whether `c` is true or false. The explicit argument
    `c : Prop` does not have any actual computational content, but there is an additional
    `[Decidable c]` argument synthesized by typeclass inference which actually
    determines how to evaluate `c` to true or false. Write `if h : c then t else e`
    instead for a "dependent if-then-else" `dite`, which allows `t`/`e` to use the fact
    that `c` is true/false.
     n GE.ge.{u} {α : Type u} [LE α] (a b : α) : Prop`a ≥ b` is an abbreviation for `b ≤ a`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≥` in identifiers is `ge`.
    
     * The recommended spelling of `>=` in identifiers is `ge` (prefer `≥` over `>=`). 0 thenite.{u} {α : Sort u} (c : Prop) [h : Decidable c] (t e : α) : α`if c then t else e` is notation for `ite c t e`, "if-then-else", which decides to
    return `t` or `e` depending on whether `c` is true or false. The explicit argument
    `c : Prop` does not have any actual computational content, but there is an additional
    `[Decidable c]` argument synthesized by typeclass inference which actually
    determines how to evaluate `c` to true or false. Write `if h : c then t else e`
    instead for a "dependent if-then-else" `dite`, which allows `t`/`e` to use the fact
    that `c` is true/false.
     fPowerSeries K' ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. n.toNatInt.toNat : ℤ → ℕConverts an integer into a natural number. Negative numbers are converted to `0`.
    
    Examples:
    * `(7 : Int).toNat = 7`
    * `(0 : Int).toNat = 0`
    * `(-7 : Int).toNat = 0`
     elseite.{u} {α : Sort u} (c : Prop) [h : Decidable c] (t e : α) : α`if c then t else e` is notation for `ite c t e`, "if-then-else", which decides to
    return `t` or `e` depending on whether `c` is true or false. The explicit argument
    `c : Prop` does not have any actual computational content, but there is an additional
    `[Decidable c]` argument synthesized by typeclass inference which actually
    determines how to evaluate `c` to true or false. Write `if h : c then t else e`
    instead for a "dependent if-then-else" `dite`, which allows `t`/`e` to use the fact
    that `c` is true/false.
     (HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`.fPowerSeries K' ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. (Neg.neg.{u} {α : Type u} [self : Neg α] : α → α`-a` computes the negative or opposite of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `neg` (when used as a unary operator).-Neg.neg.{u} {α : Type u} [self : Neg α] : α → α`-a` computes the negative or opposite of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `neg` (when used as a unary operator).n)Neg.neg.{u} {α : Type u} [self : Neg α] : α → α`-a` computes the negative or opposite of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `neg` (when used as a unary operator)..toNatInt.toNat : ℤ → ℕConverts an integer into a natural number. Negative numbers are converted to `0`.
    
    Examples:
    * `(7 : Int).toNat = 7`
    * `(0 : Int).toNat = 0`
    * `(-7 : Int).toNat = 0`
    )HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`.⁻¹Inv.inv.{u} {α : Type u} [self : Inv α] : α → α`a⁻¹` computes the inverse of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⁻¹` in identifiers is `inv`.
    theorem AlgebraicCombinatorics.FPS.fpsPow_int.{u_2}
      {K'Type u_2 : Type u_2A type universe. `Type ≡ Type 0`, `Type u ≡ Sort (u + 1)`. } [FieldField.{u} (K : Type u) : Type uA `Field` is a `CommRing` with multiplicative inverses for nonzero elements.
    
    An instance of `Field K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.
    Those two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need
    to control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).
    See also note [forgetful inheritance].
    
    If the field has positive characteristic `p`, our division by zero convention forces
    `ratCast (1 / p) = 1 / 0 = 0`.  K'Type u_2]
      [AlgebraAlgebra.{u, v} (R : Type u) (A : Type v) [CommSemiring R] [Semiring A] : Type (max u v)An associative unital `R`-algebra is a semiring `A` equipped with a map into its center `R → A`.
    
    See the implementation notes in this file for discussion of the details of this definition.
     Rat : TypeRational numbers, implemented as a pair of integers `num / den` such that the
    denominator is positive and the numerator and denominator are coprime.
     K'Type u_2] {fPowerSeries K' : PowerSeriesPowerSeries.{u_1} (R : Type u_1) : Type u_1Formal power series over a coefficient type `R`  K'Type u_2}
      (hfAlgebraicCombinatorics.FPS.HasConstantTermOne f :
        AlgebraicCombinatorics.FPS.HasConstantTermOneAlgebraicCombinatorics.FPS.HasConstantTermOne.{u_1} {K : Type u_1} [CommRing K] (f : PowerSeries K) : PropAn FPS has constant term 1.
    This is the condition for f ∈ K⟦X⟧₁ in the source.
    Label: def.fps.Exp-Log-maps (b)
    
    Note: This is definitionally equivalent to membership in `PowerSeries₁` from ExpLog.lean:
    `HasConstantTermOne f ↔ f ∈ PowerSeries₁`. The `Prop` form is used here for convenience
    in hypotheses, while `PowerSeries₁` (a `Set`) is used in ExpLog.lean for subgroup structures. 
          fPowerSeries K')
      (n : Int : TypeThe integers.
    
    This type is special-cased by the compiler and overridden with an efficient implementation. The
    runtime has a special representation for `Int` that stores “small” signed numbers directly, while
    larger numbers use a fast arbitrary-precision arithmetic library (usually
    [GMP](https://gmplib.org/)). A “small number” is an integer that can be encoded with one fewer bits
    than the platform's pointer size (i.e. 63 bits on 64-bit architectures and 31 bits on 32-bit
    architectures).
    ) :
      AlgebraicCombinatorics.FPS.fpsPowAlgebraicCombinatorics.FPS.fpsPow.{u_1} {K : Type u_1} [CommRing K] [Algebra ℚ K] (f : PowerSeries K) (c : K) :
      PowerSeries KThe c-th power of an FPS f with constant term 1.
    f^c := Exp(c * Log(f)) = exp.subst (c * log_series.subst (f-1))
    Label: def.fps.power-c  fPowerSeries K' n =Eq.{u_1} {α : Sort u_1} : α → α → PropThe equality relation. It has one introduction rule, `Eq.refl`.
    We use `a = b` as notation for `Eq a b`.
    A fundamental property of equality is that it is an equivalence relation.
    ```
    variable (α : Type) (a b c d : α)
    variable (hab : a = b) (hcb : c = b) (hcd : c = d)
    
    example : a = d :=
      Eq.trans (Eq.trans hab (Eq.symm hcb)) hcd
    ```
    Equality is much more than an equivalence relation, however. It has the important property that every assertion
    respects the equivalence, in the sense that we can substitute equal expressions without changing the truth value.
    That is, given `h1 : a = b` and `h2 : p a`, we can construct a proof for `p b` using substitution: `Eq.subst h1 h2`.
    Example:
    ```
    example (α : Type) (a b : α) (p : α → Prop)
            (h1 : a = b) (h2 : p a) : p b :=
      Eq.subst h1 h2
    
    example (α : Type) (a b : α) (p : α → Prop)
        (h1 : a = b) (h2 : p a) : p b :=
      h1 ▸ h2
    ```
    The triangle in the second presentation is a macro built on top of `Eq.subst` and `Eq.symm`, and you can enter it by typing `\t`.
    For more information: [Equality](https://lean-lang.org/theorem_proving_in_lean4/quantifiers_and_equality.html#equality)
    
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `=` in identifiers is `eq`.
        ifite.{u} {α : Sort u} (c : Prop) [h : Decidable c] (t e : α) : α`if c then t else e` is notation for `ite c t e`, "if-then-else", which decides to
    return `t` or `e` depending on whether `c` is true or false. The explicit argument
    `c : Prop` does not have any actual computational content, but there is an additional
    `[Decidable c]` argument synthesized by typeclass inference which actually
    determines how to evaluate `c` to true or false. Write `if h : c then t else e`
    instead for a "dependent if-then-else" `dite`, which allows `t`/`e` to use the fact
    that `c` is true/false.
     n GE.ge.{u} {α : Type u} [LE α] (a b : α) : Prop`a ≥ b` is an abbreviation for `b ≤ a`. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `≥` in identifiers is `ge`.
    
     * The recommended spelling of `>=` in identifiers is `ge` (prefer `≥` over `>=`). 0 thenite.{u} {α : Sort u} (c : Prop) [h : Decidable c] (t e : α) : α`if c then t else e` is notation for `ite c t e`, "if-then-else", which decides to
    return `t` or `e` depending on whether `c` is true or false. The explicit argument
    `c : Prop` does not have any actual computational content, but there is an additional
    `[Decidable c]` argument synthesized by typeclass inference which actually
    determines how to evaluate `c` to true or false. Write `if h : c then t else e`
    instead for a "dependent if-then-else" `dite`, which allows `t`/`e` to use the fact
    that `c` is true/false.
     fPowerSeries K' ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. n.toNatInt.toNat : ℤ → ℕConverts an integer into a natural number. Negative numbers are converted to `0`.
    
    Examples:
    * `(7 : Int).toNat = 7`
    * `(0 : Int).toNat = 0`
    * `(-7 : Int).toNat = 0`
    
        elseite.{u} {α : Sort u} (c : Prop) [h : Decidable c] (t e : α) : α`if c then t else e` is notation for `ite c t e`, "if-then-else", which decides to
    return `t` or `e` depending on whether `c` is true or false. The explicit argument
    `c : Prop` does not have any actual computational content, but there is an additional
    `[Decidable c]` argument synthesized by typeclass inference which actually
    determines how to evaluate `c` to true or false. Write `if h : c then t else e`
    instead for a "dependent if-then-else" `dite`, which allows `t`/`e` to use the fact
    that `c` is true/false.
     (HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`.fPowerSeries K' ^HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`. (Neg.neg.{u} {α : Type u} [self : Neg α] : α → α`-a` computes the negative or opposite of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `neg` (when used as a unary operator).-Neg.neg.{u} {α : Type u} [self : Neg α] : α → α`-a` computes the negative or opposite of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `neg` (when used as a unary operator).n)Neg.neg.{u} {α : Type u} [self : Neg α] : α → α`-a` computes the negative or opposite of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `-` in identifiers is `neg` (when used as a unary operator)..toNatInt.toNat : ℤ → ℕConverts an integer into a natural number. Negative numbers are converted to `0`.
    
    Examples:
    * `(7 : Int).toNat = 7`
    * `(0 : Int).toNat = 0`
    * `(-7 : Int).toNat = 0`
    )HPow.hPow.{u, v, w} {α : Type u} {β : Type v} {γ : outParam (Type w)} [self : HPow α β γ] : α → β → γ`a ^ b` computes `a` to the power of `b`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `^` in identifiers is `pow`.⁻¹Inv.inv.{u} {α : Type u} [self : Inv α] : α → α`a⁻¹` computes the inverse of `a`.
    The meaning of this notation is type-dependent. 
    
    Conventions for notations in identifiers:
    
     * The recommended spelling of `⁻¹` in identifiers is `inv`.
    For integer exponents, fpsPow agrees with the standard power (when f is invertible).
    For negative integers, this requires f to be invertible (which holds when constantCoeff f ≠ 0).
    Label: (consistency claim after def.fps.power-c) 
Proof

For n\ge 0, use the natural-number compatibility lemma. For n<0, combine f^{-c}\cdot f^c=1 with the natural-number case for f^{|n|}.