数学において、非負整数の階乗、で示されるは、以下のすべての正の整数の積です。階乗また、次に小さい階乗で: 例えば、 空の積 の慣例に従って、0! の値は 1 です。[ 1 ]
階乗は、古代のいくつかの文化、特にジャイナ教の古典文献におけるインド数学、そしてタルムードの書物『セフェル・イェツィラー』におけるユダヤ神秘主義者によって発見されている。階乗演算は、数学の多くの分野、特に組み合わせ論で見られる。組み合わせ論では、その最も基本的な用途は、可能な異なる数列(順列)を数えることである。異なるオブジェクト:数学解析では、階乗は指数関数やその他の関数のべき級数に使用され、代数学、数論、確率論、コンピュータ科学にも応用されています。
階乗関数の数学の多くは、18 世紀後半から 19 世紀初頭にかけて発展しました。 スターリングの近似は、大きな数の階乗の正確な近似値を提供し、それが指数関数的成長よりも速く増加することを示しています。ルジャンドルの公式は、階乗の素因数分解における素数の指数を記述し、階乗の末尾のゼロを数えるために使用できます。ダニエル・ベルヌーイとレオンハルト・オイラーは、階乗関数を、負の整数を除いて複素数の連続関数である (オフセット)ガンマ関数に補間しました。
階乗は、二項係数、二重階乗、下降階乗、原始階乗、部分階乗など、他の多くの注目すべき関数や数列と密接に関連しています。階乗関数の実装は、さまざまなコンピュータプログラミングスタイルの例としてよく用いられ、科学計算機や科学計算ソフトウェアライブラリに含まれています。積の公式や漸化式を用いて大きな階乗を直接計算するのは効率的ではありませんが、同じ桁数の数に対する高速乗算アルゴリズムの計算時間と定数倍の範囲内で一致する、より高速なアルゴリズムが知られています。
階乗の概念は、多くの文化において独自に発生してきた。
15 世紀後半以降、階乗は西洋の数学者によって研究されるようになった。1494 年の論文で、イタリアの数学者ルカ・パチョーリは、食卓の配置の問題に関連して、11! までの階乗を計算した。[ 12 ]クリストファー・クラヴィウスは、1603 年にヨハネス・デ・サクロボスコの著作に対する注釈で階乗について論じ、 1640 年代には、フランスの博学者マラン・メルセンヌが、クラヴィウスの研究に基づいて、64! までの階乗の大きな (ただし完全に正確ではない) 表を出版した。[ 13 ]指数関数のべき級数は、その係数として階乗の逆数を用いて、1676 年にアイザック・ニュートンがゴットフリート・ヴィルヘルム・ライプニッツへの手紙で初めて定式化した。[ 14 ]階乗に関する初期ヨーロッパ数学のその他の重要な研究としては、ジョン・ウォリスによる1685年の論文における広範な記述、大きな値に対するそれらの近似値の研究などが挙げられる。1721 年にアブラハム・ド・モアブルによって、1729 年にジェームズ・スターリングからド・モアブルに宛てた手紙でスターリングの近似として知られるようになったものが述べられ、同時期にダニエル・ベルヌーイとレオンハルト・オイラーによって階乗関数のガンマ関数への連続拡張が定式化された。[ 15 ]アドリアン=マリー・ルジャンドルは、1808 年に数論に関するテキストの中で、階乗を素数のべき乗に因数分解する際の指数を記述するルジャンドルの公式を含めた。[ 16 ]
表記法階乗の表記法は、 1808 年にフランスの数学者クリスチャン・クランプによって導入されました。[ 17 ]他にも多くの表記法が使用されています。階乗の引数がボックスの左辺と下辺で半分囲まれている形式は、イギリスとアメリカでしばらくの間人気がありましたが、おそらくタイプセットが難しいため、使われなくなりました。[ 17 ]「階乗」という言葉(元々はフランス語: factorielle)は、1800 年にLouis François Antoine Arbogast [ 18 ]がFaà di Bruno の公式に関する最初の著作 [19] で初めて使用しましたが、算術数列の積というより一般的な概念を指していました。この名前が指す「因数」は、階乗の積公式の項です。[ 20 ]
正の整数の階乗関数は、以下のすべての正の整数の積によって定義されます。: [ 1 ]これは、積の表記法ではより簡潔に[ 1 ]と 書くことができる。
この積の公式を最後の項以外すべてを残すように変更すると、より小さな階乗に対して同じ形式の積が定義されます。これにより、階乗関数の各値は前の値をで乗算することによって得られるという漸化式が得られます。: [ 21 ] 例えば、。
階乗はまたは記号で表すと、この定義にはいくつかの理由がある。
階乗関数の最も初期の用途は順列の数え上げです。さまざまな配置方法異なるオブジェクトをシーケンスにまとめる。[ 26 ]階乗は、オブジェクトのさまざまな順序付けを説明するために、組み合わせ論の多くの式に広く現れます。たとえば、二項係数数える-要素の組み合わせ(要素)セットから要素であり、式[ 27 ]を使用して階乗から計算できます。第1種のスターリング数は階乗に合計され、順列を数える。同じ数のサイクルを持つサブセットにグループ化される。[ 28 ]もう1つの組み合わせ論的応用は、元の位置にどの要素も残さない順列であるデランジュメントの数を数えることである。デランジュメントの数は、アイテムは最も近い整数です[ 29 ]
代数学では、階乗は二項係数を用いて和のべき乗を展開する二項定理から生じます。 [ 30 ]また、階乗は、例えば対称多項式のニュートンの恒等式のように、特定の多項式の族を互いに関連付けるために使用される係数にも現れます。[ 31 ]順列を数える際の階乗の使用も代数的に言い換えることができます。階乗は有限対称群の位数です。[ 32 ]微積分では、階乗は高階導関数を連鎖させるファア・ディ・ブルーノの公式に現れます。[ 19 ]数学解析では、階乗はべき級数の分母に頻繁に現れ、特に指数関数の級数に顕著です。[ 14 ] また、他のテイラー級数(特に三角関数と双曲線関数のテイラー級数)の係数では、係数が相殺される。から来ていますの階微分[ 33 ]べき級数における階乗のこの使用法は、指数生成関数を介して解析的組み合わせ論につながり、組み合わせクラスに対してサイズの要素はべき級数として定義される[ 34 ]
数論において、階乗の最も顕著な性質は、までのすべての正の整数によっては、素因数についてはルジャンドルの公式によってより正確に記述される。したがって、任意の大きな素数は、その数の素因数として見つけることができる。 それによって、素数の数が無限であるというユークリッドの定理の証明につながる。 [ 35 ]それ自体が素数である場合、それは階乗素数と呼ばれます。[ 36 ]また、スリニヴァーサ・ラマヌジャンによって提起されたブロカールの問題は、次の形式の平方数の存在に関するものです。[ 37 ]対照的に、数字はすべて合成数でなければならず、任意の大きな素数ギャップの存在を証明する。[ 38 ]任意の区間に素数が存在するというベルトランの公準の初等的証明は次の形式である。ポール・エルデシュの最初の成果の 1 つは、階乗の割り算の性質に基づいていた。[ 39 ] [ 40 ]階乗数システムは、各桁の位の値が階乗である数の混合基数表記法である。[ 41 ]
階乗は確率論で広く用いられており、例えばポアソン分布[ 42 ]やランダム順列の確率[ 43 ]などが挙げられる。コンピュータサイエンスでは、順列に対する総当たり探索の解析に現れるだけでなく[ 44 ]、階乗は下限にも現れる。比較ソートに必要な比較回数アイテム、[ 45 ]および連鎖ハッシュテーブルの分析では、セルごとのキーの分布はポアソン分布で正確に近似できます。[ 46 ]さらに、階乗は量子物理学や統計物理学の式に自然に現れます。これらの分野では、粒子の集合のすべての可能な順列を考慮することがよくあります。統計力学では、ボルツマンのエントロピー式やサックル・テトロード方程式などのエントロピーの計算では、ギブスのパラドックスを回避するために、各タイプの区別できない粒子の数の階乗で割ることによってミクロ状態のカウントを修正する必要があります。量子物理学は、これらの修正が必要な根本的な理由を提供します。[ 47 ]


