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 相关文章推荐
flask中使用SQLAlchemy进行辅助开发的代码
Feb 10 Python
Python下线程之间的共享和释放示例
May 04 Python
深入理解python中函数传递参数是值传递还是引用传递
Nov 07 Python
python获取本机所有IP地址的方法
Dec 26 Python
Python字符串逆序的实现方法【一题多解】
Feb 18 Python
python实现栅栏加解密 支持密钥加密
Mar 20 Python
Python玩转PDF的各种骚操作
May 06 Python
elasticsearch python 查询的两种方法
Aug 04 Python
阿里云ECS服务器部署django的方法
Aug 29 Python
python实现ftp文件传输系统(案例分析)
Mar 20 Python
python函数调用,循环,列表复制实例
May 03 Python
Python Celery异步任务队列使用方法解析
Aug 10 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设计模式 php实现单例模式(singleton)
2015/12/07 PHP
PHP实现上一篇下一篇的方法实例总结
2016/09/22 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
2016/12/27 PHP
JTrackBar水平拖动效果
2007/07/15 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
JavaScript获取多个数组的交集简单实例
2013/11/11 Javascript
js加密解密字符串可自定义密码因子
2014/05/13 Javascript
网站基于flash实现的Banner图切换效果代码
2014/10/14 Javascript
JS实现表格数据各种搜索功能的方法
2015/03/03 Javascript
JavaScript的jQuery库中ready方法的学习教程
2015/08/14 Javascript
javascript绘制漂亮的心型线效果完整实例
2016/02/02 Javascript
EasyUI学习之Combobox级联下拉列表(2)
2016/12/29 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
JavaScript瀑布流布局实现代码
2017/05/06 Javascript
jquery append与appendTo方法比较
2017/05/24 jQuery
Vue CLI 3.x 自动部署项目至服务器的方法
2019/04/02 Javascript
Vue插件之滑动验证码
2019/09/21 Javascript
Node.js API详解之 querystring用法实例分析
2020/04/29 Javascript
微信小程序单选框自定义赋值
2020/05/26 Javascript
JavaScript中layim之整合右键菜单的示例代码
2021/02/06 Javascript
[01:05:40]VG vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
requests和lxml实现爬虫的方法
2017/06/11 Python
python3实现逐字输出的方法
2019/01/23 Python
numpy库与pandas库axis=0,axis= 1轴的用法详解
2019/05/27 Python
使用python去除图片白色像素的实例
2019/12/12 Python
Python enumerate内置库用法解析
2020/02/24 Python
python中sklearn的pipeline模块实例详解
2020/05/21 Python
python pyg2plot的原理知识点总结
2021/02/28 Python
凯特·丝蓓英国官网:Kate Spade英国
2016/11/07 全球购物
Java程序开发中如何应用线程
2016/03/03 面试题
小学生植树节活动总结
2014/07/04 职场文书
合作协议书模板
2014/10/10 职场文书
求职信范文怎么写
2015/03/19 职场文书
2015年教学工作总结
2015/04/02 职场文书
关于倡议书的范文
2015/04/29 职场文书
2015新员工工作总结范文
2015/10/15 职场文书