令,可以观察发现,由于这一关系的存在,事实上可以写成不同的形式,以下使用的是
由于,因此可以计算模每个素因子的结果,再用中国剩余定理将其组合。
右侧两个求和项可以分别用杨辉三角和秦九韶法(以下代码中的变量q)递推计算。
可以观察到(证明较繁琐),模素因子p的结果是周期为的序列,因此只需计算大约一万项即可得结果。
注:中国剩余定理的简单版本韩信点兵是我国小学奥数的传统内容,此处由于涉及的素数很小,直接遍历来找出乘法逆。
注2:因需使用math.prod函数,以下代码为Python 3。
import math
def inverse(a,p):
x=1
while (x*a)%p!=1:
x+=1
return x
d={}
for p in [7,11,73,101,137]:
c=[0]
q=0
pascal=[1]
for i in range(1,10**9%(p*(p-1))+1):
q=(i*q+1)%p
pascal=[1]+[(pascal[j]+pascal[j+1])%p for j in range(i-1)]+[1]
c.append((sum((pascal[j]*c[j])%p for j in range(i))+q)%p)
d[p]=c[-1]
n=math.prod(d.keys())
print((-(sum(d[p]*inverse(n//p,p)*n//p for p in d)%n))%77777777)
|