ホーム ] PC技術/システム技術 ] VB.NETプログラミング ] なるほどナレッジ ] インフォメーション ]

上へ
平方根
立方根
整数指数
実数指数(Exp)
実数指数(一般)
対数
正弦/余弦
正接
逆正弦/逆余弦
逆正接
双曲線正弦/余弦
双曲線正接
逆双曲線正弦
階乗評価関数
級数評価関数
演算時間評価関数

数学関数

階乗評価関数

最終更新日:2006/05/15 追加

●概要

 階乗の演算は説明するまでもないが、以下の補助関数について解説する。

  • FactorialOrder(階乗次数)
  • FactorialDoubleOrderr(二重階乗次数)
  • FactorialItem(階乗項数)

 これらは、主として級数の収束予測を算出する場合に有意義となる。

●階乗次数

 Stirling の近似式によって算出している。近似式は、

 N! ≒ NN*e-N*(2*π*N)1/2

であるが、この右辺の常用対数は、十進数の桁数に他ならない。つまり、桁数Dは、

 D = Int(N * Log(N / e) + Log(2 * π * N) / 2)

 内部で、Doubleによる組込み関数で算出している。実際にN! を算出し、その指数部を調べても同じであるが、Nが数万以上になれば、時間が掛かってしまうので、現実的ではない。本法では瞬時に求まる。

●二重階乗次数

 Stirling の近似式では直接解けないので、二重階乗を階乗に変形して解いている。

 ○偶数

  (2N)!! = 2N * N!

であるから、次数は、

 Log(2N * N!) = N * Log(2) + Log(N!)
                    = N * Log(2) + FactorialOrder(N)

で、求められる。

 ○奇数

 (2N-1)!! = (2N)! / (2N)!!

であるから、次数は、

Log((2N)! / (2N)!!) = Log((2N)!) - Log((2N)!!)
                         = FactorialOrder(2N) - (N * Log(2) + FactorialOrder(N))

で、求められる。
            

●階乗項数

 ○原理

 次数は数式によって求められるが、その逆はそうは行かない。筆者は、当初、エクセルにてテーブルを作成し、テーブルの逆検索にて収束する項数を求めていたが、これは少々面倒くさい。

 近似式を直接の逆関数にできないので、項数を、1 から、100万まで、100 刻み(テーブルサイズは、10001)で FactorialOrder にてテーブルを生成しておき、以下のようにテーブルにて検索する。テーブルは、例えば以下のように、FctT(0,k) が、項数、FctT(1,k) が、次数とする。

k 0 1 2 3 4   200   10000
項数FctT(0,k) 1 101 201 301 401   20001   1000001
次数FctT(1,k) 0 159 377 616 871   77341   5565714
  1. 与えられた次数が挟まれるテーブルの位置(k-1、k とする)を検出する。
  2. テーブルのFctT(0,k-1) を初期値 ks とし、FactorialOrder(ks + j) を、j = 0 から49 まで、算出しながら、
  3. その値が、与えられた次数を始めて超えたとき終了で、そのときの、ks + j が求める項数となる。

 この方法は、k-1、k 間を補間するより正確に値を求められる。テーブルはフラグにより、一度生成すると、以降は生成しないようになっている。

<例> FactorialItem(700) ?

 次数として、700 が与えられたとすれば、テーブルは、k =3、4 が選ばれ、項数初期値は、301 となる。FactorialOrder(301 + j) ≧ 700? を、j を、0 から 99 まで、インクリメントしながら演算し、最終的に、335 を得る。

 ○確認

 実際に関数を確認した。項数を与えて、先ず、FactorialOrder を算出し、その求まった次数にて、FactorialItem(次数)を算出したもの。項数 ≒ FactorialItem となれば、OK。実際には、一致しており、誤差はないようである。ユーティリティの機能として用意されている。