階乗

数学において非負整数 n の階乗(かいじょう、factorialn ! は、1 から n までのすべての整数のである。例えば、

{\displaystyle 6!=6\times 5\times 4\times 3\times 2\times 1=720}

である。空積の規約のもと 0! = 1 と定義する[1]

階乗は数学の様々な場面に出現するが、特に組合せ論代数学解析学などが著しい。階乗の最も基本的な出自は 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]

階乗数 オンライン整数列大辞典の数列 A000142
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]。このように定義することの理由は:

  1. 零個の対象の置換は(「何もしない」という)ちょうど一通りであること。
  2. n > 0 のとき有効な漸化式 (n + 1)! = n! × (n + 1), が n = 0 の場合にも延長できること。
  3. 指数函数などの冪級数としての表示
    {\displaystyle e^{x}=\sum _{n=0}^{\infty }{\frac {x^{n}}{n!}}}
    など多くの公式が短く表せるようになること。
  4. 組合せ論における多くの等式が任意のサイズに適用して意味を持つこと。例えば零個の元を空集合から選ぶ方法の総数は
    {\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;
}