扩展的欧几里得之中国剩余定理

合集下载

中国剩余定理(模板+详解)

中国剩余定理(模板+详解)

中国剩余定理(模板+详解)问题:今有物不知其数,三三数之剩⼆,五五数之剩三,七七数之剩⼆。

问物⼏何?简单点说就是,存在⼀个数x,除以3余2,除以5余三,除以7余⼆,然后求这个数。

上⾯给出了解法。

再明⽩这个解法的原理之前,需要先知道⼀下两个定理。

定理1:⼏个数相加,如果存在⼀个加数,不能被整数a整除,那么它们的和,就不能被整数a整除。

定理2:两数不能整除,若除数扩⼤(或缩⼩)了⼏倍,⽽被除数不变,则其商和余数也同时扩⼤(或缩⼩)相同的倍数(余数必⼩于除数)。

以上两个定理随便个例⼦即可证明!现给出求解该问题的具体步骤:1、求出最⼩公倍数lcm=3*5*7=1052、求各个数所对应的基础数(1)105÷3=3535÷3=11......2 //基础数35(2)105÷5=2121÷5=4 (1)定理2把1扩⼤3倍得到3,那么被除数也扩⼤3倍,得到21*3=63//基础数633、105÷7=1515÷7=2 (1)定理2把1扩⼤2倍得到2,那么被除数也扩⼤2倍,得到15*2=30//基础数30把得到的基础数加和(注意:基础数不⼀定就是正数)35+63+30=1284、减去最⼩公倍数lcm(在⽐最⼩公倍数⼤的情况下)x=128-105=23那么满⾜题意得最⼩的数就是23了。

⼀共有四个步骤。

下⾯详细解释每⼀步的原因。

(1)最⼩公倍数就不解释了,跳过(记住,这⾥讨论的都是两两互质的情况)(2)观察求每个数对应的基础数时候的步骤,⽐如第⼀个。

105÷3=35。

显然这个35是除了当前这个数不能整除以外都能够被其他数整除,就是其他数的最⼩公倍数。

相当于找到了最⼩的起始值,⽤它去除以3发现正好余2。

那么这个基础数就是35。

记住35的特征,可以整除其他数但是不能被3整除,并且余数是2。

体现的还不够明显,再看下5对应的基础数。

21是其他数的最⼩公倍数,但是不能被5整除,⽤21除以5得到的余数是1,⽽要求的数除以5应该是余1的。

扩展欧几里德与中国剩余定理1

扩展欧几里德与中国剩余定理1


若N 通过一次测试,则N 不是素数的概率为 25%,若N 通过t 次测试,则N 不是 素数的概率为1/4**t。事实上取t 为5 时,N 不是素数的概率为 1/128,N 为素数的 概率已经大于99.99%。 在实际应用中,可首先用300—500个小素 数对N 进行测试,以提高拉宾米勒测试 通过的概率,从而提高测试速度。而在生成随 机素数时,选取的随机数最好让 r=0, 则可省去步骤(3) 的测试,进一步提高测试 速度



}
} if(a>0) return a; else return(a+n);
mi=m/M[i]; d=ext_euclid(M[i],mi,x,y); a=(a+y*mi*B[i])%m;
练习题目:
中国剩余定理: POJ 1006
数论:素数问题

数论
扩展欧几里德算法 中国剩余定理/线性 同余方程 /素数/欧拉函数
扩展欧几里德 算法
欧几里德算法

欧几里德算法又称辗转相除法,用于计 算两个整数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) 的公约数
素性测试:Rabin-Miller算法

数论学家利用费马小定理研究出了多种素数测试方法, 目前最快的算法是拉宾米勒测试算法,(现在不是最 快,印度的一名老师和他的两个本科生的算法是最快 的:印度理工学院计算机科学与工程学系的科学家马 宁德拉· 阿格拉瓦和他的两位在校本科生尼拉叶· 卡雅尔 和尼汀· 萨克斯特纳)其过程如下: (1)计算奇数M,使得N=(2**r)*M+1 (2)选择随机数A<N (3)对于任意i<r,若A**((2**i)*M) MOD N = N-1, 则N通过随机数A的测试 (4)或者,若A**M MOD N = 1,则N通过随机数A的 测试 (5)让A取不同的值对N进行5次测试,若全部通过则 判定N为素数