関数として階乗は指数関数よりも速い成長を示すが、二重指数関数よりは遅い成長を示す。[ 48 ]その成長率はしかし、指数関数的に遅くなる。この結果に近づく一つの方法は、階乗の自然対数を取ることで、積の公式を和に変換し、その和を積分によって推定することである。 結果を指数化し(そして無視できるほどの項) 近似値として[ 49 ]台形公式 を用いて積分によって上下の和をより慎重に制限すると、この推定値にはに比例する補正係数が必要であることがわかる。この補正の比例定数は、ウォリス積から求めることができ、それは次のように表される。階乗と2のべき乗の極限比として。これらの補正の結果はスターリングの近似式です: [ 50 ] ここでは、シンボルは、が無限大に近づくと、左右の比率は極限では、スターリングの公式は漸近級数の最初の項を与え、項数を増やすとさらに正確になります。[ 51 ]別のバージョン(オイラー・マクローリンの公式 から直接導出された近似式)は、補正項に奇数指数のみを必要とするため、より速く収束します。[ 51 ]これらの公式の他の多くのバリエーションも、シュリニヴァーサ・ラマヌジャン、ビル・ゴスパー、その他 によって開発されている。 [ 51 ]
比較ソートの分析に使用される階乗の二進対数は、スターリングの近似式を使用して非常に正確に推定できます。以下の式では、この項はビッグオー記法を呼び出します。[ 45 ]
階乗の積の公式は、は、最大で の素数で割り切れる。、そしてそれより大きい素数では割り切れない。[ 52 ]割り切れるかどうかについてのより正確な情報は、各素数の指数を与えるルジャンドルの公式によって与えられる。素因数分解において[ 53 ] [ 54 ] ここは底の合計を表します-桁この式で与えられる指数は、より技術的には階乗のp進評価と呼ばれる。[ 54 ]二項係数の積の公式にルジャンドルの公式を適用すると、二項係数の因数分解における各素数の指数に関する同様の結果であるクンマーの定理が得られる。 [ 55 ]階乗の素因数をさまざまな方法で素数のべき乗にグループ化すると、階乗の乗法分割が得られる。[ 56 ]
ルジャンドルの公式の特殊なケース階乗の十進数表現における末尾のゼロの数を示します。 [ 57 ]この式によれば、ゼロの数は、5 進数の桁を減算することによって得られます。から、そして結果を4で割る。[ 58 ]ルジャンドルの公式は、素数の指数がは常に指数よりも大きい5 の各因数は 2 の因数とペアにすることで、これらの末尾のゼロのいずれかを生成できます。[ 57 ]階乗の先頭の桁はベンフォードの法則に従って分布します。[ 59 ]任意の基数におけるすべての桁列は、その基数における何らかの階乗数の最初の桁列です。[ 60 ]
階乗の可除性に関するもう一つの結果であるウィルソンの定理は、次のように述べている。は割り切れるかつその場合に限りは素数である。[ 52 ]任意の整数に対してケンプナー関数最小値で与えられるそのために分ける[ 61 ]ほぼすべての数(漸近密度がゼロの例外のサブセットを除くすべて)について、それは最大の素因数と一致する。[ 62 ]
2つの階乗の積、常に均等に分割します[ 63 ]他の階乗の積に等しい階乗は無限に存在する。が階乗の任意の積である場合、同じ積にさらに1つの階乗を掛けたものに等しい。他の階乗の積であるが、この「自明な」形式ではない階乗の既知の例は次のとおりです。、、そして[ 64 ] abc予想から、非自明な例は有限個しかないことがわかる。 [ 65 ]


