1欧几里得算法
欧几里德算法又被称为辗转相除法。我们可以进行数学证明
证明如下:
代码实现如下:
递归代码
int pr(int a, int b)
{
if (b == 0)
{
return a;
}
else
{
return pr(b, a%b);
}
}
非递归实现
int pr(int a, int b)
{
int r = a%b;
while (r)
{
a = b;
b = r;
r = a%b;
}
return b;
}
2.欧几里德算法的扩展
欧几里德算法的扩展定义如下:
代码实现如下:
int pr(int a, int b, int &x, int &y)
{
if (b == 0)
{
x = 1;
y = 0;
return a;
}
int r = pr(b, a%b, x, y);
int t = y;
y = x - a / b*y;
x = t;
}
可以自行推导一下,以具体例子来理解。
非递代码如下
int pr(int a, int b, int &x, int &y)
{
int x0 = 1, y0 = 0, x1 = 0, y1 = 1;
if (b == 0)
{
x = 1;
y = 0;
return a;
}
int r = a%b;
int q = a / b;
while (r)
{
x = x0 - q*x1;
y = y0 - q*y1;
x0 = x1;
y0 = y1;
x1 = x;
y1 = y;
a = b;
b = r;
r = a%b;
q = -a / b;
}
}
关于非递归的证明,可以查看https://www.cnblogs.com/zbhfz/p/11267438.html这一篇博客
使用了线性代数的内容。
3.欧几里德算法求逆元
代码如下
int pr(int m, int n, int &x, int &y)//x及为m关于模a的逆元,x是最小整数解
{
if (n == 0)
{
x = 1;
y = 0;
return m;
}
int r = pr(n, m%n, x, y);
int t = y;
y = x - m / n*y;
x = t;
return r;
}
void main()
{
int x = 0;
int y = 0;
int r=pr(11, 8, x, y);
int m = 7 / r;
cout << (x%m+m)%m << y << endl;
4.同余定理
给定一个正整数m,如果两个整数a和b满足a-b能够被m整除,即(a-b)/m得到一个整数,那么就称整数a与b对模m同余,记作a≡b(mod m)。对模m同余是整数的一个等价关系。