階乗がいかに速く増加するかを理解する
階乗の増加は指数関数の増加をすぐに追い越します。下の表に正確な値とおおよその値を示します。
| n | n! | おおよその大きさ |
|---|---|---|
| 0 | 1 | 1 |
| 5 | 120 | 1.2 × 10² |
| 10 | 3,628,800 | 3.6 × 10⁶ |
| 15 | 1,307,674,368,000 | 1.3 × 10¹² |
| 18 | 6,402,373,705,728,000 | 6.4 × 10¹⁵ |
| 20 | 2,432,902,008,176,640,000 | 2.4 × 10¹⁸ |
- 18!(≈6.40 × 10¹⁵)は、安全な整数の上限を下回る最大の階乗です。JavaScriptのNumber.MAX_SAFE_INTEGERが2⁵³ − 1 ≈ 9.007 × 10¹⁵であるためで、この計算機がn = 18までしか正確な値を表示しないのはこのためです。なお、この上限を超えても階乗は22!まで倍精度浮動小数点数として正確に表せます。階乗はいずれも2の因数を多く含むためで、丸めが生じる最初の階乗は23!です。
- n = 19から170までは、科学的記数法による近似値(とln(n!))のみを表示します。正確な整数値を表すには、多倍長整数ライブラリなしでは標準的な浮動小数点演算がサポートする以上の精度が必要になるためです。
- n = 170を超えると、n!は標準的な倍精度浮動小数点数が表せる最大値(およそ1.8 × 10³⁰⁸)を超えて無限大にオーバーフローするため、この計算機ではnの上限を170としています。
階乗とは
0以上の整数nの階乗(n!と表記)は、1からnまでのすべての正の整数の積として定義されます:n! = n × (n − 1) × (n − 2) × ... × 2 × 1。例えば5! = 5 × 4 × 3 × 2 × 1 = 120です。定義によりn = 0のときは0! = 1(空積、掛け算の単位元)で、これは組合せ論全体で使われる標準的な取り決めです。
階乗はきわめて速く増加します——nの指数関数よりもはるかに速く増えます。10! = 3,628,800ですが、20!はすでに100京を超える2.43 × 10¹⁸に達しており、ビッグバン以来の秒数よりも大きな値です。この爆発的な増加のため、大きなnでは科学的記数法で表示するのが一般的で、ある点を超えると正確な整数値を表示すること自体が現実的でなくなります。
階乗は組合せ論の基礎です。n個の異なる対象を順番に並べる方法の数(順列)を数え、また順序を問わない選び方(組合せ)を数える二項係数の公式の分母としても現れます。さらに確率論、微積分(テイラー級数の係数)、そして数多くの組合せ論的な閉じた形の恒等式にも登場します。
階乗計算機の使い方
- 0から170までの整数nを入力します(170!は、標準的な倍精度浮動小数点数が無限大にオーバーフローせずに表せる最大の階乗に近い値です)。
- nの大きさにかかわらず常に表示される、科学的記数法での結果を確認します。
- n ≤ 18の場合は、n!の正確な整数値もあわせて表示されます。これより大きな階乗は、標準的な倍精度演算で正確に表せる整数の範囲(2⁵³ ≈ 9.007 × 10¹⁵)を超えるためです。
- ln(n!)(非常に大きな階乗をオーバーフローなしで扱うのに便利です)と、n!の正確な10進表現における末尾のゼロの個数を確認します。
階乗、末尾のゼロ、ln(n!)の計算方法
階乗を定義する再帰的な関係はn! = n × (n − 1)!で、基底条件は0! = 1です。計算例:5! = 5 × 4! = 5 × 4 × 3! = 5 × 4 × 3 × 2! = 5 × 4 × 3 × 2 × 1! = 5 × 4 × 3 × 2 × 1 × 0! = 120 × 1 = 120。
大きなnについては、自然対数ln(n!)をk = 2からnまでの和Σ ln(k)として計算します。これにより、階乗そのものを直接掛け合わせたときに起こるオーバーフローを避けられます。科学的記数法は、この和から常用対数を使って導かれます:log₁₀(n!) = ln(n!) ÷ ln(10)。整数部分が指数を、小数部分(10^xで戻したもの)が仮数を与えます。
n!の末尾のゼロの個数は、10がn!を余りなく割り切る回数に等しく、10 = 2 × 5であり階乗の中では2の因数が常に5の因数より多いため、レジャンドルの公式を使って5の因数の個数を数えることに帰着します:末尾のゼロ = ⌊n/5⌋ + ⌊n/25⌋ + ⌊n/125⌋ + ...。10!の計算例:⌊10/5⌋ = 2、⌊10/25⌋ = 0なので、10!の末尾のゼロは2個です——10! = 3,628,800からも確認できます。
よくある間違い
- 0! = 1であって0ではないことを忘れること——これは標準的な数学の取り決め(空積は1に等しい)であり、組合せ論の公式が境界条件で正しく機能するために不可欠です。
- 標準的な算術演算で任意に大きなnの階乗を正確に計算できると思い込むこと——n = 22を超えると、正確な整数値は倍精度浮動小数点数が丸め誤差なく表せる範囲を超えます。
- n!(階乗)とnⁿ(nのn乗)を混同すること——階乗は減っていく整数の列を1まで掛け合わせるのに対し、べき乗はnをそれ自身にn回掛けます。両者は増加のペースが異なり、すぐに大きく乖離します(5! = 120に対して5⁵ = 3125)。
- 負の数や整数でない数を入力すること——この初等的な意味での階乗は0以上の整数に対してのみ定義されます(ガンマ関数はこの概念を非整数に拡張しますが、それは別のより高度な公式です)。
よくある質問
n階乗とは何ですか?
n階乗(n!)は、1からnまでのすべての正の整数の積です。例えば5! = 5 × 4 × 3 × 2 × 1 = 120です。定義により0! = 1です。
なぜ0!は1になるのですか?
0!は数学の取り決めにより1と定義されます。これは「空積」(0個の因数の積)を表し、慣習として掛け算の単位元である1に等しいとされます。この定義があることで、順列や組合せといった組合せ論の公式が境界条件でも矛盾しなくなります——例えば、0個の対象を並べる方法はちょうど1通りです。
階乗はどれくらい速く増加しますか?
階乗はnの指数関数よりも速く増加します。10!は約360万ですが、20!はすでに100京を超える2.4 × 10¹⁸に達します。この超指数的な増加のペースゆえに、そこそこ大きなnでも階乗は科学的記数法で表示され、数学において非常に速い増加の例としてよく引き合いに出されます。
100!の末尾のゼロは何個ですか?
レジャンドルの公式(⌊100/5ⁱ⌋の和)を使うと、100!の末尾のゼロは⌊100/5⌋ + ⌊100/25⌋ = 20 + 4 = 24個です。末尾のゼロは積の中の10 = 2 × 5という因数から生じ、階乗の中では2の因数が5の因数より常に多いため、5の因数だけを数えれば末尾のゼロの個数がわかります。
計算機が正確に計算できる最大の階乗はいくつですか?
標準的な倍精度浮動小数点演算(JavaScriptや多くの計算機で使われています)では、18!が安全な整数の上限を下回る最大の階乗です。18! ≈ 6.40 × 10¹⁵は上限の2⁵³ − 1 ≈ 9.007 × 10¹⁵を下回りますが、19!はこれを超えてしまうためです。ただし、この上限を超えても階乗は22!まで倍精度浮動小数点数として正確に表せます。階乗はいずれも2の因数を多く含むためで、丸めが生じる最初の階乗は23!です。それより大きな階乗は通常、科学的記数法で表示されます。
参考文献
- NIST Digital Library of Mathematical Functions (DLMF), §5.1 Gamma Function: Factorial Function. dlmf.nist.gov.
- Rosen KH. Discrete Mathematics and Its Applications. 8th ed. McGraw-Hill, 2018. (Factorials and combinatorics.)
- Graham RL, Knuth DE, Patashnik O. Concrete Mathematics. 2nd ed. Addison-Wesley, 1994. (Legendre's formula for factors in n!.)