python素数筛选法浅析

  

<强>原理:

  

素数,指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。在加密应用中起重要的位置,比如广为人知的RSA算法中,就是基于大整数的因式分解难题,寻找两个超大的素数然后相乘作为密钥的。一个比较常见的求素数的办法是<强> 强,说简单一点就是画表格,然后删表格,如图所示:

  

 python素数筛选法浅析

  

从2开始依次往后面数,如果当前数字一个素数,那么就将所有其倍数的数从表中删除或者标记,然后最终得到所有的素数。

  

有一个优化:

  

标记2和3的倍数的时候,6被标记了两次,所以从我的平方开始标记,减少很多时间。

  

比如3的倍数从9开始标记,而不是6,并且每次加6 .

  

除了2以外,所有素数都是奇数。奇数的平方还是奇数,如果再加上奇数就变成了偶数一定不会是素数,所以加偶数(2倍素数)。

  

预先处理了所有偶数。

  

注意:1既不是素数也不是合数,这里没有处理1。
  

        # !prime.py   导入的时间      def质数(n):   P=[]   f=[]   因为我在范围(n + 1):   如果我在2我% 2==0:   f.append (1)   其他:   f.append (0)      我=3   当我*我& lt;=n:   如果f[我]==0:   j=我*   虽然j & lt;=n:   f [j]=1   j +=+我   我+=2      P.append (2)   因为我在范围(3,n, 2):   如果f[我]==0:   P.append(我)      返回P      def isPrime (n):   如果n比;2和n % 2==0:   返回0      我=3   当我*我& lt;=n:   如果n % i==0:   返回0   我+=2      返回1      def primeCnt (n):   问=0   因为我在范围(2 n):   如果isPrime(我):   问+=1   回来问      if __name__==癬_main__”:   开始=time.clock ()   n=10000000   P=质数(n);   打印(“有小于% d % d质数“% (len (P), n))   #我的范围(10):   #打印(P[我])   打印(时间:% f % (time.clock()实体法))   # n的范围(100000):   #如果isPrime (n):   #打印(“% d '”% n)   #打印(% d % n +其他(如果isPrime (n)“'”“不'))      开始=time.clock ()   n=1000000   打印(“有小于% d % d质数“% (primeCnt (n), n))   打印(时间:% f % (time.clock()实体法)      

用素数筛选法1千求万以内的素数用了5.767秒,

  

普通素数判断法求1百万以内的素数用了9.642秒,

  

用c++素数筛选法求1亿以内的素数用了0.948秒,

  

用c++普通素数判断法1千求万以内的素数用了3.965秒,

  

可见解释语言确实比编译语言慢很多。

  

附c++程序,用了位压缩优化空间

        # include & lt; iostream>   # include & lt; cstdio>   # include & lt; algorithm>   使用名称空间性病;   #定义N 100000001      无符号f [(N>祝辞;5)+ 5];   int p [5761456], m;   无效的init ()   {   伊特伊,j:   (我=4;i祝辞;5)|=1 & lt; & lt;(打折期0 x1f);   p [m + +]=2;   (我=3,* i祝辞;5),(1 & lt; & lt;(打折期0 x1f))))   {   p [m + +]=我;   (j=我*;j祝辞;5)|=1 & lt; & lt; (j& 0 x1f);   }   (我;i祝辞;5),(1 & lt; & lt;(打折期0 x1f))))   p [m + +]=我;   }   int is_prime (int n)   {   int我;   (我=0,p[我]* p[我]& lt;=n;我+ +)   如果(n % p[我]==0)   返回0;   返回1;   }   int isPrime (int n)   {   如果(n> 2,,n % 2==0)   返回0;   int i=3;   虽然(我* i<=n)   {   如果(n %我==0)   返回0;   我+=2;   }   返回1;   }   int main ()   {   int n=0,我;   clock_t圣=时钟();   init ();/*(我=2;i<10000000;我+ +)   如果(isPrime (i))   n + +, */printf (" % d % dms \ n”, m,时钟()-);/*当(~ scanf (“% d”,和n), n)   {   我=lower_bound (p, p + m, n + 1) - p;   printf (" % d \ n”,我);   } */返回0;   }      

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

python素数筛选法浅析