【问题标题】:Finding remainder of division the sum of the given diapason and 987654321找到除法的余数给定的音调和 987654321 的总和
【发布时间】:2016-12-12 17:21:16
【问题描述】:

你能帮帮我吗?我需要一个快速算法来计算以下内容:除法的余数从给定范围内的幂中的整数之和(从 AB ,1 A,B A = 10,B = 15,我应该计算

((11^11) + (12^12) + (13^13) + (14^14) ) % 987654321

如果我使用这种直接方法,则需要很长时间才能计算出来。计算这种余数有什么诀窍吗?

【问题讨论】:

  • 好吧,我搜索了一下,似乎“从 a 到 b 的 n^n 之和”之类的系列似乎没有封闭形式或其他有用的属性,所以恐怕你'将只是总结一堆权力。当然,在整个过程中,没有理由使用大于 987654321 的数字,所以它不会是灾难性的。 E:如果你得到多个查询,你可以先预计算整个事物的前缀和
  • @HopefullyHelpful 没必要。 OP 需要快速模幂运算,您最大的寄存器需要能够容纳大约。模数的平方(此处为 64 位即可)。
  • @HopefullyHelpful 如果 A = 1 且 B = 10^8,如何在 1 秒内运行?
  • @PhamTrung 在具有许多逻辑内核的机器上进行快速模幂运算。
  • 在每一步之后通过平方和取模进行指数应该很容易做到这一点。您可以将其与某种素筛相结合,以重用早期的数字并最大限度地减少工作。

标签: algorithm performance math optimization


【解决方案1】:

使用快速模幂运算,我们可以在O(log(n)) 时间内计算出x^n。在最坏的情况下,如果A = 1 and B = n 其中n 可以达到10^8,那么总复杂度将在左右

log(2) + log(3) + log(4) + ... + log(n)
= log(n!)
~ n*log(n) - n + O(log(n))  (According to Striling's Approximation)

Wikipedia

快速模幂运算

此方法用于快速计算x^n 形式的幂(在O(log(n)) 时间)。

它可以作为递归关系给出:

x^n = (x^2)^(n/2)     if n is even
    = x*{(x^2)^(n/2)} if n is odd

因此,实际上我们不是将xn 乘以倍,而是执行以下操作:

    x = x^2;
    n = n/2;

直到我们遇到一个小案例,n = 1

Python 代码(本例使用模数):

def fast(x, n, mod):
    if n == 1:
        return x % mod
    if n % 2 == 0:
        return fast(x**2 % mod, n/2, mod)
    else:
        return x*fast(x**2 % mod, (n-1)/2, mod) % mod

【讨论】:

    猜你喜欢
    • 2021-05-06
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多