Vba 如何使我的大数乘法函数更快?

Vba 如何使我的大数乘法函数更快?,vba,excel,biginteger,Vba,Excel,Biginteger,我最近创建了一个宏,它使用了很多大的数字(比如超过100位的十进制数字)。为了处理这些问题,我在互联网上四处寻找想法,并优化了许多我发现的东西,以满足我的需求 然而,我发现了一个大数乘法函数,它可以工作。。。但在我看来,这似乎不太有效 我试着从头开始想出我自己的算法,我试着优化这个算法。。。但我似乎不能再快了 我在想一种方法,它不需要factorOneNbr引用LargeMult。。。但是什么都没有 如果有人有任何建议,我将不胜感激 谢谢 代码如下: Public Sub Initialize(

我最近创建了一个宏,它使用了很多大的数字(比如超过100位的十进制数字)。为了处理这些问题,我在互联网上四处寻找想法,并优化了许多我发现的东西,以满足我的需求

然而,我发现了一个大数乘法函数,它可以工作。。。但在我看来,这似乎不太有效

我试着从头开始想出我自己的算法,我试着优化这个算法。。。但我似乎不能再快了

我在想一种方法,它不需要factorOneNbr引用LargeMult。。。但是什么都没有

如果有人有任何建议,我将不胜感激

谢谢

代码如下:

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所说,您的代码是不完整的。发布一个有效的例子,我们会更有帮助。