Python素数检测的方法


Posted in Python onMay 11, 2015

本文实例讲述了Python素数检测的方法。分享给大家供大家参考。具体如下:

因子检测:

检测因子,时间复杂度O(n^(1/2))

def is_prime(n):
  if n < 2:
    return False
  for i in xrange(2, int(n**0.5+1)):
    if n%i == 0:
      return False
  return True

费马小定理:

如果n是一个素数,a是小于n的任意正整数,那么a的n次方与a模n同余

实现方法:

选择一个底数(例如2),对于大整数p,如果2^(p-1)与1不是模p同余数,则p一定不是素数;否则,则p很可能是一个素数
2**(n-1)%n 不是一个容易计算的数字

模运算规则:

(a^b) % p = ((a % p)^b) % p
(a * b) % p = (a % p * b % p) % p

计算X^N(% P)

可以
如果N是偶数,那么X^N =(X*X)^[N/2];
如果N是奇数,那么X^N = X*X^(N-1) = X *(X*X)^[N/2];

def xn_mod_p(x, n, p):
  if n == 0:
    return 1
  res = xn_mod_p((x*x)%p, n>>1, p)
  if n&1 != 0:
    res = (res*x)%p
  return res

也可以归纳为下面的算法 两个函数是一样的

def xn_mod_p2(x, n, p):
  res = 1
  n_bin = bin(n)[2:]
  for i in range(0, len(n_bin)):
    res = res**2 % p
    if n_bin[i] == '1':
      res = res * x % p
  return res

有了模幂运算快速处理就可以实现费马检测

费马测试当给出否定结论时,是准确的,但是肯定结论有可能是错误的,对于大整数的效率很高,并且误判率随着整数的增大而降低

def fermat_test_prime(n):
  if n == 1:
    return False
  if n == 2:
    return True
  res = xn_mod_p(2, n-1, n)
  return res == 1

MILLER-RABIN检测

Miller-Rabin检测是目前应用比较广泛的一种

二次探测定理:如果p是一个素数,且0<x<p,则方程x^2%p=1的解为:x=1或x=p-1
费马小定理:a^(p-1) ≡ 1(mod p)

这就是Miller-Rabin素性测试的方法。不断地提取指数n-1中的因子2,把n-1表示成d*2^r(其中d是一个奇数)。那么我们需要计算的东西就变成了a的d*2^r次方除以n的余数。于是,a^(d * 2^(r-1))要么等于1,要么等于n-1。如果a^(d * 2^(r-1))等于1,定理继续适用于a^(d * 2^(r-2)),这样不断开方开下去,直到对于某个i满足a^(d * 2^i) mod n = n-1或者最后指数中的2用完了得到的a^d mod n=1或n-1。这样,Fermat小定理加强为如下形式:

尽可能提取因子2,把n-1表示成d*2^r,如果n是一个素数,那么或者a^d mod n=1,或者存在某个i使得a^(d*2^i) mod n=n-1 ( 0<=i<r ) (注意i可以等于0,这就把a^d mod n=n-1的情况统一到后面去了)

定理:若n是素数,a是小于n的正整数,则n对以a为基的Miller测试,结果为真.
Miller测试进行k次,将合数当成素数处理的错误概率最多不会超过4^(-k)

def miller_rabin_witness(a, p):
  if p == 1:
    return False
  if p == 2:
    return True
  #p-1 = u*2^t 求解 u, t
  n = p - 1
  t = int(math.floor(math.log(n, 2)))
  u = 1
  while t > 0:
    u = n / 2**t
    if n % 2**t == 0 and u % 2 == 1:
      break
    t = t - 1
  b1 = b2 = xn_mod_p2(a, u, p)
  for i in range(1, t + 1):
    b2 = b1**2 % p
    if b2 == 1 and b1 != 1 and b1 != (p - 1):
      return False
    b1 = b2
  if b1 != 1:
    return False
  return True