扩展欧几里得与中国剩余定理18页文档

扩展欧几里得与中国剩余定理18页文档

46、我们若已接受最坏的,就再没有什么损失。——卡耐基 47、书到用时方恨少、事非经过不知难。——陆游 48、书籍把我们引入最美好的社会,使我们认识各个时代的伟大智者。——史美尔斯 49、熟读唐诗三百首,不会作诗也会吟——莫扎特
扩展欧几里得与中国剩余定理
21、没有人陪你走一辈子,所以你要 适应孤 独,没 有人会 帮你一 辈子, 所以你 要奋斗 一生。 22、当眼泪流尽的时候,留下的应该 是坚强 。 23、要改变命运,首先改变自己。
24、勇气很有理由被当作人类德性之 首,因 为这种 德性保 证了所 有其余 的德性 。--温 斯顿. 丘吉尔 。 25、梯子的梯阶从来不是用来搁脚的 ,它只 是让人 们的脚 放上一 段时间 ,以便 让别一 只脚能 够再往 上登。

扩展欧几里得与中国剩余定理共18页

扩展欧几里得与中国剩余定理共18页
扩展欧几里得与中国剩余定理
1、合法而稳定的权力在使用得当时很 少遇到 抵抗。 ——塞 ·约翰 逊 2、权力会使人渐渐失去温厚善良的美 德。— —伯克
3、最大限度地行使权力总是令人反感 ;权力 不易确 定之处 始终存 在着危 险。— —塞·约翰逊 4、权力会奴化一切。——塔西佗
5、虽然权力是一头固执的熊,可是金 子可以 拉着它 的鼻子 走。— —莎士 比
谢谢!
61、奢侈是舒适的,否则就不是奢侈 。——CocoCha nel 62、少而好学,如日出之阳;壮而好学 ,如日 中之光 ;志而 好学, 如炳烛 之光。 ——刘 向 63学校。在那里,与其说好 的教师 是幸福 ,不如 说好的 教师是 不幸。 ——海 贝尔 65、接受挑战,就可以享受胜利的喜悦 。——杰纳勒 尔·乔治·S·巴顿

扩展的欧几里得算法

扩展的欧几里得算法

扩展的欧几里得算法扩展的欧几里得算法是一种求解最大公约数的算法,也被称为扩展欧几里得算法或扩展辗转相除法。

它不仅可以求出最大公约数,还可以求出一组使得两个数的线性组合等于最大公约数的系数。

本文将介绍扩展的欧几里得算法的原理、应用及其优化。

一、原理扩展的欧几里得算法是基于欧几里得算法(辗转相除法)的扩展。

欧几里得算法是一种求解最大公约数的方法,其基本思想是:用较小的数除较大的数,再用余数去除除数,如此反复,直到余数为零为止。

最后的除数就是最大公约数。

例如,求出48和18的最大公约数,过程如下:48 ÷ 18 = 2 (12)18 ÷ 12 = 1 (6)12 ÷ 6 = 2 0因此,最大公约数是6。

扩展的欧几里得算法的主要思想是在欧几里得算法的基础上,求出一组使得两个数的线性组合等于最大公约数的系数。

设a、b为两个正整数,d为它们的最大公约数,那么必定存在整数x和y,使得ax + by = d。

扩展的欧几里得算法就是通过辗转相除的过程,递归求解x和y的值。

具体来说,假设a、b为两个正整数,d为它们的最大公约数,且a > b。

则有:1. 如果b = 0,那么d = a,此时x = 1,y = 0。

2. 如果b ≠ 0,那么可以将a除以b,得到a = bq + r(其中q为a÷b的商,r为余数)。

因为d是a和b的公约数,所以d也是b和r的公约数。

因此,可以递归地求解b和r的系数x1和y1,即有:bx1 + ry1 = d由于a = bq + r,可以将其代入上式,得到:bx1 + (a - bq)y1 = d展开后得到:ay1 + b(x1 - qy1) = d因此,x = y1,y = x1 - qy1。

通过递归求解,最终可以得到x和y的值,从而求出a和b的最大公约数d以及一组使得两个数的线性组合等于最大公约数的系数。

