python - 查找涉及指数的余数模和涉及大数的除法

标签 python algorithm math language-agnostic

我需要一个快速算法来评估以下内容

((a^n-1)/(a-1)) % p

an 几乎相等但小于 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。

UPDATE::这是我想出的最终代码

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)

最佳答案

(((a ** n) - 1)/(a-1)) % p

可以重写为

(((a ** n) - 1) % ((a-1)*p))/(a-1)

这部分:

(((a ** n) - 1) % ((a-1)*p))

可以这样计算:

((a ** n) % ((a-1)*p))

然后调整为 -1。

将 a 的 n 次方和模 ((a-1)*p) 相加。这可以使用 Python pow() 函数来完成。然后调整为 -1 并除以 a-1。

使用 pow() 函数并传递模值比计算完整指数然后取模更快,因为模可以在计算的每个阶段应用于部分乘积,这阻止了值得到太大(106 的 106 次方有 600 万个十进制数字,在每一步应用模数时,值永远不必增长到大于模 - 在这个例子中大约 13 位数字)。

代码:

def exp_div_mod(a, n, p):
    m = p * (a - 1)
    return ((pow(a, n, m) - 1) % m) // (a - 1);

print exp_div_mod((10**6), (10**6), 1000003)

输出:

444446

注意:此方法仅在 a、n 和 p 为整数时有效。

关于python - 查找涉及指数的余数模和涉及大数的除法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31220786/

相关文章:

python - 获取 lxml/Python 中选定元素旁边的文本

python - 无法导入声音文件python

python - 将 Python 中的 '*' 字符读入新字符串时出现问题

algorithm - 一种聚合相似序列的算法

javascript - 如何在javascript中将数字数组中的值相乘?

algorithm - "guess the number"任意有理数的游戏?

python - 如何让敌人改变方向 PYTHON

algorithm - 找到 pt 所在的线段数

algorithm - 统一成本搜索和完备性

c++ - 使用 64 位分子和分母对 pi 的最佳有理近似值是多少?