有人可以让我知道一个有效的大n算法,它使用递归函数而不是几何求和公式来执行O(log(n))。
答案 0 :(得分:4)
您需要使用几何级数之和的公式: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来证明这一点。
答案 1 :(得分:0)
首先,当你陈述 M< 10 5 ,你知道所有数字都需要最多16位,所以只要稍微谨慎一点,你就不应该被精确问题所困扰。
接下来,作为 a n (mod M)=(a(mod M)) n (mod M),你也可以说 a< M< 10< 10 5
接下来,如果你注意到你的 n = a 0 + a 1 ... a n-1 (mod M),您可以使用以下递归:
给定数n,你会发现log 2 (n)数n,n / 2,n / 4,...,1并使用上面的公式,你可以轻松计算u n / 2 i 和 n / 2 i 知道u n / 2 i + 1 和 n / 2 i + 1
这个算法可能并不容易写(特别是不要忘记mod M操作确实没有溢出)因为测试不同,但是是 O(log 2 子>(n))的