定理指出素数是无限的。
a*b*c+1要么是素数要么其质因子就是素数。
扩展欧几里得:
扩展欧几里得算法是欧几里得(又叫辗转相除法)的扩展。已知整数a、b,扩展欧几里得算法可以在求得a、b的最大公约数的同时,能找到整数x、y(其中一个很可能是负数),使它们满足
如何求出第一组最小整数解:如果c % gcd(a,b)!=0 那么没有最小整数解。
x = x1 * c/gcd(a,b), y = y1 * c/gcd(a,b)
然后你要判断整数解的话, 也是简单, 如果(x,y)是一组解, (x + b/gcd(a,b), y - a/gcd(a,b))也是一组解
(x - b/gcd(a,b), y + a / gcd(a,b))也是一组解
我们可以先求出x是正整数的一组解, 用取模既可
x = (x % b/gcd(a,b) + b/gcd(a,b)) % b/gcd(a,b) //这里保证x >= 0
y = (c - ax) / b, 这样的x已经是最接近0的数,于是不能在减少了
所以
如果y < 0, 那么无正整数解
如果y > 0有正整数解.
扩展欧几里得还可以求逆元,ax+by=1.则最小正整数x是b模a的逆元。
#include <iostream>
using namespace std;
int x,y,q;
int exgcd(int a,int b)
{
if (b==0)
{
x=1;
y=0;
q=a;
return 0;
}
else
{
exgcd(b,a%b);
int t=x;
x=y;
y=t-a/b*y;
}
return 0;
}
int main()
{
int a,b;
while (~scanf("%d%d",&a,&b))
{
if (a<b)
{
a=a+b;
b=a-b;
a=a-b;
}
exgcd(a,b);
printf("%d = %d * %d + %d * %d\n",q,x,a,y,b);
}
}
用类似辗转相除法,求二元一次不定方程47x+30y=1的整数解。
- 47=30*1+17
- 30=17*1+13
- 17=13*1+4
- 13=4*3+1
然后把它们改写成“余数等于”的形式
- 17=47*1+30*(-1) //式1
- 13=30*1+17*(-1) //式2
- 4=17*1+13*(-1) //式3
- 1=13*1+4*(-3)
然后把它们“倒回去”
- 1=13*1+4*(-3) //应用式3
- 1=13*1+[17*1+13*(-1)]*(-3)
- 1=13*4+17*(-3) //应用式2
- 1=[30*1+17*(-1)]*4+17*(-3)
- 1=30*4+17*(-7) //应用式1
- 1=30*4+[47*1+30*(-1)]*(-7)
- 1=30*11+47*(-7)
得解x=-7, y=11。
计算
gcd(a, b).
若
gcd(a, b)
不能整除
n
,则方程无整数解;否则,在
方程的两边同除以
gcd(a, b)