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 相关文章推荐
Windows 7下Python Web环境搭建图文教程
Mar 20 Python
简单谈谈Python的pycurl模块
Apr 07 Python
详解Python3.6的py文件打包生成exe
Jul 13 Python
python实现字符串中字符分类及个数统计
Sep 28 Python
Django自带日志 settings.py文件配置方法
Aug 30 Python
通过实例简单了解Python中yield的作用
Dec 11 Python
Pytorch实现各种2d卷积示例
Dec 30 Python
Python实现鼠标自动在屏幕上随机移动功能
Mar 14 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
May 09 Python
python如何查看网页代码
Jun 07 Python
python实现文件分片上传的接口自动化
Nov 19 Python
Qt自定义Plot实现曲线绘制的详细过程
Nov 02 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 Document 代码注释规范
2009/04/13 PHP
解决php-fpm.service not found问题的办法
2017/06/06 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
基于jquery的Repeater实现代码
2010/07/17 Javascript
jQuery对表单元素的取值和赋值操作代码
2011/05/19 Javascript
两种常用的javascript数组去重方法思路及代码
2013/03/26 Javascript
Jquery带搜索框的下拉菜单
2013/05/06 Javascript
减少访问DOM的次数提升javascript性能
2014/02/24 Javascript
告诉你什么是javascript的回调函数
2014/09/04 Javascript
jQuery选择器全集详解
2014/11/24 Javascript
jQuery遮罩层实现方法实例详解(附遮罩层插件)
2015/12/08 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
vue省市区三联动下拉选择组件的实现
2017/04/28 Javascript
使用JS获取SessionStorage的值
2018/01/12 Javascript
解决linux下node.js全局模块找不到的问题
2018/05/15 Javascript
微信小程序通过保存图片分享到朋友圈功能
2018/05/24 Javascript
vue滚动插件better-scroll使用详解
2019/10/18 Javascript
vue 使用v-for进行循环的实例代码详解
2020/02/19 Javascript
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
python检测远程udp端口是否打开的方法
2015/03/14 Python
用实例解释Python中的继承和多态的概念
2015/04/27 Python
Python中的descriptor描述器简明使用指南
2016/06/02 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
基于DataFrame筛选数据与loc的用法详解
2018/05/18 Python
对python中if语句的真假判断实例详解
2019/02/18 Python
python 申请内存空间,用于创建多维数组的实例
2019/12/02 Python
使用python从三个角度解决josephus问题的方法
2020/03/27 Python
Anaconda+vscode+pytorch环境搭建过程详解
2020/05/25 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
The North Face北面法国官网:美国著名户外品牌
2019/11/01 全球购物
Perfume’s Club美国官网:西班牙第一家在线美容店
2020/06/10 全球购物
当x.equals(y)等于true时,x.hashCode()与y.hashCode()可以不相等,这句话对不对
2015/05/02 面试题
应届生服装设计自我评价
2013/09/20 职场文书
大众服装店创业计划书范文
2014/01/01 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
2015年社区工会工作总结
2015/05/26 职场文书