解二元一次方程————拓展欧几里得算法
二元一次方程的定义:
含有两个未知数,并且含有未知数的项的次数都是1的整式方程叫做二元一次方程。所有二元一次方程都可化为ax+by+c=0(a、b≠0)的一般式与ax+by=c(a、b≠0)的标准式,否则不为二元一次方程。
适合一个二元一次方程的每一对未知数的值,叫做这个二元一次方程的一个解。每个二元一次方程都有无数对方程的解,由二元一次方程组成的二元一次方程组才可能有唯一解,二元一次方程组常用加减消元法或代入消元法转换为一元一次方程进行求解。
解二元一次方程:
众所周知,解一个单一的二元一次方程是十分困难的,只能用一种简单的方法————枚举(暴力出奇迹)。可是这是不可能,因为我们的时间复杂度是爆炸的,所以我们需要一种时间复杂度低的算法来解决这种困难。
那么是时候引申出此博客的主角了——拓展欧几里得算法。可是在提出此前,我们需要掌握一个简单数学知识(最大公因数与最小公倍数)。
最大公因数与最小公倍数:
具体我就不解释了,自己百度一下,而我们主要讲的就是它们的求法,我在这里只讲一种——欧几里得算法(辗转相除法)。顾名思义,这是与欧几里得有关的。这是求两个自然数之间的最大公因数。
为什么?我们先提出一个定理(两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数)。
证法如下:
a可以表示成a = kb + r(a,b,k,r皆为正整数,且r<b),则r = a mod b。
假设d是a,b的一个公约数,记作d|a,d|b,即a和b都可以被d整除。
而r = a - kb,两边同时除以d,r/d=a/d-kb/d=m,由等式右边可知m为整数,因此d|r。
因此d也是b,a mod b的公约数。
假设d是b,a mod b的公约数, 则d|b,d| (a-k*b),k是一个整数。
进而d|a.因此d也是a,b的公约数。
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。
好了,现在我们亮出代码吧:
int gcd(int a,int b)//a,b为两个数。
{if(!b)return a;else{int r=gcd(b,a%b);return r;}
}
那么回归正题,如何用这个东西来求出解。
拓展欧几里得算法:
顾名思义,这是欧几里得算法的升级法。
可是这与二元一次方程有什么关系呢?
这是学长的解释:
这是解释,可我们该如何用代码实现呢?
毕竟是拓展,还是有一点的相似,所以我们的代码大致不变,只需要引入两个变量来表示解,根据学长所说的,我们只需要在最后将x置为1,y为0就可以了。其实还有一步,在辗转相除时,y - = ( a / b ) * x,至于为什么,我就不解释了。
下面是代码:
int exgcd(int a,int b,int &x,int &y)
{if(!b){x=1;y=0;return a;}else{ll r=exgcd(b,a%b,y,x);y-=(a/b)*x;return r;}
}
当然这只能在c(方程的常数)能被(a,b)整除时才有效,不然就没有整数解。
在最后别忘了将倍数乘回x,y(方程的解)。
当然这只能求出一组解,至于如何用特解求出普遍解,请听学长解释:
而我就不在这里写代码了,请读者自行实现。
其它数论博客:
C++初等数论同余——欧拉函数与CRT
C++基础数论————排列组合
解二元一次方程————拓展欧几里得算法相关推荐
- 【原创】更相减损术 stein算法 欧几里得算法 拓展欧几里得算法 扩展欧几里得算法 逆元的计算与筛法 解模线性方程
欧几里得 说在前面 数论学复习 Part 6. 然后再来一章CRT和组合数,就飞往概率,以此为跳板去向DP. 计划很美啊你. P.S. 这么说来拉格朗日插值可以说是数论学复习的Part 0了啊. 有一 ...
- matlab中欠定方程组超定方程组_七年级下册第10章:解二元一次方程组(12课时)...
潍坊初中数学 教师简介 马晓菲,奎文区德润学校教师,奎文区初中数学学科带头人,奎文区立德树人标兵. 微课简介 本课为七年级下册第十章<一次方程组>第二节第1课时,需要学习者掌握一元一次方程 ...
- 二元一次方程有唯一解的条件_人教版初中数学七年级下册用适当方法解二元一次方程组公开课优质课课件教案视频...
解二元一次方程组---加减法 一.教学目的: 1.使学生掌握用加减法解二元一次方程组的步骤. 2.熟练运用加减法解二元一次方程组. 3.培养学生分析问题.解决问题的能力. 二.教学重点.难点和关键 ( ...
- 方程组的直接解法和迭代法 python_基于任务驱动的翻转课堂线上教学 ——以《解二元一次方程组复习课》为例...
基于任务驱动的翻转课堂线上教学 --以<解二元一次方程组复习课>为例 1 线上教学案例设计前的思考 疫情期间,一家长群对一元一次方程和二元一次方程组进行了讨价还价,认为学个知识点还收起费来 ...
- 解二元一次方程组 含MOD26
解二元一次方程组 含MOD26计算 仿射密码的解密,频率法 C→E,K→T 解方程组 4a+b=2 19a+b=10 代码有参考 #include <iostream> #include ...
- 欧几里得算法和拓展欧几里得算法
一.欧几里得算法(辗转相除法): 结论:gcd(a,b)=gcd(b,a%b). 证明:假设a,b的最大公约数为r,a=k1r,b=k2r(k1>k2). 则a%b=k1r-nk2r=(k1-n ...
- 算法提高 解二元一次方程组(java)
算法提高 解二元一次方程组 描述 给定一个二元一次方程组,形如: a * x + b * y = c; d * x + e * y = f; x,y代表未知数,a, b, c, d, e, f为参数. ...
- js 解二元一次方程组(消元法)
解二元一次方程,首先想到的就是消元法 确定好消元法,就按照消元法制定算法 二元一次方程 结构为 ax + by = c kx + fy = s x和y为变量,a.b.c.k.f.s.为常量 1.确定常 ...
- php中求解二元一次方程,基于Algebra.js解二元一次方程的实例教程
这篇文章主要介绍了基于代数方程库Algebra.js解二元一次方程功能,结合具体实例形式分析了方程库Algebra.js计算方程的具体使用技巧,需要的朋友可以参考下 本文实例讲述了基于代数方程库Alg ...
- python用sympy解二元一次方程等数学运算
仅作为记录,大佬请跳过. #导入sympy from sympy import *#定义变量 x = Symbol('x') y = Symbol('y') # print(solve([x + 1 ...
最新文章
- python键_在Python中创建键命令
- redis完整笔记总结-数据类型-事务与锁-集群-分布式锁-常见问题(缓存穿透、击穿、雪崩)
- 正在进行时 Order 1
- printf 地址_C程序显示主机名和IP地址
- Redis持久化的几种方式——深入解析RDB
- 编码原理(附一)--算术编码
- linux下时间编程,Linux下的时间操作编程
- jquery ajax实例 php,jquery中各个ajax实例操作
- java中的异常和处理
- pandas 调用mysql函数_pandas的连接函数concat()函数的具体使用方法
- c语言int函数使用方法,int函数的使用方法_Excel中int函数的操作用法
- php 网络留言系统总结心的,留言板_感谢您的留言_代潇瑞博客-专注于PHP学习,PHP源码分享...
- 令人啼笑皆非的不靠谱产品是如何诞生的?
- windows 7家庭版升级为旗舰版 序列
- 780. 到达终点 (Reaching Points)
- 微信公众号-JS接口安全域名-配置域名保存失败
- Gitlab集成Sonarqube实现自动检测代码并发送报告给提交者
- Response to preflight request do‘nt access control check: Redirect is not allow for a preflight re.
- Java进程CPU使用率高排查
- matlab归一化方法,数据归一化的基本方法