找回密码
 欢迎注册
楼主: ysr

[讨论] 几个VB小程序

[复制链接]
发表于 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 | 显示全部楼层
各精度的计算时间:
a1.jpg
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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的时间。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-6-20 12:52:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-6-24 16:48:52 | 显示全部楼层
VB计算512位Gamma函数1.3秒,1024位达6.6秒。已经尽力了。
如何加快Gamma函数的收敛是关键。伯努利常数用到BernoulliB[740]时,Gamma函数的精度才能达到1034位。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-7-4 17:28:38 | 显示全部楼层
Gamma[n,n]/Gamma[n]的计算时,当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[n]的计算。
重新改进的函数计算器,函数值增加了复数,使得自变量可在-∞到+∞范围。不过还不能输入复数。
已完成的函数有:Exp[x],Log[x],x^y,Sin[x],Cos[x],Tan[x]
对数积分函数: li[x],Li[x]
指数积分函数:Ei[x],E[n,x]
误差函数,Erf[x] 和正态分布函数
伽马函数:Gamma[x],LnGamma[x],PolyGamma[x],PolyGamma[n,x]
其它积分函数:Si[x],Ci[x],S[x],C[x]
不完全伽马函数:Γ(n,z),γ(n,z)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-8-10 15:35:32 | 显示全部楼层
这真是个伟大而消磨时间的工程,不过从编程中确能找到解决问题的方法,学到更多的编程技巧,从中收益不浅。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-3-28 19:37 , Processed in 0.045523 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表