欧几里得—欧几里得拓展—线性同余方程

欧几里得算法:辗转相除法,用于求两个数的最大公约数

裴属定理:ax+by=gcd(a , b)  即如果a、b是整数,那么一定存在整数x、y使得ax+by=gcd(a,b)。

扩展欧几里得用途:

判断方程ax+by=m是否有解(如果ax+by=m有解,那么m一定是gcd(a,b)的若干倍);

求ax+by=m的任意一组解、通解、最小整数解;

线性同余方程是最基本的同余方程,形如  ax\equiv c(mod\:b)(等价于ax+by=c)的未知数是 x 的同余式

#include<iostream>
using namespace std;
//拓展欧几里得算法
int extend_gcd(int a, int b, int& x, int& y)
{
	if (b == 0)
	{
		x = 1;
		y = 0;
		return a;
	}
	else
	{
		int temp = extend_gcd(b, a % b, x, y);
		int t = y;
		y = x - (a / b) * y;
		x = t;
		return temp;
	}
}
int main()
{
	int a, b;
	int x, y;
	int c;
	cin >> a >> b;
	int g = extend_gcd(a, b, x, y);
	cout << "最大公约数是:" << g << endl;
	cout << "请输入c的值:";
	cin >> c;


    //求x,y其中的一个的解
	if (c % g == 0)
		cout << "有解";
	cout << "x:" << x << endl << "y:" << y << endl;


    //求ax+by=gcd(x,y)的最小正整数解
    //a 和 b 互素(即 gcd(a,b)=1)
	x += b / g;
	y -= a / g;
	cout << "最小x正整数解(=gcd(a,b),与c无关)" << endl << "x:" << x%(b/g) << endl << "y:" << y%(x/g) << endl;


    //求同余式的解
	if (c % g != 0)
		cout << "同余式无解";
	else
	{
		cout << "同余式" << endl;
		x *= c / g;
		for (int i = 0; i < g; i++)
			cout << (x + b / g * i) % b << endl;
	}
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值