Python math.factorialの使い方

この記事のポイント

Pythonのmath.factorialは、数学の「階乗(!)」を簡単に計算できる便利な関数です。

この記事を読むと、次のようなことが身に付きます。

  • 階乗計算を1行で効率的に実行する方法がわかる
  • math.factorialの基本的な書き方とルールを理解できる
  • 順列や組み合わせなど、実用的な計算プログラムが書けるようになる

自分で複雑なループ処理を書かなくても、この関数を使えば正確かつ素早く計算できるようになります。

目次

math.factorialとは?

math.factorialは、指定した数値の階乗を計算するための関数です。

階乗とは、1からその数までの整数をすべて掛け合わせた値のことです。数学では「!」という記号で表されます。たとえば「5の階乗(5!)」なら「5×4×3×2×1」を計算して「120」となります。

本来なら掛け算のループ処理を自分で書く必要がありますが、math.factorialを使えば1行で簡単に記述できます。

math.factorialの特徴

  • Pythonの標準ライブラリであるmathモジュールをインポートして使用します
  • 引数には0以上の整数を指定します
  • 負の数や小数を指定するとエラーになります
  • 計算結果は常に整数(int)として返されます
  • 大きな数値でも効率よく計算できるように作られています

【関連】
Pythonをもっと詳しく学ぶならpaizaラーニング

基本構文

math.factorialを使用するには、まずmathモジュールをインポートします。基本的な使い方はmath.factorial(n)という形式で、引数nに階乗を計算したい0以上の整数(非負整数)を指定します。

ここでは、数値を直接指定する場合と、変数を使って指定する場合の2つのパターンを見てみましょう。

数値を直接指定する

import math result = math.factorial(5) print(result)

出力結果

120

この例では、5の階乗を計算して結果を表示しています。math.factorial(5)を呼び出すことで、1から5までの整数をすべて掛け合わせた値である120が返されます。

変数を使って指定する

import math number = 7 factorial_result = math.factorial(number) print(f"{number}の階乗は{factorial_result}です")

出力結果

7の階乗は5040です

この例では、変数に代入された数値の階乗を計算し、その結果を文章の中に埋め込んで表示しています。まず変数numberに7を代入し、その変数を引数としてmath.factorial関数に渡しています。

計算結果はfactorial_resultに格納され、f文字列(フォーマット済み文字列リテラル)を使って結果をわかりやすく整形して出力しています。

プログラムの中で動的に値が変わる場合でも、このように変数を利用して柔軟に計算できます。

実用例

ここからは、math.factorialを使ったさまざまなコード例を紹介します。数学的な計算から実際のプログラミングで使える応用例まで、幅広いパターンを通してこの関数の活用方法を学んでいきましょう。

階乗の一覧表示プログラム

1から指定した数までの階乗を一覧で表示するプログラムです。数学の学習や階乗の性質を確認する際などに役立ちます。

import math max_number = 8 print("階乗の一覧表") for i in range(1, max_number + 1): factorial_value = math.factorial(i) print(f"{i}! = {factorial_value}")

出力結果

階乗の一覧表
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320

この例では、1から8までの整数の階乗を順番に計算して一覧表示しています。forループrange関数を使って数値を1ずつ増やしながら、その都度math.factorial関数で階乗を求めています。

そのため数が大きくなるにつれて階乗の値が急激に増えていく様子を数字で確認することができます。繰り返し処理の中で関数を活用する典型的なパターンであり、数値の変化を可視化したい場合に便利です。

順列の計算プログラム

n個の中からr個を選んで並べる順列(nPr)を計算するプログラムです。組み合わせ論や確率計算などで使われます。

import math def permutation(n, r): return math.factorial(n) // math.factorial(n - r) animal_count = 6 selected_count = 3 result = permutation(animal_count, selected_count) print(f"{animal_count}匹から{selected_count}匹を選ぶ順列: {result}")

出力結果

6匹から3匹を選ぶ順列: 120

この例では、異なる6匹の動物から3匹を選んで一列に並べる並べ方が何通りあるかを計算しています。順列の公式であるnPr = n! / (n-r)!をプログラムで表現するために、定義したpermutation関数の中でmath.factorialを使用しています。

全体の階乗を選ばない分の階乗で割ることで、正しい順列の数を求めています。このように関数として定義しておけば、さまざまな条件での順列計算を簡単に再利用できます。

組み合わせの計算プログラム

n個の中からr個を選ぶ組み合わせ(nCr)を計算します。確率や統計の分野でよく使われる計算です。

import math def combination(n, r): numerator = math.factorial(n) denominator = math.factorial(r) * math.factorial(n - r) return numerator // denominator total_cats = 5 choose_cats = 2 result = combination(total_cats, choose_cats) print(f"{total_cats}匹のネコから{choose_cats}匹を選ぶ組み合わせ: {result}")

出力結果

5匹のネコから2匹を選ぶ組み合わせ: 10

この例では、5匹のネコの中から2匹を選ぶ組み合わせが何通りあるかを計算しています。組み合わせの公式nCrに基づき、分母と分子それぞれでmath.factorialを使っています。

順列とは異なり、選んだものの並び順を区別しないため、さらに選んだ個数の階乗で割る処理が入っています。この計算式を使うことで、特定の条件を満たすグループ分けのパターン数を正確かつ効率的に求められます。

フィボナッチ数列と階乗の比較

フィボナッチ数列と階乗の値を並べて表示し、それぞれの成長速度を比較するプログラムです。

