扩展欧几里德算法 线性同余方程 中国剩余定理

数论c++ 同余(详细) 最近在学习算法,不管是算法竞赛中还是平常刷题中都绕不开数论,数论在算法中也是常考题了,但是我们平常在大学里一般没有这门课程,所以说学习这门课还是比较困难的,总不能跑到数学院中偷听把。今天我要分享的学习笔记的主题就是​​​​​​​。 阅读详情

转自:http://hi.baidu.com/sunhaowenprime/item/5626e3e69858afaec10d7522


哎呀,经过这两三天的奋斗,终于搞懂了一类问题——用扩展欧几里德算法求解线性同余方程。其实这类问题应该是比较基础也比较简单的,但我由于几乎没有一点数论的基础,所以还是难为了我不久,等现在彻底搞明白以后再看真的觉得是挺简单的,有关这类问题的题目也不是很多,我就做了3个。下面把这类问题的资料整理一下,方便以后再看。

      欧几里德算法


  欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:
  定理:gcd(a,b) = gcd(b,a mod b)
  证明:a可以表示成a = kb + r,则r = a mod b
  假设d是a,b的一个公约数,则有
  d|a, d|b,而r = a - kb,因此d|r
  因此d是(b,a mod b)的公约数
  假设d是(b,a mod b)的公约数,则
  d | b , d |r,但是a = kb +r
  因此d也是(a,b)的公约数
  因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证
  欧几里德算法就是根据这个原理来做的,其算法用C++语言描述为:
  

       

 int GCD(int a,int b)
        {
               while (b!=0) { int k=b; b=a%b; a=k; }
              return a;
        }

       扩展欧几里德算法


  扩展欧几里德算法是用来在已知a, b求解一组p,q使得p * a+q * b = Gcd(a, b) (解一定存在,根据数论中的相关定理)。

     算法描述为:

       

int extended_gcd(int a,int b,int &x,int &y)
        {
             int ans,t;
             if (b==0) { x=1; y=0; return a; }
             else { ans=extended_gcd(b,a%b,x,y); t=x; x=y; y=t-(a/b)*y;}
             return ans;
        }

  把这个实现和Gcd的递归实现相比,发现多了下面的x,y赋值过程,这就是扩展欧几里德算法的精髓。


  可以这样思考:
  对于a' = b, b' = a % b而言,我们求得x, y使得a'x + b'y = Gcd(a', b')
  由于b' = a % b = a - a / b * b (注:这里的/是程序设计语言中的除法)
  那么可以得到:
  a'x + b'y = Gcd(a', b') ===>
  bx + (a - a / b * b)y = Gcd(a', b') = Gcd(a, b) ===>
  ay +b(x - a / b*y) = Gcd(a, b)
  因此对于a和b而言,他们的相对应的p,q分别是y和(x-a/b*y)。

    线性同余方程

        

     对于方程 a*x+b*y=n;有整数解得充分必要条件是(n %(a,b)==0),这个定理这里就不证明了,数论书上都有。

     所以方程 a*x+b*y=n;我们可以先用扩展欧几里德算法求出一组x0,y0。也就是a*x0+b*y0=(a,b);然后两边同时除以(a,b),再乘以n。这样就得到了方程a*x0*n/(a,b)+b*y0*n/(a,b)=n;我们也就找到了方程的一个解。

     还有一个定理:若(a,b)=1,且x0,y0为a*x+b*y=n的一组解,则该方程的任一解可表示为:x=x0+b*t,y=y0-a*t;且对任一整数t,皆成立。(这个证明比较简单,就不写了)

     这样我们就可以求出方程的所有解了,但实际问题中,我们往往被要求去求最小整数解,所以我们就可以将一个特解x,t=b/(a,b),x=(x%t+t)%t;就可以了。

    方程组的情形(中国剩余定理)

     对于同余方程组:

      x=a1 (mod m1);   1

      x=a2 (mod m2);    2

      方程组有一个小于m(m1,m2的最小公倍数)的非负整数解的充分必要条件是(a1-a2)%(m1,m2)==0 ,同样利用扩展欧几里德算法。

      两式联立:a1+m1*y=a2+m2*z。

      则:a1-a2=m2*z-m1*y; 这样就可以了解出z和y,则:x=a2+m2*z;  

      现在我们将其推广到一般情形:(设m1,m2,···,mk两两互素)

      x=a1(mod m1);

     x=a2(mod m2);

      ···

      x=ak(mod mk);其在M=m1*m2*···*mk;中有唯一整数解。

      记Mi=M/mi;因为(Mi,mi)=1,故有两整数pi,qi满足Mi*pi+mi*qi=1,如果记ei=Mi*pi;那么:ei=0 (mod mj),j!=i; ei=1(mod mj),j=i;

      很明显,e1*a1+e2*a2+···+ek*ak就是方程的一个解,加减M倍后就可以得到最小非负整数解了。

      如果m1,m2,···,mk不互素,那只能两个两个求了。

      x=a1 (mod m1);  

      x=a2 (mod m2);   

      解完后,a=x; m=m1和m2的最小公倍数。即可。

      暂时就写到这里,多元的高次的我还没看,这里推荐几道题目:pku2115;pku2891;pku1061;pku1006;pku2142;强烈推荐sgu106;题目的结题报告我也会贴在博客里。

