更新日:2003/9/9
前回のものは、論理的には、間違っていなかったが、実際問題として、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
上記では、扱う数が正の数であるので、符号を考慮しない乗算関数を使用した。
N | N! | k | 計算時間 | 計算時間2 |
15 | 1307674368000 | 8 | 0~ | 0~ |
20 | 2432902008176640000 | 8 | 0~ | 0~ |
2000 | 5736桁の数 | 8 | 46秒 | 9秒 |
同上 | 同上 | 4 | 79秒 | 15秒 |
同上 | 同上 | 2 | 145秒 | 27秒 |
4000 | 12674桁の数 | 8 | 309秒 | 57秒 |
上表で「計算時間」は、Celelon 766 MHzのパソコンにおける計算結果である。
これは、フィボナッチ数列等の計算の際に使用したパソコンと同等のもの。
「計算時間2」は、Pentium4 2.4 GHzでの計算時間。現在のところ、当方で最速のマシンである。
また、kは、これまでと同様にまとめ計算の数であり、たとえば、N=2000での結果を見ると、kの効果は、大きいことが分かる。
多倍長の階乗計算を更新した。名称は、TabaichoKaijyo.Lzh。