python素数筛选法浅析


Posted in Python onMarch 19, 2018

原理:

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

python素数筛选法浅析

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

有一个优化:

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

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

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

预先处理了所有偶数。

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

#! prime.py 
import time 
 
def primes(n): 
 P = [] 
 f = [] 
 for i in range(n+1): 
  if i > 2 and i%2 == 0: 
   f.append(1) 
  else: 
   f.append(0) 
 
 i = 3 
 while i*i <= n: 
  if f[i] == 0: 
   j = i*i 
   while j <= n: 
    f[j] = 1 
    j += i+i 
  i += 2 
 
 P.append(2) 
 for i in range(3,n,2): 
  if f[i] == 0: 
   P.append(i) 
 
 return P 
 
def isPrime(n): 
 if n > 2 and n%2 == 0: 
  return 0 
 
 i = 3 
 while i*i <= n: 
  if n%i == 0: 
   return 0 
  i += 2 
 
 return 1 
 
def primeCnt(n): 
 cnt = 0 
 for i in range(2,n): 
  if isPrime(i): 
   cnt += 1 
 return cnt 
 
if __name__ == '__main__': 
 start = time.clock() 
 n = 10000000 
 P = primes(n); 
 print("There are %d primes less than %d"%(len(P),n)) 
 #for i in range(10): 
 # print(P[i]) 
 print("Time: %f"%(time.clock()-start)) 
 #for n in range(2,100000): 
 # if isPrime(n): 
 #  print("%d is prime"%n) 
  #print("%d is "%n + ("prime" if isPrime(n) else "not prime")) 
 
 start = time.clock() 
 n = 1000000 
 print("There are %d primes less than %d"%(primeCnt(n),n)) 
 print("Time: %f"%(time.clock()-start)

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

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

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

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

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

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

#include <iostream> 
#include <cstdio> 
#include <algorithm> 
using namespace std; 
#define N 100000001 
 
unsigned f[(N>>5)+5]; 
int p[5761456],m; 
void init() 
{ 
  int i,j; 
  for(i=4;i<N;i+=2) 
    f[i>>5]|=1<<(i&0x1F); 
  p[m++]=2; 
  for(i=3;i*i<N;i+=2) 
    if(!(f[i>>5]&(1<<(i&0x1F)))) 
    { 
      p[m++]=i; 
      for(j=i*i;j<N;j+=i+i) 
        f[j>>5]|=1<<(j&0x1F); 
    } 
  for(;i<N;i+=2) 
    if(!(f[i>>5]&(1<<(i&0x1F)))) 
      p[m++]=i; 
} 
int is_prime(int n) 
{ 
  int i; 
  for(i=0;p[i]*p[i]<=n;i++) 
    if(n%p[i]==0) 
      return 0; 
  return 1; 
} 
int isPrime(int n) 
{ 
  if(n>2 && n%2==0) 
    return 0; 
  int i=3; 
  while(i*i<=n) 
  { 
    if(n%i==0) 
      return 0; 
    i+=2; 
  } 
  return 1; 
} 
int main() 
{ 
  int n=0,i; 
  clock_t st=clock(); 
  init(); 
  /*for(i=2;i<10000000;i++) 
    if(isPrime(i)) 
      n++;*/ 
  printf("%d %dms\n",m,clock()-st); 
  /*while(~scanf("%d",&n),n) 
  { 
    i=lower_bound(p,p+m,n+1)-p; 
    printf("%d\n",i); 
  }*/ 
  return 0; 
}

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

Python 相关文章推荐
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
Nov 08 Python
python放大图片和画方格实现算法
Mar 30 Python
Python实现针对给定单链表删除指定节点的方法
Apr 12 Python
python实现对指定输入的字符串逆序输出的6种方法
Apr 26 Python
详解python做UI界面的方法
Feb 27 Python
Python一键安装全部依赖包的方法
Aug 12 Python
Python使用APScheduler实现定时任务过程解析
Sep 11 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
Dec 12 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
May 26 Python
python 统计代码耗时的几种方法分享
Apr 02 Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Apr 12 Python
Python 绘制多因子柱状图
May 11 Python
python实现堆和索引堆的代码示例
Mar 19 #Python
python实现一个简单的并查集的示例代码
Mar 19 #Python
python使用筛选法计算小于给定数字的所有素数
Mar 19 #Python
python将每个单词按空格分开并保存到文件中
Mar 19 #Python
python将文本分每两行一组并保存到文件
Mar 19 #Python
python: line=f.readlines()消除line中\n的方法
Mar 19 #Python
Python File readlines() 使用方法
Mar 19 #Python
You might like
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
PHP中__FILE__、dirname与basename用法实例分析
2014/12/01 PHP
CI框架集成Smarty的方法分析
2016/05/17 PHP
javascript 播放器 控制
2007/01/22 Javascript
往光标所在位置插入值的js代码
2013/09/22 Javascript
JavaScript的内存释放问题详解
2015/01/21 Javascript
js正则表达式中exec用法实例
2015/07/23 Javascript
JQuery标签页效果实例详解
2015/12/24 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
Vue表单之v-model绑定下拉列表功能
2019/05/14 Javascript
使用vue-router在Vue页面之间传递数据的方法
2019/07/15 Javascript
利用layer实现表单完美验证的方法
2019/09/26 Javascript
webpack中的模式(mode)使用详解
2020/02/20 Javascript
JS绘图Flot应用图形绘制异常解决方案
2020/10/16 Javascript
[01:04]不如跳舞!DOTA2新英雄玛尔斯的欢乐日常
2019/03/11 DOTA
python使用nntp读取新闻组内容的方法
2015/05/08 Python
Python3.5面向对象编程图文与实例详解
2019/04/24 Python
jupyter 使用Pillow包显示图像时inline显示方式
2020/04/24 Python
python+requests接口压力测试500次,查看响应时间的实例
2020/04/30 Python
django 数据库返回queryset实现封装为字典
2020/05/19 Python
如何在python中判断变量的类型
2020/07/29 Python
Python如何发送与接收大型数组
2020/08/07 Python
CSS3中设置3D变形的transform-style属性详解
2016/05/23 HTML / CSS
详解CSS3+JS完美实现放大镜模式
2020/12/03 HTML / CSS
美国知名女性服饰品牌:New York & Company
2017/03/23 全球购物
RIP版本1跟版本2的区别
2013/12/30 面试题
简历里的自我评价
2014/01/31 职场文书
请假条标准格式规范
2014/04/10 职场文书
保护动物倡议书
2014/04/15 职场文书
工厂门卫的岗位职责
2014/07/27 职场文书
见习报告格式范文
2014/11/08 职场文书
大二学年个人总结
2015/03/03 职场文书
2015年五四青年节演讲稿
2015/03/18 职场文书
给领导敬酒词
2015/08/12 职场文书
JavaScript的Set数据结构详解
2022/02/18 Javascript
css filter和getUserMedia的联合使用
2022/02/24 HTML / CSS