欧几里得算法

欧几里得算法:

  算法:\(\gcd(a,b) = \gcd(b,a \mod b)\)
  证明如下:
    令 \(r= a\mod b\),设 \(d\)\(a,b\) 的一个公约数。
    可得:\(r = a - bk\)\(a = dx\)\(b = dy\)
    继而推出:\(r = dx - kdy = d(x - ky)\)
    因此,\(d\)\(r\) 的一个因数,得证。

int gcd(int a,int b){
	if(b == 0){
		return a;
	}
	return gcd(b,a % b);
}

扩展欧几里得算法:

  功能:可以在知道 \(a,b\) 的情况下求解 \(ax+by=\gcd(a,b)\) 的一组 \(x,y\) 的解。
  证明如下:
    已知有方程 \(ax_0+by_0=\gcd(a,b)\),由欧几里得算法可得,存在\(bx_1 + (a \mod b)y_1=\gcd(b,a \mod b)\)
    由欧几里得算法得\(ax_0+by_0=bx_1+(a - kb)y_1\)
    移项,得:\(ax_0+by_0=ay_1 + b(x_1-ky_1)\)
    易得:\(\begin{cases}x_0=y_1\\y_0=x_1-ky_1\\k=a/b \end{cases}\)

int x,y;
void ex_gcd(int a,int b){
	if(b == 0){
		x = 1;
		y = 0;
		return;
	}
	ex_gcd(b,a % b);
	int t = x;
	x = y;
	y = t - (a/b)*y;
}

应用:

  • 判断不定方程 \(ax+by=c\) 是否有解:
    有解的条件:\(c \mod \gcd(a,b)= 0\)
  • 得出不定方程的通解:
    \(\begin{cases}x=x_0+b/\gcd(a,b)\\y=y_0-a/\gcd(a,b)\end{cases}\)
  • 模线性方程 \(a\times x\equiv b(\mod n)\) 的解
    由方程可得:\((a \times x - b)\mod n = 0\)
    于是设出方程 \(a \times x - n \times y = b\)
      由第二条即可解出
posted @ 2022-07-19 14:03  腾云今天首飞了吗  阅读(191)  评论(0编辑  收藏  举报