C++ 二元一次不定方程巧妙求解——运用扩展欧几里得算法
前言
在关于数论的学习中,求解二元一次不定方程是很重要的,在学习求解二元一次不定方程之前,要先了解欧几里得算法和扩展欧几里得算法。
关于数论的学习
欧几里得算法
欧几里得算法就是辗转相除法,欧几里得算法中 ( x , y ) 的最大公约数与 ( y , x mod y ) 的最大公约数相同。
证明:设 y = k*x+b ,则 b = y % x
设 d 是 ( x ,y ) 的公约数
则 d 能整除 x 和 y ,因为 b = y - k*x = a1*d - k*a2*d = d*( a1-k*a2 )
所以 d 也能整除 b
所以 ( x , y ) 的最大公约数与 ( y , x%y ) 的最大公因数相同
扩展欧几里得算法
对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然
存在两个整数 x,y ,使得 gcd(a,b)=a*x+b*y。
1. 当 b = 0时, x = 1 , y = 0
2.a>b>0时
证明:a*x+b*y = gcd( a,b)
有欧几里得算法可知
b*x1+( a % b )*y1 = gcd( b , a%b )
则a*x1+ b*y1= b*x2+ (a mod b)*y2;
所以a*x1+ b*y1= b*x2+ (a - [a / b] * b)*y2=a*y2+ b*x2- [a / b] * b*y2;
(a-[a/b]*b即为mod运算。[a/b]代表取小于等于a/b的最大整数)
也就是a*x1+ b*y1 == a*y2+ b*(x2- [a / b] *y2);
所以x1=y2
y1=x2- [a / b] *y2
关于求解 a*x+b*y=c的二元一次不定式
根据上面的扩展欧几里得算法可知,若要让 a*x+b*y=c成立,则 c 必须是 gcd( a , b ) 的倍数,否则会没有整数解,那么由于a*x1+b*y1=gcd( a , b ),所以 x 一定是 x1 的(c / gcd( a , b ))倍,y 一定是 y1 的(c / gcd( a , b ))倍。(刚读可能很难理解,多读几遍就会明白)所以 x = x1*(c / gcd( a , b )), y = y1*(c / gcd( a , b ))
这只是一组特解,我们可以通过它,求出通解
而其他通解一定满足
x0 = x + b / gcd( a , b ) * t
y0 = y - a / gcd( a , b ) * t
其中 t 为任意数
代码
结合代码理解
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;int a , b , c , T ;int ex( int a , int b , int &x , int &y )
{if( b == 0 ){x = 1 ;y = 0 ;return a; }else{int u = ex( b , a % b , y , x );y -= x *( a/b );return u ;}
}int main()
{scanf("%d", &T );for(int h = 1 ; h <= T ; ++ h ){scanf("%d%d%d", &a , &b ,&c );int x = 0 ,y = 0 ;int p = ex( a, b , x , y );//求最小公约数和满足 a*x+b*y=gcd(a,b) 的 x 和 yx = x * ( c / p );y = y * ( c / p );cout<<x << " "<< y <<endl; //这里只输出特解/*通解for(int i = -10000 ; i <= 100000 ; ++ i ) {y0 = y - a/p*i;x0 = x + b/p*i;}*/}
}
C++ 二元一次不定方程巧妙求解——运用扩展欧几里得算法相关推荐
- 二元一次不定方程的整数解(扩展欧几里得算法)
二元一次不定方程的整数解(扩展欧几里得算法) (不得不说这是一堂数学*信竞课) 整数解解法 c(mod b)或ax+by=c有整数解当且仅当(a,b)|c 一般意义下的解法: 欧拉函数 扩展欧几里得算 ...
- 欧几里得扩展欧几里得算法及相关的数学证明
//欧几里得算法求最大公约数 int gcd(int m,int n) {int u0=m,u1=n,t;if( u0<u1 )// 保证u0>=u1u0^=u1,u1^=u0,u0^=u ...
- 如何求解二元一次不定方程的整数解
这里讨论的二元一次不定方程专指ax+by=c(a*b≠0,a,b,c∈Z)-----① 定理一: 方程①有整数解的充分必要条件是(a,b)|c((a,b)即Gcd(a,b),下同) 定理二(裴蜀定理) ...
- 二元一次不定方程的快速解法
二元一次不定方程(形如 a * x + b * y = c的方程,又叫丢番图方程,下简称不定方程),是初等数论经典的研究对象.二元一次不定方程应用广泛,如经典的找换问题和装箱问题(下面我将通过一系列的 ...
- 二元一次不定方程的解法
二元一次不定方程的解法 时间:2008-12-17 14:47 点击: 147次 我们知道,如果未知数的个数多于方程的个数,那么,一般来说,它的解往往是不确定的,例如方程 x-2y=3, 方程组 等, ...
- 初等数论--同余方程--二元一次不定方程的通解形式
初等数论--同余方程--二元一次不定方程的通解形式 博主是初学初等数论(整除+同余+原根),本意是想整理一些较难理解的定理.算法,加深记忆也方便日后查找:如果有错,欢迎指正. 我整理成一个系列:初等数 ...
- c语言不定方程的二元一次,poj1061 - 同余方程,二元一次不定方程
以前不会解二元一次不定方程的时候不会做,现在会做了. #include #include using namespace std; typedef __int64 int64; void solveT ...
- 二元一次不定方程的整数解
先来看看一个典型的二元一次不定方程: a x + b y − c = 0 a , b , c ∈ z x , y ∈ z ax+by-c=0\\ a,b,c\in\mathbb{z}\\x,y\in\ ...
- c语言 不定方程问题程序,[原创]钱币问题解答(二元一次不定方程正整数解浅析)...
[原创]钱币问题解答(二元一次不定方程正整数解浅析) 可能很多朋友对不定方程的解法都有一定的了解,我这里只针对钱币问题对一类简单的二元一次不定方程正整数解 做些简单说明,希望会对大家有用. (严谨的数 ...
最新文章
- 几张图看懂列式存储(转)
- SK电讯进军中国网游的四种原因
- 一个成熟的网站模板如何引起用户的注意?
- Codeforces Round #618 (Div. 2)-B. Assigning to Classes
- 【今日CS 视觉论文速览】Fri, 21 Dec 2018
- 二叉树层序遍历递归与非递归_二叉树的遍历「递归、非递归」以及自己的感受
- 吴恩达《深度学习》 学习笔记1
- thinkphp在nginx下pathinfo支持
- Linux下的find指令分析 , atime, ctime, mtime
- python for循环练习
- 2021世界量子计算机排名,2021 QS世界大学学科排名如期出炉啦!
- python 实现接口上传图片
- 四种方法解决微信小程序设置背景图片,哪种最好?
- 怎样设置html设置透视,用css实现透视效果
- 计算机组成原理mgk换算,计算机组成原理十套卷(本科)计算题及答案
- react 使用dom-to-image 将html转为图片并保存
- unity中Animator controller无法给动作添加motion的问题
- !=EOF的含义和原理
- 机器性能测试与显卡价格报表
- MockMvc案例实战调用Controller层API接⼝
热门文章
- C#面试经历分享(好好看,好好学)
- 第二部分 s3c2440 移植linux内核 添加网卡支持 yaffs2文件系统支持
- 解决D-LINK DI 504路由器上网掉线问题
- 删除链表重复节点 python_Word里面如何删除空白页?删除Word空白页的六种方法
- 通达信指标函数说明大全(2014)(转)
- MuMu模拟器开发者文档
- git不显示贡献度的解决方案
- 利用python,20行代码即可实现照片墙,还可以生成爱心形状哟
- 消金主流市场外的灰色地带:vivo应用商店聚集大量“伪现金贷平台”
- 双目是个词吗_描写眼睛的词语3个字