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中创建动态视图的教程
Jul 15 Python
Django框架中render_to_response()函数的使用方法
Jul 16 Python
使用python对excle和json互相转换的示例
Oct 23 Python
Python实现合并excel表格的方法分析
Apr 13 Python
pytorch获取vgg16-feature层输出的例子
Aug 20 Python
python3.5的包存放的具体路径
Aug 16 Python
python3.8动态人脸识别的实现示例
Sep 21 Python
python 实现逻辑回归
Dec 30 Python
快速一键生成Python爬虫请求头
Mar 04 Python
详解Python中下划线的5种含义
Jul 15 Python
python游戏开发之pygame实现接球小游戏
Apr 22 Python
Python+DeOldify实现老照片上色功能
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
PHP获得用户使用的代理服务器ip即真实ip
2006/12/31 PHP
php 获取本机外网/公网IP的代码
2010/05/09 PHP
基于session_unset与session_destroy的区别详解
2013/06/03 PHP
PHP中实现生成静态文件的方法缓解服务器压力
2014/01/07 PHP
php CI框架插入一条或多条sql记录示例
2014/07/29 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
2015/09/14 PHP
TopList标签和JavaScript结合两例
2007/08/12 Javascript
js下用gb2312编码解码实现方法
2009/12/31 Javascript
Javascript实现关联数据(Linked Data)查询及注意细节
2013/02/22 Javascript
深入理解Javascript作用域与变量提升
2013/12/09 Javascript
json中换行符的处理方法示例介绍
2014/06/10 Javascript
javascript显式类型转换实例分析
2015/04/25 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
jquery实现二级导航下拉菜单效果
2015/12/18 Javascript
javascript实现表单验证
2016/01/29 Javascript
微信小程序项目实践之主页tab选项实现
2018/07/18 Javascript
JavaScript Canvas实现验证码
2020/08/02 Javascript
JavaScript:ES2019 的新特性(译)
2019/08/08 Javascript
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
Python实现检测服务器是否可以ping通的2种方法
2015/01/01 Python
开源软件包和环境管理系统Anaconda的安装使用
2017/09/04 Python
对python GUI实现完美进度条的示例详解
2018/12/13 Python
python3正则提取字符串里的中文实例
2019/01/31 Python
Python中将两个或多个list合成一个list的方法小结
2019/05/12 Python
python 基于TCP协议的套接字编程详解
2019/06/29 Python
Pyecharts绘制全球流向图的示例代码
2020/01/08 Python
Daniel Wellington官方海外旗舰店:丹尼尔惠灵顿DW手表
2018/02/22 全球购物
房地产开发计划书
2014/01/10 职场文书
我的梦想演讲稿
2014/04/30 职场文书
国贸专业毕业求职信
2014/06/11 职场文书
2014年政风行风工作总结
2014/11/22 职场文书
简历自我评价模板
2015/03/11 职场文书
我的法兰西岁月观后感
2015/06/09 职场文书
导游词之五台山
2019/10/11 职场文书
如何在Python项目中引入日志
2021/05/31 Python
解决Python保存文件名太长OSError: [Errno 36] File name too long
2022/05/11 Python