import math def fibonacci(n): if n <= 1: return n a, b = 0, 1 for _ in range(2, n + 1): a, b = b, a + b return b print("数値\tフィボナッチ\t階乗") for i in range(1, 8): fib = fibonacci(i) fact = math.factorial(i) print(f"{i}\t{fib}\t\t{fact}")

出力結果

数値	フィボナッチ	階乗
1	1		1
2	1		2
3	2		6
4	3		24
5	5		120
6	8		720
7	13		5040

この例では、前の2つの数を足してできる「フィボナッチ数列」と、掛け算で増えていく「階乗」の値を並べて表示しています。

forループの中でそれぞれの計算関数を呼び出し、結果をタブ区切りで整形して出力しています。表形式にすることで、階乗の方が数値の増え方が圧倒的に速いという性質を一目で比較できるようになっています。

アルゴリズムの計算量や成長率の違いを理解するのに適した例です。

二項係数を使った確率計算

コイン投げでの確率計算を二項係数(組み合わせ)を使って行うプログラムです。実際の確率問題の解決に応用できます。

import math def binomial_coefficient(n, k): return math.factorial(n) // (math.factorial(k) * math.factorial(n - k)) coin_flips = 5 target_heads = 3 coefficient = binomial_coefficient(coin_flips, target_heads) probability = coefficient / (2 ** coin_flips) print(f"{coin_flips}回投げて{target_heads}回表が出る確率: {probability:.3f}")

出力結果

5回投げて3回表が出る確率: 0.312

この例では、コインを5回投げたときに表がちょうど3回出る確率を計算しています。まずmath.factorialを使った自作関数で、表が出るパターンの数(二項係数)を求めます。次に、すべてのコインの出方の総数(2の5乗)で割ることで確率を算出しています。

このように、階乗は確率計算の基礎となる重要な要素であり、統計学的な分析やシミュレーションの実装において頻繁に活用されます。

大きな数の階乗計算と桁数の確認

大きな数の階乗を計算し、その桁数を確認するプログラムです。計算処理の性能や数値の規模を把握する際に活用できます。

import math large_numbers = [10, 50, 100] print("大きな数の階乗計算") for num in large_numbers: factorial_result = math.factorial(num) digit_count = len(str(factorial_result)) print(f"{num}! の桁数: {digit_count}") if num <= 10: print(f"値: {factorial_result}")

出力結果

大きな数の階乗計算
10! の桁数: 7
値: 3628800
50! の桁数: 65
100! の桁数: 158

この例では、10、50、100という大きな数の階乗を計算し、その結果が何桁になるかを調べています。Pythonの整数型(int)は桁数の制限がないため、100の階乗のような巨大な数でもオーバーフローせずに正確に計算できます。

計算結果を文字列に変換して長さを測ることで、桁数を簡単に取得しています。この特性により、Pythonは科学技術計算や暗号理論など、大規模な数値処理を必要とする領域で最も選ばれている言語です。

階乗を使った数学的性質の検証

階乗の数学的性質を検証するプログラムです。スターリングの近似などの数学的な関係を確認できます。

import math def stirling_approximation(n): return math.sqrt(2 * math.pi * n) * (n / math.e) ** n numbers = [5, 10, 15, 20] print("階乗とスターリング近似の比較") for n in numbers: actual = math.factorial(n) approx = stirling_approximation(n) ratio = approx / actual print(f"n={n}: 実際={actual:.0f}, 近似={approx:.0f}, 比率={ratio:.3f}")

出力結果

階乗とスターリング近似の比較
n=5: 実際=120, 近似=118, 比率=0.983
n=10: 実際=3628800, 近似=3598696, 比率=0.992
n=15: 実際=1307674368000, 近似=1300430722199, 比率=0.994
n=20: 実際=2432902008176640000, 近似=2422786846761135104, 比率=0.996

この例では、階乗の値を近似的に求める「スターリングの公式」の精度を検証しています。math.factorialで求めた正確な値と、公式を使って計算した近似値を比較し、その比率を出力しています。

nの値が大きくなるにつれて比率が1に近づいていくことから、近似公式が大きな数の階乗に対して有効であることをプログラムを通して確認しています。数学的な定理や公式をコードで検証する際にも、この関数は役立ちます。

まとめ

Pythonのmath.factorialは、階乗計算を効率的に行うための関数です。基本的な使い方から応用まで、さまざまなプログラムで役立ちます。

math.factorialが活躍する場面

  • 順列や組み合わせのパターン数を計算するとき
  • 確率や統計などの数学的な処理を行うとき
  • アルゴリズムの実装で階乗の値が必要なとき

関数を使う上で、押さえておきたいポイントを覚えておきましょう。

重要なポイント

  • 引数には0以上の整数を指定する(負の値はエラー)
  • 計算結果は必ず整数(int)として返される
  • 数値が大きすぎると処理が重くなる点に注意する

初めてmath.factorialを使う方も、この記事で紹介したコードを実際に書いて試してみてください。

数学的な計算は難しそうに見えますが、便利な関数を使いこなせば、驚くほど簡単にプログラムへ組み込むことができます。ぜひマスターして、活用の幅を広げていきましょう。

レベルを更に上げたい方はpaizaプログラミングスキルチェックへ

  1. paizaラーニングトップ
  2. リファレンス
  3. Pythonのリファレンス記事一覧
  4. Python math.factorialの使い方