Algorithm 修正几何级数中的模运算
我们知道几何级数中n项之和由 Sn=a1(1-r^n)/(1-r),如果序列的形式为a1、a1*r、a1*r^2、a1*r^3……a1*r^n 现在我修改了几何级数,级数的形式是 a1,(a1*r)模p,(a1*r^2)模p,(a1*r^3)模p…..(a1*r^n)模p其中a1是初始项,p是素数,r是公比。这个级数的第n项由:(a1*r^n-1)mod p给出Algorithm 修正几何级数中的模运算,algorithm,math,modulo,algebra,Algorithm,Math,Modulo,Algebra,我们知道几何级数中n项之和由 Sn=a1(1-r^n)/(1-r),如果序列的形式为a1、a1*r、a1*r^2、a1*r^3……a1*r^n 现在我修改了几何级数,级数的形式是 a1,(a1*r)模p,(a1*r^2)模p,(a1*r^3)模p…..(a1*r^n)模p其中a1是初始项,p是素数,r是公比。这个级数的第n项由:(a1*r^n-1)mod p给出 我正试图得到上面修改过的GP的求和公式,并且非常努力。如果有人能给我们一些启示,或者给我们一些建议,让我们在不迭代所有n项的情况下找到
我正试图得到上面修改过的GP的求和公式,并且非常努力。如果有人能给我们一些启示,或者给我们一些建议,让我们在不迭代所有n项的情况下找到求和的有效算法,这将非常有帮助。主关系是相同的,求和
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
和贝佐特系数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
请注意,如果
r
是一个。
然后我们可以降低求和的复杂性
我们必须找到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)
然后我们采取双方的观点:
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
您可以在O(sqrt(m))
中使用算法来解决这个问题。
如果你想在代码中实现,我会提供给你。我投票决定把这个问题作为离题题来结束,因为它与编程无关,只有mathematicsOne可以找到解决上述问题的有效算法。这就是我所问的。原则上,解决方案是相同的,x是
a1*(r^N-1)=(r-1)*x mod p
的解决方案。问题是p
和r-1
可能有公约数,这需要在解释扩展欧几里德算法时小心处理,XGCD(p,r-1)
@LutzL。谢谢你的回复。你能用一个非常简单的例子来解释吗?你必须找到n
或者什么?上面的实现将计算n个级数的和,我需要的是n个级数的和公式,就像正常几何级数的Sn=a1(1-r^n)/(1-r)一样。到底有什么区别?在您的用例中,您认为p
和r
的典型值是什么?如果“p”是素数(从OP开始),r-1和p
是相对素数,除非r-1
是p
的倍数,这与r=1
相同。是的,这是正确的。然后,也可以通过Fermat的小定理计算r-1
的逆,如powmod(r-1,p-2,p)
。为了实现,我们需要找到模逆righhi,我正试图从这个链接实现小步算法。公式化简为p^i[sqrt(n)]=q*p^-j(mod n)。所以我必须计算p^-j,它必须由扩展的欧几里德算法来完成吗?。是否有相同的代码示例。找到的链接很少,但不是很清楚。您可以从中学习此算法