欧几里得及扩展算法
辗转相除法/欧几里得算法求两个数的最大公约数,gcd(m,n)=gcd(n,m%n)
这个算法的效率非常高,是对数级别的时间复杂度
当m>=2n时,m->n,规模至少变成了原来的1/2,当m<2n,虽然这次规模不会变成一半,但下次规模会变成一半,若仍不会变成一半,不难证明上次规模至少变成了2/3,整体还是指数级缩小
更加通俗的解释,m=qn+r,qn>m/2,否则m=2qn+R,所以r没有m的一半大,迭代两次必然规模缩小一半
int gcd(int m, int n)//m>=n { 	int r; 	while (n) 	{ 		r = m % n; 		m = n; 		n = r; 	} 	return m; }
扩展欧几里得算法将分解过程逆向写出得到mx+ny=c的一组解,注意这个解不是惟一的,c是gcd(m,n)
依据:
mx1+ny1=c
nx2+(m%n)y2=c
m%n=m-m//n * n
恒等式x1=y2,y1=x2-m//n * y2
迭代到最后解为1,0,所以只需一直往前推
void anti_gcd(int m, int n,int c,int* x,int* y)//(a > b)
{
	*x = 1, * y = 0;
	int temp;
	while ((*x) * m + (*y) * n != c)
	{
		temp = *x;
		*x = *y;
		*y = temp - (m / n) * (*y);
	}
	return;
}
得到一组解如何得到其他更多的解
不妨先设gcd(m,n)=1
x1,y1是已知解,x2,y2是待求解
mx1+ny1=1
mx2+ny2=1
=>
mx1y2+ny1y2=y2
mx2y1+ny1y2=y1
=>
m(x1y2-x2y1)=y2-y1
同理 n(y1x2-y2x1)=x2-x1
可解出x2,y2

                
            
        
浙公网安备 33010602011771号