def prime_test_miller_rabin(p, k):
  while k > 0:
    a = randint(1, p - 1)
    if not miller_rabin_witness(a, p):
      return False
    k = k - 1
  return True

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
Python通过websocket与js客户端通信示例分析
Jun 25 Python
使用Python多线程爬虫爬取电影天堂资源
Sep 23 Python
python解决网站的反爬虫策略总结
Oct 26 Python
Python中scatter函数参数及用法详解
Nov 08 Python
Anaconda 离线安装 python 包的操作方法
Jun 11 Python
Python3 Post登录并且保存cookie登录其他页面的方法
Dec 28 Python
pandas DataFrame 行列索引及值的获取的方法
Jul 02 Python
Python实现最常见加密方式详解
Jul 13 Python
Python的垃圾回收机制详解
Aug 28 Python
基于python读取.mat文件并取出信息
Dec 16 Python
django中的数据库迁移的实现
Mar 16 Python
Python并发爬虫常用实现方法解析
Nov 19 Python
Python中IPYTHON入门实例
May 11 #Python
Python使用MONGODB入门实例
May 11 #Python
python学习数据结构实例代码
May 11 #Python
Python使用CMD模块更优雅的运行脚本
May 11 #Python
Python中DJANGO简单测试实例
May 11 #Python
python单元测试unittest实例详解
May 11 #Python
Python使用MYSQLDB实现从数据库中导出XML文件的方法
May 11 #Python
You might like
PHP 设置MySQL连接字符集的方法
2011/01/02 PHP
PHP把JPEG图片转换成Progressive JPEG的方法
2014/06/30 PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
2015/12/21 PHP
php判断用户是否关注微信公众号
2016/07/22 PHP
golang与PHP输出excel示例
2016/07/22 PHP
Laravel框架基于ajax实现二级联动功能示例
2019/01/17 PHP
jQuery DOM插入节点操作指南
2015/03/03 Javascript
Jquery插件实现点击获取验证码后60秒内禁止重新获取
2015/03/13 Javascript
原生js的数组除重复简单实例
2016/05/24 Javascript
js点击按钮实现水波纹效果代码(CSS3和Canves)
2016/09/15 Javascript
常用原生js自定义函数总结
2016/11/20 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
2017/02/27 Javascript
解决vue+webpack打包路径的问题
2018/03/06 Javascript
Vue.js实现的表格增加删除demo示例
2018/05/22 Javascript
node.js 模块和其下载资源的镜像设置的方法
2018/09/06 Javascript
vue递归组件实战之简单树形控件实例代码
2019/08/27 Javascript
VUE兄弟组件传值操作实例分析
2019/10/26 Javascript
跟老齐学Python之关于循环的小伎俩
2014/10/02 Python
Python的Bottle框架的一些使用技巧介绍
2015/04/08 Python
python中zip和unzip数据的方法
2015/05/27 Python
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
总结网络IO模型与select模型的Python实例讲解
2016/06/27 Python
Python实现动态加载模块、类、函数的方法分析
2017/07/18 Python
python实现生成字符串大小写字母和数字的各种组合
2019/01/01 Python
Python字符串处理的8招秘籍(小结)
2019/08/13 Python
python使用协程实现并发操作的方法详解
2019/12/27 Python
Pytorch maxpool的ceil_mode用法
2020/02/18 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
2020/03/09 Python
python3从网络摄像机解析mjpeg http流的示例
2020/11/13 Python
美国本地交易和折扣网站:LocalFlavor.com
2017/10/26 全球购物
在线购买澳大利亚设计师手拿包和奢华晚装手袋:Olga Berg
2019/03/20 全球购物
人事专员工作职责
2014/02/22 职场文书
房展策划方案
2014/06/07 职场文书
家长学校培训材料
2014/08/20 职场文书
安全守法证明
2015/06/23 职场文书
详解Nginx启动失败的几种错误处理
2021/04/01 Servers