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获取apk文件URL地址实例
Nov 01 Python
python多线程编程中的join函数使用心得
Sep 02 Python
在Django框架中编写Contact表单的教程
Jul 17 Python
Python面向对象编程中关于类和方法的学习笔记
Jun 30 Python
Python 实现随机数详解及实例代码
Apr 15 Python
python执行使用shell命令方法分享
Nov 08 Python
快速入门python学习笔记
Dec 06 Python
使用python编写简单的小程序编译成exe跑在win10上
Jan 15 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
Mar 08 Python
解决c++调用python中文乱码问题
Jul 29 Python
python3.9.1环境安装的方法(图文)
Feb 02 Python
Python数据分析之绘图和可视化详解
Jun 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
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
2012/09/19 PHP
PHP分多步骤填写发布信息的简单方法实例代码
2012/09/23 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
thinkPHP5.0框架引入Traits功能实例分析
2017/03/18 PHP
详解php与ethereum客户端交互
2018/04/28 PHP
PHP基于curl实现模拟微信浏览器打开微信链接的方法示例
2019/02/15 PHP
JavaScript 全角转半角部分
2009/10/28 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
2013/12/10 Javascript
JavaScript 基本概念
2015/01/20 Javascript
jQuery实现带动画效果的多级下拉菜单代码
2015/09/08 Javascript
jquery+正则实现统一的表单验证
2015/09/20 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
2015/11/15 Javascript
Javascript获取随机数的实现方法
2016/06/22 Javascript
AngularJS 作用域详解及示例代码
2016/08/17 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
Javascript之面向对象--接口
2016/12/02 Javascript
canvas实现图像截取功能
2017/02/06 Javascript
mockjs,json-server一起搭建前端通用的数据模拟框架教程
2017/12/18 Javascript
关于Vue组件库开发详析
2018/07/01 Javascript
VUE实现图片验证码功能
2020/11/18 Javascript
vue 中url 链接左边的小图标更改问题
2019/12/30 Javascript
Python SqlAlchemy动态添加数据表字段实例解析
2018/02/07 Python
python 解压pkl文件的方法
2018/10/25 Python
使用Python将Exception异常错误堆栈信息写入日志文件
2020/04/08 Python
Django restful framework生成API文档过程详解
2020/11/12 Python
Python接口自动化测试框架运行原理及流程
2020/11/30 Python
意大利高端时尚买手店:Stefania Mode
2018/03/01 全球购物
单位提档介绍信
2014/01/17 职场文书
大专生找工作自荐书
2014/06/10 职场文书
党的群众路线教育实践活动心得体会(医院)
2014/11/03 职场文书
处级干部考察材料
2014/12/24 职场文书
小学庆六一主持词
2015/06/30 职场文书
导游词之阆中古城
2019/12/23 职场文书
USB TYPE-C 或将成为所有智能手机充电标准
2022/04/21 数码科技
Spring Boot 使用 Spring-Retry 进行重试框架
2022/04/24 Java/Android