階乗の計算
$$n!=n(n-1)(n-2) \cdots 2 \cdot 1$$を階乗(factorial)といい、通常 $0!=1$ と定義される。階乗の計算を行うには以下のような再帰関数を自作すればよい。
def fact(x): if x == 0: return 1 else: return x * fact(x - 1) print(fact(10))
これは負の値を入力するとエラーになる。「if x <= 0:」と不等号にすれば負の値については常に1を返し、小数を入れても無理やり計算するようになる(ただしこれは正しい値ではない)。
mathモジュールをインポートしてfactorial関数を利用する手もある。factorial関数の引数は非負整数しか受け付けない。
import math num = math.factorial(10) print(num)
また、scipyライブラリが使える環境であればscipy.special.factorial()を利用することも可能である。第2引数にTrueを渡すと正確な値を出力する。
from scipy import special n = 30 # n!を近似計算 num1 = special.factorial(n) print(num1) # 2.652528598121911e+32 # n!の正確な値を計算 num2 = special.factorial(n, True) print(num2) # 265252859812191058636308480000000
あるいは「from mpmath import *」として、mpmathライブラリのfactorial関数を用いることもできる。この関数では引数が巨大数の場合、スターリングの公式を使って階乗が概算される。小数を引数とする場合は大人しくガンマ関数を用いること。
二重階乗の計算
$$n!! =\begin{cases} n\,(n-2)\,(n-4) \cdots 3 \cdot 1\quad (n:\text{奇数}) \\
n\,(n-2)\,(n-4) \cdots 4 \cdot 2\quad (n:\text{偶数})\end{cases}$$を二重階乗(double factorial)といい、通常 $0!!=(-1)!!=1$ と定義される。階乗の計算を行うには以下のような関数を自作する。
def dfact(n): if n <= 0: return 1 else: return n * dfact(n-2) print(dfact(10))
最初の条件文が「if x <= 0:」となっている部分がポイント。
またはsympyライブラリを使えばfactorial2関数で二重階乗が計算可能である。
import sympy f = sympy.factorial2(10) print(f) # 3840
なお、mpmathライブラリと同様にsympyライブラリのfactorial関数でも階乗が計算できる。