基础数论——EXGCD
1.前言
\(皆さん、こんにちは。\)今天我们来讲 \(EXGCD\) 。(扩展欧几里得)
既然是扩展嘛,那肯定有不扩展的,也就是 \(GCD\) 。
我们都知道 \(GCD\) 怎么写:
ll GCD(ll X,ll Y){ return Y==0?X:GCD(Y,X%Y);}
然后今天就要讲它的升级版: \(EXGCD\) 。
2.讲解
上面一段就是 \(GCD\) 的写法,它能够快速解决最大公约数问题。
那么 \(EXGCD\) 就是要解决下面的这个问题:
\(a\times q\equiv c \pmod{p}\)
已知整数 \(q\) , \(p\) , \(c\) ,求整数 \(a\) 。
那么我们现在把问题转化一下,显然我们不可能直接对这个问题进行求解。
\(a\times q + b\times p = c\)
模 \(p\) 相当于就是加上一些 \(p\) 或者减去一些,我们用一个未知量 \(b\) 来表示 \(p\) 的数量。但相较于第一个式子,这个式子更加简洁。
所以现在我们就是要求出 \(a\) 和 \(b\) 的值。
由于是模 \(p\) 意义下的,所以我们令 \(a\) , \(b\) 都是非负整数。
我们设 \(d=gcd(q,p)\) ,那么可得以下式子:
\(d \times \dfrac{q}{d} \times a + d \times \dfrac{p}{d} \times b = d \times \dfrac{c}{d}\)
由于 \(gcd(q,p) \mid q\) 且 \(gcd(q,p) \mid p\) ,那么 \(\dfrac{q}{d}\) 和 \(\dfrac{p}{d}\) 就是整数,那么 \(\dfrac{c}{d}\) 也是整数,所以 \(gcd(q,p) \mid c\) 。
那么如果我们求解了以下式子:
\(x\times q + y\times p = gcd(q,p)\)
然后令 \(x\) 乘上 \(\dfrac{c}{gcd(q,p)}\) 就是 \(a\) 的值了。
我们设 \(x_1\) , \(y_1\) 为 \(gcd(q,p)\) 的解。
\(x_1 \times q + y_1 \times p = gcd(q,p)\) ①
然后设 \(x_2\) , \(y_2\) 为 \(gcd(p,q\ mod\ p)\) 的解。
\(x_2 \times p + y_2 \times (q\ mod\ p) = gcd(p,q\ mod\ p)\)
显然 \(gcd(p,q\ mod\ p)\) 和 \(gcd(q,p)\) 是相等的,都是求 \(p\) 和 \(q\) 的最大公约数,所以得:
\(x_2 \times p + y_2 \times (q\ mod\ p) = gcd(q,p)\) ②
接下来把 ③ 式的 “\(q\ mod\ p\)” 展开得:
\(x_2 \times p + y_2 \times q - y_2 \times \left\lfloor\dfrac{q}{p}\right\rfloor \times p = gcd(q,p)\) ③
由 ①、③ 二式得, \(x_1=y_2\) 、 \(y_1=x_2-y_2 \times \left\lfloor\dfrac{q}{p}\right\rfloor\) 。
所以我们发现, \(p\) 和 \(q\) 的解是由 \(q\) 和 \((p\ mod\ q)\) 推过来的,所以我们可以在求 \(q\) 和 \(p\) 的最大公约数递归返回的过程中求解 \(x\) 和 \(y\) 。
当 \(p\) 为 \(0\) 的时候 \(q\) 为最大公约数,此时的 \(x=1\) , \(y=0\) 。
这样 \(EXGCD\) 就讲完了。
3.代码
#include<bits/stdc++.h>
using namespace std;
long long Q,P,X,Y;
long long Exgcd(long long Q,long long P,long long &X1,long long &Y1){
if(!P){ X1=1;Y1=0; return Q;}
long long X2,Y2,D=Exgcd(P,Q%P,X2,Y2);
X1=Y2;Y1=X2-(Q/P)*Y2;
return D;
}
int main(){
scanf("%lld%lld",&Q,&P);
Exgcd(Q,P,X,Y);
while(X<0) X=X+P;
printf("%lld\n",X%P);
return 0;
}
\(Thanks for Watch.\)
\(皆さん、さよなら。\)
基础数论——EXGCD的更多相关文章
- LightOJ1214 Large Division 基础数论+同余定理
Given two integers, a and b, you should check whether a is divisible by b or not. We know that an in ...
- HDU-1576 A/B 基础数论+解题报告
HDU-1576 A/B 基础数论+解题报告 题意 求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973) (我们给定的A必能被B整除,且gcd(B,9973) = 1). 输入 数据 ...
- RSA算法原理——(2)RSA简介及基础数论知识
上期为大家介绍了目前常见加密算法,相信阅读过的同学们对目前的加密算法也算是有了一个大概的了解.如果你对这些解密算法概念及特点还不是很清晰的话,昌昌非常推荐大家可以看看HTTPS的加密通信原理,因为HT ...
- POJ 2891 Strange Way to Express Integers 中国剩余定理 数论 exgcd
http://poj.org/problem?id=2891 题意就是孙子算经里那个定理的基础描述不过换了数字和约束条件的个数…… https://blog.csdn.net/HownoneHe/ar ...
- ACM&OI 基础数论算法专题
ACM&OI 基础数学算法专题 一.数论基础 质数及其判法 (已完结) 质数的两种筛法 (已完结) 算数基本定理与质因数分解 (已完结) 约数与整除 (已完结) 整除分块 (已完结) 最大公约 ...
- HDU 1299 基础数论 分解
给一个数n问有多少种x,y的组合使$\frac{1}{x}+\frac{1}{y}=\frac{1}{n},x<=y$满足,设y = k + n,代入得到$x = \frac{n^2}{k} + ...
- NOIp 基础数论知识点总结
推荐阅读 NOIp 数学知识点总结: https://www.cnblogs.com/greyqz/p/maths.html Basic 常用素数表:https://www.cnblogs.com/g ...
- HDU 1060 Leftmost Digit 基础数论
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1060 这道题运用的是数学方法. 假设S=n^n.两边同时取对数,得到lgS=nlgn.即有S=10 ...
- hdoj1905 Pseudoprime numbers (基础数论)
Problem Description Fermat's theorem states that for any prime number p and for any integer a > 1 ...
随机推荐
- MATLAB矩阵的表示
矩阵是matlab中最基本的数据对象. l 矩阵的建立 l 冒号表达式 l 结构矩阵和单元矩阵 1.矩阵的建立 (1)利用直接输入法建立矩阵:将矩阵的元素用中括号括起来,按矩阵行的顺序输入各元素 ...
- 记一次 spinor flash 读速度优化
背景 某个项目使用的介质是 spinor, 其 bootloader 需要从 flash 中加载 os. 启动速度是一个关键指标,需要深入优化.其他部分的优化暂且略过,此篇主要记录对 nor 读速度的 ...
- Tomcat服务器的下载与安装,修改端口号
安装及简单配置Tomcat服务器: 1.登录www.apache.org 网站,之后点击Projects , 点击Project List,找到Tomcat. 2.点击Tomcat之后,之后进入Tom ...
- JS实现手机号码中间4位变星号
这个问题,我们可以用截取字符串解决,以下我列出2种方法,小伙伴们可以根据自己的需要选择哦: ● 1,substring()方法用于提取字符串中介于两个指定下标之间的字符. '; //该号码是乱打出来的 ...
- [hdu5445 Food Problem]多重背包
题意:一堆食物,有价值.空间.数量三种属性,一些卡车,有空间,价格,数量三种属性.求最少的钱(不超过50000)买卡车装下价值大于等于给定价值的食物,食物可以拆开来放. 思路:这题的关键是给定的条件: ...
- TP5整合的阿里云短信接口
现阶段,短信的应用主要就是用来验证下手机号是不是正常的手机号.只要涉及到用户手机号的问题的时候,都会做短信验证码来验证下改手机号是否是正常手机号.接下来就是操作步骤. 首先要在阿里云账号上开通短信功能 ...
- Redis学习笔记(六) 对象
前面我们看了Redis用到的主要数据结构,如简单动态字符串(SDS).双向链表.字典.压缩列表.整数集合等. 但是Redis并没有直接使用这些数据结构来实现键值对,而是基于这些数据结构创建了一个对象系 ...
- 去除 HTML 和 PHP 标记
strip_tags()函数,从字符串中去除html和php标记,随笔记一下,如果看过就过去,下次再找可能又会费点事,记下来下次好找
- java基础知识积累总结
参考:http://www.importnew.com/22083.html 参考:http://www.importnew.com/22087.html 十分感谢原作者的汇总,我在这个基础上,有所改 ...
- APP测试知识中的monkey测试
了解了logging模块的应用 1)两种方式,1:日志级别函数 2:日志级别的四大组件来实现日志功能(日志流处理) 2)日志流处理日志logging四大组件:logger(日志器) ...