Documentation

Mathlib.RingTheory.Polynomial.HilbertPoly

Hilbert polynomials #

In this file, we formalise the following statement: if F is a field with characteristic 0, then given any p : F[X] and d : ℕ, there exists some h : F[X] such that for any large enough n : ℕ, h(n) is equal to the coefficient of Xⁿ in the power series expansion of p/(1 - X)ᵈ. This h is unique and is denoted as Polynomial.hilbertPoly p d.

For example, given d : ℕ, the power series expansion of 1/(1 - X)ᵈ⁺¹ in F[X] is Σₙ ((d + n).choose d)Xⁿ, which equals Σₙ ((n + 1)···(n + d)/d!)Xⁿ and hence Polynomial.hilbertPoly (1 : F[X]) (d + 1) is the polynomial (X + 1)···(X + d)/d!. Note that if d! = 0 in F, then the polynomial (X + 1)···(X + d)/d! no longer works, so we do not want the characteristic of F to be divisible by d!. As Polynomial.hilbertPoly may take any p : F[X] and d : ℕ as its inputs, it is necessary for us to assume that CharZero F.

Main definitions #

TODO #

noncomputable def Polynomial.preHilbertPoly (F : Type u_1) [Field F] (d k : ) :

For any field F and natural numbers d and k, Polynomial.preHilbertPoly F d k is defined as (d.factorial : F)⁻¹ • ((ascPochhammer F d).comp (X - (C (k : F)) + 1)). This is the most basic form of Hilbert polynomials. Polynomial.preHilbertPoly ℚ d 0 is exactly the Hilbert polynomial of the polynomial ring ℚ[X_0,...,X_d] viewed as a graded module over itself. In fact, Polynomial.preHilbertPoly F d k is the same as Polynomial.hilbertPoly ((X : F[X]) ^ k) (d + 1) for any field F and d k : ℕ (see the lemma Polynomial.hilbertPoly_X_pow_succ). See also the lemma Polynomial.preHilbertPoly_eq_choose_sub_add, which states that if CharZero F, then for any d k n : ℕ with k ≤ n, (Polynomial.preHilbertPoly F d k).eval (n : F) equals (n - k + d).choose d.

Equations
Instances For
    theorem Polynomial.preHilbertPoly_eq_choose_sub_add (F : Type u_1) [Field F] [CharZero F] (d : ) {k n : } (hkn : k n) :
    eval (↑n) (preHilbertPoly F d k) = ((n - k + d).choose d)
    noncomputable def Polynomial.hilbertPoly {F : Type u_1} [Field F] (p : Polynomial F) (d : ) :

    Polynomial.hilbertPoly p 0 = 0; for any d : ℕ, Polynomial.hilbertPoly p (d + 1) is defined as ∑ i ∈ p.support, (p.coeff i) • Polynomial.preHilbertPoly F d i. If M is a graded module whose Poincaré series can be written as p(X)/(1 - X)ᵈ for some p : ℚ[X] with integer coefficients, then Polynomial.hilbertPoly p d is the Hilbert polynomial of M. See also Polynomial.coeff_mul_invOneSubPow_eq_hilbertPoly_eval, which says that PowerSeries.coeff F n (p * PowerSeries.invOneSubPow F d) equals (Polynomial.hilbertPoly p d).eval (n : F) for any large enough n : ℕ.

    Equations
    Instances For
      theorem Polynomial.hilbertPoly_succ {F : Type u_1} [Field F] (p : Polynomial F) (d : ) :
      p.hilbertPoly (d + 1) = ip.support, p.coeff i preHilbertPoly F d i
      theorem Polynomial.hilbertPoly_X_pow_succ {F : Type u_1} [Field F] (d k : ) :
      (X ^ k).hilbertPoly (d + 1) = preHilbertPoly F d k
      theorem Polynomial.hilbertPoly_add_left {F : Type u_1} [Field F] (p q : Polynomial F) (d : ) :
      theorem Polynomial.hilbertPoly_smul {F : Type u_1} [Field F] (a : F) (p : Polynomial F) (d : ) :
      noncomputable def Polynomial.hilbertPoly_linearMap (F : Type u_1) [Field F] (d : ) :

      The function that sends any p : F[X] to Polynomial.hilbertPoly p d is an F-linear map from F[X] to F[X].

      Equations
      Instances For
        theorem Polynomial.coeff_mul_invOneSubPow_eq_hilbertPoly_eval {F : Type u_1} [Field F] [CharZero F] {p : Polynomial F} (d : ) {n : } (hn : p.natDegree < n) :
        (PowerSeries.coeff F n) (p * (PowerSeries.invOneSubPow F d)) = eval (↑n) (p.hilbertPoly d)

        The key property of Hilbert polynomials. If F is a field with characteristic 0, p : F[X] and d : ℕ, then for any large enough n : ℕ, (Polynomial.hilbertPoly p d).eval (n : F) equals the coefficient of Xⁿ in the power series expansion of p/(1 - X)ᵈ.

        theorem Polynomial.existsUnique_hilbertPoly {F : Type u_1} [Field F] [CharZero F] (p : Polynomial F) (d : ) :
        ∃! h : Polynomial F, ∃ (N : ), n > N, (PowerSeries.coeff F n) (p * (PowerSeries.invOneSubPow F d)) = eval (↑n) h

        The polynomial satisfying the key property of Polynomial.hilbertPoly p d is unique.

        @[deprecated Polynomial.existsUnique_hilbertPoly (since := "2024-12-17")]
        theorem Polynomial.exists_unique_hilbertPoly {F : Type u_1} [Field F] [CharZero F] (p : Polynomial F) (d : ) :
        ∃! h : Polynomial F, ∃ (N : ), n > N, (PowerSeries.coeff F n) (p * (PowerSeries.invOneSubPow F d)) = eval (↑n) h

        Alias of Polynomial.existsUnique_hilbertPoly.


        The polynomial satisfying the key property of Polynomial.hilbertPoly p d is unique.

        theorem Polynomial.eq_hilbertPoly_of_forall_coeff_eq_eval {F : Type u_1} [Field F] [CharZero F] {p h : Polynomial F} {d : } (N : ) (hhN : n > N, (PowerSeries.coeff F n) (p * (PowerSeries.invOneSubPow F d)) = eval (↑n) h) :

        If h : F[X] and there exists some N : ℕ such that for any number n : ℕ bigger than N we have PowerSeries.coeff F n (p * invOneSubPow F d) = h.eval (n : F), then h is exactly Polynomial.hilbertPoly p d.

        theorem Polynomial.hilbertPoly_mul_one_sub_succ {F : Type u_1} [Field F] [CharZero F] (p : Polynomial F) (d : ) :
        (p * (1 - X)).hilbertPoly (d + 1) = p.hilbertPoly d
        theorem Polynomial.hilbertPoly_mul_one_sub_pow_add {F : Type u_1} [Field F] [CharZero F] (p : Polynomial F) (d e : ) :
        (p * (1 - X) ^ e).hilbertPoly (d + e) = p.hilbertPoly d