小规模素数筛法效率及复杂度分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
小规模素数筛法效率及复杂度分析
全规模筛法,开方筛法,Eratosthenes筛法的复杂性分析讨论
和Miller Rabin筛法的实现难点分析
计算机学院2011级1班计算机科学与技术(师范)张季伦
本文主要讨论几种小规模教学常用的素数筛法的算法时间复杂性以及实现难度,这几种算法分别是全规模筛法,开方筛法,Eratosthenes筛法和Miller Rabin筛法。其中我将对前三种算法进行较为全面的分析,计算证明和代码实现;对于Miller Rabin算法(它其实是一种随机算法),我将给出一个并不完美但包含其主要思想的算法实现。
我将从思想,原理,复杂度和实现代码几个方面来讨论我所提到的算法。
1.全规模遍历筛法:
a)原理:根据素数的基本定义:只能被1或本身整除的数。我们通过用小于其本
身大于等于2的数去除它,判断余数过后方可知道其素性。
b)伪代码:
1.INPUT N;
2.DEFINE FLAG=0;
3.DEFINE I;
4.FOR(I=2;I IF(N%I==0) {FLAG=0;BREAK;} ELSE FLAG=1; } 5.IF(FLAG==0) OUTPUT UNPRIME; 6.ELSE OUTPUT PRIME; c)复杂度分析: a)可以很容易得看出,该算法对于测试一个素数的素性时,复杂度为 O(N)。 b)当测试数据为一个数为N的递增数串时,其复杂度为O(N*N)。 2.开方遍历算法: a)原理:由初等数论的基本知识可以知道,对于任意一个大于2的合数N来说, 下式是成立的: N=pow(p1,k1)*pow(p2,k2)*pow(p3,k3)*………………*pow(pn,kn)。 其中:pi (1<=i<=n) 表示已知素数2<=pi<=sqrt(N)+1 在这一点中pow(m,n)代表m的n次方,sqrt(m)代表m的开方,加一是为了保 险起见。 所以,我们对全规模遍历法会有一个优化就是将核心的循环步长由N优化为 至多sqrt(N)+1。 b)伪代码: 1.INPUT N; 2.DEFINE FLAG=0; 3.DEFINE I; 4.FOR(I=2;I IF(N%I==0) {FLAG=0;BREAK;} ELSE FLAG=1; } 5.IF(FLAG==0) OUTPUT UNPRIME; 6.ELSE OUTPUT PRIME; c)复杂度分析: i.根据和借鉴全规模的分析方式可以得出,在测试数据为单个数的情 况下,开方筛法的复杂度为O(SQRT(N))。 ii.在递增数串N的输入规模情况下复杂度为O(N* SQRT(N))。 3.Eratosthenes筛法: a)原理:根据初等数论中的基本算术定理衍生来的Eratosthenes筛法(求连续递 增素数表)。其基本的中心思想是这样的: i.生成自然数数表 ii.得到第一个素数2,并将2的倍数全部划掉(1就不用说了) iii.由于要得到一个质数,我们只需要确定他的开方数以内的大于2的自然数不会整除它,所以我们的到3是质数,然后划去3的倍数, 依次类推。 b)一些技巧: i.由于我们已经知道了对于一个数N,其的质因子会一定小于其开方 的向上取整数,所以对于连续数表来说,我们只需要把最大数开方 取整以内的质数的倍数找出即可,而这个过程又是伴随在主过程中 的。 c)伪代码: 1.INPUT N; 2.DEFINE I,J; 3.J=1; 4.J->FLAG=0; 5.FOR(I=2;I IF(J IS DELED) CONTINUE; FOR(J=2*I;J<=N;J=J+I){ J->FLAG=0; } } 6.FOR(I=1;I<=N;I++) IF(I->FLAG!=0) OUTPUT I; d)复杂度分析: i.可以看出,该算法的时间复杂度是常数级别的。但是其空间复杂度 确是O(N)。 ler Rabin算法: a)原理:根据费马小定理的一个变种,存在质数P使得下列式子成立: pow(A,(P-1))=1(MOD P)