factorialk — SciPy v1.15.2 Manual (original) (raw)
scipy.special.
scipy.special.factorialk(n, k, exact=False, extend='zero')[source]#
Multifactorial of n of order k, n(!!…!).
This is the multifactorial of n skipping k values. For example,
factorialk(17, 4) = 17!!!! = 17 * 13 * 9 * 5 * 1
In particular, for any integer n
, we have
factorialk(n, 1) = factorial(n)
factorialk(n, 2) = factorial2(n)
Parameters:
nint or float or complex (or array_like thereof)
Input values for multifactorial. Non-integer values requireextend='complex'
. By default, the return value for n < 0
is 0.
nint or float or complex (or array_like thereof)
Order of multifactorial. Non-integer values require extend='complex'
.
exactbool, optional
If exact
is set to True, calculate the answer exactly using integer arithmetic, otherwise use an approximation (faster, but yields floats instead of integers) Default is False.
extendstring, optional
One of 'zero'
or 'complex'
; this determines how values n<0
are handled - by default they are 0, but it is possible to opt into the complex extension of the multifactorial. This enables passing complex values, not only to n
but also to k
.
Warning
Using the 'complex'
extension also changes the values of the multifactorial at integers n != 1 (mod k)
by a factor depending on both k
and n % k
, see below or [1].
Returns:
nfint or float or complex or ndarray
Multifactorial (order k
) of n
, as integer, float or complex (depending on exact
and extend
). Array inputs are returned as arrays.
Notes
While less straight-forward than for the double-factorial, it’s possible to calculate a general approximation formula of n!(k) by studying n
for a given remainder r < k
(thus n = m * k + r
, resp. r = n % k
), which can be put together into something valid for all integer values n >= 0
& k > 0
:
n!(k) = k ** ((n - r)/k) * gamma(n/k + 1) / gamma(r/k + 1) * max(r, 1)
This is the basis of the approximation when exact=False
.
In principle, any fixed choice of r
(ignoring its relation r = n%k
to n
) would provide a suitable analytic continuation from integer n
to complex z
(not only satisfying the functional equation but also being logarithmically convex, c.f. Bohr-Mollerup theorem) – in fact, the choice of r
above only changes the function by a constant factor. The final constraint that determines the canonical continuation is f(1) = 1
, which forces r = 1
(see also [1]).:
z!(k) = k ** ((z - 1)/k) * gamma(z/k + 1) / gamma(1/k + 1)
References
Examples
from scipy.special import factorialk factorialk(5, k=1, exact=True) 120 factorialk(5, k=3, exact=True) 10 factorialk([5, 7, 9], k=3, exact=True) array([ 10, 28, 162]) factorialk([5, 7, 9], k=3, exact=False) array([ 10., 28., 162.])