欧几里得

说在前面

数论学复习 Part 6。
然后再来一章CRT和组合数,就飞往概率,以此为跳板去向DP。
计划很美啊你。

P.S. 这么说来拉格朗日插值可以说是数论学复习的Part 0了啊。

有一个*龙门粗口**这就是祖安人打招呼的方式*博主在以前发了一篇*儒雅随和*的博客,也是讲这个的,虽然写的很*祖安粗口*,但证明还是可堪一看的,(反正是借鉴来的)。

为什么我还会记得多年前的我写博客的亚子呢?

更相减损术 辗转相减法

可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。

gcd(a,b)=gcd(b,a−b)gcd(a,b)=gcd(b,a-b)gcd(a,b)=gcd(b,a−b)。

int gcd(int a,int b)
{if(a<b) swap(a,b);return b?gcd(b,a-b):a;
}

再加上“可半者半之”。

int gcd(int a,int b)
{if(a<b) swap(a,b);if(a&1) a>>=1;if(b&1) b>>=1;return b?gcd(b,a-b):a;
}

P.S.更相损减术本来是用来约分的,所以“可半者半之”这句话被狭义理解为分子分母都是偶数时约掉2。而我纯路人,看到可半者半之就直接断章取义了。P.S. 更相损减术本来是用来约分的,所以“可半者半之”这句话被狭义理解为分子分母都是偶数时约掉2。\\ 而我纯路人,看到可半者半之就直接断章取义了。 P.S.更相损减术本来是用来约分的,所以“可半者半之”这句话被狭义理解为分子分母都是偶数时约掉2。而我纯路人,看到可半者半之就直接断章取义了。

这样的话,stein算法和辗转相减法一模一样。(中国数学领先外国1700年!)\xcancel{(中国数学领先外国1700年!)}(中国数学领先外国1700年!)​

原理是一个数ddd它整除aaa和bbb的话,它就整除a,ba,ba,b的任意线性组合即d∣pa+qb(p,q∈Z)d\mid pa+qb~~~(p,q\in Z)d∣pa+qb   (p,q∈Z)。

证明私以为完全不需要了。

欧几里得算法 辗转相除法

gcd(a,b)=gcd(b,a%b)gcd(a,b)=gcd(b,a\%b)gcd(a,b)=gcd(b,a%b)
模运算是什么?就是多次反复地减直到减不动。
就是多次调用上一个算法。
正确性就更不用赘述了。

int dcg(int a,int b)
{return b?dcg(b,a%b):a;
}

贝祖(裴蜀)定理

对于任意整数a,ba,ba,b,一定存在整数x,yx,yx,y,使得ax+by=gcd(a,b)ax+by=gcd(a,b)ax+by=gcd(a,b)。
特别的,如果a,ba,ba,b互质,就一定存在整数x,yx,yx,y满足ax+by=1ax+by=1ax+by=1。

设gcd(a,b)=dgcd(a,b)=dgcd(a,b)=d,a=pd,b=qda=pd,b=qda=pd,b=qd,则ax+by=gcd(a,b)⟺px+qy=1ax+by=gcd(a,b)\iff px+qy=1ax+by=gcd(a,b)⟺px+qy=1。易知gcd(p,q)=1gcd(p,q)=1gcd(p,q)=1。
也就是说把所有一般命题转到了“特别的”命题上来。
怎么证明存在性问题?简单啊,给出一组(x,y)(x,y)(x,y)不就好了吗?
原式⟺px≡1modq\iff px\equiv 1\mod q⟺px≡1modq
就是求p关于q的一个逆元,这个逆元的存在性我已经在之前不用贝祖证明出来了(1.1),现在就不再赘述一次。

P.S.换一个等价命题应该会证得舒服点,比如ac≡bcmodp,(c,p)=1→a≡bmodpac\equiv bc\mod p,(c,p)=1\to a\equiv b \mod pac≡bcmodp,(c,p)=1→a≡bmodp。

拓展欧几里得算法

拓展欧几里得算法能够在辗转相除的同时求出一组x,yx,yx,y使得ax+by=gcd(a,b)ax+by=gcd(a,b)ax+by=gcd(a,b)。

怎么在辗转相除的时候求呢?我们要看gcd(b,a%b)gcd(b,a\%b)gcd(b,a%b)是吧?
我们设已经辗转相除求出了bx0+(a%b)y0=gcd(b,a%b)bx_0+(a\%b)y_0=gcd(b,a\%b)bx0​+(a%b)y0​=gcd(b,a%b),然后试图用x0,y0x_0,y_0x0​,y0​递推出x,yx,yx,y。

