4、最优的了,但是如果只求某一个Fn,可以改进GCD(GreatCommonDivisor)Euclid算法intgcd(inta,intb){intmod;while(mod=a%b)a=b,b=mod;returnb;}//注意这里面必须a,b都为正数,否则要加其他判断语句Extended-Euclid算法:同时求出v,u使gcd(a,b)=u*a+v*b(重要)非递归的不好写,建议写递归的扩展欧几里得算法注意到对于gcd(a,b)=d我们对(a,b)用欧几里德辗转相除会最终得到(d,0)此时对于把a=d,b=0带入a*x+b*y=d,显然x=
5、1,y可以为任意值,这里y可以为任意值就意味着解会有无数个。我们可以用a=d,b=0的情况逆推出来任何gcd(a,b)=d满足a*x+b*y=d的解。如果x0,y0是b*x+(a%b)*y=d的解,那么对于a*x+b*y=d的解呢?扩展欧几里得算法b*x+(a%b)*y=d=>b*x+(a-[a/b]*b)*y=a*y+b*(x-[a/b]*y),所以a*x+b*y=d的解x1=y0,y1=x0-[a/b]*y0;这样我们可以程序迭代了。注:a,b为正整数,设集合A={x*a+y*b
6、x,y是整数},则A中最小正元素是gcd(a,b)费马小定理及其
7、推广若p为素数,gcd(a,p)=1则a^(p-1)=1(modp)推广:若gcd(a,n)=1则a^f(a)=1(modn)其中f(a)为a的欧拉函数,这里注意到,如果n为素数,则由于n的欧拉函数=n-1,可以推出费马小定理Extended-Euclid算法扩展欧几里德算法:EXTENDED-EUCLID(a,b)ifb=0thenreturn(a,1,0)(d’,x’,y’)←EXTENDED-EUCLID(b,a%b)(d,x,y)←(d’,y’,x’–(a/b)*y’)return(d,x,y)13求解模线性方程定理:方程ax=b(modn)对
8、于未知量x有解,当且仅当gcd(a,n)
9、b定理:方程ax=b(modn)或者对模n有d个不同的解,其中d=gcd(a,n)或者无解。14求解模线性方程定理:设d=gcd(a,n),假定对整数x’和y’,有d=ax’+ny’。如果d
10、b,则方程ax=b(modn)有一个解的值为x0,满足x0=x’(b/d)modn。15求解模线性方程定理:假设方程ax=b(modn)有解(即有d
11、b,其中d=gcd(a,n)),x0是该方程的任意一个解,则该方程对模n恰有d个不同的解,分别为:xi=x0+i(n/d)(i=1,2,…,d-1)。16求解模线性方程MOD
12、ULAR-LINEAR_EQUATION_SOLVER(a,b,n)(d,x’,y’)←EXT