Vba 如何使我的大数乘法函数更快?
我最近创建了一个宏,它使用了很多大的数字(比如超过100位的十进制数字)。为了处理这些问题,我在互联网上四处寻找想法,并优化了许多我发现的东西,以满足我的需求 然而,我发现了一个大数乘法函数,它可以工作。。。但在我看来,这似乎不太有效 我试着从头开始想出我自己的算法,我试着优化这个算法。。。但我似乎不能再快了 我在想一种方法,它不需要factorOneNbr引用LargeMult。。。但是什么都没有 如果有人有任何建议,我将不胜感激 谢谢 代码如下:Vba 如何使我的大数乘法函数更快?,vba,excel,biginteger,Vba,Excel,Biginteger,我最近创建了一个宏,它使用了很多大的数字(比如超过100位的十进制数字)。为了处理这些问题,我在互联网上四处寻找想法,并优化了许多我发现的东西,以满足我的需求 然而,我发现了一个大数乘法函数,它可以工作。。。但在我看来,这似乎不太有效 我试着从头开始想出我自己的算法,我试着优化这个算法。。。但我似乎不能再快了 我在想一种方法,它不需要factorOneNbr引用LargeMult。。。但是什么都没有 如果有人有任何建议,我将不胜感激 谢谢 代码如下: Public Sub Initialize(
Public Sub Initialize()
Static Initialized As Boolean
If Initialized Then Exit Sub
Initialized = True
cDecMax = _
CDec(Replace("79,228,162,514,264,337,593,543,950,335", ",", ""))
'this is 2^96-1
cDecMaxLen = Len(cDecMax) - 1
cSqrDecMaxLen = cDecMaxLen \ 2
End Sub
Function Ceil(x As Single) As Long
If x < 0 Then Ceil = Fix(x) Else Ceil = -Int(-x)
End Function
Function LargeMult(ByVal Nbr1 As String, ByVal Nbr2 As String) As String
Initialize
Dim negative As Boolean
negative = False
If Left(Nbr1, 1) = "-" And Left(Nbr2, 1) = "-" Then
Nbr1 = Right(Nbr1, Len(Nbr1) - 1)
Nbr2 = Right(Nbr2, Len(Nbr2) - 1)
ElseIf Left(Nbr1, 1) = "-" Then
Nbr1 = Right(Nbr1, Len(Nbr1) - 1)
negative = True
ElseIf Left(Nbr2, 1) = "-" Then
Nbr2 = Right(Nbr2, Len(Nbr2) - 1)
negative = True
End If
If Len(Nbr1) <= cSqrDecMaxLen And Len(Nbr2) <= cSqrDecMaxLen Then
LargeMult = CStr(CDec(Nbr1) * CDec(Nbr2))
If negative Then LargeMult = "-" & LargeMult
Exit Function
End If
If Len(Nbr1) > cSqrDecMaxLen Then
LargeMult = factorOneNbr(Nbr1, Nbr2)
Else
LargeMult = factorOneNbr(Nbr2, Nbr1)
End If
If negative Then LargeMult = "-" & LargeMult
End Function
Private Function factorOneNbr(ByVal LargeNbr As String, _
ByVal Nbr2 As String) As String
Dim NbrChunks As Integer, i As Integer, _
Nbr1Part As String, PowersOf10 As Integer, _
Rslt As String, FinalRslt As String
FinalRslt = "0"
NbrChunks = Ceil(Len(LargeNbr) / cSqrDecMaxLen) - 1
For i = NbrChunks To 0 Step -1
Nbr1Part = Mid(LargeNbr, i * cSqrDecMaxLen + 1, cSqrDecMaxLen)
Rslt = LargeMult(Nbr1Part, Nbr2)
FinalRslt = LargeAdd(FinalRslt, Rslt & String(PowersOf10, "0"))
PowersOf10 = PowersOf10 + Len(Nbr1Part)
Next i
factorOneNbr = FinalRslt
End Function
Public子初始化()
静态初始化为布尔值
如果初始化,则退出Sub
已初始化=真
cDecMax=_
CDec(替换(“79228162514264337593543950335”、“、”和“))
“这是2^96-1
cDecMaxLen=Len(cDecMax)-1
cSqrDecMaxLen=cDecMaxLen\2
端接头
功能单元(x为单个)长度为
如果x<0,则Ceil=Fix(x)否则Ceil=-Int(-x)
端函数
函数LargeMult(ByVal Nbr1作为字符串,ByVal Nbr2作为字符串)作为字符串
初始化
将负数设置为布尔值
否定=错误
如果左(Nbr1,1)=“-”和左(Nbr2,1)=“-”
Nbr1=右侧(Nbr1,Len(Nbr1)-1)
Nbr2=右侧(Nbr2,Len(Nbr2)-1)
如果左(Nbr1,1)=“-”则
Nbr1=右侧(Nbr1,Len(Nbr1)-1)
负=真
如果左(Nbr2,1)=“-”则
Nbr2=右侧(Nbr2,Len(Nbr2)-1)
负=真
如果结束
如果Len(Nbr1)您尝试过–Strassen_算法吗?我认为这是一个很好的问题,如果您包括LargeAdd
函数,并且它按预期工作。事实上,这是无法编译的,我无法验证它是否有效。我使用Google follow在Stack Overflow上找到了一些可用的指针,为了找到它们,我使用Google查询“site:stackoverflow.com大数算术”和“java大数算术”。通过这些查询,您肯定可以找到更多的指针,正如ckuhn203所说,您的代码是不完整的。发布一个有效的例子,我们会更有帮助。