Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 修正几何级数中的模运算_Algorithm_Math_Modulo_Algebra - Fatal编程技术网

Algorithm 修正几何级数中的模运算

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项的情况下找到

我们知道几何级数中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项的情况下找到求和的有效算法,这将非常有帮助。

主关系是相同的,求和
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,它必须由扩展的欧几里德算法来完成吗?。是否有相同的代码示例。找到的链接很少,但不是很清楚。您可以从中学习此算法