欧几里得:
欧几里得算法:
定理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的对数的立方)次