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中使用模块的教程
Apr 27 Python
详解如何使用Python编写vim插件
Nov 28 Python
手把手教你python实现SVM算法
Dec 27 Python
python爬取淘宝商品销量信息
Nov 16 Python
Python实现的线性回归算法示例【附csv文件下载】
Dec 29 Python
Python中GeoJson和bokeh-1的使用讲解
Jan 03 Python
python异步存储数据详解
Mar 19 Python
python web框架中实现原生分页
Sep 08 Python
keras做CNN的训练误差loss的下降操作
Jun 22 Python
使用Keras建立模型并训练等一系列操作方式
Jul 02 Python
Python必须了解的35个关键词
Jul 16 Python
详解Python描述符的工作原理
Jun 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
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
2007/01/11 Javascript
Js动态创建div
2008/09/25 Javascript
web前端开发也需要日志
2010/12/09 Javascript
jqgrid 简单学习笔记
2011/05/03 Javascript
js中的push和join方法使用介绍
2013/10/08 Javascript
jquery获取一组checkbox的值(实例代码)
2013/11/04 Javascript
分享一个自己写的简单的javascript分页组件
2015/02/15 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
2015/06/23 Javascript
浅析创建javascript对象的方法
2016/05/13 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
2016/05/25 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
2016/06/30 Javascript
js html css实现复选框全选与反选
2016/10/09 Javascript
微信小程序 传值取值的几种方法总结
2017/01/16 Javascript
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
2017/10/17 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
2018/10/19 Javascript
解决vue项目axios每次请求session不一致的问题
2020/10/24 Javascript
深入浅析ImageMagick命令执行漏洞
2016/10/11 Python
tensorflow训练中出现nan问题的解决
2018/02/10 Python
python通过Windows下远程控制Linux系统
2018/06/20 Python
Python爬虫学习之获取指定网页源码
2019/07/30 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
python使用Matplotlib改变坐标轴的默认位置
2019/10/18 Python
Django异步任务线程池实现原理
2019/12/17 Python
利用Python将多张图片合成视频的实现
2020/11/23 Python
Html5 语法与规则简要概述
2014/07/29 HTML / CSS
财务会计人员求职的自我评价
2014/01/13 职场文书
搞笑婚礼主持词
2014/03/13 职场文书
家长通知书家长评语
2014/04/17 职场文书
经典毕业生求职信
2014/07/12 职场文书
安全目标管理责任书
2014/07/25 职场文书
教师个人事迹材料
2014/12/17 职场文书
试用期辞职信范文
2015/03/02 职场文书
消防宣传语大全
2015/07/13 职场文书