因为gcd(a,b)=gcd(b,a%b)gcd(a,b)=gcd(b,a\%b)gcd(a,b)=gcd(b,a%b),所以有ax+by=bx0+(a%b)y0ax+by=bx_0+(a\%b)y_0ax+by=bx0​+(a%b)y0​。设a=kb+ra=kb+ra=kb+r,则原方程⟺(kb+r)x+by=bx0+ry0⟺b(kx+y)+rx=bx0+ry0原方程\iff (kb+r)x+by=bx_0+ry_0\iff b(kx+y)+rx=bx_0+ry_0原方程⟺(kb+r)x+by=bx0​+ry0​⟺b(kx+y)+rx=bx0​+ry0​。
然后随便多项式恒等定理一下就得到{kx+y=x0x=y0⇒{x=y0y=x0−ky0=x0−⌊ab⌋y0\begin{cases}kx+y=x_0\\x=y_0\end{cases}\Rarr\begin{cases}x=y_0\\ y=x_0-ky_0=x_0-\lfloor\frac{a}{b}\rfloor y_0 \end{cases}{kx+y=x0​x=y0​​⇒{x=y0​y=x0​−ky0​=x0​−⌊ba​⌋y0​​。

然后到最后b=0,a=gcdb=0,a=gcdb=0,a=gcd的时候,有xk=1,yk=0x_k=1,y_k=0xk​=1,yk​=0。

int exgcd(int a,int b,int &x,int &y)
{if(!b) {x=1,y=0; return a;}int w=exgcd(b,a%b,y,x);y-=x*(a/b);return w;
}

或者

void exgcd(int a,int b,int &d,int &x,int &y)
{if(!b) {x=1,y=0,d=a; return ;}exgcd(b,a%b,d,y,x),y-=x*(a/b);
}

逆元

定义

除法怎么取模?
小数分数怎么取模?整除、整数的概念都没有了,你怎么取模?
那怎么除法呢?
怎么规避小数分数呢?
52=2.5\frac{5}{2}=2.525​=2.5的话,5=2∗2.55=2*2.55=2∗2.5。
所以乘法就行了。

我们如果说一个数aaa关于ppp的逆元是a−1a^{-1}a−1的话,就等价于定义xamodp=xa−1modp\frac{x}{a}\mod p=xa^{-1}\mod pax​modp=xa−1modp。
要求a×a−1≡1modpa\times a^{-1}\equiv 1\mod pa×a−1≡1modp。

这个逆元存在的前提上文也有说,a,pa,pa,p要互质。

求法

法一

如果ppp是质数的话,我们就有费马小定理,ap−1≡1modpa^{p-1}\equiv 1\mod pap−1≡1modp。此时aaa的逆元显然就是a×ap−2≡1modpa\times a^{p-2}\equiv 1\mod pa×ap−2≡1modp。
这个东西据说还叫蒙哥马利快速幂模。

法二

另外一种方法就是用exgcd。
exgcd(a,b,&x,&y)得到的x就是a关于b的逆元,y就是b关于a的逆元。

筛法

给一个数p,递推地求逆元,求出一个范围内所有数关于p的逆元。
那么p肯定是质数或者相对是质数了。

现在正在求aaa关于ppp的逆元,设p=ka+rp=ka+rp=ka+r,则有ka+r≡0(modp)ka+r\equiv0 \pmod pka+r≡0(modp),设aaa的逆元为a−1a^{-1}a−1,rrr的逆元是r−1r^{-1}r−1,在两边同时乘以a−1r−1a^{-1}r^{-1}a−1r−1,则有kr−1+a−1≡0(modp)⟺a−1≡−kr−1≡−⌊pa⌋(pmoda)−1(modp)kr^{-1}+a^{-1}\equiv 0\pmod p\iff a^{-1}\equiv -kr^{-1}\equiv -\lfloor \frac{p}{a}\rfloor(p\mod a)^{-1}\pmod pkr−1+a−1≡0(modp)⟺a−1≡−kr−1≡−⌊ap​⌋(pmoda)−1(modp)。

inv[0]=inv[1]=1;
for(int i=2;i<=N;i++) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;

解模线性方程

ax+by=cax+by=cax+by=c。

首先如果gcd(a,b)∤cgcd(a,b)\nmid cgcd(a,b)∤c的话,肯定无解,因为左边必然是gcd(a,b)gcd(a,b)gcd(a,b)的倍数。
如果gcd(a,b)∣cgcd(a,b)\mid cgcd(a,b)∣c的话,设c=k×gcd(a,b)c=k\times gcd(a,b)c=k×gcd(a,b),那么我们跑一次扩欧,得到ax0+by0=gcd(a,b)ax_0+by_0=gcd(a,b)ax0​+by0​=gcd(a,b)的一组解(x0,y0)(x_0,y_0)(x0​,y0​),然后再乘上kkk就搞定了。
{x=kx0y=ky0\begin{cases}x=kx_0\\y=ky_0\end{cases}{x=kx0​y=ky0​​

如果想要求最小正整数解的话,则就(x%p+p)%p(x\%p+p)\%p(x%p+p)%p就是了。

ax≡bmodpax\equiv b \mod pax≡bmodp。

和上面那个差不多。

【原创】更相减损术 stein算法 欧几里得算法 拓展欧几里得算法 扩展欧几里得算法 逆元的计算与筛法 解模线性方程相关推荐

  1. 【C语言】辗转相除法+更相减损术+秦九韶算法

    一.辗转相除法 1.简介 辗转相除法又叫欧几里得算法. 假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的: 1997 / 615 = 3 (余 152) 615 ...

  2. 更相减损术程序设计c语言,更相减损术

    本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 更相减损术是出自<九章算术>的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合 ...

  3. C++算法:辗转相除法与更相减损术

    辗转相除法与更相减损术 1.我们已经学过求最大公因数的知识,你能求出18与30的公因数吗? 2.如果公因数比较大而且根据我们的观察又不能得到一些公因数,我们又应该怎样求它们的最大公因数?比如求8251 ...

  4. 更相减损术——Java实现

    Java作业--求最大公约数--更相减损术 虽然算法简单,但是因为很不熟练,所以一开始的代码有较多错误,以下是经过多次修改后的代码. 代码: import java.util.Scanner;publ ...

  5. 求最大公约数和最小公倍数——辗转相除法(欧几里得算法)、更相减损术、stein算法

    辗转相除法-- 辗转相除法求最大公约数的原理: 两个整数其中较小的数 和 两数相除(较大数除较小数)的余数(使用递归)的最大公约数. 辗转相除法求最小公倍数的原理: 两个整数分别除以最大公约数的结果相 ...

  6. c语言碾转相除法,从高中碾转相除法、更相减损术算法谈起

    编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」 先问你们一个小学问题:「如何求两个整数的最大公约数?」 曾经见过不少的算法题,发现有的并不在数据 ...

  7. 五十六、从高中碾转相除法、更相减损术算法谈起

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题代码化. ---- Runsen 先问你们一个小学问题:如何求两个整数的最大公约数? 曾经见过不少的算法题 ...

  8. 更相减损法java,五十6、从高中碾转相除法、更相减损术算法谈起

    「@Author:Runsen」git ❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」github ❞ 先问大家一个小学问题:「如何求两个整 ...

  9. 更相减损法java,五十六、从高中碾转相除法、更相减损术算法谈起

    「@Author:Runsen」❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化.「---- Runsen」❞ 先问你们一个小学问题:「如何求两个整数的最大公约数?」 曾 ...

最新文章

  1. 技术分享:几种常见的JavaScript混淆和反混淆工具分析实战【转】
  2. qt creator无法删除文件怎么办?(需要在cmakelists文件里配置)
  3. 【Python】一文搞懂Pandas数据排序
  4. 关于SOCKET资源堆栈
  5. JavaScript高级笔记
  6. python怎么读取石墨表格_Python用Pandas读写Excel
  7. 关于IDEA WEB项目的创建与无法继承HttpServlet问题
  8. python两大特性与四大语法_Day 1:Python 两大特性和四大基本语法
  9. 《专家手记AJAX开发实战 》电子试读版发布
  10. centos7黑客帝国装逼
  11. Mac小技巧:在mac上怎么把png转换成jpg
  12. spring-speed-up.xml
  13. 自媒体标题不会写?用这个工具,一键生成爆文标题
  14. cfree5.0中文版
  15. IT运维外包甩不掉的包袱
  16. SAM4E单片机之旅——20、DMAC之使用Multi-buffer进行内存拷贝
  17. 一次性计时器和间隔性计时器的实现
  18. ng test 运行报错SassError: Can‘t find stylesheet to import, 导致case 一个都没有执行
  19. android 虚拟键 高度,Android获取虚拟按键的高度(适配全面屏)
  20. vue : 无法加载文件 C:\Users\xxx\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本

热门文章

  1. 从专升本到互联网大厂-我的2021
  2. 常用图片格式JPG\PNG\SVG该如何选择?
  3. 天刀 服务器状态,天刀实用技巧_天刀各种游戏小技巧_玩游戏网
  4. 牛客小白月赛37 E.紫妹永不服输(构造)
  5. 生存分析绘图——Kaplan-Meier生存曲线
  6. 如何在浏览器查看渲染时间?
  7. 舒适区、学习区、恐慌区
  8. JSON+AJAX+ThreadLocal+文件上传下载
  9. Go语言之路:一、万丈高楼平地起
  10. 基于秘密共享的MPC:GMW、BGW、Beaver triple