云梦
发表于 2013-6-17 09:12:38
再继续优化不知道该怎么办?用分治法计算一次1024位乘法0.0024秒,用HugeCalc是0.004秒。
Function Mult_() '分治法 多位数相乘C*A=C,A 2013-06.14
Dim myVar, myNum, Var, r As Variant
Dim Aa, Ba, Ca, xP2 As Single
Dim Dx As Chen
Dim ax_sz(512), bx_sz(512), cx_sz(512) As Variant
Ax.St = Ax.St + Zero
Cx.St = Cx.St + Zero
If Left(Ax.St, 1) > "0" And Left(Cx.St, 1) > "0" Then
For i = 0 To xP
ax_sz(i) = CDec(Mid(Ax.St, i * Gsw + 1, Gsw))
bx_sz(i) = CDec(Mid(Cx.St, i * Gsw + 1, Gsw))
Next i
myVar = ax_sz(0) * bx_sz(0)
cx_sz(1) = myVar
For i = 1 To xP
myNum = ax_sz(i) * bx_sz(i)
myVar = myVar + myNum
For j = 0 To (i - 1) / 2
cx_sz(i + 1) = cx_sz(i + 1) + (ax_sz(i - j) - ax_sz(j)) * (bx_sz(j) - bx_sz(i - j))
Next
cx_sz(i + 1) = cx_sz(i + 1) + myVar
Next
r = CDec(0)
For i = xP To 0 Step -1
cx_sz(i) = cx_sz(i) + r
r = Fix(cx_sz(i) / Zero6)
cx_sz(i) = cx_sz(i) - r * Zero6
Next i
oResult = CStr(cx_sz(0))
For i = 1 To xP
oResult = oResult + Right(Zero06 + CStr(cx_sz(i)), Gsw)
Next i
Dx.Bz = IIf(Ax.Bz = Cx.Bz, "", "-")
Dx.St = oResult
'指数计算
Aa = Val(Left(Ax.St, 1))
Ba = Val(Left(Cx.St, 1))
Ca = Val(Left(Dx.St, 1))
If Ax.Zs + Cx.Zs < 10 ^ 15 Then
Dx.Zs = Ax.Zs + Cx.Zs + IIf(Aa * Ba <= Ca, 0, 1)
Else
Dx.Zs = 0
End If
Cx = Dx
Ax = Dx
Else
Ax.Bz = ""
Ax.St = "0"
Ax.Zs = 0
Cx = Ax
End If
End Function
云梦
发表于 2013-6-17 09:17:39
如果去掉
Ax.St = Ax.St + Zero
Cx.St = Cx.St + Zero
时间为0.002秒,相当于HugeCalc速度的1/2
云梦
发表于 2013-6-17 10:53:42
各精度的计算时间:
云梦
发表于 2013-6-17 11:11:45
用HugeCalc乘法计算2048位时间为0.01秒,3072位时间为0.019秒。用分治法计算2048位为0.0076秒,3072位时间为0.016秒。看来5000位以下FFT并不合算(当然我指的是用VB)。
分治法1024位计算比硬乘法节约大约1/3的时间。
ysr
发表于 2013-6-20 12:52:50
云梦
发表于 2013-6-24 16:48:52
VB计算512位Gamma函数1.3秒,1024位达6.6秒。已经尽力了。
如何加快Gamma函数的收敛是关键。伯努利常数用到BernoulliB时,Gamma函数的精度才能达到1034位。
云梦
发表于 2013-7-4 17:28:38
Gamma/Gamma的计算时,当n>1000000以上时有没有更好的计算公式可以加快收敛速度?
我的VB计算器遇到难点,64位十进制精度当n=100000时计算时间是10秒,更大时就很慢。
云梦
发表于 2013-7-6 09:50:07
n<10^255,z<10^256时:
γ(n,z)值计算成功。
但Γ(n,z)该如何能计算呢?
云梦
发表于 2013-8-10 12:26:34
不完全伽马函数的计算终于完成了。
关于γ(n,z) 和 Γ(n,z)计算确很复杂,对于自变量n,z:-∞<n<+∞,-∞<z<+∞好不容易全部解决l了,包括复数值的计算。
当n为负整数时,只有采用极限法确定所需要的精度值,因为 Γ(n)=∞,这就需要高精度的Gamma的计算。
重新改进的函数计算器,函数值增加了复数,使得自变量可在-∞到+∞范围。不过还不能输入复数。
已完成的函数有:Exp,Log,x^y,Sin,Cos,Tan
对数积分函数: li,Li
指数积分函数:Ei,E
误差函数,Erf 和正态分布函数
伽马函数:Gamma,LnGamma,PolyGamma,PolyGamma
其它积分函数:Si,Ci,S,C
不完全伽马函数:Γ(n,z),γ(n,z)
云梦
发表于 2013-8-10 15:35:32
这真是个伟大而消磨时间的工程,不过从编程中确能找到解决问题的方法,学到更多的编程技巧,从中收益不浅。