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打印scrapy蜘蛛抓取树结构的方法
Apr 08 Python
Python实现扩展内置类型的方法分析
Oct 16 Python
python实现音乐下载器
Apr 15 Python
python判断数字是否是超级素数幂
Sep 27 Python
Django 实现购物车功能的示例代码
Oct 08 Python
python 处理微信对账单数据的实例代码
Jul 19 Python
手写一个python迭代器过程详解
Aug 27 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
Sep 23 Python
python 实现让字典的value 成为列表
Dec 16 Python
Pytorch之Variable的用法
Dec 31 Python
浅谈在django中使用redirect重定向数据传输的问题
Mar 13 Python
Python Pandas pandas.read_sql_query函数实例用法分析
Jun 21 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
DC动漫人物排行
2020/03/03 欧美动漫
《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
从PHP $_SERVER相关参数判断是否支持Rewrite模块
2013/09/26 PHP
PHP单例模式详解及实例代码
2016/12/21 PHP
PHP工厂模式、单例模式与注册树模式实例详解
2019/06/03 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
JavaScript去除空格的几种方法
2006/10/03 Javascript
js网页版计算器的简单实现
2013/07/02 Javascript
浅析ajax请求json数据并用js解析(示例分析)
2013/07/13 Javascript
JS实现div居中示例
2014/04/17 Javascript
JQuery表单验证插件EasyValidator用法分析
2014/11/15 Javascript
浅谈jquery上下滑动的注意事项
2016/10/13 Javascript
手机端转换rem适应
2017/04/01 Javascript
Vue实现一个返回顶部backToTop组件
2017/07/25 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
webpack 样式加载的实现原理
2018/06/12 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
微信小程序实现多张图片上传功能
2020/11/18 Javascript
跟老齐学Python之大话题小函数(2)
2014/10/10 Python
python利用正则表达式提取字符串
2016/12/08 Python
R语言 vs Python对比:数据分析哪家强?
2017/11/17 Python
利用Anaconda简单安装scrapy框架的方法
2018/06/13 Python
在Python 中同一个类两个函数间变量的调用方法
2019/01/31 Python
Python绘制频率分布直方图的示例
2019/07/08 Python
使用python将微信image下.dat文件解密为.png的方法
2020/11/30 Python
Columbia Sportswear法国官网:全球户外品牌
2020/09/25 全球购物
省优秀教师事迹材料
2014/01/30 职场文书
中学生个人自我评价
2014/02/06 职场文书
幼儿园门卫岗位职责
2014/02/14 职场文书
活动总结报告格式
2014/05/09 职场文书
学校就业推荐信范文
2014/05/19 职场文书
销售顾问工作计划书
2014/09/15 职场文书
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
分享几个实用的CSS代码块
2022/06/10 HTML / CSS