Documentation

Mathlib.RingTheory.Polynomial.Pochhammer

The Pochhammer polynomials #

We define and prove some basic relations about ascPochhammer S n : S[X] := X * (X + 1) * ... * (X + n - 1) which is also known as the rising factorial and about descPochhammer R n : R[X] := X * (X - 1) * ... * (X - n + 1) which is also known as the falling factorial. Versions of this definition that are focused on Nat can be found in Data.Nat.Factorial as Nat.ascFactorial and Nat.descFactorial.

Implementation #

As with many other families of polynomials, even though the coefficients are always in β„• or β„€, we define the polynomial with coefficients in any [Semiring S] or [Ring R]. In an integral domain S, we show that ascPochhammer S n is zero iff n is a sufficiently large non-positive integer.

TODO #

There is lots more in this direction:

noncomputable def ascPochhammer (S : Type u) [Semiring S] :
β„• β†’ Polynomial S

ascPochhammer S n is the polynomial X * (X + 1) * ... * (X + n - 1), with coefficients in the semiring S.

Instances For
    @[simp]
    theorem ascPochhammer_map {S : Type u} [Semiring S] {T : Type v} [Semiring T] (f : S β†’+* T) (n : β„•) :
    theorem ascPochhammer_evalβ‚‚ {S : Type u} [Semiring S] {T : Type v} [Semiring T] (f : S β†’+* T) (n : β„•) (t : T) :
    @[simp]
    theorem ascPochhammer_eval_cast (S : Type u) [Semiring S] (n k : β„•) :
    ↑(Polynomial.eval k (ascPochhammer β„• n)) = Polynomial.eval (↑k) (ascPochhammer S n)
    theorem ascPochhammer_eval_zero (S : Type u) [Semiring S] {n : β„•} :
    Polynomial.eval 0 (ascPochhammer S n) = if n = 0 then 1 else 0
    @[simp]
    theorem ascPochhammer_ne_zero_eval_zero (S : Type u) [Semiring S] {n : β„•} (h : n β‰  0) :
    theorem ascPochhammer_succ_right (S : Type u) [Semiring S] (n : β„•) :
    ascPochhammer S (n + 1) = ascPochhammer S n * (Polynomial.X + ↑n)
    theorem ascPochhammer_succ_eval {S : Type u_1} [Semiring S] (n : β„•) (k : S) :
    Polynomial.eval k (ascPochhammer S (n + 1)) = Polynomial.eval k (ascPochhammer S n) * (k + ↑n)
    theorem ascPochhammer_succ_comp_X_add_one (S : Type u) [Semiring S] (n : β„•) :
    (ascPochhammer S (n + 1)).comp (Polynomial.X + 1) = ascPochhammer S (n + 1) + (n + 1) β€’ (ascPochhammer S n).comp (Polynomial.X + 1)
    theorem ascPochhammer_mul (S : Type u) [Semiring S] (n m : β„•) :
    ascPochhammer S n * (ascPochhammer S m).comp (Polynomial.X + ↑n) = ascPochhammer S (n + m)
    theorem ascPochhammer_nat_eq_natCast_descFactorial (S : Type u_1) [Semiring S] (a b : β„•) :
    Polynomial.eval (↑a) (ascPochhammer S b) = ↑((a + b - 1).descFactorial b)
    theorem ascPochhammer_pos {S : Type u_1} [Semiring S] [PartialOrder S] [IsStrictOrderedRing S] (n : β„•) (s : S) (h : 0 < s) :
    @[simp]
    theorem ascPochhammer_eval_one (S : Type u_2) [Semiring S] (n : β„•) :
    theorem factorial_mul_ascPochhammer (S : Type u_2) [Semiring S] (r n : β„•) :
    ↑r.factorial * Polynomial.eval (↑r + 1) (ascPochhammer S n) = ↑(r + n).factorial
    theorem ascPochhammer_nat_eval_succ (r n : β„•) :
    n * Polynomial.eval (n + 1) (ascPochhammer β„• r) = (n + r) * Polynomial.eval n (ascPochhammer β„• r)
    theorem ascPochhammer_eval_succ (S : Type u_1) [Semiring S] (r n : β„•) :
    ↑n * Polynomial.eval (↑n + 1) (ascPochhammer S r) = (↑n + ↑r) * Polynomial.eval (↑n) (ascPochhammer S r)
    theorem Nat.cast_ascFactorial (S : Type u_1) [Semiring S] (a b : β„•) :
    ↑(a.ascFactorial b) = Polynomial.eval (↑a) (ascPochhammer S b)
    theorem Nat.cast_descFactorial (S : Type u_1) [Semiring S] (a b : β„•) :
    ↑(a.descFactorial b) = Polynomial.eval (↑(a - (b - 1))) (ascPochhammer S b)
    theorem Nat.cast_factorial (S : Type u_1) [Semiring S] (a : β„•) :
    noncomputable def descPochhammer (R : Type u) [Ring R] :
    β„• β†’ Polynomial R

    descPochhammer R n is the polynomial X * (X - 1) * ... * (X - n + 1), with coefficients in the ring R.

    Instances For
      @[simp]
      theorem descPochhammer_map {R : Type u} [Ring R] {T : Type v} [Ring T] (f : R β†’+* T) (n : β„•) :
      @[simp]
      theorem descPochhammer_eval_cast (R : Type u) [Ring R] (n : β„•) (k : β„€) :
      ↑(Polynomial.eval k (descPochhammer β„€ n)) = Polynomial.eval (↑k) (descPochhammer R n)
      theorem descPochhammer_eval_zero (R : Type u) [Ring R] {n : β„•} :
      Polynomial.eval 0 (descPochhammer R n) = if n = 0 then 1 else 0
      @[simp]
      theorem descPochhammer_ne_zero_eval_zero (R : Type u) [Ring R] {n : β„•} (h : n β‰  0) :
      theorem descPochhammer_succ_right (R : Type u) [Ring R] (n : β„•) :
      descPochhammer R (n + 1) = descPochhammer R n * (Polynomial.X - ↑n)
      @[simp]
      theorem descPochhammer_natDegree (R : Type u) [Ring R] (n : β„•) [NoZeroDivisors R] [Nontrivial R] :
      theorem descPochhammer_succ_eval {S : Type u_1} [Ring S] (n : β„•) (k : S) :
      Polynomial.eval k (descPochhammer S (n + 1)) = Polynomial.eval k (descPochhammer S n) * (k - ↑n)
      theorem descPochhammer_succ_comp_X_sub_one (R : Type u) [Ring R] (n : β„•) :
      (descPochhammer R (n + 1)).comp (Polynomial.X - 1) = descPochhammer R (n + 1) - (↑n + 1) β€’ (descPochhammer R n).comp (Polynomial.X - 1)
      theorem descPochhammer_eq_ascPochhammer (n : β„•) :
      descPochhammer β„€ n = (ascPochhammer β„€ n).comp (Polynomial.X - ↑n + 1)
      theorem descPochhammer_eval_eq_ascPochhammer (R : Type u) [Ring R] (r : R) (n : β„•) :
      theorem descPochhammer_mul (R : Type u) [Ring R] (n m : β„•) :
      descPochhammer R n * (descPochhammer R m).comp (Polynomial.X - ↑n) = descPochhammer R (n + m)
      theorem descPochhammer_eval_eq_descFactorial (R : Type u) [Ring R] (n k : β„•) :
      Polynomial.eval (↑n) (descPochhammer R k) = ↑(n.descFactorial k)
      theorem descPochhammer_int_eq_ascFactorial (a b : β„•) :
      Polynomial.eval (↑a + ↑b) (descPochhammer β„€ b) = ↑((a + 1).ascFactorial b)
      theorem ascPochhammer_eval_neg_coe_nat_of_lt {R : Type u} [Ring R] {n k : β„•} (h : k < n) :
      Polynomial.eval (-↑k) (ascPochhammer R n) = 0

      The Pochhammer polynomial of degree n has roots at 0, -1, ..., -(n - 1).

      @[simp]
      theorem ascPochhammer_eval_eq_zero_iff {R : Type u} [Ring R] [IsDomain R] (n : β„•) (r : R) :
      Polynomial.eval r (ascPochhammer R n) = 0 ↔ βˆƒ k < n, ↑k = -r

      Over an integral domain, the Pochhammer polynomial of degree n has roots only at 0, -1, ..., -(n - 1).

      theorem descPochhammer_eval_coe_nat_of_lt {R : Type u} [Ring R] {k n : β„•} (h : k < n) :
      Polynomial.eval (↑k) (descPochhammer R n) = 0

      descPochhammer R n is 0 for 0, 1, …, n-1.

      theorem descPochhammer_eval_eq_prod_range {R : Type u_1} [CommRing R] (n : β„•) (r : R) :
      Polynomial.eval r (descPochhammer R n) = ∏ j ∈ Finset.range n, (r - ↑j)
      theorem descPochhammer_pos {S : Type u_1} [Ring S] [PartialOrder S] [IsStrictOrderedRing S] {n : β„•} {s : S} (h : ↑n - 1 < s) :

      descPochhammer S n is positive on (n-1, ∞).

      theorem descPochhammer_nonneg {S : Type u_1} [Ring S] [PartialOrder S] [IsStrictOrderedRing S] {n : β„•} {s : S} (h : ↑n - 1 ≀ s) :

      descPochhammer S n is nonnegative on [n-1, ∞).

      theorem pow_le_descPochhammer_eval {S : Type u_1} [Ring S] [PartialOrder S] [IsStrictOrderedRing S] {n : β„•} {s : S} (h : ↑n - 1 ≀ s) :
      (s - ↑n + 1) ^ n ≀ Polynomial.eval s (descPochhammer S n)

      descPochhammer S n is at least (s-n+1)^n on [n-1, ∞).

      theorem monotoneOn_descPochhammer_eval {S : Type u_1} [Ring S] [PartialOrder S] [IsStrictOrderedRing S] (n : β„•) :
      MonotoneOn (fun (x : S) => Polynomial.eval x (descPochhammer S n)) (Set.Ici (↑n - 1))

      descPochhammer S n is monotone on [n-1, ∞).

      theorem Nat.cast_choose_eq_ascPochhammer_div (K : Type u_1) [DivisionSemiring K] [CharZero K] (a b : β„•) :
      ↑(a.choose b) = Polynomial.eval (↑(a - (b - 1))) (ascPochhammer K b) / ↑b.factorial
      theorem Nat.cast_choose_eq_descPochhammer_div (K : Type u_1) [DivisionRing K] [CharZero K] (a b : β„•) :
      ↑(a.choose b) = Polynomial.eval (↑a) (descPochhammer K b) / ↑b.factorial