欧几里得:
欧几里得算法:
定理1:整数a≥b>0,令r0=a,r1=b如果我们做带余除法得到rj=r(j+1)q(j+1)+r(j+2),且0<r(j+2)<r(j+1),j=0,1,2,…,n-2且r(n+1)=0,那么(a,b)=rn,即最后一个非零余数
从定理中我们看到通过带余除法,在每一步中被除数和除数被更小的数代替,这些更小的数实际上是每一步中的除数和余数么运算直到余数为0时终止。这一系列的运算产生了一系列的等式,而最大公因子就是最后一个非零的余数
引理1:如果e和d是整数且e=dq+r,其中q,r是整数么那么(e,d)=(d,r)
所以得到gcd的模板
LL gcd(LL a,LL b)
{
If(b==0)return a;
Return gcd(b,a%b);
}
欧几里得算法是一种快速地求最大公因子的方法
接下来,当我们估算用欧几里得算法求两个整数的最大公因子时用到除法的最大步数时会看到这一点。但是,我们首先要证明的,对于一个给定的正整数n,存在整数a,b使得用欧几里得方法求(a,b)恰好需要n步除法。我们可以通过斐波那契序列中连续的项来求这样的整数。
用欧几里得算法求斐波那契序列中连续项的最大公因子的速度很慢,因为除了最后一步,其余的每一步的商都是1,例如(34,55)需用8次除法,且互质。
下面定理告诉我们用欧几里得算法求斐波那契序列中连续两项的最大公因子需要多少步除法.
定理2:令f(n+1)和f(n+2)(n>1)是斐波那契序列中连续两项。那么用欧几里得算法证明(f(n+1),f(n+2))一共需要n步。
欧几里得算法的计算复杂度:拉梅定理:用欧几里得算法计算两个正整数的最大公因子时,所需的除法次数不会超过整数中较小的那个十进制数的位数的5倍。(定理3)
推论:求两个正整数a,b。a>b的最大公因子需要O((log2a)^3)(log以2为底a的对数的立方)次的运算。
用线性组合的方法来表示最大公因子:
欧几里得算法可以得到用两个整数的线性组合来表示他们的最大公因子。
一般地吗,为了知晓如何使用a,b的线性组合来表示他们的最大公因子d=(a,b),我们就要涉及欧几里得算法中产生的一系列的等式。由倒数第二个等式我们有:
rn=(a,b)=r(n-2)-r(n-1)*q(n-1)
这就用r(n-2)和r(n-1)的线性组合表示了(a,b)。那么倒数第三部就将r(n-1)用r(n-3)-r(n-2)q(n-2)来表示。即
r(n-1)=r(n-3)-r(n-2)*q(n-2),
用这个等式来小区上面的表达式中的r(n-1),那么
(a,b)=r(n-2)-(r(n-3)-r(n-2)*q(n-2))*q(n-1)
=(1+q(n-1)*q(n-2))r(n-2)-q(n-1)*r(n-3)
这就将(a,b)表示成了r(n-2),r(n-3)的线性组合。我们继续沿着欧几里得算法相反的步骤将(a,b)表示成接下来的余数的线性组合,直到我们求的(a,b)表示成r0=a,r1=b的线性组合。对于特定的j,如果我们已经求的
(a,b)=s*rj+t*r(j-1)
那么,因为
rj=r(j-2)-r(j-1)*q(j-1)
我们有
(a,b)=s(r(j-2)-r(j-1)q(j-1))+tr(j-1)
=(t-sq(j-1))r(j-1)+sr(j-2)
这显示了如何沿着欧几里得算法产生的等式递进,最终使得a和b的最大公因子(a,b)可以表示成他们的线性组合。
这种将(a,b)表示成a,b线性组合的方法在计算上很不方便,因为它必须给出欧几里得算法的步骤,并且保存这些步骤,然后沿着欧几里得算法相反的步骤将(a,b)表示成一对相邻的余数的线性表示。有另一种计算(a,b)方法,只需要用一次欧几里得算法。
这个方法就是扩展欧几里得算法。
定理4:令a,b是正整数,那么
(a,b)=Sn*a+Tn*b
其中Sn,Tn是下面定义的递归序列的第n项
S0=1,T0=0,
S1=0,T1=1
且 Sj=S(j-2)-Q(j-1)S(j-1) Tj=T(j-2)-Q(j-1)T(j-1)
其中j=2,3,…,n,qj是欧几里得算法中每一步的商