【发布时间】:2015-07-04 12:45:43
【问题描述】:
我需要一个快速算法来评估以下内容
((a^n-1)/(a-1)) % p
a 和 n 几乎相等,但小于 10^6,p 是一个固定的质数(比如p=1000003)。我需要在 1 秒内计算它。我正在使用python。 Wolfram Mathematica computes it instantly。使用以下代码需要 35.2170000076 秒
print (((10**6)**(10**6)-1)/((10**6)-1))%1000003
如果分母a-1 不存在,我可以将幂分组为更小的顺序并使用关系a*b (mod c) = (a (mod c) * b (mod c)) (mod c) 但分母存在。
如何使用快速算法对此进行评估?没有可用的 numpy/scipy。
更新::这是我想出的最终代码
def exp_div_mod(a, n, p):
r = pow(a, n, p*(a-1)) - 1
r = r - 1 if r == -1 else r
return r/(a-1)
【问题讨论】:
-
可以使用en.wikipedia.org/wiki/Extended_Euclidean_algorithm求逆
1/(a-1) mod p;然后应用你写的最后一个身份。 -
@hiroprotagonist 我会尽力让你知道的。
-
gmpy 模块有一个可以计算模数逆的函数:
gmpy.divm"返回 x 使得 b*x==a 模 m,否则如果没有这样的值 x,则引发 ZeroDivisionError 异常存在”。在 OP 中使用a、n和p,(pow(a,n,p)-1)*gmpy.divm(1,a-1,p) % p返回 444446。 -
当然,gmpy 不是必需的,如果你做一点代数,就像 samgak 的回答一样。 :)
-
r = r - 1 if r == -1 else r在您的更新中是错误的。
标签: python algorithm math language-agnostic