Python 实现快速模幂运算功能
我正在尝试实现函数快速模幂运算(b,k,m),该函数计算: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(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