【Python】階乗・二重階乗の計算

PythonのTopに戻る


階乗・二重階乗の計算

・階乗の計算
・二重階乗の計算

 

 階乗の計算

$$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関数でも階乗が計算できる。

 


PythonのTopに戻る