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

合集下载

中国剩余定理的证明过程

中国剩余定理的证明过程

中国剩余定理的证明过程(原创实用版)目录一、引言二、中国剩余定理的概念和背景三、中国剩余定理的证明过程1.求解模数2.求解余数3.构造同余方程4.求解同余方程四、中国剩余定理的应用五、结论正文一、引言中国剩余定理,又称孙子定理,是我国古代数学家孙子提出的一个著名数学定理。

该定理描述了这样一个问题:已知一个整数被若干个正整数(除数)除,所得的余数都相同,求这个整数的最小值。

这个问题在古代被称为“物不知其数”,而中国剩余定理则给出了解决这个问题的方法。

二、中国剩余定理的概念和背景中国剩余定理的表述如下:设整数 a、b、c 分别为除数 d1、d2、d3 的余数,且 d1、d2、d3 两两互质,则存在整数 x、y、z 使得:ax ≡ 1 (mod d1)by ≡ 1 (mod d2)其中,x、y、z 为整数,且 x≥1,y≥1,z≥1。

中国剩余定理的背景可以追溯到古代数学家孙子提出的“物不知其数”问题。

孙子问题描述了这样一个情景:有三个牧羊人,他们分别放牧的三群羊总数相同,但每群羊的数量分别除以 3、5、7 的余数相同。

问:至少有多少只羊?三、中国剩余定理的证明过程为了证明中国剩余定理,我们可以采用两种方法:一种是基于数学归纳法和模运算的证明,另一种是基于鸽巢原理(中国剩余定理的另一种称呼)的证明。

1.求解模数首先,根据题意,我们需要求出除数 d1、d2、d3 的最小公倍数 d。

d 即为所求整数的模数。

2.求解余数根据题意,我们可以得到以下同余方程组:ax ≡ 1 (mod d1)by ≡ 1 (mod d2)cz ≡ 1 (mod d3)我们可以通过扩展欧几里得算法求解这个同余方程组,得到 x、y、z 的值。

3.构造同余方程根据求解得到的 x、y、z,我们可以构造如下同余方程:x = 1 + d1 * r1y = 1 + d2 * r2其中,r1、r2、r3 分别为 x、y、z 除以 d1、d2、d3 的余数。

同余方程的求解技巧

同余方程的求解技巧

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

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

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

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

例如,将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是未知的整数。

中国剩余定理计算过程

中国剩余定理计算过程

中国剩余定理计算过程摘要:一、引言二、中国剩余定理的概念和背景三、中国剩余定理的算法实现四、中国剩余定理的应用案例五、结论正文:一、引言中国剩余定理,又称孙子定理,是我国古代数学家孙子所提出的一个数学定理。

这个定理在现代数学领域有着广泛的应用,特别是在数论、代数和密码学等方面有着重要的地位。

本文将介绍中国剩余定理的计算过程及其应用案例。

二、中国剩余定理的概念和背景中国剩余定理是关于同余方程组的一个定理。

同余方程组是指由多个同余方程组成的方程组,例如:x ≡ a (mod m)、x ≡ b (mod n)、x ≡ c (mod p) 等。

在这个方程组中,解的存在性和解的数量是该定理研究的重点。

中国剩余定理的表述为:设m1、m2、m3、...、mk 为两两互质的正整数,a1、a2、a3、...、ak 为整数,则同余方程组:x ≡ a1 (mod m1), x ≡ a2 (mod m2), x ≡ a3 (mod m3),..., x ≡ ak (mod mk)必有解,且解的数量为m1 × m2 ×...× mk。

三、中国剩余定理的算法实现中国剩余定理的算法实现有多种方法,其中较为常见的方法是基于miracl 大数运算库和PARI/GMP 软件。

以下分别简要介绍这两种方法:1.基于miracl 大数运算库的方法:miracl 是一个用于大数计算的C 语言库,可以方便地处理非常大整数。

利用miracl 实现中国剩余定理的算法过程如下:(1)读入文本文件中的数据,得到同余方程组的系数;(2)判断正整数是否两两互素,是则进行下一步,否则跳出;(3)利用扩展欧几里得算法求解同余方程组;(4)输出解。

2.基于PARI/GMP 软件的方法:PARI 是一个免费的数学软件,内置了高性能的数值计算库GMP。

使用PARI/GMP 实现中国剩余定理的算法过程如下:(1)打开PARI 软件,输入"pari" 进入PARI 交互式环境;(2)输入"gmpmode(1)",开启GMP 模式;(3)读入文本文件中的数据,得到同余方程组的系数;(4)使用PARI/GMP 提供的函数求解同余方程组;(5)输出解。

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

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

