修正几何级数中的模运算

时间:2017-06-18 09:34:56

标签: algorithm math modulo algebra

我们知道几何级数中的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个术语,那将会有很大的帮助。

2 个答案:

答案 0 :(得分:4)

请注意,如果rprimitive 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))

请注意,如果a11,则最后一个字词为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. 

难以观察到pr-1可能有公约除数,这不是真正的问题,因为r-1分为r^N-1,但仍需要小心处理

模块化除法可以通过与逆相乘来实现,并且可以通过扩展的欧几里德算法来计算。

的任何实施
 d,u,v = XGCD(r-1,p) 

返回最大公约数d和Bezout因子u,v,以便

u*(r-1)+v*p = d

f/df = 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