扩展的欧几里得之中国剩余定理
中国剩余定理(模板+详解)
中国剩余定理(模板+详解)问题:今有物不知其数,三三数之剩⼆,五五数之剩三,七七数之剩⼆。
问物⼏何?简单点说就是,存在⼀个数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
若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页文档
46、我们若已接受最坏的,就再没有什么损失。——卡耐基 47、书到用时方恨少、事非经过不知难。——陆游 48、书籍把我们引入最美好的社会,使我们认识各个时代的伟大智者。——史美尔斯 49、熟读唐诗三百首,不会作诗也会吟——莫扎特
扩展欧几里得与中国剩余定理
21、没有人陪你走一辈子,所以你要 适应孤 独,没 有人会 帮你一 辈子, 所以你 要奋斗 一生。 22、当眼泪流尽的时候,留下的应该 是坚强 。 23、要改变命运,首先改变自己。
24、勇气很有理由被当作人类德性之 首,因 为这种 德性保 证了所 有其余 的德性 。--温 斯顿. 丘吉尔 。 25、梯子的梯阶从来不是用来搁脚的 ,它只 是让人 们的脚 放上一 段时间 ,以便 让别一 只脚能 够再往 上登。
扩展欧几里得与中国剩余定理共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
代码:
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。
中国剩余定理的证明过程
中国剩余定理的证明过程中国剩余定理(Chinese Remainder Theorem)是一种非常有用的数论定理,它提供了一种解决一组同余方程组的方法。
这个定理最早由中国古代数学家孙子提出,被认为是中国古代数学的杰作之一。
现代中国剩余定理由法国数学家员会(LPéLopital)于1785年从中国传统数学中发现并证明。
首先,我们先来探究一下同余方程的定义。
对于给定的整数a,b 和m,同余方程可以表示为:ax ≡ b (mod m),其中≡表示模m下的同余关系。
也就是说,x是一个整数,满足ax与b除以m所得余数相等。
如果同余方程有解,那么方程存在无穷多个解,且这些解之间相互模m同余。
接下来,我们来证明中国剩余定理。
设m1,m2,...,mk是两两互质的正整数,令M = m1 * m2 * … * mk,再令Mi = M/mi。
根据中国剩余定理,存在一个整数yi满足以下条件:Mi * yi ≡ 1 (mod mi),对于任意的1 ≤ i ≤ k。
我们先证明Mi * yi ≡ 1 (mod mi)。
由于Mi = M/mi,因此Mi与mi互素。
根据扩展欧几里得算法,存在整数ai和bi,使得Mi *ai + mi * bi = 1。
我们对两边同时取模mi,得到Mi * ai ≡ 1 (mod mi),从而证明了Mi * yi ≡ 1 (mod mi)。
现在我们来考虑方程组x ≡ a1 (mod m1),x ≡ a2 (modm2),...,x ≡ ak (mod mk)在模M下的解。
设x = a1 * Mi * yi1 + a2 * Mi * yi2 + ... + ak * Mi * yik。
为了证明这个x是方程组的解,我们只需证明x对于每个mi都满足给定的同余方程。
对于任意的1 ≤ j ≤ k,我们有x ≡ a1 * Mi * yi1 + a2 *Mi * yi2 + ... + aj * Mi * yij + ... + ak * Mi * yik (mod mj)。
中国剩余定理的证明过程
中国剩余定理的证明过程中国剩余定理(Chinese Remainder Theorem,CRT)是一个数论定理,用于解决一组模同余方程的问题。
它的证明过程可以通过数学归纳法来进行。
首先,我们考虑一个非常简单的情况,即两个数$a_1$和$a_2$的模同余方程:$x ≡ a_1 (mod\, m_1)$$x ≡ a_2 (mod\, m_2)$假设$m_1$和$m_2$互质,我们可以用扩展欧几里得算法找到一组整数$s_1$和$s_2$,使得$s_1 \cdot m_1 + s_2 \cdot m_2 = 1$。
那么我们可以构造一个解$x = a_1 \cdot s_2 \cdot m_2 + a_2\cdot s_1 \cdot m_1$。
这个解使得$x ≡ a_1 \cdot s_2 \cdot m_2 + a_2 \cdot s_1 \cdot m_1 \equiv a_1 (mod\, m_1)$,因为$a_2 \cdot s_1 \cdot m_1 ≡ 0 (mod\, m_1)$;同时也满足$x ≡ a_1 \cdot s_2 \cdot m_2 + a_2 \cdot s_1 \cdot m_1 \equiv a_2 (mod\, m_2)$,因为$a_1 \cdot s_2 \cdot m_2 ≡ 0 (mod\, m_2)$。
接下来我们考虑一个更一般的情况,有$n$个模同余方程:$x ≡ a_1 (mod\, m_1)$$x ≡ a_2 (mod\, m_2)$...$x ≡ a_n (mod\, m_n)$其中$m_1,\, m_2,\, ..., \,m_n$互质。
我们可以通过多次使用上述简单情况的结论,逐步减少方程的个数。
首先,我们可以通过两个方程来构造一个新的方程组:$x_1 ≡ a_1 (mod\, m_1)$$x_1 ≡ a_2 (mod\, m_2)$$x_2 ≡ a_2 (mod\, m_2)$$x_2 ≡ a_3 (mod\, m_3)$...$x_{n-1} ≡ a_{n-1} (mod\, m_{n-1})$$x_{n-1} ≡ a_n (mod\, m_n)$通过这样的构造,我们可以将$n$个方程减少为$n-1$个方程。
中国剩余定理(CRT)and扩展中国剩余定理(EXCRT)
中国剩余定理(CRT)and扩展中国剩余定理(EXCRT)今有物不知其数,三三数之余⼆;五五数之余三;七七数之余⼆。
问物⼏何?语⽂⽔平不⾼,⼤概翻译⼀下:今天Rothen钓了⼏个妹⼦,3个3个的数会余下2个,5个5个的数会余下3个,七个七个的数会剩下2个好吧,这样好像更难理解了,懒得翻译了,反正⼤家都看得懂,⼤佬们就先做会吧,反正对于您这种神犇那肯定是秒切啊!。
中国剩余定理好⾼级的东西啊,吓得我赶紧来个BFS( Baidu First Search)发现中国剩余定理⼜叫孙⼦定理,原因是孙⼦发明的(这名字绝了)然后对于上⾯的题⽬的解法为:(注意,中国剩余定理的解法只能⽤于⼏个模数两两互质的情况)1.⾸先找出5和7的 mod 3等于1的公倍数(70),然后找出3和7的mod 5 等于1的公倍数(21),还有就是3 和 5的mod 7等于1的公倍数(15)2.答案就是上⾯求出来的三个数的乘积分别乘以"对应的余数" mod 所有模数的乘积例如 (70*2+21*3+15*2)mod (7*3*5)得到23纳尼!这么神奇的吗?真的就是这么神奇哦~本蒟蒻查阅对于这个定理的证明为:把上⾯的问题转化为多个个⼦问题:假设存在⼀个数x1 % 3 =2("%"就是取余数),那么x1就能表⽰为3k+2的形式(k >= 0)假设存在⼀个数x2 % 5 =3("%"就是取余数),那么x1就能表⽰为5k+3的形式(k >= 0)假设存在⼀个数x3 % 7 =2("%"就是取余数),那么x1就能表⽰为7k+2的形式(k >= 0)那么考虑如果存在⼀个x1 + x2 + x3使得它们满⾜上⾯的所有条件呢?⾸先有个特别基础的公式:A % B = C, 那么(A + B*K) % B =C这个应该很好理解,你可以这么想:跟上⾯的类似,A可以表⽰为若⼲倍的B加上C,⽽A+B*k就可以表⽰为:若⼲倍的B + C +K倍的B ,⾃然的对于(A+B*k)%B也是等于C了啊!回到刚才的问题,怎么样才能使得x1+x2+x3满⾜条件呢?若要使得(x1+x2+x3)%3仍然余下2,那么x2,x3就⼀定要是三的倍数若要使得(x1+x2+x3)%5仍然余下3,那么x1,x3就⼀定要是五的倍数若要使得(x1+x2+x3)%7仍然余下2,那么x1,x2就⼀定要是七的倍数所以问题就转化为了求出x1,x2,x3哦吼,从上⾯我们看出了x1,x2,x3的⼏个性质:1.x1是5和7的公倍数,⽽且x1 % 3 = 22.x2是3和7的公倍数,⽽且x2 % 5 = 33.x3是3和5的公倍数,⽽且x3 % 7 = 2同时⼜引⼊⼀个数学公式:如果a%b=c,那么(a*k)%b=(a%b+a%b+a%b+...+a%b(k个a%b) ) mod b=c×k mod b然后问题就可以⽤开篇的⽅法解决了呀!⽽且找出来的是最⼩满⾜条件的数。
中国剩余定理的证明过程
中国剩余定理的证明过程中国剩余定理(Chinese Remainder Theorem)是数论中的一项重要理论,最早由中国数学家孙子在《孙子算经》中提出,后来被欧洲数学家雷蒙德·托勒密(Regiomontanus)发现并命名。
下面,我们将详细介绍中国剩余定理的证明过程。
一、首先我们要明确中国剩余定理是针对两两互素的模数进行求解的。
假设我们有n个不同的互素模数:m1, m2, ..., mn。
令M = m1 * m2* ... * mn,且Mi = M / mi,其中1≤i≤n。
二、定理的主要思想是通过构造一个等差数列,使得该等差数列模除每个模数mi的余数相等。
设x是满足条件的数,那么我们有以下等式:x ≡ a1(mod m1)x ≡ a2(mod m2)...x ≡ an(mod mn)三、我们将上述等式转化为如下的等差数列形式:x ≡ a1 + k1 * m1 (mod m1 * m2 * ... * mn)x ≡ a2 + k2 * m2 (mod m1 * m2 * ... * mn)...x ≡ an + kn * mn (mod m1 * m2 * ... * mn)其中ki是一个整数。
四、根据模运算的性质,可以将上述等式简化如下:x ≡ ∑(ai * Mi * Mi') (mod M)其中Mi'是Mi的逆元,满足Mi * Mi' ≡ 1(mod mi)。
五、根据欧几里得算法,可以计算M的逆元Mi',即可得到x的取值。
通过上述证明过程,可以看出中国剩余定理的基本思想是通过构造一个等差数列,使得该数列模除每个模数的余数相等,然后根据模运算的性质进行计算求解。
下面我们通过一个具体的例子来说明中国剩余定理的应用:假设我们需要求解以下模线性方程组:x ≡ 2(mod 3)x ≡ 3(mod 4)x ≡ 2(mod 5)首先,计算M = 3 * 4 * 5 = 60,然后计算Mi = M / miM1=60/3=20M2=60/4=15M3=60/5=12接下来,计算Mi的逆元Mi',得到:M1' ≡ 2(mod 3) => M1' = 2M2' ≡ 3(mod 4) => M2' = 3M3' ≡ 3(mod 5) => M3' = 3然后,根据上述公式:x ≡ (∑(ai * Mi * Mi'))(mod 60)≡ (2 * 20 * 2 + 3 * 15 * 3 + 2 * 12 * 3)(mod 60)≡ 287(mod 60)最后,求解287(mod 60)的余数,得到x ≡ 7(mod 60)。
中国剩余定理(孙子定理)
中国剩余定理(孙⼦定理) 中国剩余定理,也叫孙⼦定理,是数论中的⼜⼀个重要定理,那么它是⼲什么⽤的呢?简单来说,这是⼀个⽤来求⼀元线性同余⽅程组的定理。
叫做孙⼦定理的原因就是该定理最早可见于南北朝时期的著作《孙⼦算经》卷下第⼆⼗六题,叫做“物不知数”问题,原⽂如下: 有物不知其数,三三数之剩⼆,五五数之剩三,七七数之剩⼆。
问物⼏何? 翻译⼀下,就是说,⼀个数除以三余⼆,除以五余三,除以七余⼆,求这个整数。
接下来,我们把这⼀道题作为例题,探究⼀下如何利⽤孙⼦定理搞定同余⽅程组例1: 求解⼀元线性同余⽅程组: x ≡ 2 ( mod 3 ) x ≡ 3 ( mod 5 ) x ≡ 2 ( mod 7 ) 解: 做题依据: 当p1 , p2 , ……互质的时候,有 x ≡(a1 q1 q1-1+ a2 q2 q2-1+……)mod P 其中P = p1 p2……, q i = p / p i ,q i-1为 q i 在模p i 意义下的逆元 对于这道题,x ≡(2 * 35 * 2 + 3 * 21 * 1+ 2 * 15 * 1)mod 105 = 23例2: 求解⼀元线性同余⽅程组: x ≡ 3(mod 12) x ≡ 2(mod 18) 解: 做题依据 当p不互质时,有x ≡ a1 ( mod p1 ) = = > x = a1 + p1 b1, x ≡ a2 ( mod p2 ) = = > x = a2 + p2 b2 所以p1 b1 - p2 b2 = a2 - a1 ⽤扩展欧⼏⾥得得解 因此不断合并⽅程即可2019-04-09 11:39:10。
数论之中国剩余定理
数论之中国剩余定理欧⼏⾥得算法是⼀种求解两⾮负数最⼤公约数的过程,它本质上就是执⾏辗转相除法。
int gcd(int a,int b){return b==0?a:gcd(b,a%b);}可证明最终得到的结果(设为r n )就是所求最⼤公约数:第⼀步证明r n 是两数约束,第⼆步证明r n 可被两数任意约数整除。
贝祖定理:对于不全为 0 的⾃然数a ,b ,必然存在整数x ,y (不唯⼀)满⾜等式ax +by =gcd (a ,b )。
使⽤扩展欧⼏⾥得算法能够证明。
进⽽可知,若a ,b 互素,那么存在整数x ,y 满⾜等式ax +by =1。
更进⼀步,若a ,b 互素,总可以找到⼀个⽐b ⼩的⾮负数x ,使得ax =1(mod b )成⽴。
中国剩余定理是从⼀个⽅程求解过程总结出的定理。
有同余⽅程组:x ≡a 1mod m 1x ≡a 2mod m 2⋯x ≡a k mod m k ,其中m 1,m 2,⋯,m k 为两两互素整数,求x 的最⼩⾮负整数解。
求解:令M =∏k i =1m i ,即M 是所有m i 的最⼩公倍数;由于m i 两两互素,所以M m i 与m i 亦互素,根据上述贝祖定理推论,可有Mm i t i ≡1mod m i ;则有⼀个解为x =∑k i =1a i M m i t i ,通解为x +i ∗M (i ∈Z ),特别的,最⼩⾮负整数解为(x %M +M )%M 。
证明:由Mm i t i ≡1mod m i 两边同乘a i 得:a i M m i t i ≡a i mod m i ;⼜∀k ↓=i ,a i Mm i t i ≡0mod m k ;将两式代⼊原⽅程,易得[其中⼀解]x =∑k i =1a i Mm i t i 。
推论:基于上述同余⽅程组,对于不同的a 1,a 2…,a k 集合,0⩽取值亦各不相同,此⼀⼀对应关系可⽤于推导。
参考资料:{()()()()()()()()Loading [MathJax]/jax/element/mml/optable/SuppMathOperators.js。
ctf 中国剩余定理
ctf 中国剩余定理摘要:一、引言1.中国剩余定理的背景和意义2.本文的目的和结构二、中国剩余定理的基本概念1.模运算2.同余方程组3.扩展欧几里得算法三、中国剩余定理的证明1.定理的陈述2.证明思路和方法3.证明过程详解四、中国剩余定理的应用1.密码学中的应用2.计算机科学中的应用3.其他领域的应用五、总结1.中国剩余定理的重要性2.进一步研究的方向正文:一、引言中国剩余定理,又称拉格朗日定理,是数论中一个重要的定理。
它为解决模线性方程组问题提供了一个巧妙的方法,不仅在数学领域具有深远的影响,还在密码学、计算机科学等领域有着广泛的应用。
本文将详细介绍中国剩余定理的基本概念、证明方法和应用。
二、中国剩余定理的基本概念1.模运算模运算是一种特殊的除法运算,表示a mod b,即a 除以b 的余数。
例如,7 mod 3 = 1,因为7 除以3 的余数是1。
2.同余方程组设m 和n 是互质的正整数,a 和b 是非负整数,如果对于任意整数x,都有ax ≡ b (mod m),则称ax 和b 关于m 同余,记作ax ≡ b (mod m)。
若同余方程组有解,则称该同余方程组是可解的。
3.扩展欧几里得算法扩展欧几里得算法是一种求解同余方程组的方法,它可以在多项式时间内找到一组特解,从而判定同余方程组是否有解。
三、中国剩余定理的证明1.定理的陈述设m1, m2, ..., mn 是n 个互质的正整数,a1, a2, ..., an 是n 个非负整数,ai ≡ b1 (mod mi),ai ≡ b2 (mod mi),...,ai ≡ bn (mod mi),对于任意整数x,都有ax ≡ b1, b2, ..., bn (mod m1, m2, ..., mn)。
则存在唯一的整数解x0,使得ax0 ≡ b1, b2, ..., bn (mod m1, m2, ..., mn)。
2.证明思路和方法证明过程主要利用了数学归纳法,首先证明当n=2 时定理成立,然后假设当n=k 时定理成立,证明当n=k+1 时定理也成立。
中国剩余定理ppt课件
A = n - m; B = l; C = x - y;
gcd = GCD(A, B);
if(C % gcd != 0) {
printf("Impossible\n"); continue;
}
A = A/gcd; B = B/gcd; C = C/gcd;
exp_gcd(A, B, X, Y);
int i,p,e,d,k,j=0;
while(scanf("%d%d%d%d",&p,&e,&i,&d) && !(p==-1 && i==-1 &&
e==-1 && d==-1)){
j++;
k=(p*5544+e*14421+i*1288-d+21252)%21252;
if(k>0)
}
return 0;
21
}
PKU 1061 青蛙的约会
/JudgeOnline/problem?id= 1061
大意:青蛙A和青蛙B,规定纬度线上东经0度处 为原点,一条首尾相接的数轴由东往西为正方向, 单位长度1米。设青蛙A的出发点坐标是x,青蛙B 的出发点坐标是y。青蛙A一次能跳m米,青蛙B 一次能跳n米,两只青蛙跳一次所花费的时间相同。 纬度线总长L米。现在要你求出它们跳了几次以后 才会碰面。(同一时间跳到同一点上 才算碰面)
/JudgeOnline/proble m?id=2891
大意: 给出K对整数,每对整数假设是A和B,则
一个数N,它除以A余B,求满足这K对整数 的整数N。 (直接用剩余定理)
c++中国剩余定理
中国剩余定理(CRT)是数论中的一个重要定理,用于解决一组模同余方程组。
C++ 中可以通过实现相关算法来应用中国剩余定理。
首先,让我们回顾一下中国剩余定理的基本形式。
给定一组同余方程:
x≡a1(mod m1)
x≡a2(mod m2)
⋮
x≡a k(mod m k)
其中m1,m2,...,m k两两互质,即任意两个模数的最大公约数为 1。
中国剩余定理保证存在唯一的解x模乘积M=m1⋅m2⋅...⋅m k。
C++ 中实现中国剩余定理的一种方式是使用扩展欧几里得算法求解模数之间的乘法逆元,然后通过计算累积求解最终的x。
以下是一个简单的 C++ 示例代码:
这个例子中,我们通过extendedGCD函数求解乘法逆元,然后在chineseRemainderTheorem函数中应用中国剩余定理。
这只是一个简单的示例,实际应用中可能需要根据具体情况进行修改。
中国剩余定理
中国剩余定理(同余方程组)小结问题简单来说就是 a = ai (mod ni) 求未知数a,以下小结略去证明, 只是对定理作了必要的解释, 要了解相关定理,可查阅数论资料.中国余数定理:设 n=n1*n2...nk, 其中因子两两互质.有: a-----(a1,a2,...,ak), 其中ai = a mod ni, 则 a和(a1,a2,...,ak)关系是一一对应的.就是说可以由 a 求出(a1,a2,...,ak), 也可以由(a1,a2,...,ak)求出a推论1:对于 a=ai (mod ni) 的同余方程,有唯一解下面说说由(a1, a2, ..., ak)求a的方法:定义 mi = n1*n2*...nk / ni; ci = mi(mf mod ni); 其中 mi*mf mod ni = 1;则 a = (a1*c1+a2*c2+...+ak*ck) (mod n) (注:由此等式可求a%n, 当n很大时)中国剩余定理关键是mf的求法,如果理解了扩展欧几里得 ax+by=d, 就可以想到:mi*mf mod ni = 1 => mi*mf+ni*y=1;代码如下:复制内容到剪贴板代码:#include <iostream>#include <cmath>using namespace std;const int MAXN = 100;int nn, a[MAXN], n[MAXN];int egcd(int a, int b, int &x, int &y) {int d;if (b == 0) {x = 1; y = 0;return a;} else {d = egcd(b, a%b, y, x);y -= a/b*x;return d;}}int lmes() {int i, tm=1, mf, y, ret=0, m;for (i=0; i<nn; i++) tm *= n[i]; for (i=0; i<nn; i++) {m = tm/n[i];egcd(m, n[i], mf, y);ret += (a[i]*m*(mf%n[i]))%tm; }return (ret+tm)%tm;}int main() {a[0] = 4; a[1] = 5;n[0] = 5; n[1] = 11;nn = 2;printf("%d\n", lmes());return 0;}。
扩展中国剩余定理(EXCRT)
扩展中国剩余定理(EXCRT)数论基础知识吧主要还是留个板⼦,之后就不⽤动脑⼦了(模板://在主函数依次调⽤//fold(a,b,m,n)和excrt(b,m,n)//求解ax+by=gcd(a,b),返回gcd(a,b)ll exgcd(ll a,ll b,ll &x,ll &y){if(b==0LL){x=1,y=0;return a;}ll tmp=exgcd(b,a%b,y,x);y=y-a/b*x;return tmp;}inline ll mod(ll x,ll m){if(x>=m)x-=m;if(x<0)x+=m;return x;}//防⽌中间结果爆longlong的x*y%mll mul(ll x,ll y,ll m){ll res=0,tmp=x;x=mod(x%m+m,m),y=mod(y%m+m,m);while(y){if(y&1LL)res=mod(res+tmp,m);tmp=mod(tmp*2,m);y/=2;}return res;}//求解⽅程组x_i=a_i mod m_ill excrt(ll *a,ll *m,int n){ll res=0,lcm=1;for(int i=1;i<=n;i++){ll A,B,C,x,y,gcd;A=lcm,B=m[i],C=a[i]-res;gcd=exgcd(A,B,x,y);//⽆解if(C%gcd!=0)return -1;ll tmp=lcm;lcm=lcm/gcd*m[i];res=res+mul(C/gcd,mul(tmp,x,lcm),lcm); res=mod(res%lcm+lcm,lcm);}return res;}//将a_i的逆元乘到b_i上//之后要excrt的是b_i与m_ill fold(ll *a,ll *b,ll *m,int n){for(int i=1;i<=n;i++){ll x,y,gcd;gcd=exgcd(a[i],m[i],x,y);//⽆逆元if(b[i]%gcd!=0)return -1;a[i]/=gcd,b[i]/=gcd,m[i]/=gcd;exgcd(a[i],m[i],x,y);b[i]=mul(b[i],x,m[i]);}return1;}View Code主要⽤来求解线性同余⽅程组即我们希望对于以下⽅程组求最⼩的x,使得\begin{equation} \begin{cases} x\equiv a_1 (mod\ \ m_1)\\ x\equiv a_2(mod\ \ m_2)\\ \vdots \\ x\equiv a_n(mod\ \ m_n)\end{cases} \end{equation}\nonumber其中m_1,m_2,...,m_n不保证互质在此之前需要先掌握扩展欧⼏⾥德(exgcd)参考这篇就⾜够了,很详细(最后⼀步式⼦错了,不过结论对的):exgcd解决的问题是:ax+by=gcd(a,b)//求解ax+by=gcd(a,b),返回gcd(a,b)ll exgcd(ll a,ll b,ll &x,ll &y){if(b==0LL){x=1,y=0;return a;}ll tmp=exgcd(b,a%b,y,x);y=y-a/b*x;return tmp;}View Code⼀些除了本⾝之外的⽤法:1. 解ax+by=c的不定⽅程:将解出的x,y同乘\frac{c}{gcd(a,b)}即可得到特解;若c\ mod\ gcd(a,b)\neq 0,则⽅程⽆解2. 求逆元:若a,b互质,那么求出的x就是a在模b意义下的逆元了3. 解Ax\equiv B(mod\ \ M)的同余⽅程:令a=A,b=M,c=B,则X=x\cdot \frac{c}{gcd(a,b)}为该⽅程的解;若c\ mod\ gcd(a,b)\neq 0,则该⽅程⽆解有了上⾯的铺垫,现在可以愉快地求同余⽅程组了参考这篇:假设现在已经算完了前k-1个⽅程组的解,设M=lcm(m_1,m_2,...,m_{k-1})则通解为x+t\cdot M(t为任意整数)对于第k个⽅程,我们希望x+t\cdot M\equiv a_k(mod\ \ m_k)即,希望找到合适的t,s使得x+t\cdot M=a_k+s\cdot m_k移项后就是t\cdot M+s\cdot m_k=a_k-x,已经是exgcd可以处理的ax+by=c的形式了;⽤exgcd(M,m_k,t,s),再乘以\frac{a_k-x}{gcd(M,m_k)},即可得到t,s于是前k个⽅程的特解为x'=x+t\cdot M,如令M'=lcm(M,m_k)则通解为x'+t'M'(t'为任意整数)这样⼀步⼀步做下去,直到算出前n个⽅程的特解于是可以写出下⾯的代码(题⽬为:)#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;const int N=100005;//求解ax+by=gcd(a,b),返回gcd(a,b)ll exgcd(ll a,ll b,ll &x,ll &y){if(b==0LL){x=1,y=0;return a;ll tmp=exgcd(b,a%b,y,x);y=y-a/b*x;return tmp;}inline ll mod(ll x,ll m){if(x>=m)x-=m;if(x<0)x+=m;return x;}//防⽌中间结果爆longlong的x*y%mll mul(ll x,ll y,ll m){ll res=0,tmp=x;x=mod(x%m+m,m),y=mod(y%m+m,m); while(y){if(y&1LL)res=mod(res+tmp,m);tmp=mod(tmp*2,m);y/=2;}return res;}//求解⽅程组x_i=a_i mod m_ill excrt(ll *a,ll *m,int n){ll res=0,lcm=1;for(int i=1;i<=n;i++){ll A,B,C,x,y,gcd;A=lcm,B=m[i],C=a[i]-res;gcd=exgcd(A,B,x,y);//⽆解if(C%gcd!=0)return -1;ll tmp=lcm;lcm=lcm/gcd*m[i];res=res+mul(C/gcd,mul(tmp,x,lcm),lcm);res=mod(res%lcm+lcm,lcm);}return res;}int n;ll a[N],m[N];int main(){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%lld%lld",&m[i],&a[i]);printf("%lld\n",excrt(a,m,n));return0;}View Code也可以有再稍微扩展⼀点的做法,即解决\begin{equation} \begin{cases} a_1x\equiv b_1 (mod\ \ m_1)\\ a_2x\equiv b_2(mod\ \ m_2)\\ \vdots \\ a_nx\equiv b_n(mod\ \ m_n)\end{cases} \end{equation}\nonumber当gcd(a_i,m_i)=1时,可以通过exgcd求逆元当gcd(a_i,m_i)\neq 1,若b_i\ mod\ gcd(a_i,m_i)\neq 0,则该⽅程必然⽆解;否则将a_i,b_i,m_i同除gcd(a_i,m_i),则\frac{a_i}{gcd(a_i,m_i)},\frac{m_i}{gcd(a_i,m_i)}互质,那么也可以通过exgcd求逆元之前看错题意时想的,没找到题⽬#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;const int N=100005;//求解ax+by=gcd(a,b),返回gcd(a,b)ll exgcd(ll a,ll b,ll &x,ll &y){if(b==0LL){x=1,y=0;return a;}ll tmp=exgcd(b,a%b,y,x);y=y-a/b*x;return tmp;}inline ll mod(ll x,ll m){if(x>=m)x-=m;if(x<0)x+=m;return x;}//防⽌中间结果爆longlong的x*y%mll mul(ll x,ll y,ll m){ll res=0,tmp=x;x=mod(x%m+m,m),y=mod(y%m+m,m); while(y){if(y&1LL)res=mod(res+tmp,m);tmp=mod(tmp*2,m);y/=2;}return res;}//求解⽅程组x_i=a_i mod m_ill excrt(ll *a,ll *m,int n){ll res=0,lcm=1;for(int i=1;i<=n;i++){ll A,B,C,x,y,gcd;A=lcm,B=m[i],C=a[i]-res;gcd=exgcd(A,B,x,y);//⽆解if(C%gcd!=0)return -1;ll tmp=lcm;lcm=lcm/gcd*m[i];res=res+mul(C/gcd,mul(tmp,x,lcm),lcm); res=mod(res%lcm+lcm,lcm);}return res;}//将a_i的逆元乘到b_i上//之后要excrt的是b_i与m_ill fold(ll *a,ll *b,ll *m,int n){for(int i=1;i<=n;i++){ll x,y,gcd;gcd=exgcd(a[i],m[i],x,y);//⽆逆元if(b[i]%gcd!=0)return -1;a[i]/=gcd,b[i]/=gcd,m[i]/=gcd;exgcd(a[i],m[i],x,y);b[i]=mul(b[i],x,m[i]);}return1;}int n;ll a[N],b[N],m[N];int main(){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%lld%lld",&m[i],&b[i]),a[i]=1;fold(a,b,m,n);printf("%lld\n",excrt(b,m,n));return0;}View Code只是留个模板,毕竟玩不出什么花⾥胡哨的(完)Loading [MathJax]/jax/output/HTML-CSS/fonts/TeX/fontdata.js。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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: 中国剩余定理的完美演绎。