【问题标题】:Sum of series: a^0+2a^1 + 3*a^2 + 4*a^3 + … + n*a^(n-1) (mod M)系列之和:a^0+2a^1 + 3*a^2 + 4*a^3 + ... + n*a^(n-1) (mod M)
【发布时间】:2016-10-17 10:19:11
【问题描述】:

有人能给我一个关于大 n 的有效算法的想法,它使用递归函数而不是几何求和公式执行 O(log(n))。

【问题讨论】:

  • 我什至可以给你O(1):这是几何数列mod M的总和。
  • @freakish 好吧,这不是恒定的复杂性,因为您仍然需要计算 a^(n+1) ,这无法在恒定时间内完成
  • @IvayloStrandjev 但是a^(n+1) mod M 可以在常数时间内计算出来。
  • @ashraful_haque 栈溢出不是来给你写代码的。但是,我们可以建议一种可行的方法。您仍然需要自己编写代码

标签: c++ algorithm number-theory


【解决方案1】:

您需要使用几何级数和的公式:a^1 + a^2 + ... a^n = (a^(n+1) - 1) / (a - 1)。使用exponentiation by squaring,您可以在 O(log(n)) 中计算 (a^(n+1) - 1)。如果 M 是素数,除以 (a - 1) 只是再一次取幂 - 对于任何具有素数 p 的 U 互素数,U^(-1) (mod p) = U^(p-2) (mod p)。您可以使用Fermat's little theorem 来证明这一点。

【讨论】:

  • 好吧,你不必划分mod M。实际上对于非主要的M 这可能很困难。计算a^(n+1) mod M 就足够了。所有其他计算都可以在恒定时间内以整数执行,然后再次mod M
  • @freakish 不正确。可能是 (a^(n+1) - 1) = 3 (mod m) 和 (a - 1) = 2016 (mod m) (这里当然 2016 是小于 m 的随机数)
  • 我的错,你还要加a - 1 mod M。请注意,a/b mod M == (a mod M)/(b mod M) 其中== 表示“全等”。仅当右侧有意义时,即当b mod M != 0 时,等式才成立。这种情况下只要a != 1 mod M那么就可以简单计算(a^(n+1) - 1 mod M) / (a - 1 mod M) mod M
  • 假设a != 1 mod MM 必须是素数要好得多。
  • @freakish 由于同一个例子,这又不是真的。考虑 64 / 8 (mod 3)。
【解决方案2】:

首先,正如您所说的 M 5,您知道所有数字最多需要 16 位,所以只要稍微谨慎一点,您不应该被精确问题所困扰。

接下来,如an(mod M) = (a(mod M))n(mod M),你也可以说 a5

接下来如果你记下 un=a0+a1...an-1 (mod M),您可以使用以下递归:

  • u2k = uk+akuk (mod M)
  • uk+1 = uk+ak (mod M)
  • u2k+1 = uk+1+ak+1uk (mod M ) = uk+ak+a*akuk (mod M)

给定一个数 n,你会发现 log2(n) 个数 n, n/2, n/4, ..., 1,使用上面的公式,你可以很容易地计算un/2i 和 an/2i 知道 un/2 i+1 和 an/2i+1

由于测试不同,这个算法可能写起来并不简单(特别是不要忘记 mod M 操作确保不会溢出),但它 O(log2 (n))

【讨论】:

    猜你喜欢
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 2010-10-28
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    相关资源
    最近更新 更多