《数论基础.ppt

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数论基础 求素数方法 1)p[N]存储所有的素数,二重循环,用已经求出的不大于平方根的所有素数试除 for(i=2;in;++i)? for(j=0;jm p[j]*p[j]=n;++j)? 如果p[j]整除i,则i不是素数 如果都不能整除,则i是素数,添加到素数列表p[N]; 素数 2)增加布尔型数组b[N]记录是否为素数,初始化所有值=1,从头开始遍历,如果b[i]==1,则i是素数,将所有的i的倍数j均修改为b[j]=0 for(i=2;in;++i)? 如果b[i]==1则添加到素数列表p[],然后利用循环for(j=i*i;jn;j+=i) b[j]=0将i的所有倍数删掉 思考:试比较两种方法效率 大数的素性检测 Rabin-Miller素数测试 非素数通过测试概率为 ? Pollard-ρ算法 大数的快速分解 不详细介绍,有兴趣的可以上网搜索 二分法in乘方 如何计算a^n ? 1)计算a*a*a*…*a*a*a,需要计算n-1次乘法,时间复杂度O(n)? 2)考虑实例a^4,计算b=a*a,再算c=b*b,则c=a^4,但是只用了两次乘法,效率提高。比如a^9=a*(a^4)*(a^4),只需用4次乘法,一般的,a^n时间复杂度为O(logn)? 二分法in乘方 考虑n二进制最后一位 如果=0,则a^n可以化为(a^2)^(n/2)? 如果=1,则a^n可以化为(a^2)^(n/2)*a 然后可以继续用类似方法求解,考虑n的倒数第2位二进制,等等…… 改进乘方算法应用于fibonacci GCD(Great Common Divisor)? Euclid 算法 int gcd ( int a, int b ) { int mod; while ( mod = a % b ) a = b, b = mod; return b; }//注意这里面必须a,b都为正数,否则要加其他判断语句 Extended-Euclid 算法: 同时求出 v, u 使gcd ( a, b ) = u * a + v * b(重要) 非递归的不好写,建议写递归的 LCM(Least Common Multiple)? 有了 GCD, LCM 就好办了↓ LCM ( a, b ) = a * b / GCD ( a, b ) 实际上最好写成a/GCD(a,b)*b 思考:为什么下面的写法好? 中国剩余定理 中国剩余定理的内容如下: 令n=n1n2...nk,其中ni是两两互质的数,则对 0=an与0=aini且ai=a?mod?ni 首先定义mi=n/ni(i=1,2...k),则mi是除了ni以外的所有nj的乘积,由于GCD(mi,ni)=1,所以用扩展Euclid算法得ci满足bini+cimi=1 a=a1c1m1+a2c2m2+...+akckmk?(mod?n) 欧拉函数 (x)表示与x互质且小于x的正整数的个数 如果x为素数,则欧拉函数等于x-1 求法:将x分解为p1^n1*p2^n2*…pk^nk,则 欧拉函数=p1^(n1-1)*…*pk^(nk-1)*(p1-1)*…*(pk-1)? n! n!=p1^n1*p2^n2*…*pk^nk 勒让德定理: ni=[n/pi]+[n/pi^2]+[n/pi^3]+…… 其中[]表示向下取整 思考:可以扩展这个方法,对任意的a,求指数e使a^e整除n!,但是a^(e+1)不整除n! 费马小定理及其推广 若p为素数,gcd(a,p)=1 则a^(p-1)=1(mod p)? 推广: 若gcd(a,n)=1 则a^f(n)=1(mod n)? 其中f(n)为n的欧拉函数,这里注意到,如果n为素数,则由于n的欧拉函数=n-1,可以推出费马小定理 扩展欧几里得算法 注意到对于gcd(a,b) = d 我们对(a, b)用欧几里德辗转相除会最终得到 (d, 0)此时对于把a =d, b = 0 带入a*x + b*y = d,显然x = 1,y可以为任意值, 这里y可以为任意值就意味着解会有无数个。我们可以用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的解呢? 扩展欧几里得算法 b*x + (a%b)*y = d?=?b*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; 这样我们可以程序迭代了。 * 普通的算法求Fn的时间复杂度为O(n),当然如果要求求出所有的Fn,这种已经是最优的了,但

文档评论(0)

maxianhui + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档