VB.NETはじめる(その11)

更新日:2003/9/9

多倍長計算 階乗(修正)

11.1 階乗計算の修正

前回のものは、論理的には、間違っていなかったが、実際問題として、Nが高々10000以下であれば、ループは、通常のFor Nextで十分であり、その方が早いはずである。
短いので修正した全文を掲げる。(関数名を修正している)

Function FKAIJYO(ByRef strw As String, ByRef kw As Integer) As String
'多倍長階乗計算ルーチン : TA : 2003/9/8-9
Dim strw1 As String
Dim i, j As Integer
i = Val(strw)
strw1 = "1"
k = kw
If strw = "0" Or strw = "1" Then
  GoTo FKAIJYO_1
End If
For j = 1 To i
  strw1 = FMU(strw1, Str(j), k)   ’乗算関数
Next j
FKAIJYO_1:
FKAIJYO = strw1
End Function

上記では、扱う数が正の数であるので、符号を考慮しない乗算関数を使用した。

11.2 計算結果(修正版)

N N! 計算時間 計算時間2
15 1307674368000  0~  0~
20 2432902008176640000  0~  0~
2000 5736桁の数 46秒 9秒
同上 同上 79秒 15秒
同上 同上 145秒 27秒
4000 12674桁の数 309秒 57秒

上表で「計算時間」は、Celelon 766 MHzのパソコンにおける計算結果である。
これは、フィボナッチ数列等の計算の際に使用したパソコンと同等のもの。
「計算時間2」は、Pentium4 2.4 GHzでの計算時間。現在のところ、当方で最速のマシンである。
また、kは、これまでと同様にまとめ計算の数であり、たとえば、N=2000での結果を見ると、kの効果は、大きいことが分かる。

11.3 自作ものを更新

多倍長の階乗計算を更新した。名称は、TabaichoKaijyo.Lzh。

VB.NETはじめるに戻る