1、数 论,主讲:廖枝平,2009程序设计竞赛培训,2 最小公倍、最大公约数, Euclid算法,3 素数,目录,1 同余、整除的判别,1、2部分的主要参考文献:陈景润初等数论,4 扩展的Euclid算法,中国剩余定理,1 同余、整除的判别,1.1 数论中相关运算表示,1.3 整除的判别,1.2 同余的概念,1.1 数论相关性质与定理,1.2 同余的概念,1.3 整除的判别,1.3.1 同余法,1.3.2 弃九法,1.3.3 截去末位数法,1.3.1 同余法,1.3.2 弃九法,弃九法结论,对于9,还有没有别的判断法呢? 例:25225102259(252),末位数去掉就是25,若252能是9的倍
2、数,则该数就是9的倍数。 这样,就得到另一个判别方法:截去末位数法。,a10qr , 0r10 a10qr10nr10nr 10(qnr)(10n1)r 当(10n1)|(qnr)时有(10n-1)|a,1、一个整数a,截去末位数,再加末位数的n倍,它的和能被10n-l整除时,则该数a能被10n-1整除。,1.3.3 截去末位数法,应用这个方法可以判别一个数能否被9,19,29,39,49, 等数整除。,证明:,例: 判断708296能否被29整除?,可被29整除,对29,n=3 计算过程:,解:,3、一个正整数a,截去末位数,再减去这个末位数的2倍,其差能被7整除时,这个自然数能被7整除。4
3、、一个正整数a,截去末位数,再加上末位数的4倍,其和能被13整除时,这个自然数能被13整除。,按此证法还可得到:,综上,截去末位数的方法,对于判断一个整数A能否被数P整除是一个行之有效的方法,可列表如下:,2、一个整数a,截去末位数,再减去末位数字的n倍,它的差能被10n+1整除时,这个数能被10n+1整除。,用这个方法可以判别一个数能否被11,21,31,整除。,2 最小公倍、最大公约数,2.1 最小公倍数,2.2 最大公约数,2.3 Euclid算法,2.1 最小公倍数,int num1,num2,temp,b;scanf(%d,%d,求两个整数最小公倍数 的代码示例,求三个整数的最小公倍
4、数,把3个数的质因数写出来,最小公倍数等于它们所有的质因数的乘积。(如果有几个质因数相同,则比较3个数中哪个数有该质因数的个数较多,乘较多的次数)。先看这3个数是否互质,如果互质,就直接相乘。如 4,5,7 这3个数两两互质,所以最小公倍数就是457,再看如果有不互质的情况:如 4,6,9,再例如求:3,6,9 的最小公倍数。,313623933,那么最小公倍数就是:23318,422623933,分解质因数:,那么最小公倍数就是:233236,就是说彼此之间相同的约数只提供一个。,分解质因数:,求三个以上整数的最小公倍数,2.2 最大公约(因)数,求三个整数的最大公约数,求三个以上整数的最大
5、公约数,2.3 Euclid算法,欧几里德(Euclid)算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:,gcd (a,b) = gcd( b, a mod b ),a可以表示成a=kb+r,则r=a mod b。(1) 假设d是a,b的一个公约数,则有: d|a, d|b,而r=a-kb,因此:d|r 因此:d是(b,a mod b)的公约数 (2) 假设d 是(b,a mod b)的公约数,则: d|b , d|r ,而:a=kb+r 因此:d也是(a,b)的公约数 因此:(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等。,证
6、明,gcd (a,b) = gcd( b, a mod b ),Euclid算法的代码示例,int Gcd (int a, int b) while(b != 0) int r = b; b = a % b; a = r; return a;,法一:,int Gcd (int a, int b) if(b = 0) return a; return Gcd(b, a % b);,法二:,3 素数,3.2 爱氏筛法,3.1 素数的基本概念,3.3 Miller_Rabin素数测试法,素数判别定理,3.1 素数的基本概念,a是大于1的任何整数。,虽然我们还不能判别所有素数,但比较小的素数总可能找出
7、来,并由小到大制成表格。早在公元前300年,希腊数学家爱拉多斯(Eratosthenes)就用他创造的筛法造出了100以内的素数表,这种方法称为爱氏筛法。,3.2 爱氏筛法,(3) 留下p12 划掉p1的倍数 留下p23 划掉p2的倍数 留下p35 划掉p3的倍数 留下p47 划掉p4的倍数,找出不超过 的全部素数,依次排列 ,小于10的素数为2,3,5,7(2) 把1l0O依次排成10行,(4) 留下25个数即为100以内素数。,爱氏筛法的方法为:(以N100为例),爱氏筛法的原理:,如果n 是素数,规定留下。如果nN是合数,必有一个素因数 ,即n必定是某一个素数 的倍数,被划掉了。如果 n
8、N是素数,n不会是任何素数 的倍数,所以被留下来了。留下的是全体素数N,测试一个整数n是否是素数,最简单的方法是把这个数除以2 的数,如果余数为0,则n是一个合数,否则,n就是一个素数。,3.3 Miller_Rabin素数测试法,算法3.3.1的时间复杂性是O( )。对于一个正整数n,其位数为 ,则算法Factor的时间复杂性是O(10m/2),因此,这个算法的时间复杂性是指数阶的。费尔马定理: 如果n是一个素数,a为正整数且0an,则an-1 mod n1。 费尔马定理表明,如果存在一个小于n的正整数a,使得an-1 mod n1,则n肯定不是素数。,费尔马定理只是素数判定的一个必要条件,
9、有些合数也满足费尔马定理,这些合数被称作Carmichael数。Carmichael数是非常少的,在1100,000,000范围内的整数中,只有255个Carmichael数。为了提高素数测试的准确性,可以多次随机选取小于n的正整数a,重复计算dan-1 mod n来判定n是否是素数。例如,对于341,取a=3,则3340 mod 34156,从而判定341不是素数。,算法3.3.2Fermat测试int ExpMod(int n) /计算an-1 mod n a=Random(2, n-1); /产生2, n-1之间的随机整数 b=1; for (i=1; ibx+(a-a/b *b)y =
10、Gcd(a,b) =Gcd(a,b) =ay+b(x-a/b*y) =Gcd(a,b)因此对于a和b而言,他们的相对应的 p,q 分别是 y和(x-a/b*y),4.2 中国剩余定理(孙子定理),孙子定理的研究内容,答案:23,陈景润初等数论,把这个问题的提法用同余式的式子来表达,可以写成(设x是所求物数):,解为: x70a + 21b + 15c (mod 105),式(45),依据的公式:,(1) 求M, M1, M2, M3,证明:,(2) 求 M1, M2, M3,得证,m1,m2,mk是两两互素的k个正整数,令M= m1m2mk=m1M1=m2M2=mkMk。则同余式组: x1=b
11、1(mod m1), x2=b2(mod m2), xk=bk(mod mk) 其正整数解是: xb1M1M1+b2M2M2+bkMkMk(modM)其中Mi是满足同余式: MiMi1(mod mi) (i = 1,2k),中国剩余定理算法结论,k2,算法解题步骤:,中国剩余定理算法结论(续1),中国剩余定理算法结论(续2),算法代码示例:,#includeusing namespace std;typedef long long llong;llong b1000,w1000;llong extended_euclid(llong a, llong b, llong ,int exGcd(i
12、nt a, int b, int ,llong chinese_remainder(int len) llong i, d, x, y, m, n, ret; ret = 0; n = 1; for(i=0; i len ;i+) n *= wi; for(i=0; i 41,41必须被选中,否则其它各项全选也不够41,从而更达不到52。然后算出52-41=11。因为11恰大于A中的9,9必须被选中,否则前面各项加起来也不到9,更达不到11。同理,算出11-9=2正好是A中的项。这样就得到52=41+9+2。,再如A=A2,=10000。如果能表示为A中的若干项之和,那么从恰大于6907知69
13、07是一个加项。然后算出10000-6907=3093。3039-1718=1375, 1375-863=512, 512-430=82。因为82不是A中的项,所以=10000不能表示为A中的若干项之和。,背包系统就是将超递增序列用于秘密地传递数字语言的一种密码系统。事实上,只要会秘密地传送一个字母,也就会传送整个语言了。而由表1知一个字母可以看成一个5位的比特串,比如i可看成01001。选取一个超递增序列A= (1,2,3,9,20),把i也想成一个矢量= (0,1,0,0,1)并作A与的内积:A= (1,2,5,9,20)(0,1,0,0,1)=22。,基于超递增序列A就可以把i以数字22
14、的形式发送给对方。对方收到数字22后,如果他(她)也知道这个超递增序列A,就很容易算出(0,1,0,0,1)这个序列从而可以恢复出文字i来。如果敌方(或第三者)截获了数字22,因为他(她)不知道A,也就恢复不出i来。但以上所述不是真正的背包系统。在实用的背包系统中,序列A的长度n远远大于5,可以达到100。同时序列A经过用数论方法进行变换后可将所得的非超递增序列B公诸与众,但控制一些秘钥仅为友方所知。,1.3 背包系统的加密和解密方法,数字语言,即比特串。以n =10为例,即以传送两个英文字母为例进行说明。,选取一个超递增序列A=(a1,an),比如A为前文中所给出的A2。以A记A中各项之和,
15、则 A=55205。取整数m,使mA,比如取m =55207。再取整数t,使1tm且t与m互素,即(m,t)=1。比如取t=25236。,(1) 加密对象,(2) 加密方法,A2= (103,107,211,430,863,1718, 3449,6907,13807,27610),bi= tai ( mod m) , i =1 , , n ,n =10,经计算得B=(4579,50316,24924,30908,27110, 17953,32732,16553,22075,53620)这个B可以公之于众,友方敌方都知道,但请注意B已经不是超递增序列了。,用t乘A的各项后再用m去除所得各项,以B
16、记所得余数依次构成的序列,即B= (b1,bn),BtA (mod m),设为待传送的10比特数字语言,比如= (0100100000)。将与B作内积得=B=77426。这个77426就是密文,敌方截获了也很难从B和算出,因为B已经不是超递增的了,正像想从一大堆积木块B中找出恰好装满背包的那些积木块一样。当n =100时,如果不借助其它数学理论,用20世纪90年代的计算机去试探性地破译背包系统得花上30年的时间!,(3) 解密方法,友方在收到信息后是容易基于B而恢复出来的,因为t与m这两个密钥是通知了友方的。事实上,因为t与m互素,利用辗转相除法可以求出一个最小的正整数 u 使:ut1(mod
17、m)。,在本例中可求得u =1061。有了u就可以从B中恢复出超递增序列A来,同时也可以恢复出A与的内积来:用u去乘B的各项再模去若干个m即得A。以B的第一项4579为例:因为 u4579=4858319,4858319=8855207+103所以A的第1项为103。同理可得A的其余各项,求得A=A2。又,以u乘即得:=AuB=u=106177426 =82148986970(modm),因为A是超递增序列,有了=970就很容易求出:= (0100100000)。,BtA (mod m),ut1(modm),2、RSA密码系统,2.1 RSA密码系统的工作过程,2.2 RSA的原理,2.3 R
18、SA算法的数论证明,2.1 RSA密码系统的工作过程,假设数据要由A机器传到B机器,那么由B机器用随机数生成一个key,称之为私钥private key,这个key自始至终都只留在B机器里不送出来。然后由这个private key计算出另一个key,称之为公钥public key,并且因算法的特殊性决定从public key几乎不可能反推算出private key。然后将这个public key通过网络传递给A机器。,RSA的做法大致如下:,A机器用这个public key将数据编码,被编码的数据必须使用private key才能解码。A机器将编码过的数据通过网络传到B机器,B机器最后用pri
19、vate key将数据解码。即使有第三者窃听资料,他只能得到B传给A的public key,以及A用这个public key编码后的数据。没有private key,第三者根本无法解码。所以这个方法确实能防止第三者窃听。,2.2 RSA的原理,首先找出三个数:p、q、r。其中p和q是两个互异的质数,r是与(p-1)(q-1)互质的数。这样p、q、r这三个数便是private key。,找出m,使得rm1(mod(p-1)(q-1)。这个m一定存在,因为r与(p-1)(q-1)互质,用辗转相除法就可以得到了。再计算n=p*q。m和n这两个数便是公钥public key。,(1) 找出私钥:p、q
20、、r,算法使用步骤,(2) 计算出公钥:m、n,若资料为a,将其看成是一个大整数,假设a=n的话,就将a表示成s进位(s=n,通常取s=2t),则每一位数均小于n,然后分段编码。接下来,计算bam (mod n),(0=bn),b就是编码后的资料。,(3) 进行编码:bam (mod n),算法使用步骤(续1),编码过程是:,计算cbr (mod pq),(0=cpq)。解码过程很简单,后面会证明c和a其实是相等的。,如果第三者进行窃听时,会得到几个数:m、n(等于pq)、b。他如果要解码的话,必须想办法得到r,所以他必须对n作质因数分解。要防止他分解,最有效的方法是找两个非常的大质数p、q,使第三者作因数分解时发生困难。,(4) 进行解码:cbr (mod pq),解码过程是:,(5) 算法安全性,2.3 RSA算法的数论证明,总 结,主讲:廖枝平,2009程序设计竞赛培训,博弈论(机器),棋类,牌类,走法(行动集合)产生,搜索技术,估值,棋盘(局面)表示,算法优化,牌类游戏树搜索算法,发牌策略,牌类致胜策略,最小公倍、最大公约数, Euclid算法,扩展的Euclid算法,中国剩余定理,素数,同余、整除的判别,数论与密码,背包原理,RSA密码系统,大家暑期辛苦了!,