階乗の定義と計算方法
正の整数
を
のように計算します。階乗は数学のあらゆる場面で登場します。特に確率論による組合せや オイラー積分(ガンマ関数)、関数の級数展開などの計算で活躍します。
コンピュータで階乗を計算させるには再帰的定義を用いると簡単です。
つまり
といった具合に計算させます。
となります。一般に階乗は
と定義することができます。
【Excel】FACT関数
Excel の FACT(x) は x の階乗を返します。たとえば、セルに
=FACT(10)
と入力すると、
=FACT(-5)
と入力すると、#NUM! すなわち関数に無効な数値が渡されたことを示すエラーが表示されます。数学では階乗は非負の整数のみに定義されていますが、FACT に小数を渡してもエラーとはなりません。引数の小数部は切り捨てられ、整数部の階乗を返します。たとえば、
=FACT(4.8)
と入力した場合、4 の階乗を計算して 24 を返します。
スターリングの公式
スターリングの公式
を用いると、階乗についての近似式
を得ます。この近似は
二重階乗の定義と計算方法
正の整数 n について、
を n の二重階乗(double factorial)と定義します。たとえば、
のように計算します。二重階乗はガンマ関数やベッセル関数など特殊関数の計算などで用います。二重階乗は普通の階乗と指数の組合せで表すこともできます。
証明は簡単です:
また、
左辺は
したがって、
が証明されました。たとえば、
となります。
【Excel】FACTDOUBLE関数
Excel の FACTDOUBLE(x) は x の二重階乗を返します。たとえば、
=FACTDOUBLE(8)
と入力すると、
=FACT(5.5)
を入力すると、5 の二重階乗
【EX14】Excel で階乗を含む級数を計算します
Excel を用いて次の級数
【ヒント】基本問題ですが、階乗計算の関数を使う必要があります。
【解答】数値の階乗を計算するときは FACT関数を使います。たとえば次のようなシートを作って、セル C3 には
=(B3-1)/FACT(B3)
と入力してセル C12 までコピーします。
それから数値を合計する SUM関数を使って
=SUM(C3:C12)
と入力すれば求める値が表示されます。最後に計算結果が表示されているセルを右クリックして、[セルの書式設定]、[数値] を順に選択し、小数点以下の桁数を 8 に設定すると 0.99999972 が表示されます。ちなみに級数の式を
と変形して右辺を具体的に書き表してみると最初と最後の項だけが残り、
となります。つまりある程度
【VBA】巨大階乗数の計算
ワークシートでは FACT 関数を用いて
=FACT(数値)
とすれば階乗の値を返してくれますが、数値に 171 以上の値を入れるとエラーになってしまいます。エクセルでは 15 桁までの数しか扱えないからです。そこでこの問題を解決するために階乗の値を
の形で表すことにして
ですから
と足し算で表すことができます。まずはこの
'[VBA] 階乗の対数を計算する関数 Function LOG_FACT(n As Long) As Double Dim k As Long Dim logef As Double If n = 1 Then LOG_FACT = 0 'nが1より大きな整数であれば以下の処理を行う ElseIf n = Int(n) And n > 1 Then 'n!の自然対数を計算します For k = 0 To n - 1 logef = logef + Log(n - k) Next k '常用対数に変換 LOG_FACT = logef / Log(10) Else LOG_FACT = CVErr(xlErrNum) End If End Function
たとえばワークシートのセルに
=LOG_FACT(1000)
と入力すると、「2567.604…」が返ります。これが指数部分
のように書くことができます。
=TRUNC(LOG_FACT(数値))
とするだけです。先ほどの例、つまり 1000! の桁数を得るには
=TRUNC(LOG_FACT(1000))
と入力すればよく、結果は 2567 となります(ものすごい桁ですね!)。
POWER_DEC という関数を作って
Function POWERDEC(x As Double) As Double POWER_DEC = 10 ^ (x - Fix(x)) End Function
さきほどの 1000! の例に適用して
=POWER_DEC(LOG_FACT(1000))
とすると 4.0238726 … という値を得ることができます。つまり
であることがわかりました。
エクセルや数学に関するコメントをお寄せください
二重階乗を階乗で表します。のところで、
(2m−1)!! = 2*m/(2^m*m!) とありますが、これは誤りで、
(2m−1)!! = (2*m)!!/(2*m)! さらに、
= 2^m*m!/(2*m)! ですよね。
御指摘ありがとうございます。
誤記を訂正すると同時に、説明不足な箇所は加筆しておきました。
何しろ一人で書いているので、サイトのあちこちに誤記があると思われます。
今後も誤りを指摘していただけると幸いです。よろしくお願いします。