/** This program calculates the "rising factorial" and the "falling factorial." Sometimes this is called the "Pochhammer function" but that naming convention is almost certainly going to be ambiguous. (See Knuth, below) Beware the (terrible) notation as (v)_k or v^(n) which may represent either the rising or falling factorial! (Just because a quantity is in parentheses you're supposed to infer that it means some totally different thing than that number in parentheses?! Get out of here with that, you, and your binomial theorem notation and your Legendre symbol notation and your Jacobi symbol notation and every other mathematician who thought "hey I'm just gonna make parentheses mean something TOTALLY NEW and AMBIGUOUS and name it after myself.") Pochhammer himself used that notation to mean something else! So stop it! See Knuth, Donald E. "Two Notes on Notation", https://arxiv.org/abs/math/9205211 beginning around equation (2.11) for many more details and better (but still ambiguous and awful) notation. */ /** Calculate the rising factorial. The rising factorial calculates: v (v+1) (v+2) ... (v + k - 1) This function is closely related to the gamma function, which is closely related to the factorial. This implementation includes an extension to negative numbers, where: risingFactorial[v, -k] := (-1)^-k / risingFactorial[1-v, -k] Since this function only utilizes basic arithmetic, it automatically works to arbitrary precision and works for complex numbers. This function also works with symbolic values of v: risingFactorial[x,3] produces: x (1 + x) (2 + x) See: https://en.wikipedia.org/wiki/Falling_and_rising_factorials Gonzalez, Ivan & Jiu, Lin & Moll, Victor. (2015). Pochhammer Symbol with Negative Indices. A New Rule for the Method of Brackets. Open Mathematics. 14. 10.1515/math-2016-0063. Which can be found at: https://www.researchgate.net/publication/280695601_Pochhammer_Symbol_with_Negative_Indices_A_New_Rule_for_the_Method_of_Brackets/fulltext/55c4077508aeb97567402184/280695601_Pochhammer_Symbol_with_Negative_Indices_A_New_Rule_for_the_Method_of_Brackets.pdf?origin=publication_detail or in arxiv: https://arxiv.org/abs/1508.00056 */ risingFactorial[v, k] := { if ! isInteger[k] { println["risingFactorial not defined for non-integer value k = \$k"] return undef } // Extension to negative numbers if k < 0 return (-1)^-k / risingFactorial[1-v, -k] product = 1 for s = 0 to k-1 product = product * (v+s) return product } /** An alternate name for the rising factorial. As noted above, the name "Pochhammer" can indicate a rising or falling factorial depending on the conventions in your field and this usage should be deprecated. */ Pochhammer[v, k] := risingFactorial[v, k] /** Calculate the falling factorial. This calculates x (x-1) (x-2) ... (x-n+1) See https://en.wikipedia.org/wiki/Falling_and_rising_factorials */ fallingFactorial[x, n] := { product = 1 for k = 0 to n-1 product = product * (x-k) return product } /** This is a generalization of the binomial theorem to rational r using Newton's generalization. r can even be symbolic. This utilizes the fact that the binomial theorem for (r, k) can be generalized for r and integer k by: fallingFactorial[r, k] / k! See: https://en.wikipedia.org/wiki/Binomial_theorem#Newton's_generalized_binomial_theorem */ generalizedBinomial[r, k] := fallingFactorial[r, k] / k!