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分割TXT文件成4K的TXT文件
May 23 Python
精确查找PHP WEBSHELL木马的方法(1)
Apr 12 Python
Python多线程同步Lock、RLock、Semaphore、Event实例
Nov 21 Python
使用PDB简单调试Python程序简明指南
Apr 25 Python
Python实现爬取逐浪小说的方法
Jul 07 Python
Python图像滤波处理操作示例【基于ImageFilter类】
Jan 03 Python
python实现画五角星和螺旋线的示例
Jan 20 Python
python 获取毫秒数,计算调用时长的方法
Feb 20 Python
python-pyinstaller、打包后获取路径的实例
Jun 10 Python
如何用python 操作zookeeper
Dec 28 Python
Python基础之pandas数据合并
Apr 27 Python
Python中json.load()和json.loads()有哪些区别
Jun 07 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/11/14 PHP
通过具体程序来理解PHP里面的抽象类
2010/01/28 PHP
批量去除PHP文件中bom的PHP代码
2012/03/13 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
2014/03/08 PHP
PHP网站自动化配置的实现方法(必看)
2017/05/27 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
PHP解析url并得到url参数方法总结
2018/10/11 PHP
JavaScript触发器详解
2007/03/10 Javascript
基于jquery的网站幻灯片切换效果焦点图代码
2013/09/15 Javascript
js+div实现图片滚动效果代码
2014/02/10 Javascript
解决jquery实现的radio重新选中的问题
2015/07/03 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
javascript绘制漂亮的心型线效果完整实例
2016/02/02 Javascript
js添加事件的通用方法推荐
2016/05/15 Javascript
如何在Angular2中使用jQuery及其插件的方法
2017/02/09 Javascript
JQuery 进入页面默认给已赋值的复选框打钩
2017/03/23 jQuery
layui导航栏实现代码
2017/05/19 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
2017/08/16 Javascript
浅谈vue的踩坑路
2017/08/31 Javascript
react-native-fs实现文件下载、文本存储的示例代码
2017/09/22 Javascript
浅析Vue 防抖与节流的使用
2019/11/14 Javascript
vue页面引入three.js实现3d动画场景操作
2020/08/10 Javascript
[06:57]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD 选手采访
2021/03/11 DOTA
python利用Guetzli批量压缩图片
2017/03/23 Python
python实现换位加密算法的示例
2018/10/14 Python
解决python中使用PYQT时中文乱码问题
2019/06/17 Python
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
利用pyecharts读取csv并进行数据统计可视化的实现
2020/04/17 Python
鱼油专家:Omegavia
2016/10/10 全球购物
葡萄牙航空官方网站:TAP Air Portugal
2019/10/31 全球购物
生物科学系大学生的自我评价
2013/12/20 职场文书
电焊工工作岗位职责
2014/02/06 职场文书
幸福中国演讲稿
2014/09/12 职场文书
党员观看《筑梦中国》心得体会
2016/01/18 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers
Centos7 Shell编程之正则表达式、文本处理工具详解
2022/08/05 Servers