二、应用扩展的欧几里得算法在密码学、数论、计算机图形学等领域都有广泛的应用。

同余方程的求解技巧

同余方程的求解技巧

同余方程的求解技巧同余方程是一类重要的数学问题,它在很多领域都有应用,例如密码学、图论、代数学等。

在解决此类问题的过程中,需要掌握一些相关的求解技巧。

一、欧几里得算法欧几里得算法是解同余方程中最基本的技巧。

它的核心思想是将两个数的较大值通过辗转相除的方式,求出它们的最大公约数。

例如,将6和9进行运算,可以得到如下计算式:9 = 6 x 1 + 36 = 3 x 2 + 0因为6和9的最大公约数为3,所以可以用这种方法求解同余方程Ax ≡ B(mod M) 。

其中A、B、M是已知的整数,x是未知整数。

首先,使用欧几里得算法求出A和M的最大公约数D;如果B能被D整除,那么方程有解。

然后,将A和M分别除以D,得到A'和M',此时Ax ≡ B(mod M)可写为:A'x ≡ B'/D(mod M'/D)。

对这个新的方程重复以上步骤,直到求出解x。

二、中国剩余定理中国剩余定理是解同余方程组的一种方法。

最初,这个定理是由中国数学家孙子所发现并应用于民事案例中。

中国剩余定理适用于一组形如x ≡ a1 (mod n1), x ≡ a2 (mod n2), …, x≡ ar (mod nr) 的同余方程。

其中a1, a2, …, ar是已知的整数,n1, n2, …,nr是互不相同的正整数。

首先,使用欧几里得算法求解n1, n2, …, nr之间的最大公约数D;如果D不整除每一个ai,则无解。

否则,设N = [n1, n2, …,nr] = n1 x n2 x … x nr,则以上同余方程的通解可以写成:x = a1k1M1 + a2k2M2 + … + arkrMr。

其中,Mi = N/ni,且Mi与ni互质;ki是未知的整数,是通过扩展的欧几里得算法计算得到的。

三、扩展欧几里得算法扩展欧几里得算法是用于求解同余方程 Ax + By = C 的一种算法。

其中,A、B、C是已知的整数,x和y是未知的整数。

扩展欧几里德算法和中国剩余定理 2

扩展欧几里德算法和中国剩余定理 2

代码:
exgcd(int a,int b,int &x,int &y) { if(b==0) {x=1;y=0;return;} exgcd(b,a%b,x,y); int t=y; y=x-a/b*y; x=t; } 时间复杂度和欧几里德算法一样为 O(lgb)
这样我们就得到了方程的其中一 组解。那么,如何得到所有的解呢? 设x1,y1是方程ax+by=c的一组解 其中c=gcd(a,b) , 变形可以得到 y1=(c-a*x1)/b(1) 显然 (c-a*x1)%b=0 ,且c%b=0 所以(a*x1)%b=0, 所以[a*(x1+kb)]%b=0, 把x1=x1+kb代入(1)式可得 y1=y1-ka
Input 输入只包括一行5个整数x,y,m,n,L,其中x≠y < 2000000000, 0 < m、n < 2000000000,0 < L < 2100000000。 Output 输出碰面所需要的跳跃次数,如果永远不可能碰面则输出一行 "Impossible"
Sample Input 12345 Sample Output 4
扩展欧几里德 sgu106 poj 2115、2142 非互质同余方程组 poj 2891 hdu1573 中国剩余定理 poj 1006
END
扩展欧几里德算法 与 中国剩余定理
——2012软件工程 唐溢鸿
扩展欧几里德算法
PKU 1061 青蛙的约会
/problem?id=1061
大意:青蛙A和青蛙B,规定纬度线上东经0度处为 原点,一条首尾相接的数轴由东往西为正方向, 单位长度1米。设青蛙A的出发点坐标是x,青蛙B 的出发点坐标是y。青蛙A一次能跳m米,青蛙B 一次能跳n米,两只青蛙跳一次所花费的时间相同。 纬度线总长L米。现在要你求出它们跳了几次以后 才会碰面。(同一时间跳到同一点上 才算碰面)

中国剩余定理计算过程

中国剩余定理计算过程

中国剩余定理计算过程摘要:一、中国剩余定理简介- 概念- 数学表达式二、模数和同余方程组- 模数的定义和性质- 同余方程组的表示方法三、中国剩余定理的计算步骤1.扩展欧几里得算法2.求解模数和通解3.计算模数和特解4.求解原同余方程组四、计算实例1.实例介绍2.计算过程3.结果分析正文:中国剩余定理是一种用于求解同余方程组的数学方法,它可以解决一组同余方程组是否有解以及如何求解的问题。

在数学领域中,同余方程组广泛应用于数论、密码学、计算机科学等领域,因此,中国剩余定理在这些领域中都有着重要的应用价值。

一、中国剩余定理简介中国剩余定理,又称为孙子定理,是数学家孙子于公元前3 世纪提出的一个数学定理。

该定理指出,如果两个整数a 和b 互质,那么同余方程组:ax ≡ b (mod m)对于任意整数x,都有唯一解。

其中,m 为模数,ax ≡ b (mod m) 表示a 与b 模m 同余。

二、模数和同余方程组在中国剩余定理中,模数是一个非常重要的概念。

模数是用于同余方程组中的一个正整数,它决定了同余方程组的解的范围。

同余方程组是指由两个或多个同余方程组成的方程组,它可以表示为:ax ≡ b (mod m)其中,a 和b 是整数,m 是模数。

三、中国剩余定理的计算步骤中国剩余定理的计算步骤主要包括扩展欧几里得算法、求解模数和通解、计算模数和特解以及求解原同余方程组。

1.扩展欧几里得算法:该算法用于求解两个整数a 和b 的最大公约数。

2.求解模数和通解:根据扩展欧几里得算法的结果,求解同余方程组的通解。

3.计算模数和特解:根据通解和同余方程组中的系数,计算同余方程组的特解。

4.求解原同余方程组:利用求得的通解和特解,求解原同余方程组。

四、计算实例下面通过一个实例来说明中国剩余定理的计算过程。

实例介绍:给定同余方程组:x ≡ 2 (mod 3)x ≡ 5 (mod 7)计算过程:1.求解扩展欧几里得算法:首先,求解2 和7 的最大公约数,得到1。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

扩展的欧几里得&中国剩余定理
扩展的欧几里得(EXTENDED-EUCLID)
一、假设:
对于给定的整数a和b,它们满足方程:ax+by=d=gcd(a,b),求出整系数x,y
二、推理:
ax+by=gcd(a,b)=gcd(b,a%b)=bx+(a-(int)a/b*b)y=ay+b(x-(a-(int) a/b*y)
三、扩展的欧几里得算法:
1int extended_gcd(int a, int b, int &x, int &y)
2 {
3int ret, tmp;
4if (!b) {
5 x = 1; y = 0; return a;
6 }
7 ret = extended_gcd(b, a % b, x, y);
8 tmp = x;
9 x = y;
10 y = tmp - a / b * y;
11return ret;
12 }
复制代码
四、应用:
1、求解模线性方程:ax≡b (mod n)
定理一:设d=gcd(a,n),用扩展欧几里得算法解线性方程ax'+ny'=d.如果d|b,则方程axºb(mod n)有一个解的值x0=x'(b/d)mod n
定理二:方程axºb(mod n)有解(即存在d|b,其中d=gcd(a,n)),x0是该方程的任意一个解,则该方程对模n恰有d个不同的解,分别为
x(i)=x(0)+i(n/d)(i=1,2,...d-1)
//用扩展欧几里得解模线性方程ax=b (mod n)
bool modularLinearEquation(int a,int b,int n)
{
int x,y,x0,i;
int d=Extended_Euclid(a,n,x,y); //ax=b (mod n) 等价于ax+n y=b
if(b%d)
return false;
x0=x*(b/d)%n;
for(i=1;i<=d;i++)
printf("%d\n",(x0+i*(n/d))%n);
return true;
}
复制代码
2、求乘法逆元:ax≡1(mod n)
ax≡1(mod n)等价于ax+ny=1=gcd(a,n),调用
extended_gcd(a,n,&x,&y),并当公约数ret=1时,x%n即为a的乘法逆元。

中国剩余定理(CRT)
一、背景介绍:
在《孙子算经》中有这样一个问题:“今有物不知其数,三三数之剩二(除以3余2),五五数之剩三(除以5余3),七七数之剩二(除以7余2),
问物几何?”这个问题称为“孙子问题”,该问题的一般解法国际上称为“中国剩余定理”。

具体解法分三步:
1、找出三个数:从3和5的公倍数中找出被7除余1的最小数15,从3和7的公倍数中找出被5除余1 的最小数21,最后从5和7的公倍数中找出除3余1的最小数70。

2、用15乘以2(2为最终结果除以7的余数),用21乘以3(3为最终结果除以5的余数),同理,用70乘以2(2为最终结果除以3的余数),然后把三个乘积相
加(15*2+21*3+70*2)得到和233。

3、用233除以3,5,7三个数的最小公倍数105,得到余数23,即233%105=23。

这个余数23就是符合条件的最小数。

二、形式化解释:
假设x是那个未知数,而除3,5,7后的余数分别为r1,r2,r3。

因此有
x≡r1(mod 3)
x≡r2(mod 5)
x≡r3(mod 7)
第一步:就是找除了r[i]之外的所有余数r[j](j≠i)的乘积(最小公倍数);
第二步:在求n1,n2,n3时又用了一个小技巧,以n1为例,并非从5和7的公倍数中直接找一个除以3余2的数,而是先找一个除以3余1的数,再乘以2。

(定理:如果a%b=c,那么(a*k)%b=kc (k为大于零的整数))
第三步:n1+n2+n3只是问题的一个解,并不是最小的解,故最小解应是该解的等价类。

注:中国剩余定理的思想在于先找到一个满足条件的数,不管是不是最小的,如果不是最小的就不断减公倍数,中国剩余定理的巧妙在于把满足条件的数分成三个部分相加。

三、典型问题:输入b[i],r[i](分别为除数和余数)求a(被除数), i∈[1,n]
四、形式化定义:
x≡r[1](mod b[1])
x≡r[2](mod b[2])

x≡r[n](mod b[n])
设m[i]是除了b[i]的所有数的乘积
m[i]=b[1]*b[2]*...*b[i-1]*b[i]...*b[n],
定义c[i]=m[i](m[i]¯1 mod b[i]); //第一、二步就是求c[i]
则有a≡∑a[i]*c[i] (mod M); M=∏b[i] //第三步
五、典型题目:猪的安家
Andy和Mary养了很多猪。

他们想要给猪安家。

但是Andy没有足够的猪圈,很多猪只能够在一个猪圈安家。

举个例子,假如有16头猪,Andy建了3个猪圈,
为了保证公平,剩下1头猪就没有地方安家了。

Mary生气了,骂Andy没有脑子,并让他重新建立猪圈。

这回Andy建造了5个猪圈,但是仍然有1头猪没有地方去,
然后Andy又建造了7个猪圈,但是还有2头没有地方去。

Andy都快疯了。

你对这个事情感兴趣起来,你想通过Andy建造猪圈的过程,知道Andy家至少养了多少头
猪。

输入
输入包含多组测试数据。

每组数据第一行包含一个整数n (n <= 10) – Andy建立猪圈的次数,解下来n行,每行两个整数ai, bi( bi <= ai <= 1000), 表示Andy 建立了ai个猪圈,有bi头猪没有去处。

你可以假定(ai, aj) = 1.
输出
输出包含一个正整数,即为Andy家至少养猪的数目。

样例输入
3
3 1
5 1
7 2
样例输出
16
代码如下:
1 #include<stdio.h>
2int main()
3 {
4int M,Mn,result;
5int r[10],b[10],i,j,n;
6while (~scanf("%d",&n))
7 {
8 result=0;
9 M=1;
10for(i=0;i<n;i++)
11 {
12 scanf("%d %d",b+i,r+i);
13 M*=b[i];
14 }
15for(i=0;i<n;i++)
16 {
17 Mn=M/b[i];
18for(j=1;(Mn*j)%b[i]!=1;j++); //求乘法逆元,也可以用上面的扩展欧几里得算法
19 result+=Mn*r[i]*j;
20 }
21 printf("%d\n",result%M);
22 }
23return0;
24 }
复制代码
参考:POJ1006: 中国剩余定理的完美演绎。

相关文档
最新文档