階乗を連続関数に拡張する方法は無数に存在する。[ 66 ]これらの方法の中で最も広く用いられているのは[ 67 ] 、ガンマ関数を用いる方法である。ガンマ関数は、正の実数に対して積分として定義できる。 結果として得られる関数は、非負整数の階乗に関連している。方程式により これは、非整数引数の階乗の定義として使用できます。すべての値において両方そしてが定義されると、ガンマ関数は関数方程式に従う。階乗の漸化式 を一般化する。 [ 66 ]
同じ積分は、より一般的には任意の複素数に対して収束する。実部が正である。オイラーの反射公式を解くことで、複素平面の残りの非整数点にも拡張できる。 しかし、この式は整数には使えません。なぜなら、整数では、項はゼロ除算を引き起こします。この拡張プロセスの結果は解析関数(より具体的には有理型関数)であり、ガンマ関数の積分公式の解析接続です。これは、単純極を持つ非正の整数を除いて、すべての複素数でゼロ以外の値を持ちます。同様に、これは負の整数以外のすべての複素数での階乗の定義を提供します。[ 67 ] ガンマ関数を他の連続的な階乗補間と区別するガンマ関数の特性の1つは、ガンマ関数(1だけオフセット)が、階乗を補間し、同じ関数方程式に従う正の実数上の唯一の対数凸関数であることを示すボーア・モレラップの定理によって与えられます。ヘルムート・ヴィーラントの関連する一意性定理によれば、複素ガンマ関数とそのスカラー倍は、正の複素半平面上で関数方程式を満たし、実部が 1 から 2 の間の複素数に対して有界である唯一の正則関数である。[ 68 ]
階乗値を補間する他の複素関数には、非正の整数を含むすべての複素数上の整関数であるアダマールのガンマ関数があります。 [ 69 ] [ 70 ] p進数では、大きな整数の階乗 ( p進整数の密な部分集合) はルジャンドルの公式に従ってゼロに収束するため、その値に近い連続関数はどこでもゼロになってしまいます。代わりに、p進ガンマ関数は、階乗のpで割り切れる因子を省略した修正された形式の階乗の連続補間を提供します。[ 71 ]
ディガンマ関数はガンマ関数の対数微分です。ガンマ関数が階乗の連続補間を1だけずらして提供するのと同様に、ディガンマ関数は調和数の連続補間をオイラー・マスケローニ定数だけずらして提供します。[ 72 ]

