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 相关文章推荐
Django应用程序中如何发送电子邮件详解
Feb 04 Python
使用Python对MySQL数据操作
Apr 06 Python
简单了解OpenCV是个什么东西
Nov 10 Python
一个Python最简单的接口自动化框架
Jan 02 Python
一些Centos Python 生产环境的部署命令(推荐)
May 07 Python
对python csv模块配置分隔符和引用符详解
Dec 12 Python
python匹配两个短语之间的字符实例
Dec 25 Python
使用Python进行体育竞技分析(预测球队成绩)
May 16 Python
django框架防止XSS注入的方法分析
Jun 21 Python
使用tensorflow显示pb模型的所有网络结点方式
Jan 23 Python
python 爬虫 实现增量去重和定时爬取实例
Feb 28 Python
python统计字符串中字母出现次数代码实例
Mar 02 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
全国FM电台频率大全 - 6 辽宁省
2020/03/11 无线电
探讨PHP使用eAccelerator的API开发详解
2013/06/09 PHP
PHP5全版本绕过open_basedir读文件脚本漏洞详细介绍
2015/01/20 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
Laravel框架实现的记录SQL日志功能示例
2018/06/19 PHP
thinkphp5.1 框架钩子和行为用法实例分析
2020/05/25 PHP
js模拟实现Array的sort方法
2007/12/11 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
js异步加载的三种解决方案
2013/03/04 Javascript
JavaScript按值删除数组元素的方法
2015/04/24 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
2015/08/12 Javascript
js发送短信倒计时的简单实现方法
2016/09/08 Javascript
从零学习node.js之详解异步控制工具async(八)
2017/02/27 Javascript
JS数组操作中的经典算法实例讲解
2017/07/26 Javascript
微信小程序下拉刷新PullDownRefresh的使用方法
2018/11/29 Javascript
[01:07]DOTA2次级职业联赛 - Fpb战队宣传片
2014/12/01 DOTA
使用python实现strcmp函数功能示例
2014/03/25 Python
使用70行Python代码实现一个递归下降解析器的教程
2015/04/17 Python
python 实现倒排索引的方法
2018/12/25 Python
Django 解决distinct无法去除重复数据的问题
2020/05/20 Python
Python pymysql模块安装并操作过程解析
2020/10/13 Python
html5 canvas-1.canvas介绍(hello canvas)
2013/01/07 HTML / CSS
美国牛仔品牌:True Religion
2018/11/16 全球购物
FirstCry阿联酋儿童和婴儿产品网上购物:FirstCry.ae
2021/02/22 全球购物
数据库基础的一些面试题
2012/02/25 面试题
优秀毕业生推荐信
2013/11/02 职场文书
高中运动会入场词
2014/02/14 职场文书
运动会方阵口号
2014/06/07 职场文书
五一口号
2014/06/19 职场文书
青年标兵事迹材料
2014/08/16 职场文书
水知道答案观后感
2015/06/08 职场文书
学生会副主席竞选稿
2015/11/19 职场文书
MySQL中order by的使用详情
2021/11/17 MySQL
Go语言安装并操作redis的go-redis库
2022/04/14 Golang
JS setTimeout与setInterval的区别
2022/04/20 Javascript