前言

在关于数论的学习中,求解二元一次不定方程是很重要的,在学习求解二元一次不定方程之前,要先了解欧几里得算法和扩展欧几里得算法。

关于数论的学习


欧几里得算法

欧几里得算法就是辗转相除法,欧几里得算法中 ( 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++ 二元一次不定方程巧妙求解——运用扩展欧几里得算法相关推荐

  1. 二元一次不定方程的整数解(扩展欧几里得算法)

    二元一次不定方程的整数解(扩展欧几里得算法) (不得不说这是一堂数学*信竞课) 整数解解法 c(mod b)或ax+by=c有整数解当且仅当(a,b)|c 一般意义下的解法: 欧拉函数 扩展欧几里得算 ...

  2. 欧几里得扩展欧几里得算法及相关的数学证明

    //欧几里得算法求最大公约数 int gcd(int m,int n) {int u0=m,u1=n,t;if( u0<u1 )// 保证u0>=u1u0^=u1,u1^=u0,u0^=u ...

  3. 如何求解二元一次不定方程的整数解

    这里讨论的二元一次不定方程专指ax+by=c(a*b≠0,a,b,c∈Z)-----① 定理一: 方程①有整数解的充分必要条件是(a,b)|c((a,b)即Gcd(a,b),下同) 定理二(裴蜀定理) ...

  4. 二元一次不定方程的快速解法

    二元一次不定方程(形如 a * x + b * y = c的方程,又叫丢番图方程,下简称不定方程),是初等数论经典的研究对象.二元一次不定方程应用广泛,如经典的找换问题和装箱问题(下面我将通过一系列的 ...

  5. 二元一次不定方程的解法

    二元一次不定方程的解法 时间:2008-12-17 14:47 点击: 147次 我们知道,如果未知数的个数多于方程的个数,那么,一般来说,它的解往往是不确定的,例如方程 x-2y=3, 方程组 等, ...

  6. 初等数论--同余方程--二元一次不定方程的通解形式

    初等数论--同余方程--二元一次不定方程的通解形式 博主是初学初等数论(整除+同余+原根),本意是想整理一些较难理解的定理.算法,加深记忆也方便日后查找:如果有错,欢迎指正. 我整理成一个系列:初等数 ...

  7. c语言不定方程的二元一次,poj1061 - 同余方程,二元一次不定方程

    以前不会解二元一次不定方程的时候不会做,现在会做了. #include #include using namespace std; typedef __int64 int64; void solveT ...

  8. 二元一次不定方程的整数解

    先来看看一个典型的二元一次不定方程: 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\ ...

  9. c语言 不定方程问题程序,[原创]钱币问题解答(二元一次不定方程正整数解浅析)...

    [原创]钱币问题解答(二元一次不定方程正整数解浅析) 可能很多朋友对不定方程的解法都有一定的了解,我这里只针对钱币问题对一类简单的二元一次不定方程正整数解 做些简单说明,希望会对大家有用. (严谨的数 ...

最新文章

  1. 几张图看懂列式存储(转)
  2. SK电讯进军中国网游的四种原因
  3. 一个成熟的网站模板如何引起用户的注意?
  4. Codeforces Round #618 (Div. 2)-B. Assigning to Classes
  5. 【今日CS 视觉论文速览】Fri, 21 Dec 2018
  6. 二叉树层序遍历递归与非递归_二叉树的遍历「递归、非递归」以及自己的感受
  7. 吴恩达《深度学习》 学习笔记1
  8. thinkphp在nginx下pathinfo支持
  9. Linux下的find指令分析 , atime, ctime, mtime
  10. python for循环练习
  11. 2021世界量子计算机排名,2021 QS世界大学学科排名如期出炉啦!
  12. python 实现接口上传图片
  13. 四种方法解决微信小程序设置背景图片,哪种最好?
  14. 怎样设置html设置透视,用css实现透视效果
  15. 计算机组成原理mgk换算,计算机组成原理十套卷(本科)计算题及答案
  16. react 使用dom-to-image 将html转为图片并保存
  17. unity中Animator controller无法给动作添加motion的问题
  18. !=EOF的含义和原理
  19. 机器性能测试与显卡价格报表
  20. MockMvc案例实战调用Controller层API接⼝

热门文章

  1. C#面试经历分享(好好看,好好学)
  2. 第二部分 s3c2440 移植linux内核 添加网卡支持 yaffs2文件系统支持
  3. 解决D-LINK DI 504路由器上网掉线问题
  4. 删除链表重复节点 python_Word里面如何删除空白页?删除Word空白页的六种方法
  5. 通达信指标函数说明大全(2014)(转)
  6. MuMu模拟器开发者文档
  7. git不显示贡献度的解决方案
  8. 利用python,20行代码即可实现照片墙,还可以生成爱心形状哟
  9. 消金主流市场外的灰色地带:vivo应用商店聚集大量“伪现金贷平台”
  10. 双目是个词吗_描写眼睛的词语3个字