中国剩余定理——一次同余方程 读取一组数据a、b和m,求一次同余方程ax≡b(mod m)的最小非负解。 立即下载

相关推荐

Oracle Patch清理

- opatch clean的帮助,该命令清除.patch_storage directory文件夹下的'restore.sh,make.txt' files and 'scratch,backup'-- 执行完毕后,貌似没有变化,可能和自己环境有关(19年开始测试补丁,基本上每个季度都测试,后面把又把数据库用RMAN做了迁移,又转换成了PDB模式)。在对Oracle安装补丁后,会发现OS上被占用了大量的空间,本文档清理Opatch过程中的一些文件,释放空间。--清理后空间,剩余25G。

文档搬运工 1072

C++线性同余方程模板

【代码】C++线性同余方程模板。

xiebohang的博客 437

x265探索与研究(四):如何编码视频?

如何编码视频?           本文介绍x265中的两种编码视频方法,一是采用命令行的方法;二是GUI的方式。   1、命令行的方法   (1)、第一种方式生成*.265格式的视频文件           第一种方式可以生成*.265格式的视频文件,对应的命令为: x265 --input-res 352x288 --fps 30 hall_cif_352x288_300.y

成长Bar的博客专栏 3935

c++数论:同余方程

洛谷P1082 谜之ac 前置知识:(a*x)%mod=((a%mod)*x)%mod #include <bits/stdc++.h> using namespace std; long long work(long long a,long long b)//求同余方程的函数 { if(a>b) a%=b;//一定要有,不然会一直运行这个 if(...

NEFU_kadia的博客 1834

最新Linux CSI Tools安装教程(两台主机,一发一收)(监控模式)

无线感知之CSI Tools工具安装,最新在监控模式下采集CSI数据,

h1998040218的博客 3032

vmware vsphere5---部署vCSA(VMware vCenter Server)附带第二阶段安装报错解决方案

因为这份文档我是边做边写的,遇到问题重新装了好几次所以IP会很乱ESXI主机为192.168.20.10VCSA为192.168.20.7,后台为192.168.20.7:5480后期请自行对应,后面的192.168.20.57请对应192.168.20.7,或根据自己的来。

m0_70212665的博客 5713

C++之同余定理

同余定理(一)同余定理的定义(二)同余定理的定理符号定义定理一:(三)同余定理相关定理欧拉函数推论(费马小定理)相关例题 (一)同余定理的定义 数论中的重要概念。给定一个正整数m,如果两个整数a和b满足a-b能够被m整除,即(a-b)/m得到一个整数,那么就称整数a与b对模m同余,记作a≡b(mod m)。对模m同余是整数的一个等价关系。(证明略) (二)同余定理的定理 符号 两个整数a、b,若...

low5252的博客 7478

Coze工作流实战:Coze一键生成沉浸式历史故事视频

【coze工作流实战】一键生成火爆的沉浸式历史故事视频!短短3分钟,顶替你3天的工作量!

bickys的博客 1004

【2020.5.23Code+】同余方程

