数学专题(三)、欧几里得与扩展欧几里得

【数学】扩展欧几里得算法 EXGCD\rm EXGCDEXGCD,即 扩展欧几里得算法,简称 扩欧,是用来求出方程 ax+by=gcd⁡(a,b)ax+by=\gcd(a,b)ax+by=gcd(a,b) 的整数解的,其中 a,ba,ba,b 均为整数. 前置芝士:辗转相除法 与 裴蜀定理。 我们考虑辗转相除法的最后一步,当 b=0b=0b=0 时,要使得 ax+0y=gcd⁡(a,0)=aax+0y=\gcd(a,0)=aax+0y=gcd(a,0)=a 成立,那么只要取 x=1x=1x=1,yyy 取任意整数即可,不妨取 y=0 阅读详情

五一之前再更一发,话说要为今年的邀请赛做准备了,但是我还什么都不会啊QAQ

今天主要更Euclid这个人发明的算法。欧几里得算法(Euclidean Algorithm),又称辗转相除法,是用来求解两个数的最大公约数的一种算法。其主要的思想是,设有正整数a,b,不妨令a>b,且a mod b≠0. gcd( a , b )=gcd( b , a mod b ),证明如下:

由于a mod b≠0,设a=k*b+r,即a mod b=r.设gcd( a , b )=c,则c|a且c|b.

令a=m*c,b=n*c且mn互质,r=a-k*b=m*c-n*c*k=(m-n*k)c,也即c|r. 由于n与m-n*k互质,(证:若n与m-n*k不互质,设gcd(n,m-n*k)=d,且d>1.令n=xd,m-n*k=yd,且xy互质,则y+xk与x互质。gcd(a,b)=gcd(xcd,(y+xk)cd)=cd>c,与假设矛盾)所以gcd( b , r )=c=gcd( a , b ).证毕。代码的话很好写,一行递归就搞定了,在这儿就不放上来了。

然后要说的是扩展欧几里得算法(extended Euclidean algorithm)。exgcd的主要思想为:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。下证:

设 a>b。
1,显然当 b=0,gcd(a,b)=a。此时 x=1,y=0;
2,a>b>0 时
设 ax 1+ by 1= gcd(a,b);
bx 2+ (a mod b)y 2= gcd(b,a mod b);
根据朴素的 欧几里得原理有 gcd(a,b) = gcd(b,a mod b);
则:ax 1+ by 1= bx 2+ (a mod b)y 2;
即:ax 1+ by 1= bx 2+ (a - [a / b] * b)y 2=ay 2+ bx 2- [a / b] * by 2;
说明: a-[a/b]*b即为mod运算。[a/b]代表取小于a/b的最大整数。
也就是ax 1+ by1 == ay 2+ b(x 2- [a / b] *y 2);
根据恒等定理得:x 1=y 2; y 1=x 2- [a / b] *y 2;
这样我们就得到了求解 x 1,y 1 的方法:x 1,y 1 的值基于 x 2,y 2.
上面的思想是以递归定义的,因为 gcd 不断的递归求解一定会有个时候 b=0,所以递归可以结束。
#include<bits/stdc++.h>
using namespace std;

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

int main(){
    long long a,b,c,d;
    while(cin>>a>>b>>c>>d){
        cout<<exgcd(a,b,c,d)<<endl;
    }

    return 0;
}

辣么exgcd有什么用呢?至少有以下3个作用:

1、求解不定方程;

2、求解模线性方程(线性同余方程);

3、求解模的逆元。

关于求解不定方程,可以参考这一篇博客http://www.cnblogs.com/void/archive/2011/04/18/2020357.html

关于求解同余方程和乘法逆元,实际上都是把他们转化成ax+ ny= b的方程形式求解。

同余方程 ax≡b (mod n)对于未知数 x 有解,当且仅当 gcd(a,n) | b。且方程有解时,方程有 gcd(a,n) 个解。

设 d= gcd(a,n),假如整数 x 和 y,满足 d= ax+ ny(用扩展欧几里德得出)。如果 d| b,则方程

a* x0+ n* y0= d, 方程两边乘以 b/ d,(因为 d|b,所以能够整除),得到 a* x0* b/ d+ n* y0* b/ d= b。
所以 x= x0* b/ d,y= y0* b/ d 为 ax+ ny= b 的一个解,所以 x= x0* b/ d 为 ax= b (mod n ) 的解。

