数论基础(1)扩展欧几里得定理
一、引言
扩欧在朴素欧几里得定理中扩展得到,主要用于解决什么问题?
1.求两个数的最大公约数(朴素欧也可以解决这个问题)
2.ax+by=gcd(a,b),求解这个线性不定方程的一组特解。
(补充:贝祖定理:裴蜀定理(或贝祖定理)得名于法国数学家艾蒂安·裴蜀,说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立。
它的一个重要推论是:a,b互质的充分必要条件是存在整数x,y使ax+by=1.)
二、关于exgcd的理解
1.代码递归的理解
2.细节的理解
注意ax+by=gcd(a,b)中,a、b要大于0
b如果小于0也这样处理,即,不管a,b符号符合,最后都变成
|a|x+|b|y=gcd(|a|,|b|)
三、代码
void exgcd(int a,int b,int &g,int &x,int &y)
{if(!b){g=b; x=1; y=0;}else{exgcd(b,a%b,g,y,x); y-=x*(a/b);}
}
四、求解模线性方程
ax≡c (mod b)
充要条件:
ax-by=c
于是我们就发现是线性不定方程的形式啦,就可以用扩欧求解
下面还会讲逆元,也是这个思想!
五、例题
青蛙的约会
AC:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define ll long long
#define INF 0x3f3f3f3f
#define EPS 1E-10using namespace std;ll x,y,m,n,L;
void gcd(ll a,ll b,ll &d,ll &x,ll &y)
{if(b==0){d=a; x=1; y=0;}else{gcd(b,a%b,d,y,x); y-=x*(a/b);}
}
void solve()
{ll t,s;ll g;if(n<m){swap(n,m);swap(x,y);}gcd(n-m,L,g,t,s);if((x-y)%g!=0){printf("Impossible\n");return ;}t*=(x-y)/g;ll tmp=(L/g);cout<<(t%tmp+tmp)%tmp<<endl; return ;
}
int main()
{cin>>x>>y>>m>>n>>L;solve();return 0;
}
数论基础(1)扩展欧几里得定理相关推荐
- 专题·扩展欧几里得定理【including 求解二元一次方程,线性同余方程
初见安~这里是基础数论专题(3)~[详见数论专栏] p.s:本文章假设你已经掌握了欧几里得算法--辗转相除法求最大公约数(gcd) 一.二元一次方程 形如的含有两个未知数且最高次数为1的方程我们称之为 ...
- 欧几里得定理与扩展欧几里得定理
欧几里的定理(辗转相除法): gcd(a,b) = gcd(b,a%b) gcd(a,b)表示a,b的最大公约数 证明: 设 a > b c = a%b a = k * b + c (k为某个整 ...
- 数学基础知识(扩展欧几里得定理)
一.欧几里得定理(辗转相除法) 性质:如果 i 能整除a,也能整除b,则 i 能整除a+b,也能整除ax+by(x,y为整数),同时a mod b = a-(a/b)*b 用以上的性质我们知道如果一个 ...
- 扩展欧几里得定理求ax + by = c 的通解
扩展欧几里得定理求ax + by = c 的通解: 前置条件: ax + by = c , gcd(a, b) = d 计算: a d \frac{a}{d} dax + b d \frac{b}{ ...
- 扩展欧几里得定理详解和运用(就不信你看不懂!)
1 :扩展欧几里得内容: 扩展欧几里德算法是用来在已知a, b求解一组x,y使得ax+by =c.(若 c%gcd(a,b)!=0)则无解 所以 我们求ax+by=c是不是可以转化为求 ax+by=k ...
- 扩展欧几里得定理的证明和代码
1.欧几里得算法,gcd(a,b)为a b(a>b)的最大公约数,则gcd(a,b) = acd(b, a%b) 利用这个定理我们可以反复对ab模下去求得a和b的最大公约数 代码如下 int G ...
- 浅谈扩展欧几里得定理(附裴蜀定理)
关于扩展欧几里得定理 众所周知,扩展欧几里得定理是用来求形如(a,b,c皆为整数)这样的方程的一组解[注,仅是一组解]的定理 它的原理比较复杂,本人学了挺久才懂了一点,这里就不谈了,扩欧的核心是它的思 ...
- 【数论初步学习】扩展欧几里得定理
本章节不以理解算法为目的,更注重于使用. 首先需要了解扩展欧几里得的算法 ---找出一对(x,y),使得其能满足ax+by=gcd(a,b)这一式子. 下面给出实现此算法的代码 void gcd(in ...
- 扩展欧几里得定理基础讲解 代码及证明
知识储备 1 . 朴素欧几里得原理:gcd(a,b) == gcd(b,a % b) 2 . 负数取模:忽略符号返回绝对值就好了 3 . 模数原理:对于整数a,b必然存在整数k使得a % b == a ...
最新文章
- PHP特级课视频教程_第二十八集 PHP搜索代码测试_李强强
- .net 下直接读分区数据,并生成ISO光盘镜像文件,含DEMO
- CDH使用秘籍(一):Cloudera Manager和Managed Service的数据库
- 主题简介 ASP .NET
- python 和C语言 中的一些容易混淆的符号整理
- Python+OpenCV:训练级联分类器(Cascade Classifier Training)
- python + Eclipse + Pydev 安装
- AWS亚马逊ssh登录失败 Permissions 0644 for .pem are too open
- 郭天祥 新概念51单片机C语言教程.入门、提高、开发.pdf下载地址
- 图像处理黑科技—破解文档识别难题(PS检测、弯曲拉平、切边切片、摩尔纹)
- VXLAN技术产生背景
- 第一章 FreeSWITCH 的架构
- 安徽省对口计算机试题答案,安徽省对口高考试卷
- 微信抢红包算法实现(JAVA)
- 关于tink的碰撞检测类【2】
- 自动化测试 appium 会报错 Could not proxy command to remote server. Original error: Error: socket hang up
- VLC Media Player
- 2018年GIS学术年会总结
- MapReduce编程入门-日志访问次数统计任务
- 蝉知 路径index.php,宝塔面板下蝉知cms nginx环境下完美伪静态的解决办法