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使用webbrowser浏览指定url的方法
Apr 04 Python
Python实现多线程抓取妹子图
Aug 08 Python
python中根据字符串调用函数的实现方法
Jun 12 Python
python学习教程之Numpy和Pandas的使用
Sep 11 Python
用python实现将数组元素按从小到大的顺序排列方法
Jul 02 Python
对Python中Iterator和Iterable的区别详解
Oct 18 Python
python try except 捕获所有异常的实例
Oct 18 Python
pthon贪吃蛇游戏详细代码
Jan 27 Python
Python父目录、子目录的相互调用方法
Feb 16 Python
对PyQt5的输入对话框使用(QInputDialog)详解
Jun 25 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
Sep 07 Python
python使用paramiko实现ssh的功能详解
Mar 06 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设计模式之访问者模式
2016/09/23 PHP
PHP实现简易blog的制作
2016/10/24 PHP
php中时间函数date及常用的时间计算
2017/05/12 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
php json转换相关知识(小结)
2018/12/21 PHP
JavaScript中各种编码解码函数的区别和注意事项
2010/08/19 Javascript
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
jquery多选项卡效果实例代码(附效果图)
2013/03/23 Javascript
用javascript将数据导入Excel示例代码
2014/09/10 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
JavaScript小技巧整理
2015/12/30 Javascript
easyui中combotree循环获取父节点至根节点并输出路径实现方法
2016/11/10 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
2017/04/13 Javascript
深入浅出es6模板字符串
2017/08/26 Javascript
react中的ajax封装实例详解
2017/10/17 Javascript
浅谈Node.js之异步流控制
2017/10/25 Javascript
基于 Vue 实现一个酷炫的 menu插件
2017/11/14 Javascript
微信小程序商品详情页的底部弹出框效果
2020/11/16 Javascript
javascript中floor使用方法总结
2019/02/02 Javascript
超简单的微信小程序轮播图
2019/11/22 Javascript
python抓取网页中的图片示例
2014/02/28 Python
Python获取网页上图片下载地址的方法
2015/03/11 Python
windows10系统中安装python3.x+scrapy教程
2016/11/08 Python
Python threading的使用方法解析
2019/08/28 Python
全球最大的生存食品、水和装备专用在线市场:BePrepared.com
2020/01/02 全球购物
Java中各种基本数据类型的默认值都是什么
2016/12/22 面试题
医院护理人员的自我评价分享
2013/10/04 职场文书
实习自荐信
2013/10/13 职场文书
小学生手册家长评语
2014/04/16 职场文书
我心目中的好老师活动方案
2014/08/19 职场文书
2014年人民警察入党思想汇报
2014/10/12 职场文书
优秀团队申报材料
2014/12/26 职场文书
2015教师年度考核评语
2015/03/25 职场文书
爱国主题班会教案
2015/08/14 职场文书
2019开业庆典剪彩仪式主持词!
2019/07/22 职场文书
MySQL数据库⾼可⽤HA实现小结
2022/01/22 MySQL