Python 实现快速模幂运算功能

Python 实现快速模幂运算功能,python,cryptography,Python,Cryptography,我正在尝试实现函数快速模幂运算(b,k,m),该函数计算: b(2k)mod m仅使用约2k模乘 我试过这个方法: def FastModularExponentiation(b, k, m): res = 1 b = b % m while (k > 0): if ((k & 1) == 1): res = (res * b) % m k = k >> 1 b = (b *

我正在尝试实现函数快速模幂运算(b,k,m),该函数计算:
b(2k)mod m仅使用约2k模乘

我试过这个方法:

def FastModularExponentiation(b, k, m):
    res = 1
    b = b % m
    while (k > 0):
        if ((k & 1) == 1):
            res = (res * b) % m
        k = k >> 1
        b = (b * b) % m
    return res
但我仍然陷入同样的问题,如果我尝试
b=2
k=1
m=10
,我的代码返回22。然而,正确的答案是:

2^(2^1)模10=2^2模10=4


我也找不到原因。

更新:我终于明白你不想要常规的(即,
b^k mod m
),而是
b^(2^k)mod m
(正如你明确指出的)

使用常规内置Python函数,这将是:

def FastModularExponentiation(b, k, m):
    return pow(b, pow(2, k), m)
或者,不使用
pow

def FastModularExponentiation(b, k, m):
    b %= m
    for _ in range(k):
        b = b ** 2 % m
    return b
如果知道
r=phi(m)
(),可以先减小指数:
exp=pow(2,k,r)
,然后计算
pow(b,exp,m)
。根据输入值,这可能会加快速度


(这是我以为你想要的原始答案,
b^k mod m

这对我来说很有用:

def fast_mod_exp(b, exp, m):
    res = 1
    while exp > 1:
        if exp & 1:
            res = (res * b) % m
        b = b ** 2 % m
        exp >>= 1
    return (b * res) % m
我发现的唯一显著差异是在最后一行:
返回(b*res)%m
和我的
while
循环提前终止:
while exp>1
(这应该与您所做的相同-只是它节省了不必要的平方运算)


还请注意,内置函数将免费完成所有这些操作(如果提供第三个参数):


答案是:预期结果:1399670962,取而代之的是5793163382,这就是问题所在!输入是随机选择的,我尝试了许多测试用例,成功了,但失败了三次。我理解,但请检查一下,这样您就会知道函数
pow()
不起作用!经过大量的搜索和尝试,第四行中的问题看起来像是用2代替了1,效果很好,请编辑您的答案以检查它是否被接受,请不要否决我的问题!如果你投了赞成票,我会很感激这就是解决办法:如果你感兴趣的话
pow(4, 13, 497)
# 445