階乗
数学において非負整数 n の階乗(かいじょう、英: factorial)n ! は、1 から n までのすべての整数の積である。例えば、
- {\displaystyle 6!=6\times 5\times 4\times 3\times 2\times 1=720}
階乗は数学の様々な場面に出現するが、特に組合せ論、代数学、解析学などが著しい。階乗の最も基本的な出自は n 個の相異なる対象を一列に並べる方法(対象の置換)の総数が n! 通りであるという事実である。この事実は少なくとも12世紀にはインドの学者によって知られていた[2]。ファビアン・ステッドマン(英語版)は1677年にチェンジリンギング(英語版)への応用として階乗を記述した[* 1]。再帰的な手法による記述の後、Stedman は(独自の言葉を用いて)階乗に関しての記述を与えている:
Now the nature of these methods is such, that the changes on one number comprehends [includes] the changes on all lesser numbers, ... insomuch that a compleat Peal of changes on one number seemeth to be formed by uniting of the compleat Peals on all lesser numbers into one entire body;[4]
エクスクラメーションマーク(!)を用いた、この "n!" という表記は1808年にChristian Kramp(英語版)によって発明された[5]。
0! | 1 |
---|---|
1! | 1 |
2! | 2 |
3! | 6 |
4! | 24 |
5! | 120 |
6! | 720 |
7! | 5 040 |
8! | 40 320 |
9! | 362 880 |
10! | 3 628 800 |
11! | 39 916 800 |
12! | 479 001 600 |
13! | 6 227 020 800 |
14! | 87 178 291 200 |
15! | 1 307 674 368 000 |
16! | 20 922 789 888 000 |
17! | 355 687 428 096 000 |
18! | 6 402 373 705 728 000 |
19! | 121 645 100 408 832 000 |
20! | 2 432 902 008 176 640 000 |
階乗の定義は、最も重要な性質を残したまま、非整数を引数とする函数に拡張することができる。そうすれば解析学における著しい手法などの進んだ数学を利用できるようになる。
目次
定義
いくつか同値な条件により定義することが可能である。
- {\displaystyle n!=\prod _{k=1}^{n}k=n\times \left(n-1\right)\times \cdots \times 3\times 2\times 1}
- 再帰的な定義
- {\displaystyle n!={\begin{cases}1,&{\text{if }}n=0\\n\times \left(n-1\right)!,&{\text{if }}n>0\end{cases}}}
- 微分に関する「冪の法則(英語版)」を用いた定義[6]
- {\displaystyle n!={\frac {d^{n}}{dx^{n}}}x^{n}\quad \left(n\geq 0\right)}
- n! = ( n 元集合の置換の総数 )
上記の何れの定義においても、
- {\displaystyle 0!=1}
となることが織り込み済みである(最初の定義では「 0 項の積は 1 と定める」という規約によって)[* 2]。このように定義することの理由は:
- 零個の対象の置換は(「何もしない」という)ちょうど一通りであること。
- n > 0 のとき有効な漸化式 (n + 1)! = n! × (n + 1), が n = 0 の場合にも延長できること。
- 指数函数などの冪級数としての表示
- {\displaystyle e^{x}=\sum _{n=0}^{\infty }{\frac {x^{n}}{n!}}}
- 組合せ論における多くの等式が任意のサイズに適用して意味を持つこと。例えば零個の元を空集合から選ぶ方法の総数は
- {\displaystyle {\binom {0}{0}}={\frac {0!}{0!\,0!}}=1}
であり、一般に n 元集合から n 個全ての元を選び出す方法の総数は
- {\displaystyle {\binom {n}{n}}={\frac {n!}{n!\,0!}}=1}
など様々に挙げることができる。
より進んだ数学においては、引数が非整数の場合にも階乗函数を定義することができる(後述)。そういった一般化された定義のもとでの階乗は関数電卓や、Maple や Mathematica などの数学ソフトウェアで利用できる。
プログラミング言語における階乗
多くのプログラミング言語において、再帰的な定義を利用し、プロシージャの再帰呼び出しを用いた階乗の実装が可能である。
以下はC言語での例である。例示するコードではint
型を使用しているが、int
型では小さな階乗でもオーバーフローしてしまうため、大きな階乗についてはdouble
型のような浮動小数点数型を用いるなどの工夫が必要となる。
int factorial(int n) { int x; if (n > 0) { x = n * factorial(n - 1); } else { x = 1; // 0! = 1 } return x; }