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调用java模块SmartXLS和jpype修改excel文件的方法
Apr 28 Python
python分析网页上所有超链接的方法
May 08 Python
使用python实现个性化词云的方法
Jun 16 Python
对pandas数据判断是否为NaN值的方法详解
Nov 06 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
Jun 17 Python
Python检查 云备份进程是否正常运行代码实例
Aug 22 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
Jan 08 Python
python实现加密的方式总结
Jan 19 Python
Python super()方法原理详解
Mar 31 Python
将keras的h5模型转换为tensorflow的pb模型操作
May 25 Python
简单了解Python多态与属性运行原理
Jun 15 Python
PYTHON 使用 Pandas 删除某列指定值所在的行
Apr 28 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编程实现简单的网页版计算器功能示例
2017/04/26 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
php异常处理捕获错误整理
2019/09/23 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
学习YUI.Ext 第二天
2007/03/10 Javascript
JavaScript 节点操作 以及DOMDocument属性和方法
2007/12/06 Javascript
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
2010/05/13 Javascript
推荐20家国外的脚本下载网站
2011/04/28 Javascript
js onkeypress与onkeydown 事件区别详细说明
2012/12/13 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
js日期联动示例
2014/05/02 Javascript
nodejs 整合kindEditor实现图片上传
2015/02/03 NodeJs
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
Vue.js实现简单ToDoList 前期准备(一)
2016/12/01 Javascript
详解vue2.0 不同屏幕适配及px与rem转换问题
2018/02/23 Javascript
Vue传参一箩筐(页面、组件)
2019/04/04 Javascript
vue视频播放插件vue-video-player的具体使用方法
2019/11/08 Javascript
如何修改Vue打包后文件的接口地址配置的方法
2020/04/22 Javascript
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
Python的多维空数组赋值方法
2018/04/13 Python
python判断数字是否是超级素数幂
2018/09/27 Python
python去除拼音声调字母,替换为字母的方法
2018/11/28 Python
树莓派采用socket方式文件传输(python)
2019/06/22 Python
python区块及区块链的开发详解
2019/07/03 Python
使用matplotlib绘制图例标签中带有公式的图
2019/12/13 Python
Pytorch中的VGG实现修改最后一层FC
2020/01/15 Python
CSS3 :nth-child()伪类选择器实现奇偶行显示不同样式
2013/11/05 HTML / CSS
html如何对span设置宽度
2019/10/30 HTML / CSS
95%的面试官都会问到的50道Java线程题,附答案
2012/08/03 面试题
学前教育学生自荐信范文
2013/12/31 职场文书
优秀驾驶员先进事迹材料
2014/05/04 职场文书
物流管理专业自荐信
2014/06/23 职场文书
大国崛起英国观后感
2015/06/02 职场文书
MySQL分库分表与分区的入门指南
2021/04/22 MySQL
使用这 6个Vue加载动画库来减少我们网站的跳出率
2021/05/18 Vue.js
redis哨兵常用命令和监控示例详解
2021/05/27 Redis