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 del()函数用法
Mar 24 Python
Python调用命令行进度条的方法
May 05 Python
Python实现在线音乐播放器
Mar 03 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
Mar 14 Python
Python中logging实例讲解
Jan 17 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
Apr 18 Python
解决Pycharm的项目目录突然消失的问题
Jan 20 Python
浅谈pytorch torch.backends.cudnn设置作用
Feb 20 Python
python 比较字典value的最大值的几种方法
Apr 17 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
Jun 11 Python
Python获取excel内容及相关操作代码实例
Aug 10 Python
LyScript实现绕过反调试保护的示例详解
Aug 14 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
php自动跳转中英文页面
2008/07/29 PHP
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
2014/06/25 PHP
PHP使用array_fill定义多维数组的方法
2015/03/18 PHP
php外部执行命令函数用法小结
2016/10/11 PHP
CI框架AR数据库操作常用函数总结
2016/11/21 PHP
php实现将数据做成json的格式给前端使用
2018/08/21 PHP
PHP实现微信对账单处理
2018/10/01 PHP
HTTP状态代码以及定义(解释)
2007/02/02 Javascript
爆炸式的JS圆形浮动菜单特效代码
2010/03/03 Javascript
javascript 弹出窗口中是否显示地址栏的实现代码
2011/04/14 Javascript
Jquery对象和Dom对象的区别分析
2014/11/20 Javascript
JavaScript学习笔记之DOM基础 2.4
2015/08/14 Javascript
animate 实现滑动切换效果【实例代码】
2016/05/05 Javascript
js中的深浅拷贝问题简析
2019/05/10 Javascript
微信小程序如何再次获取用户授权的方法
2019/05/10 Javascript
jQuery事件绑定和解绑、事件冒泡与阻止事件冒泡及弹出应用示例
2019/05/13 jQuery
Vue实现计算器计算效果
2020/08/17 Javascript
JavaScript实现移动端拖动元素
2020/11/24 Javascript
vue3.0 自适应不同分辨率电脑的操作
2021/02/06 Vue.js
[02:48]DOTA2超级联赛专访海涛:你们的选择没有错
2013/06/07 DOTA
[47:03]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第二场 12.10
2020/12/13 DOTA
Python 2.7.x 和 3.x 版本的重要区别小结
2014/11/28 Python
Python实现控制台进度条功能
2016/01/04 Python
python 调用HBase的简单实例
2016/12/18 Python
Python表示矩阵的方法分析
2017/05/26 Python
python自动重试第三方包retrying模块的方法
2018/04/24 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
2018/06/11 Python
pytorch 准备、训练和测试自己的图片数据的方法
2020/01/10 Python
Python 实现网课实时监控自动签到、打卡功能
2020/03/12 Python
Keras实现支持masking的Flatten层代码
2020/06/16 Python
解决PDF 转图片时丢文字的一种可能方式
2021/03/04 Python
小组名称和口号
2014/06/09 职场文书
公共场所禁烟倡议书
2014/08/30 职场文书
报到证办理个人委托书
2014/10/06 职场文书
王亚平太空授课观后感
2015/06/12 职场文书
springboot新建项目pom.xml文件第一行报错的解决
2022/01/18 Java/Android