階乗関数は、科学計算機によく見られる機能です。[ 73 ]また、 Python の数学関数モジュール[ 74 ]やBoost C++ ライブラリ[ 75 ]などの科学プログラミングライブラリにも含まれています。
効率が問題にならない場合、階乗の計算は簡単です。初期化された変数に、次の値を順次掛けるだけです。までの整数によってこの計算の単純さから、さまざまなコンピュータプログラミングスタイルや手法の使用において一般的な例となっている。[ 76 ]反復[ 77 ]を用いた擬似コードでは次のように表現できる。
define factorial( n ): f := 1 for i := 1, 2, 3, ..., n : f := f * i return f
または、その再帰関係に基づく再帰[ 78 ]を使用する
factorial( n ) を定義します。もしn = 0ならば1 を返します。n * factorial( n − 1)を返します。
その計算に適した他の方法としては、メモ化[ 79 ] 、動的計画法[ 80 ]、関数型計画法[ 81 ]などがある。これらのアルゴリズムの計算複雑性は、各算術演算が一定時間かかり、各数値が一定量の記憶領域を使用する単位コストランダムアクセスマシンモデルを使用して分析できる。このモデルでは、これらの方法は、時間が経つにつれて、反復バージョンはスペースを使用します末尾再帰用に最適化されていない限り、再帰バージョンは呼び出しスタックを格納するために線形スペースを必要とします。[ 82 ]ただし、この計算モデルは、次の場合にのみ適しています。十分に小さいのでマシンワードに収まるように。[ 83 ] 12! と 20! は、それぞれ32 ビット[ 84 ]と64 ビット整数に格納できる最大の階乗です。[ 85 ]浮動小数点数はより大きな階乗を表現できますが、正確ではなく近似的に表現され、12! より大きい階乗ではオーバーフローします。[ 84 ]
より大きな階乗の正確な計算には、急速な増加と整数オーバーフローのため、任意精度演算が関係します。計算時間は、結果の桁数またはビット数の関数として分析できます。[ 85 ]スターリングの公式によれば、もっているビット。[ 86 ]シェーンハーゲ・シュトラッセンアルゴリズムは、-ビット積の時間乗算アルゴリズムの高速化により、は既知である。[ 87 ]しかし、階乗の計算には単一の乗算ではなく繰り返し積が含まれるため、これらの時間制限は直接適用されない。この設定では、計算は1から順番に行うのは非効率的です。なぜなら、乗算のうち一定の割合が時間を要するそれぞれ合計時間より良いアプローチは、一連の数を乗算する分割統治アルゴリズムとして乗算を実行することです。数字を2つの部分列に分割することによって数値を乗算し、各部分列を乗算し、最後に1回の乗算で結果を組み合わせます。この階乗の計算方法は合計で: 1 つの対数は階乗のビット数から、2 つ目は乗算アルゴリズムから、3 つ目は分割統治法から得られます。[ 88 ]
さらに効率が良いのは、 n ! を素因数分解から計算する方法で、これは指数を積に展開するよりも二乗による指数計算の方が速いという原理に基づいています。 [ 86 ] [ 89 ]アーノルド・シェーンハーゲによるこのアルゴリズムは、まずまでの素数のリストを見つけることから始まります。例えばエラトステネスの篩を用いて、各素数の指数を計算するためにルジャンドルの公式を使用します。次に、以下の再帰アルゴリズムを使用して、これらの指数で素数のべき乗の積を計算します。
までのすべての素数の積は-ビット数、素数定理により、最初のステップにかかる時間は一方の対数は分割統治法から、もう一方の対数は乗算アルゴリズムから得られます。アルゴリズムの再帰呼び出しでは、素数定理を再び利用して、対応する積のビット数が再帰の各レベルで一定の係数で減少することを証明できます。したがって、すべての再帰レベルでのこれらのステップの合計時間は等比数列で加算され、2番目のステップでの二乗と3番目のステップでの乗算にかかる時間は再びなぜなら、それぞれは、ある数とある数の単一の乗算だからです。ビット。繰り返しますが、再帰の各レベルで、関係する数値は一定の割合のビットを持ちます(そうでないと、繰り返し二乗すると最終結果が大きくなりすぎるため)。したがって、再帰呼び出しのこれらのステップにかかる時間は、等比数列で加算されます。結果として、アルゴリズム全体には時間がかかります結果のビット数が同じ単一の乗算に比例する。[ 89 ]
階乗と類似または関連する整数列は他にもいくつかあります。