扩展的欧几里得&中国剩余定理扩展的欧几里得(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=bif(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)和扩展中国剩余定理(excrt)

中国剩余定理(crt)和扩展中国剩余定理(excrt)

中国剩余定理(crt)和扩展中国剩余定理(excrt)数论守门员⼆号 =。

=中国剩余定理:1.⼀次同余⽅程组:⼀次同余⽅程组是指形如x≡ai(mod mi) (i=1,2,…,k)的同余⽅程构成的组中国剩余定理的主要⽤途是解⼀次同余⽅程组,其中m1,m2,...,mk互质2.中国剩余定理:令M=m1*m2*...*mk(即所有m的lcm)ti为同余⽅程M/mi*ti≡1(mod mi)的最⼩正整数解则存在解x=∑ai*M/mi*ti通解为x+i*M最⼩⾮负整数解为(x%M+M)%M(我承认这段是抄的orz原⽂看起来更⽅便:)M/mi*ti≡1(mod mi)可转化为M/mi*ti+mi*y=1,然后⽤exgcd求ti其中gcd(M/mi, mi)=1,意义为⽅程组⼀定有解3.证明:对于第k个⽅程①当i≠k时,有mk|M/mi,即ai*M/mi*ti≡0(mod mk)②当i=k时,有M/mk*tk≡1(mod mk),即ak*M/mk*tk≡ak(mod mk)故∑ai*M/mi*ti≡ak(mod mk)4.代码:(其中LL是long long,qcm是快速乘)1 LL crt(){2 LL bwl=0;3for(int i=1;i<=k;++i){4 LL x,y;5 exgcd(M/m[i],m[i],x,y);6if(x<0) x=x%m[i]+m[i];7 bwl=(bwl+qcm(qcm(a[i],M/m[i]),x))%M;8 }9return (bwl+M)%M;10 }View Code5.孙⼦算经:《孙⼦算经》:今有物不知其数,三三数之剩⼆;五五数之剩三;七七数之剩⼆。

问物⼏何?《算法统宗》:三⼈同⾏七⼗稀,五树梅花廿⼀枝,七⼦团圆⽉正半,除百零五便得知。

其中70=7*5*2,70%3=1,21=3*7*1,21%5=1,15(半个⽉)=3*5*1,15%7=1⽤70*2+21*3+15*2=233除3*5*7=105,得到的余数23即为答案70=3*5*2,21=3*7*1,15=3*5*1三式中的最后⼀个乘数2、1、1即为上⽂提到的di 数字还挺吉利的233扩展中国剩余定理:1.⼀次同余⽅程组:扩展中国剩余定理的主要⽤途是解⼀次同余⽅程组,其中m1,m2,...,mn不⼀定互质2.扩展中国剩余定理:令前k-1个⽅程组成的同余⽅程组的⼀个解为x且M为前k-1个模数的lcm则前k-1个⽅程的⽅程组的通解为x+i*M现在将第k个⽅程加⼊只需求⼀个正整数t,使得x+t*M≡ak(mod mk)可以转化为M*t+mk*y=ak-x然后⽤exgcd求出t若此⽅程⽆解,则整个同余⽅程组⽆解否则x+t*M为前k个⽅程的⽅程组的⼀个解(这段也是我抄的,原⽂和上边⼀样orz)3.代码:(其中LL是long long,qcm是快速乘,三个参数分别为两个乘数和模数)1 LL excrt(){2 LL M=m[1],ans=a[1];3for(int i=2;i<=k;++i){4 LL x,y;5 LL d=gcd(M,m[i]);6 LL c=(a[i]-ans%m[i]+m[i])%m[i];7if(c%d) return -1;8 exgcd(M,m[i],x,y);9 x=qcm(x,c/d,m[i]/d);10 ans+=qcm(x,M,M*m[i]);11 M*=m[i]/d;12 ans=(ans%M+M)%M;13 }14return ans;15 }View Code4.细节:1.有些题数字卡得严,必须要⽤快速乘2.快速乘时注意第⼆个乘数必须为正,要⽤通解处理3.每次快速乘的模数不⼀定⼀样,需要好好考虑例题:洛⾕3868 猜数字洛⾕4777 扩展中国剩余定理。

欧几里德算法和扩展欧几里德算法

欧几里德算法和扩展欧几里德算法

欧几里德算法和扩展欧几里德算法欧几里德算法和扩展欧几里德算法欧几里德算法欧几里德算法又称辗转相除法,用于计算两个整数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++语言描述为:void swap(int & a, int & b){int c = a;a = b;b = c;}int gcd(int a,int b){if(0 == a ){return b;}if( 0 == b){return a;}if(a > b){swap(a,b);}int c;for(c = a % b ; c > 0 ; c = a % b){a = b;b = c;}return b;}模P乘法逆元对于整数a、p,如果存在整数b,满足ab mod p =1,则说,b是a的模p乘法逆元。

定理:a存在模p的乘法逆元的充要条件是gcd(a,p) = 1证明:首先证明充分性如果gcd(a,p) = 1,根据欧拉定理,aφ(p)≡ 1 mod p,因此显然aφ(p)-1 mod p是a的模p乘法逆元。

再证明必要性假设存在a模p的乘法逆元为bab ≡ 1 mod p则ab = kp +1 ,所以1 = ab - kp因为gcd(a,p) = d所以d | 1所以d只能为1扩展欧几里德算法扩展欧几里德算法不但能计算(a,b)的最大公约数,而且能计算a模b及b模a的乘法逆元,用C语言描述如下:int gcd(int a, int b , int& ar,int & br){int x1,x2,x3;int y1,y2,y3;int t1,t2,t3;if(0 == a){//有一个数为0,就不存在乘法逆元ar = 0;br = 0 ;return b;}if(0 == b){ar = 0;br = 0 ;return a;x1 = 1;x2 = 0;x3 = a;y1 = 0;y2 = 1;y3 = b;int k;for( t3 = x3 % y3 ; t3 != 0 ; t3 = x3 % y3){k = x3 / y3;t2 = x2 - k * y2;t1 = x1 - k * y1;x1 = y1;x1 = y2;x3 = y3;y1 = t1;y2 = t2;y3 = t3;}if( y3 == 1){//有乘法逆元ar = y2;br = x1;return 1;}else{//公约数不为1,无乘法逆元ar = 0;br = 0;return y3;}}扩展欧几里德算法对于最大公约数的计算和普通欧几里德算法是一致的。

中国剩余定理计算过程

中国剩余定理计算过程

中国剩余定理计算过程摘要:一、中国剩余定理简介- 概念- 数学表达式二、模数和同余方程组- 模数的定义和性质- 同余方程组的表示方法三、中国剩余定理的计算步骤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)是数论中的一个重要定理,它提供了一种解决一组同余方程的方法。

这个定理最早由中国数学家孙子在《孙子算经》中给出,后来由法国数学家孟德尔在17世纪将其形式化并证明。

中国剩余定理在现代密码学、编码及计算机科学等领域中得到广泛应用。

首先,我们来看一个简单的例子来理解中国剩余定理的基本思想。

假设有一个装满了一百个鸡蛋的蛋筐,如果每十二个蛋放进一个篮子,那么这些蛋需要放在多少个篮子里?我们可以用模运算来解决这个问题。

我们首先计算100除以12的商和余数,即100÷12=8余4、商表示放入篮子的个数,余数表示篮子中剩余的蛋数。

因此,我们需要8个篮子,并且还剩下4个蛋。

这个例子中就是使用了中国剩余定理。

定理的正式表述为:如果有一组模数互质的同余方程组{x ≡ a1 (mod n1), x ≡ a2 (mod n2), ..., x ≡ ak (mod nk)},其中n1、n2、…、nk为正整数,a1、a2、…、ak为任意整数,而且n1、n2、…、nk两两互质,那么同余方程组在模n = n1 × n2 × … × nk下有唯一解。

中国剩余定理的解法可以通过构造一个同余方程组{x ≡ a1 (modn1), x ≡ a2 (mod n2), ..., x ≡ ak (mod nk)},其中n1、n2、…、nk为给定的模数,a1、a2、…、ak为给定的余数。

然后我们找到这个同余方程组在模n = n1 × n2 × … × nk下的唯一解。

具体步骤如下:1. 计算n = n1 × n2 × … × nk。

2. 对于每一个i,计算Ni = n / ni。

3. 对于每一个i,计算Mi,使得Mi × Ni ≡ 1 (mod ni)。

可以使用扩展欧几里得算法来计算Mi。

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


若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为素数
扩展欧几里德算法
扩展欧几里德算法是用来在已知a, b 求解一组p,q使得p * a+q * b = Gcd(a, b) (解一定存在,根据数论中的相关定理)。

原理


因为Gcd(a, b) = Gcd(b,a%b) 所以p * a+q * b = Gcd(a, b) = Gcd(b,a%b) = p * b + q * a % b = p * b +q * (a – a / b * b) = q * a + (p – a / b*q) *b 这样它就将 a b 的线性组合就化简为 b 与 a % b 的线性组合。
线性同余方程

对于方程 a*x+b*y=c,该方程等价于 ax ≡ c (mod b);有整数解得充分必要 条件是(c %gcd(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;我们也就找到了方程的一个解。

欧拉函数性质
练习

1:给出一个数n,求出1~n-1中,所有 与n不互质的数之和[与n的最小公约数>1] (MOD 1000000007)。
2.poj 3090




依据以上原理: 经过一步代换必有 a > b 以后的每次代换 将 a 换为 b ,将 b 换为 a % b ,这样 a,b 必定再减小。 当 b 减小到 0 时,它们的最大公因数为 a
实现代码:



int euclid(int a,int b) { if (b==0) return a; else return euclid(b,a%b); }
第 1 步过后2 4 ... 28 30这15个单元被标成false,其余为true。 第 2 步开始: i=3; 由于prime[3]=true, 把prime[6], [9], [12], [15], [18], [21], [24], [27], [30]标为false. i=4; 由于prime[4]=false,不在继续筛法步骤。 i=5; 由于prime[5]=true, 把prime[10],[15],[20],[25],[30]标为false. i=6>sqrt(30)算法结束。 第 3 步把prime[]值为true的下标输出来: for(i=2; i<=30; i++) if(prime[i]) printf("%d ",i); 结果是 2 3 5 7 11 13 17 19 23 29
代码:形如ax+by=c

int Extended_Euclid(int a,int b,int& x,int &y) { if(b==0){ x=1; y=0; return a; } int d=Extended_Euclid(b,a%b,x,y); int temp=x;x=y;y=temp-a/b*y; return d; } //用扩展欧几里得算法解线性方程ax+by=c; bool linearEquation(int a,int b,int c,int& x,int &y) { int d=Extended_Euclid(a,b,x,y); if(c%d) return false; int k=c/d; x*=k ;// + t*b; y*=k ;//- t*a;//求的只是其中一个解 return true;
练习

??
欧拉函数

在数论,对正整数n,欧拉函数是少于或等于n的数中 与n互质的数的数目。此函数以其首名研究者欧拉命名, 它又称为Euler‘s totient function、φ函数、欧拉商数等。 例如φ(8)=4,因为1,3,5,7均和8互质。 从欧拉函数引伸出来在环论方面的事实和拉格朗 日定理构成了欧拉定理的证明。 φ函数的值 φ(1)=1(唯一和1互质的数就是1本身)。 若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p1)p^(k-1),因为除了p的倍数外,其他数都跟n互质。 欧拉函数是积性函数——若m,n互质,
y = 0;
return a; }
ret = extended_gcd(b, a % b,x, y); tmp = x; x = y; y = tmp - a / b * y; return ret; }
int main()
{ int a,b,x, y, z; scanf("%d%d",&a,&b); z=extended_gcd(a,b, x, y); printf("%d %d %d\n",z,x,y); return 0; }



根据我们前边的结论: a b 都在减小,当 b 减小到 0 时,我们 就可以得出 p = 1 ,q = 0 然后递归回去就可以求出 最终的 p ,q 了
例 注意:形如ax+by = gcd(a,b)
#include<stdio.h>
int extended_gcd(int a, int b, int &x, int &y) { int ret, tmp; if (!b) { x = 1;
1. 最简单 For(i = 1; i < n;i++) For(i = 1; i < n/2;i++) For(i = 1; i < sqrt(n);i++)
用筛法求素数

厄拉多塞筛法 先将2-N的各数写在纸上: 2,3,4,5,6,7,8,9,10,11,12,13, 14,15,16,17,18,19,20,21,22,23,24, 24,26,27,28,29,30,31,32,33,34,35, 36,37,38,39,40... 在2的上面画一个圆圈,然后划去2的其他倍数; 第一个既未画圈又没有被划去的数是3,将它画圈,再 划去3的其他倍数;现在既未画圈又没有被划去的第一 个数 是5,将它画圈,并划去5的其他倍数……依次类 推,一直到所有小于或等于N的各数都画了圈或划去为 止。这时,表中画了圈的以及未划去的那些数正好就 是小于 N的素数。

}
练习
扩展欧几里德算法: POJ 1061 2115 poj2142:The Balance
中国剩余定理

公元前后的《孙子算经》中有“物不知 数”问题:“今有物不知其数,三三数 之余二 ,五五数之余三 ,七七数之余二, 问物几何?”答为“23”。也就是求同余 式组x≡2 (mod3),x≡3 (mod5 ), x≡2 (mod7)(式中a≡b (mod m) 表示m整除a-b )的正整数解。



还有一个定理:若gcd(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;就可以了。
1. φ(mn)=φ(m)φ(n) 2. φ(p)=p-1 p为素数 φ (p^n)=p^(n-1)*(p-1); 3. a是N的质因数 若(N%a==0 && (N/a)%a==0) 有:E(N)=E(N/a)*a; 若(N%a==0 && (N/a)%a!=0) 有:E(N)=E(N/a)*(a-1); 欧拉函数的引伸:小于或等于n的数中,与n互质的数 的总和为:φ(x) * x / 2。(n>1)
相关文档
最新文档