假设我们有一系列求和 s = 1 + 2a + 3a ^ 2 + 4a ^ 3 + .... + ba ^(b-1)
我需要找到s MOD M,其中M是素数,b是相对大的整数。
我找到了一个O((log n)^ 2)分而治之的解决方案。 哪里, g(n)=(1 + a + a ^ 2 + ... + a ^ n)MOD M
f(a,b)= [f(a,b / 2)+ a ^ b / 2 *(f(a,b / 2)+ b / 2 * g(b / 2))] MOD M ,其中b是偶数 f(a,b)= [f(a,b / 2)+ a ^ b / 2 *(f(a,b / 2)+ b / 2 * g(b / 2))+ ba(b-1 )] MOD M,其中b是奇数
是否有针对此问题的O(log n)解决方案?
答案 0 :(得分:5)
是。请注意1 + 2a + 3a^2 + ... + ba^(b-1)
是a
中1 + a + a^2 + a^3 + ... + a^b
的衍生物。 (正式权力系列的领域涵盖了很多这样的技巧。)我们可以用automatic differentiation with dual numbers及时O(log b)
算术运算来评估后者。像这样:
def fdf(a, b, m):
if b == 0:
return (1, 0)
elif b % 2 == 1:
f, df = fdf((a**2) % m, (b - 1) / 2, m)
df *= 2 * a
return ((1 + a) * f % m, (f + (1 + a) * df) % m)
else:
f, df = fdf((a**2) % m, (b - 2) / 2, m)
df *= 2 * a
return ((1 + (a + a**2) * f) % m, (
(1 + 2 * a) * f + (a + a**2) * df) % m)
答案是fdf(a, b, m)[1]
。当我们从a**2
的导数到关于a
的导数时,请注意使用链规则。