这里讨论的二元一次不定方程专指ax+by=c(a*b≠0,a,b,c∈Z)-----①
定理一:
方程①有整数解的充分必要条件是(a,b)|c((a,b)即Gcd(a,b),下同)
定理二(裴蜀定理)
设(a,b)=1,则方程①的全部整数解可表为:
x=x0+bt,y=y0-at(x0,y0是方程的一组整数解,t为任意整数)
也可以表述为:
方程①的全部整数解可表为:
x=x0+bt/(a,b),y=y0-at/(a,b)(x0,y0是方程的一组整数解,t为任意整数)

我以前的一个想法是求出(a,b)并判断是否(a,b)|c,然后约简a,b,c(都除以(a,b)),这样(a,b)=1,如果方程①有整数解的话,根据定理二,在一个长度为|b|的整数范围内必存在一个x的解,在一个长度为|a|的整数范围内必存在一个y的解。那么在x的[0,|b|-1]或者y的[0,|a|-1]上试解吧,找到x0可以求出y0,找到y0可以求出x0。为了减少搜索次数,我们先比较|a|和|b|,如果|a|≤|b|就在y上试解,反之则在x上试解。我用这种办法ac了sgu106和poj1061,但是这种办法的代价并非是最低的,因为有一个著名的欧几里德扩展算法。
这个算法源自于求gcd的欧几里德算法,二者的算法复杂度基本上是一样的。
回忆一下欧几里德算法:
有两个数a,b,我们把它们写成u0和u1,求gcd的步骤如下:
u0=q0*u1+u2
u1=q1*u2+u3
u2=q2*u3+u4
...
uj=qj*u(j+1)
u(j+1)便是a和b的最大公约数。
要求出一组整数解,可以先求出ax+by=(a,b)的一组解x0,y0,然后x0=x0*c/(a,b),y0=x0*c/(a,b).
同样地,把a和b写成u0和u1,设ui=u0*xi+u1*yi(必然存在这样的xi和yi,因为uj是gcd(u0,u1)的倍数),
那么x0=1,y0=0,x1=0,y1=1;
u(i+1)=u(i-1)-q(i-1)*ui=u0*x(i-1)+u1*y(i-1)-q(i-1)*u0*x(i)-q(i-1)*u1*y(i)=u0*(x(i-1)-q(i-1)*x(i))+u1*(y(i-1)-q(i-1)*y(i)),而u(i+1)=u0*x(i+1)+u1*y(i+1),因此
x(i+1)=x(i-1)-q(i-1)*x(i)
y(i+1)=y(i-1)-q(i-1)*y(i)
伟大的递推式!
我们要求的是xj和yj(uj=u0*xj+u1*yj,uj为gcd),所以只要递推到xj和yj即可。
以下程序演示了欧几里德扩展算法:
#include<stdio.h>
int Ext_Gcd(int a,int b,int &x,int &y) //返回的Gcd带符号
{
int q,tmp,x0=0,x1=1,y0=1,y1=0;
while(a)
{
q=b/a;
tmp=a;
a=b%a;
b=tmp;
tmp=x1;
x1=x0-q*x1;
x0=tmp;
tmp=y1;
y1=y0-q*y1;
y0=tmp;
}
x=x0;
y=y0;
return b;
}
int main()
{
int a,b,c,x,y,gcd;
printf("*****欧几里德扩展算法演示程序*****/n/n");
for(;;)
{
printf("请输入方程的参量:/n");
scanf("%d %d %d",&a,&b,&c);
gcd=Ext_Gcd(a,b,x,y);
if (c%gcd) {printf("该方程无解。/n");continue;}
c/=gcd;
printf("a,b的公约数为:%d。/n方程的标准解为:%d %d/n/n",gcd,x*c,y*c);
}
}

如何求解二元一次不定方程的整数解相关推荐

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

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

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

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

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

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

  4. C++ 二元一次不定方程巧妙求解——运用扩展欧几里得算法

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

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

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

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

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

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

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

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

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

  9. P5656 【模板】二元一次不定方程(exgcd)

    题目传送门 题意: 给定不定方程ax+by=c. 若该方程无整数解,输出 -1 若该方程有整数解,且有正整数解,则输出其正整数解的数量,所有正整数解中 x 的最小值,所有正整数解中 y 的最小值,所有 ...

最新文章

  1. python监听udp端口_python检测远程udp端口是否打开
  2. eclipse代码补全
  3. MAC启动redis的目录
  4. Command Magicks:如何使用控制台处理文件和字符串
  5. python class用法理解_Python小世界:彻底搞懂Python一切皆对象!
  6. 3.深度学习的实用层面
  7. 软件需求和结构_软件工程复习 3640组考题
  8. 深入理解 flex 布局以及计算_Flexbox, Layout
  9. 怎么建立局域网_用ZeroTier搭建属于自己的虚拟局域网(VLAN)
  10. Permission is only granted to system apps解决方法
  11. 洛谷P1867 【Mc生存】经验值
  12. 佛祖保佑 永无shell
  13. Windows Server 2008R2 取消屏幕自动锁定
  14. 日期转换(正推与倒推)
  15. 2011 Asia Beijing Regional Online Contest-1004 hdu4043 FXTZ II
  16. 重磅干货不容错过!2017云栖大会汇总资料,速来领取!
  17. Android平台证件识别系统
  18. 查看安装的tensorflow是哪个版本,查看Tensorflow是GPU还是CPU
  19. 手把手教Apereo CAS5.2.3 注册后自动登录
  20. Java常见面试题(八股文)汇总

热门文章

  1. Jekyll 教程——安装
  2. 推荐一本书:《Visual C++程序开发范例宝典》——你可以找到你想要的实例
  3. 法官的假发是用来吓人的?
  4. [HCIP]MPLS解决路由黑洞
  5. 苹果se2_太快了!苹果已面向iPhone SE 2用户推送iOS 13.4.1
  6. 【Python零基础到入门】Python基础语法篇——基本数据类型【文末送书】
  7. 二叉树、B树、B+树、红黑树 的 本质区别以及各个应用场景
  8. 算法基础部分-二叉树
  9. 安卓开发中的重力感应传感器
  10. [python之数据分析] 基础篇1- Numpy,Scipy,Matplotlib 快速入门攻略