我们知道几何级数中的n项之和由下式给出 如果序列的形式为a1,a1 * r,a1 * r ^ 2,a1 * r ^ 3 ...... a1 * r ^ n,则Sn = a1(1-r ^ n)/(1-r)。
现在我修改了几何级数,其中系列是形式 a1,(a1 * r)mod p,(a1 * r ^ 2)mod p,(a1 * r ^ 3)mod p .....(a1 * r ^ n)mod p其中a1是初始项, p是素数,r是常用比率。该系列的第N个术语由下式给出:(a1 * r ^ n-1)mod p。
我正在尝试获得上述修改后的GP的求和公式并且非常努力地努力。如果有人可以对它进行一些说明,或者建议找到有效的算法来求和,而不需要迭代所有n个术语,那将会有很大的帮助。
答案 0 :(得分:4)
请注意,如果r
是primitive root modulo p
。
然后我们可以降低总和的复杂性。
我们必须找到S = a1*1 + a1*r + a1*r^2 + ... + a1*r^n
。然后我们以封闭的形式将S
写为S = a1*(r^n - 1) / (r - 1)
。
现在可以简化为:
a1*(r^n - 1) / (r - 1) = S (mod p)
=> a1*r^n = S * (r - 1) + 1 (mod p)
现在采用离散对数和基数r两边,
log(a1*r^n) = log_r(S*(r-1) + 1 (mod p))
=>log_r(a1) + n*log_r(r) = log_r(S*(r-1) + 1 (mod p))
=>n*log_r(r) = log_r(S*(r-1) + 1 (mod p)) - log_r(a1) (mod(p-1))
=>n*1 = log_r(S*(r-1) + 1 (mod (p-1))) - log_r(a1) (mod (p-1))
请注意,如果a1
为1
,则最后一个字词为0
。
设S = 6,r = 3,m = 7,a1 = 1。 然后,我们想要在以下一致性中求解n:
(3^n - 1)/(3 - 1) = 6 (mod 7)
=> 3^n - 1 = (3 - 1) * 6 (mod 7)
=> 3^n = 2 * 6 + 1 (mod 7)
=> 3^n = 6 (mod 7)
然后我们采取双方的discrete logarithm:
log_3(3^n) = log_3(6) (mod (7-1))
=> n * log_3(3) = log_3(6) (mod 6)
=> n * 1 = 3 (mod 6)
=> n = 3 (mod 6)
所以,n = 3。
您可以使用Baby-step Giant-step算法在O(sqrt(m))
中解决此问题。
如果你想在代码中实现我将为你提供。
答案 1 :(得分:2)
主要关系是相同的,总和x
是
a1*(r^N-1) = (r-1)*x mod p.
难以观察到p
和r-1
可能有公约除数,这不是真正的问题,因为r-1
分为r^N-1
,但仍需要小心处理
模块化除法可以通过与逆相乘来实现,并且可以通过扩展的欧几里德算法来计算。
的任何实施 d,u,v = XGCD(r-1,p)
返回最大公约数d
和Bezout因子u,v
,以便
u*(r-1)+v*p = d
与f/d
,f = a1*(r^N-1)
相乘会产生
(u*f/d)*(r-1) + (v*f/d)*p = f = a1*(r^N-1)
以便可以将解决方案标识为x = u*(f/d)
。因此,实施将遵循
rN = powmod(r,N,p)
f = a1*(rN-1) mod p
d,u,v = XGCD(r-1,p)
return u*(f/d) mod p