VBA-模幂运算

VBA-模幂运算,vba,excel,Vba,Excel,我一直在尝试在VBA中进行模幂运算,以便在MS excel中使用,但似乎存在一个逻辑错误,每当我尝试使用该公式时,excel都会崩溃 Function expmod(ax As Integer, bx As Integer, cx As Integer) ' Declare a, b, and c Dim a As Integer Dim b As Integer Dim c As Integer ' Declare new values Dim a1 As Integer Dim p As

我一直在尝试在VBA中进行模幂运算,以便在MS excel中使用,但似乎存在一个逻辑错误,每当我尝试使用该公式时,excel都会崩溃

Function expmod(ax As Integer, bx As Integer, cx As Integer)
' Declare a, b, and c
Dim a As Integer
Dim b As Integer
Dim c As Integer

' Declare new values
Dim a1 As Integer
Dim p As Integer

' Set variables
a = ax
b = bx
c = cx
a1 = a Mod c
p = 1

' Loop to use Modular exponentiation
While b > 0
    a = ax
    If (b Mod 2 <> 0) Then
        p = p * a1
        b = b / 2
    End If
    a1 = (a1 * a1) Mod c
Wend
expmod = a1
End Function
函数expmod(ax为整数,bx为整数,cx为整数)
'声明a、b和c
将a变暗为整数
作为整数的Dim b
作为整数的Dim c
'声明新值
作为整数的Dim a1
作为整数的Dim p
'设置变量
a=ax
b=bx
c=cx
a1=a模数c
p=1
'循环以使用模幂运算
当b>0时
a=ax
如果(b模式2 0),则
p=p*a1
b=b/2
如果结束
a1=(a1*a1)模块c
温德
expmod=a1
端函数

我使用了提供的伪代码。

这是我不久前编写的一个实现。使用
Long
而不是
Integer
可以处理更高的指数:

Function mod_exp(alpha As Long, exponent As Long, modulus As Long) As Long
    Dim y As Long, z As Long, n As Long
    y = 1
    z = alpha Mod modulus
    n = exponent

    'Main Loop:
    Do While n > 0
        If n Mod 2 = 1 Then y = (y * z) Mod modulus
        n = Int(n / 2)
        If n > 0 Then z = (z * z) Mod modulus
    Loop

    mod_exp = y
End Function

这是我不久前写的一个实现。使用
Long
而不是
Integer
可以处理更高的指数:

Function mod_exp(alpha As Long, exponent As Long, modulus As Long) As Long
    Dim y As Long, z As Long, n As Long
    y = 1
    z = alpha Mod modulus
    n = exponent

    'Main Loop:
    Do While n > 0
        If n Mod 2 = 1 Then y = (y * z) Mod modulus
        n = Int(n / 2)
        If n > 0 Then z = (z * z) Mod modulus
    Loop

    mod_exp = y
End Function

在b==2(或2的倍数)的情况下,您将在无限循环中结束。您可以单步执行并查看错误所在吗?或者正如@woockashek所建议的,如果它持续循环,请告诉我们不确定
a
的意义是什么……您将它设置为同一事物两次,但从不修改它。您在修改代码时引入了多个错误。再仔细看看。您还应该使用
Long
(32位)而不是
Integer
(16位)。如果b==2(或2的倍数),您将进入无限循环。您可以单步执行并查看错误所在吗?或者正如@woockashek所建议的,如果它持续循环,请告诉我们不确定
a
的意义是什么……您将它设置为同一事物两次,但从不修改它。您在修改代码时引入了多个错误。再仔细看看。您还应该使用
Long
(32位)而不是
Integer
(16位)。非常感谢!非常感谢你!