The Pochhammer polynomials #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
We define and prove some basic relations about
pochhammer S n : S[X] := X * (X + 1) * ... * (X + n - 1)
which is also known as the rising factorial. A version of this definition
that is focused on nat
can be found in data.nat.factorial
as nat.asc_factorial
.
Implementation #
As with many other families of polynomials, even though the coefficients are always in ℕ
,
we define the polynomial with coefficients in any [semiring S]
.
TODO #
There is lots more in this direction:
- q-factorials, q-binomials, q-Pochhammer.
pochhammer S n
is the polynomial X * (X+1) * ... * (X + n - 1)
,
with coefficients in the semiring S
.
Equations
- pochhammer S (n + 1) = polynomial.X * (pochhammer S n).comp (polynomial.X + 1)
- pochhammer S 0 = 1
theorem
pochhammer_succ_left
(S : Type u)
[semiring S]
(n : ℕ) :
pochhammer S (n + 1) = polynomial.X * (pochhammer S n).comp (polynomial.X + 1)
@[simp]
theorem
pochhammer_map
{S : Type u}
[semiring S]
{T : Type v}
[semiring T]
(f : S →+* T)
(n : ℕ) :
polynomial.map f (pochhammer S n) = pochhammer T n
@[simp, norm_cast]
theorem
pochhammer_eval_cast
(S : Type u)
[semiring S]
(n k : ℕ) :
↑(polynomial.eval k (pochhammer ℕ n)) = polynomial.eval ↑k (pochhammer S n)
theorem
pochhammer_eval_zero
(S : Type u)
[semiring S]
{n : ℕ} :
polynomial.eval 0 (pochhammer S n) = ite (n = 0) 1 0
theorem
pochhammer_zero_eval_zero
(S : Type u)
[semiring S] :
polynomial.eval 0 (pochhammer S 0) = 1
@[simp]
theorem
pochhammer_ne_zero_eval_zero
(S : Type u)
[semiring S]
{n : ℕ}
(h : n ≠ 0) :
polynomial.eval 0 (pochhammer S n) = 0
theorem
pochhammer_succ_right
(S : Type u)
[semiring S]
(n : ℕ) :
pochhammer S (n + 1) = pochhammer S n * (polynomial.X + ↑n)
theorem
pochhammer_succ_eval
{S : Type u_1}
[semiring S]
(n : ℕ)
(k : S) :
polynomial.eval k (pochhammer S (n + 1)) = polynomial.eval k (pochhammer S n) * (k + ↑n)
theorem
pochhammer_succ_comp_X_add_one
(S : Type u)
[semiring S]
(n : ℕ) :
(pochhammer S (n + 1)).comp (polynomial.X + 1) = pochhammer S (n + 1) + (n + 1) • (pochhammer S n).comp (polynomial.X + 1)
theorem
pochhammer_mul
(S : Type u)
[semiring S]
(n m : ℕ) :
pochhammer S n * (pochhammer S m).comp (polynomial.X + ↑n) = pochhammer S (n + m)
theorem
pochhammer_nat_eq_asc_factorial
(n k : ℕ) :
polynomial.eval (n + 1) (pochhammer ℕ k) = n.asc_factorial k
theorem
pochhammer_nat_eq_desc_factorial
(a b : ℕ) :
polynomial.eval a (pochhammer ℕ b) = (a + b - 1).desc_factorial b
theorem
pochhammer_pos
{S : Type u_1}
[strict_ordered_semiring S]
(n : ℕ)
(s : S)
(h : 0 < s) :
0 < polynomial.eval s (pochhammer S n)
@[simp]
theorem
pochhammer_eval_one
(S : Type u_1)
[semiring S]
(n : ℕ) :
polynomial.eval 1 (pochhammer S n) = ↑(n.factorial)
theorem
pochhammer_nat_eval_succ
(r n : ℕ) :
n * polynomial.eval (n + 1) (pochhammer ℕ r) = (n + r) * polynomial.eval n (pochhammer ℕ r)
theorem
pochhammer_eval_succ
(S : Type u_1)
[semiring S]
(r n : ℕ) :
↑n * polynomial.eval (↑n + 1) (pochhammer S r) = (↑n + ↑r) * polynomial.eval ↑n (pochhammer S r)