1、1,ACM 数论,2,初等数论的概念,整除性和约数:假设d和a是整数,d|a(读作d整除a),意味着存在某个整数k,有a=kd。如果d|a,并且d0,则称d是a的约数。每个整数a都可以被其平凡约数1和a整除,a的非平凡约数也称为a的因子。,3,初等数论的概念,素数和合数对于某个整数a1,如果它仅有平凡约数1和a则称p是素数。否则p是合数。可以证明素数有无限多个。(数学归纳法)筛法求素数。,4,求素数方法,1)pN存储所有的素数,二重循环,用已经求出的不大于平方根的所有素数试除for(i=2;in;+i)for(j=0;jm ,5,2)给定一个范围(求这个范围内的素数),进行如下步骤: 0.从2
2、开始,2是第一个素数。也是第一个新素数。取出2。 1.筛掉所有新素数的倍数。 2.留下来的数里面第一个(最小的)是新素数。取出这个新素数。 3.重复1和2直到没有数存在。,Eratosthenes筛法,6,初等数论概念,除法定理,余数除法定理:对任意整数a和任意正整数n,存在唯一的整数q和r,使得a=qn+r,其中0rn。值q成为除法的商,值r=a(mod n)称为除法的余数。,7,初等数论的概念,公约数与最大公约数d是a的约数并且也是b的约数,则d是a和b的公约数。两个不同时为0的整数a和b的最大公约数表示为gcd(a, b)。,8,初等数论的概念,gcd(a, b) 的性质:定理:如果a,
3、b是不全为0的任意整数,则gcd(a, b)是a与b的线性组合ax+by:x,yZ中的最小正元素。推论1:对于任意整数a,b,如果d|a并且d|b,则d|gcd(a, b)。推论2:对于所有整数a和b以及任意非负整数n,gcd(an, bn)=n*gcd(a,b)。推论3:对所有正整数n,a和b,如果n|ab并且gcd(a, n)=1,则n|b。,9,初等数论的概念,互质数:如果两个整数a与b只有公因数1,即如果gcd(a, b)=1,则a与b称为互质数(互素)。定理:对任意整数a,b和p,如果gcd(a, p)=1且gcd(b, p)=1,则gcd(ab, p) = 1。,10,最大公约数
4、gcd(最大公因子),Euclidean算法求两个正整数a和b的gcd。先令r0为a,r1为b,接着执行如下运算:,11,最大公约数,GCD递归定理:对任意非负整数a和任意正整数b,gcd(a, b) = gcd(b, a mod b)。例如,gdc(18,10)=gcd(10,8)=gcd(8,2)=2,12,欧几里德算法:EUCLID(a, b) if b = 0 then return a else return EUCLID(b, a % b),13,二进制最大公约数算法:如果a和b都是都是偶数,那么gcd(a, b) = 2gcd(a/2, b/2)。如果a是奇数,b是偶数,那么gc
5、d(a, b) = gcd(a, b/2)。如果a和b都是奇数,那么gcd(a, b) = (ab)/2, b)。举例子,14,思考: 将两个整数的欧几里德算法推广到求m个整数的最大公约数。,15,Extended-Euclidean 算法,定理:对于不完全为0的非负整数a,b,gcd(a,b)表示a,b的最大公约数d,必然存在整数对x,y,使得gcd(a,b)=d=ax+by。,16,扩展欧几里德算法,对于gcd(a,b) = d,对(a, b)用欧几里德辗转相除会最终得到(d, 0)。此时对于把a =d, b = 0 代入a*x + b*y = d,显然x = 1,y可以为任意值。我们可以
6、用a = d, b = 0的情况逆推出来任何gcd(a, b) = d 满足a*x + b*y = d的解。如果x0,y0是b*x + (a%b)*y = d 的解,那么对于a*x + b*y = d的解呢?,17,扩展欧几里德算法,b*x + (a%b)*y = db*x + (a - a/b*b)*y = a*y + b*(x - a/b*y),所以a*x + b*y = d的解x1 = y0, y1= x0 - a/b*y0; 这样我们可以程序迭代了。gcd18,10=2, 2=18*(-1)+10*2, 2=2*1+0*10,注:a,b为正整数,设集合A = x*a+y*b|x,y是整
7、数,则A中最小正元素是gcd(a,b),18,扩展欧几里德算法:EXTENDED-EUCLID(a, b) if b = 0 then return (a, 1, 0) (d,x,y) EXTENDED-EUCLID(b, a%b) (d, x, y) (d, y, x (a/b) * y) return (d, x, y),19,扩展欧几里德算法,20,例如:a4864,b3458,则由上述算法可得gcd(4864,3458)38,且(4864)(38)(3458)(45)38,21,LCM(Least Common Multiple),有了 GCD, LCM 就好办了LCM ( a, b
8、) = a * b / GCD ( a, b ) 实际上最好写成a/GCD(a,b)*b思考:为什么下面的写法好?,22,初等数论概念,唯一因子分解唯一质因子分解定理:合数a仅能以一种方式,写成如下的乘积形式:a=p1e1p2e2prer其中pi为素数,p1p21,如果gcd(a, n)=1,则方程ax=1(mod n)对模n有唯一解,否则无解。,37,公元56世纪前后的孙子算经中有“物不知数”问题:“今有物不知其数,三三数之余二 ,五五数之余三 ,七七数之余二,问物几何?”答为“23”。也就是求同余式组x2 (mod3),x3 (mod5 ),x2 (mod7)的正整数解。明朝程大位用歌谣给
9、出了该题的解法:“三人同行七十稀,五树梅花廿一枝,七子团圆月正半,除百零五便得知。”即解为 x27032121523323(mod105)。,中国剩余定理,38,中国剩余定理(孙子定理),39,欧拉函数,Euler函数 :设m是正整数,1,2,m中与m互素的数的个数。定理:,40,41,定理:如果p是一个奇素数且e1,则方程x2=1(mod pe)仅有两个解:x=1和x=-1。定理:如果对模n存在1的非平凡平方根,则n是合数。,42,元素的幂,3k mod 7为:i 0 1 2 3 4 5 6 7 8 9 10 113k mod 7 1 3 2 6 4 5 1 3 2 6 4 52k mod
10、7为:i 0 1 2 3 4 5 6 7 8 9 10 112k mod 7 1 2 4 1 2 4 1 2 4 1 2 4,43,离散对数,定义:离散对数问题(Discrete Logarithm problom)是这样的一个问题:给定一个素数p,p在Zp*上的一个原根a,以及一个整数b Zp*。求一个整数x(0xp-1),使得ax=b(mod p)。记作:x=logab,44,离散对数,例:令p=11,它的一个原根是2,因为26=9(mod n),所以log29=6。另外还有26=216=226=9(mod n),45,离散对数,一般离散对数问题(GDLP):给定一个n阶的有限循环群G和它
11、的一个原根,以及元素b,求一个整数x(0xn-1),使得ax=b.,46,离散对数,计算离散对数穷举搜索Baby-step Giant-step算法(Shanks算法),47,离散对数,Baby-step Giant-step算法:Baby-step Giant-step是一个用空间换时间的对穷举算法的一个改进,令m=(p-1)1/2,如果b=ax,那么可以把x重写为x=i*m+j,其中0 i, j m,于是b=ai*m * aj,两边同除得b(a-m)i=aj,然后可以通过下面的算法来计算x。,48,49,离散对数,Baby-step Giant-step算法:复杂度分析:需要保存(p-1)
12、1/2个二元组,生成这些二元组需要的时间为O(p-1)1/2),对二元组进行排序需要的时间为O(log(p-1)1/2)*(p-1)1/2) .第(5)步的循环最多执行(p-1)1/2次,每次如果采用二分查找来寻找指定元素那么总的时间复杂度为O(p-1)1/2 log(p-1)1/2),50,离散对数,例:令p=113,a=3,b=57执行算法:m=11计算出的二元组排好序为:j 0 1 8 2 5 9 3 7 6 10 43j(mod 113) 1 3 7 9 17 21 27 40 51 63 81计算a-1=3-1(mod 113) = 38,然后计算a-m=3811(mod 113)
13、= 58执行循环过程中r=b*a-mi,查找过程中的(i, r)为:i 0 1 2 3 4 5 6 7 8 9r 57 29 100 37 112 55 26 39 2 3最终返回:i * m + j = 9 * 11 + 1 = 100,51,RSA算法,RSA 算法描述RSA是Rivet,Shamir和Adleman于1978年在美国麻省理工学院研制出来的,它是一种比较典型的公开密钥加密算法。基础 大数分解和素性检测将两个大素数相乘在计算上很容易实现,但将该乘积分解为两个大素数因子的计算量是相当巨大的,以至于在实际计算中是不能实现的。,52,1.RSA密码体制的建立:,(1)选择两个大素数
14、p和q;(2)计算乘积n=pq和(n)=(p-1)(q-1); (3)选择大于1小于(n)的随机整数e,使得gcd(e,(n)=1;(4)计算d使得de=1mod (n);(5)对每一个密钥k=(n,p,q,d,e),定义加密变换为 Ek(x)=xemodn,解密变换为Dk(x)=ydmodn,这里x,yZn;(6)以e,n为公开密钥,p,q,d为私有密钥。,53,2.RSA算法实例:下面用两个小素数7和17来建立一个简单的RSA算法:(1)选择两个素数p=7和q=17;(2)计算n=pq=7 17=119,计算(n)=(p-1)(q-1)=6 16=96;(3)选择一个随机整数e=5,它小于
15、(n)96并且于96互素;(4)求出d,使得de=1mod96且d96,此处求出d=77,因为 77 53854 961;(5)输入明文M19,计算19模119的5次幂,Me19566mod119,传出密文C66;(6)接收密文66,计算66模119的77次幂;Cd=667719mod119得到明文19。,54,如果要计算Me,将e写成二进制形式bkbk-1b0,这里bk1,则有 。因此:,计算模指数的有效算法“平方乘”算法。,55,这样可以构造一个计算Memod n的算法: d=1; for i=k downto 0 do d=d2 mod n; if bi=1 then d=(dM) mo
16、d n; return d;,计算模指数的有效算法“平方乘”算法。,56,如果把M看作矩阵,上面方法可应用于矩阵乘方,改进乘方算法应用于fibonacci:普通的算法求Fn的时间复杂度为O(n),当然如果要求求出所有的Fn,这种已经是最优的了,但是如果只求某一个Fn,可以改进:,57,素数测试,58,素数测试,59,素数测试,60,素数测试,要判断一个整数n是不是素数,应用费马定理:如果n是素数,那么对于任意的a都满足an-1=1(mod n)。所以可以通过随机选取若干个a,来检验n是否是素数。,61,素数测试,如果n是合数,并且满足an-1=1(mod n)那么就说n是一个基为a的伪素数。,
17、62,素数测试,然而,并不能通过增加随机次数来增加这种测试的正确性,因为存在一些合数,也满足对于任意的a,an-1=1(mod n)通常把这样的合数称为Carmichael数。前三个Carmichael数是561,1105和1729。Carmichael数是非常少的,在小于100000000的数中,只有255个Carmichael数。,63,大数的素性检测,Rabin-Miller素数测试非素数通过测试概率为 Pollard-算法大数的快速分解,64,65,66,梅森素数,把形如(2p-1)形式的素数称为梅森素数,p是素数。1, 231-1之间的梅森素数有:22-1, 23-1, 25-1, 27-1, 213-1, 217-1, 219-1, 231-1梅森素数的一个性质:一个正整数n的所有约数和是2的幂当且仅当n能够被分解为若干个不同的梅森素数之积。,67,THANK YOU!,