扩展欧几里得与二元不定方程

news/2024/9/2 23:34:20

二元不定方程,就是形同ax+by=c的二元方程,
只不过有无数组解罢了。
还有原谅我蒟蒻,不会用字母的写法,只好直觉+小学数学写法了

我们可以使用辗转相除法来解决(过渡好生硬啊)

我们首先来看一组例子
为了方便理解,特将每个多项式系数都写了出来,同时并没有将符号带进括号

37x-107y=25

37x-(37*2+33)y=25
37(x-2y)-33y=25

(-33*-1+4)(x-2y)-33y=25
-33(-x+3y)+4(x-2y)=25

(4*-8-1)(-x+3y)+4(x-2y)=25
4(9x-26y)-1(-x+3y)=25 

(-1*4+0)(9x-26y)-(-x+3y)=25
-(-37x+107y)+0(9x-26y)=25

我们自下而上看
因为系数0的存在
那么9x-26y=0
我们又可以惊奇的发现
9x-26y正好在它上面式子中出现了。
考虑整体思想,将括号内的多项式(就是(x-+3y))(or单项式)看做一个整体,便可求得(-x+3y)的值(当做一次方程来做)
再如此处理,便可将x,y的一对特值找出来 

那怎么求出其他的特值捏?

对于一个减法,我们总可以用正号将一个减数变成加数

那么就变成了两个数和相等的情况(真啰嗦)

那么我们这一个整数d

ax+by=c=a(x+bd)+b(y+ad)=c

因为将括号开出来时就将bd 和 ad消去了,所以两数的和不会改变

所以(x+bd)与 (y-ad)也是一组特解

这样有条件枚举d便会找到想要的特解

在理解了如何利用辗转相除法来求解后,再来看程序实现

#include<iostream>
using namespace std;
void exgcd(long long a,long long b,long long &x,long long &y,long long r)
{
    if(b==0)//有了系数0,为什么0肯定在b上?请回看gcd
    {
        x=r/a; //最终结果有可能系数为非零整数
        y=0;//e.....
        return ;
    }
    exgcd(b,a%b,x,y,r);//辗转相除
    //因为这里是回溯,注意下面写下一层就是递归意义上的下一层。可能理解起来有些别扭,原谅我吧233.
    long long k=x;//暂时保留下一层的x,注意是自下而上计算的
    x=y;//可以参考例子,例子我觉得自己写的很公正(就是有些别扭)
    y=k-a/b*y;//k是下一层的x,下一层的x是这一层的x-这一层的x,y的系数的商*这一层的x+这一层的y(不乘任何数)(这里的y是变量,储存的是下一层的x),便得到了这一层的y。
    return ;
}
int main() 
{
    long long a,b,l;//ab为xy的系数,l为化成ax+by=c后的c
    cin>>a>>b>>l;
    long long x,y;
    exgcd(a,b,x,y,l); //扩展欧几里得是特殊的二元不等式
    cout<<x<<" "<<y;
}

扩欧只需要将ax+by=c中的c变为1即可

转载于:https://www.cnblogs.com/Lance1ot/p/8494383.html


http://www.niftyadmin.cn/n/735560.html

相关文章

Cpp進階:Vector 向量

Cpp 進階&#xff1a;Vector 向量 文章目錄Cpp 進階&#xff1a;Vector 向量簡介參考正文Overview 總覽Printer 輔助函數Declaration 變量聲明構造函數語法Access 訪問元素(查、改)訪問元素(查、改)相關語法Insert & Erase 增刪元素(增、刪)增刪元素(增、刪)相關語法Capaci…

毕设期间的杂记

流媒体 流媒体&#xff0c;又叫流式媒体&#xff0c;是边传边播的媒体&#xff0c;是多媒体的一种。边传边播是指媒体提供商在网络上传输媒体的“同时”&#xff0c;用户一边不断地接收并观看或收听被传输的媒体。“流”媒体的“流”指的是这种媒体的传输方式&#xff08;流的…

CSS样式总结

CSS相关概念1. CSS的定义Cascading Style Sheets 层叠样式表&#xff08;级联样式表&#xff09;2. CSS的作用定义网页外观&#xff0c;如字体、背景、颜色等3. CSS特点① 精确的定位 准确的控制页面的任何元素② 精细的控制 可以做到像素级别的调整③ 样式与内容的分离 便于维…

Cpp進階:Map 映射表

Cpp 進階&#xff1a;Map 映射表 文章目錄Cpp 進階&#xff1a;Map 映射表簡介參考正文重要類型元素操作map.insert 插入(增)map.find、map.lower_bound、map.upper_bound 查找(查)map.erase、map.clear 刪除元素(刪)迭代器其他方法結語簡介 上一篇&#xff1a;Cpp 進階&#…

[转] HTML5+规范:device(管理设备信息)

http://blog.csdn.net/qq_27626333/article/details/51815310 Device模块管理设备信息&#xff0c;用于获取手机设备的相关信息&#xff0c;如IMEI、IMSI、型号、厂商等。通过plus.device获取设备信息管理对象。 1、属性 1.1、imei: 设备的国际移动设备身份码&#xff0c;调用此…

进阶动态规划

(好几万年前的草稿箱里的存货了…还是先放出来吧…反正近期是不更了hhh) 5.数位统计dp 例题&#xff1a;计数问题 输入 1 10 44 497 346 542 1199 1748 1496 1403 1004 503 1714 190 1317 854 1976 494 1001 1960 0 0输出 1 2 1 1 1 1 1 1 1 1 85 185 185 185 190 96 96 96…

Cpp進階:String 字符串

Cpp 進階&#xff1a;String 字符串 文章目錄Cpp 進階&#xff1a;String 字符串簡介參考正文Overview 總覽Import 引入構造函數擷取單個字符或子串(查)修改字符串(增、刪、改)其他屬性結語簡介 原來 C 中使用字符串時&#xff0c;是一個以 \0 結尾的字符序列(char[])&#xf…

视觉SLAM十四讲 2-概述部分

蓝色 紫色 红色 SLAM&#xff1a;同时定位与地图构建 ”搭载特定传感器的主体&#xff0c;在没有环境先验信息的情况下&#xff0c;于运动过程中建立环境的模型&#xff0c;同时估计自己的运动“ 若传感器主要为相机&#xff0c;即为视觉SLAM。 两类传感器 安装在环境中的…