ax≡b (mod n)的一个解为 x0= x* (b/ d ) mod n,且方程的 d 个解分别为 xi= (x0+ i* (n/ d ))mod n {i= 0... d-1}。

设ans=x*(b/d),s=n/d;

方程ax≡b (mod n)的最小整数解为:(ans%s+s)%s;

相关证明:

证明方程有一解是: x0 = x'(b/d) mod n;
由 a*x0 = a*x'(b/d) (mod n)
     a*x0 = d (b/d) (mod n)   (由于 ax' = d (mod n))
             = b (mod n)

证明方程有d个解: xi = x0 + i*(n/d)  (mod n);
由 a*xi (mod n) = a * (x0 + i*(n/d)) (mod n)
                         = (a*x0+a*i*(n/d)) (mod n)
                         = a * x0 (mod n)             (由于 d | a)
                         = b

证毕。



【专题】欧几里得算法、扩展欧几里得、乘法逆元 1.欧几里得 用途 最大公因数和最小公倍数 定理:  gcd(a,b)=gcd(b,a%b)gcd(a,b)=gcd(b,a\%b)   证明: 我们令c=gcd(a,b)c=gcd(a,b) 令a=n∗ca=n*c , b=m∗cb=m*c a%b=a−k∗b=(n−m∗k)∗ca\%b=a-k*b=(n-m*k)*c,可知,c也是a%ba\%b的因子,现在只需证明c是b和 阅读详情

相关推荐

数学知识——扩展欧几里得算法

数学知识-扩展欧几里得算法及其应用

qq_64637770的博客 1862

扩展欧几里得算法求逆元

扩展欧几里得算法应该是最优的求逆元算法之一,他和费马小定理具有同样的时间复杂度O(log(n))O(log(n))O(log(n)),但是费马小定理需要模数为质数,扩展欧几里得算法则不需要。 逆元定义 若aaa与ppp互素,则满足(a×x)modp=1(a\times x) mod p=1(a×x)modp=1的xxx为aaa的逆元。 显然,有(k×p+1)modp=1(k\times p+1) mod p=1(k×p+1)modp=1(kkk为任意常数),又因为(a×x)modp=1(a\times x)

陈颜的博客 1万+

数学知识:扩展欧几里得算法

扩展欧几里得算法新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdow

m0_62021646的博客 1426

算法打卡之快速幂

例题1:快速幂 给定 n 组 ai,bi,pi,对于每组数据,求出 的值。 输入格式 第一行包含整数 n。 接下来 n 行,每行包含三个整数 ai,bi,pi。 输出格式 对于每组数据,输出一个结果,表示 的值。 每个结果占一行。 数据范围 1≤n≤100000, 1≤ai,bi,pi≤2×109 输入样例: 2 3 2 5 4 3 9 输出样例: 4 1 答案: import java.io.BufferedReader; import java.io.InputStreamReader; publ

weixin_51304175的博客 796

欧几里得&扩展欧几里得算法及相关的数学证明

//欧几里得算法求最大公约数 int gcd(int m,int n) { int u0=m,u1=n,t; if( u0=u1 u0^=u1,u1^=u0,u0^=u1; while(u0%u1) { t=u1; u1=u0%u1;

无题 2346

MoveIt控制睿尔曼RM65机械臂:从仿真到实机的3种控制模式对比

本文详细解析了使用MoveIt框架控制睿尔曼RM65机械臂的三种核心模式:拖动规划、目标姿态规划和Python API控制,从Gazebo仿真到实机部署的完整实现路径。通过ROS环境配置、控制参数优化及实机过渡技术,为工业自动化和机器人研究提供实用指南。

727

一点初等数论(扩展欧几里得,求逆元的三种方法)

以前遇到数论题直接懵逼,今天开始好好搞搞基础的数论知识。 一下内容证明我可能会省略,毕竟我太弱了…. . . . . . 1.模运算 几个常用的定律: ( a + b ) mod p = ( a mod p + b mod p ) mod p ( a * b ) mod p = ( (a mod p) * (b mod p) ) mod p c * ( a mod p )...

ojzha的博客 1万+

【紫光同创PG2L200H开发板】盘古200Pro+开发板(MES2L676-200HP)

开发板 SMA接口符合标准 SMA 接口规范,可使用”内螺旋+插针“的 SMA 线连接板卡”外螺旋+插孔”的 SMA 接口进行通信,板卡 SMA 接口与 FPGA 的 HSST 收发器的一路 RX/TX 相连,TX信号和 RX 信号都是以差分信号方式通过隔直电容连接 FPGA 和 SMA 接口, TX 发送和 RX 接收数据速率高达 6.6Gb/s。为了减轻带电插拔造成对 FPGA 芯片的损坏,在设计上在 JTAG 信号位置添加了保护二极管来保证信号的电压在 FPGA 接受的范围,避免 FPGA 的损坏。

MYMINIEYE的博客 2881

扩展欧几里得算法 | exgcd 证明 + 板子 + 习题

扩展欧几里得算法 是在 欧几里得算法 && 裴楚定理 基础上得出来的。

m0_60593173的博客 777

一分钟教会你搭建steam新游幻兽帕鲁服务器

总结: 游戏对服务器搭建要求相对较高、且对服务器网络协议有要求不能封堵UDP、多开、游戏运行久、同时在线人数多了这些会很吃内存 我自己用的64G内存多开4区测试玩家同时在线50多人的情况下内存已经跑满了、对于想用服务器搭建联机的小伙伴建议根据开区数量以及玩家人数去选择配置、当然也可以直接找我阿杰购买、我可以提供技术搭建服务。注:如果用的是本地电脑局域网搭建直接输入127.0.0.1:8211就行 如果用的是服务器搭建输入自己服务器IP+端口或解析的域名+端口进入游戏。

用最简单的方式说最重要的事!服务器、存储、云计 算、A智能的大数据产品、游戏开发技术。致力于广 大开发者、政企用户、各项机构等,构建云上世界提供全方位云计算解决方案。旨在打造差异化的开放式闭环生态系统帮助用户快速构建稳定、安全的云计算环境。 2235

手把手教你用Synopsys AHB VIP搭建验证环境:从SINGLE到WRAP16的完整波形分析与避坑指南

本文详细介绍了如何使用Synopsys AHB VIP搭建验证环境,从基础配置到复杂波形调试实战。重点解析了AHB协议中各种Burst类型的地址计算机制,包括INCR和WRAP类型,并提供了实际案例和避坑指南,帮助工程师快速掌握验证技巧。

weixin_42552716的博客 414

数论——扩展欧几里得

数论——扩展欧几里得

faith_xy的博客 287

博途 V16(TIA portal V16)安装教程

本文提供了西门子TIA Portal V16软件的完整安装指南。内容包括百度网盘下载链接(提取码kv69)、详细安装步骤(关闭安全保护、典型安装设置)、授权破解方法,以及PLCSIM仿真功能的使用说明。重点演示了S7-1200 PLC程序的仿真过程,解析了仿真界面各元素功能,包括状态指示灯(RUN/STOP/ERROR)、操作按钮(RUN/STOP/MRES)和网络接口状态等。通过图文并茂的方式,完整呈现了从软件安装到PLC程序仿真的全流程操作。

lingchen1906的博客 6699

扩展欧几里得算法算法例题——1299. 五指山、1301. C 循环

大圣在佛祖的手掌中。 我们假设佛祖的手掌是一个圆圈,圆圈的长为 n,逆时针记为:0,1,2,…,n−1,而大圣每次飞的距离为 d。 现在大圣所在的位置记为 x,而大圣想去的地方在 y。 要你告诉大圣至少要飞多少次才能到达目的地。 注意:孙悟空的筋斗云只沿着逆时针方向翻。 输入格式 有多组测试数据。 第一行是一个正整数 T,表示测试数据的组数; 每组测试数据包括一行,四个非负整数,分别为如来手掌圆圈的长度 n,筋斗所能飞的距离 d,大圣的初始位置 x 和大圣想去的地方 y。 输出格式 对于每组测试数据,输出一

pxlsdz的博客 1318

基于大模型的JMeter日志智能分析服务化实践

在软件性能测试领域,日志分析是定位系统瓶颈、评估稳定性的关键环节。传统基于规则或正则表达式的分析方法,在面对格式多变、上下文关联复杂的海量日志时,往往效率低下且难以深入。大语言模型(LLM)凭借其强大的自然语言理解与推理能力,为这一挑战提供了新的解决方案。其技术价值在于能够自动化地从非结构化文本中提取语义信息、关联分散的上下文,并生成可操作的根因分析与优化建议,从而将工程师从繁琐的日志筛查中解放出来,显著提升问题诊断的深度与效率。这一技术可广泛应用于自动化测试报告生成、实时监控预警、脚本调试辅助等工程实践场

weixin_28839549的博客 338

100天精通Python(基础篇)——第4天:数据类型全解析_从基础到转换

数据类型全解析_从基础到转换

努力让自己发光,对的人才能迎着光而来 11万+

欧几里得算法/扩展欧几里得算法

转载请说明出处:http://blog.youkuaiyun.com/leader_one/article/details/75222771 说在前面 出于尊重,简单介绍一下欧几里得(想了解更多自己百度去) 欧几里得(希腊文:Ευκλειδης ,公元前330年—公元前275年),古希腊数学家。他活跃于托勒密一世(公元前364年-公元前283年)时期的亚历山大里亚,被称为“几何之父”,他最著...

leader_one的博客 3万+

车辆重识别/再辨识数据集: Vehicle Re-ID Datasets Collection

车辆数据库 1.VERI-Wild: A Large Dataset and a New Method for Vehicle Re-Identification in the Wild (2019-CVPR) 数据库名称:VERI-Wild 论文:链接 数据库描述: 车辆图像由一个包含174个摄像机,拍摄范围覆盖超过200平方公里的市区CCTV系统拍摄。摄像机是24小时连续拍摄30天,其长时间的...

AI炼丹师 6857

数学——欧几里得算法和扩展欧几里得算法

欧几里得算法 欧几里德算法是用来求两个正整数最大公约数的算法。古希腊数学家欧几里德在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里德算法。 假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里德算法,是这样进行的: 1997 ÷\div÷ 615 = 3 (余 152) 615 ÷\div÷ 152 = 4(余7) 152 ÷\div÷ 7 = 21(余5) 7 ÷\div÷ 5 = 1 (余2) 5 ÷\div÷ 2 = 2 (余1) 2 ÷\div÷ 1 = 2

snowdroptulip的博客 5032

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

扩展欧几里得算法详解

为了介绍扩展欧几里得,我们先介绍一下贝祖定理: 即如果a、b是整数,那么一定存在整数x、y使得ax+by=gcd(a,b)。 换句话说,如果ax+by=m有解,那么m一定是gcd(a,b)的若干倍。(可以来判断一个这样的式子有没有解) 有一个直接的应用就是 如果ax+by=1有解,那么gcd(a,b)=1; 要求出这个最大公因数gcd(a,b),我们最容易想到的就是古...

hhh 7万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【扩展欧几里得】

1.欧几里得算法欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数 gcd(a,b)。基本算法:设 a = qb + r,其中a,b,q,r都是整数,则 gcd(a,b) = gcd(b,r),即 gcd(a,b) = gcd(b,a%b)。证明: a = qb + r 如果 r = 0,那么 a 是 b 的倍数,此时显然 b 是 a 和 b 的最大公约数。 如果 r ≠ 0,任何...

tystrwor的博客 6612

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

数论——裴蜀定理、欧几里得算法、扩展欧几里得算法、逆元以及求解

a|b表示a整除b;a|\b表示a不整除b;|可以表示对整数的划分;

u014114223的博客 2107

扩展欧几里得算法——AcWing.877扩展欧几里得算法

扩展欧几里得算法是用来在已知整数 a、b 的情况下,求解一组整数 x、y 使得 ax + by = gcd(a, b)(gcd 表示最大公约数)。

u014114223的博客 1465

欧几里得算法与扩展欧几里得算法(C++/Java)

本篇文章将介绍【数论】知识,有关最大公约数算法之欧几里得算法及其扩展算法,代码实现使用C++/Java。

未见花闻的博客 1098

信息安全数学基础——扩展欧几里得算法

本文主要介绍了扩展欧几里得算法,其在求解乘法逆元时会非常有帮助。

weixin_45930035的博客 2948

扩展欧几里得算法——数学知识(c++)

1.扩展欧几里得算法 贝祖定理 若a,b是整数,且gcd(a,b)=d,那么对于任意的整数x,y,ax+by=m中的m一定是d的倍数。(特别地,如果a、b是整数,那么一定存在整数x、y使得ax+by=gcd(a,b)。) 以上图片来自zeroAC AcWing 877. 扩展欧几里得算法 给定n对正整数ai,bi,对于每对数,求出一组xi,yi,使其满足ai∗xi+bi∗yi=gcd(ai,bi)。 输入格式 第一行包含整数n。 接下来n行,每行包含两个整数ai,bi。 输出格式 输出共n行,对于每组a

Annabel_CM的博客 1861
上一篇: 字符串(一)、字符串Hash
下一篇: 区间专题(一)、分块及莫队算法
Messhiro
博客等级 码龄9年 4粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值