题目 Description Input Output 输出到标准输出。 输出包含 n 行,第 i 行包含一个正整数,表示第 i 个方程解的组数。 Sample Input Sample Input1 5 59 0 31 15 29 0 47 0 43 38 Sample Input2 1 5 0 Sample Output Sample Output1 1 32 57 1 44 Sample Output2 9 【样例 2 解释】 9 组解分别为 (a, b) = (0, 0),(1, 2),(1,

Brute♂force 472

RK3568嵌入式Linux多屏显示开发指南

摘要:本篇RK3568嵌入式Linux多屏显示开发指南详细介绍了基于Qt应用层的实现方案。文章首先概述了技术架构,说明从Qt应用到硬件显示的完整流程。然后提供了两种实现方案:推荐使用Qt内置多屏支持方案,包含完整的C++代码示例和配置文件说明;对于需要精细控制的场景,给出了基于libdrm API的底层实现方案。最后重点讨论了屏幕旋转处理和多屏协同工作模式的关键技术要点,包括扩展桌面、镜像模式等实现方法。

froxy的专栏 1572

智能座舱(七)——智能音频系统

本文剖析车载智能音频系统的核心技术,聚焦音响、功放、麦克风和广播收音机四大组件。音响系统通过多声道布局(如23扬声器阵列)结合动态声场校准算法,实现三维声场覆盖;功放系统采用高效D类技术,支持OTA音效调整和故障自愈;麦克风阵列运用波束成形技术实现精准拾音,并保障隐私安全;广播系统融合数字与网络技术提升音质。核心在于硬件标准化与算法差异化的协同,未来将朝集成化、AI个性化方向发展。

DC20160101的博客 1573

扩展欧几里德算法 线性同余方程 中国剩余定理 (转载)

链接地址:http://hi.baidu.com/%B1%BF%D0%A1%BA%A2_shw/blog/item/0676025d56a87d4afbf2c093.html 对这位作者表示感谢 哎呀,经过这两三天的奋斗,终于搞懂了一类问题——用扩展欧几里德算法求解线性同余方程。其实这类问题应该是比较基础也比较简单的,但我由于几乎没有一点数论的基础,所以还是难为了我不久,等现在彻底搞明白...

weixin_30550271的博客 143

Go语言面试:面试中经常被问到的50个经典面试题(附参考答案)

Go语言核心知识点摘要 基础语法与数据结构 make和new区别:new分配零值内存返回指针,make初始化引用类型返回实例 Slice底层:包含指针、长度、容量的结构体,多个slice可共享底层数组 nil与空slice:nil指针为nil,空slice指针非nil但JSON编码不同 Map原理:哈希表实现,非线程安全,扩容策略影响性能 for range注意:循环变量是拷贝,map遍历无序 defer执行:LIFO顺序,函数返回前执行 Struct比较:仅当所有字段可比较时才可比较 参数传递:只有值传递

数据知道的博客 4721

【转】扩展欧几里德算法 线性同余方程 中国剩余定理

转载自笨小孩_shw 哎呀,经过这两三天的奋斗,终于搞懂了一类问题——用扩展欧几里德算法求解线性同余方程。其实这类问题应该是比较基础也比较简单的,但我由于几乎没有一点数论的基础,所以还是难为了我不久,等现在彻底搞明白以后再看真的觉得是挺简单的,有关这类问题的题目也不是很多,我就做了3个。下面把这类问题的资料整理一下,方便以后再看。 欧几里德算法 ...

weixin_30511039的博客 116

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

IEM模型,地表粗糙度模拟

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

[转]经典讲解: 扩展欧几里德算法 线性同余方程 中国剩余定理

 欧几里德算法  欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:  定理:gcd(a,b) = gcd(b,a mod b)  证明:a可以表示成a = kb + r,则r = a mod b  假设d是a,b的一个公约数,则有  d|a, d|b,而r = a - kb,因此d|r  因此d是(b,a mod b)的公约数  假设d 是(b,a

笑风生 2609

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

线性同余方程组

线性同余方程 线性同余方程的形式:ax ≡ b (mod m),意思就是求解x的值使得 (a*x)%m=b%m 一、首先复习一下模运算,对于模运算,有以下等式成立: 假设a ≡ c (mod m)且b ≡ d(mod m),则: a + b ≡ c + d (mod m) a - b ≡ c - d (mod m) a * b ≡ c * d (mod m) 对于除法来说相对复杂一点 虽然2 ...

qq_43710979的博客 2435

扩展欧几里德求解线性同余方程组相关~

现在理解了,怕以后忘了。 记录一下。。我们都知道欧几里德算法,又叫辗转相除法。 gcd(a,b) = gcd(b,a%b); 代码实现为int gcd(int a,int b) { return b ? gcd(b,a%b) : a; }扩展欧几里德 对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然 存在整数对

No Program No Life 716

扩展欧几里德与中国剩余定理学习笔记&&模版

蒟蒻这几天比较闲,于是自学了早就学了很久的扩欧与中国剩余定理。。。。。。 --------------------------------------------------------------------------------------------------------------扩展欧几里德----------------------------------------------

Lcomyn的专栏 966
上一篇: Python - 求斐波那契数列前N项之和
下一篇: Python - KMP算法
MagHSK
博客等级 码龄15年 8粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值