欧几里得定理与扩展欧几里得

3,欧几里德定理:(射影定理)
定理指出素数是无限的。

a*b*c+1要么是素数要么其质因子就是素数。


扩展欧几里得:

扩展欧几里得算法是欧几里得(又叫辗转相除法)的扩展。已知整数a、b,扩展欧几里得算法可以在求得a、b的最大公约数的同时,能找到整数x、y(其中一个很可能是负数),使它们满足ax + by = \gcd(a, b).

如何求出第一组最小整数解:如果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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值