问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用python判断素数

发布网友 发布时间:2022-05-10 18:03

我来回答

2个回答

懂视网 时间:2022-05-10 22:25

这篇文章主要介绍了Python素数检测的方法,实例分析了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

热心网友 时间:2022-05-10 19:33

运用python的数学函数,
先导入math模块,
再定义isPrime()方法即可;
使用for进行单行程序扫描素数即可;
运用python的itertools模块判断即可;使用if...while语句来判断即可。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如果银行拒贷有哪些办法 小天鹅滚筒洗衣机水位多少合适 阴阳师百闻牌攻略大全 百闻牌式神卡组阵容大全 阴阳师百闻牌三大妖狐阵容推荐 妖狐流派怎么搭配?-新手攻略-安族网... 阴阳师百闻牌妖狐快攻阵容 怎么搭配攻略推荐 阴阳师百闻牌妖狐技能攻略 妖狐属性及卡组搭配推荐-新手攻略-安族网... 阴阳师百闻牌妖狐最强卡组 阵容怎么搭配攻略 阴阳师百闻牌妖狐卡组推荐 怎么搭配攻略分享 带鹏字的公司名字大全 鹏字开头公司起名 叶罗丽娃娃玩具店在哪 跑步会不会使胸部减小 女性跑步的困惑 胸部会不会缩水 跑愈久能减愈多 一度电能给10000毫安的充电宝充多少次 WROD 怎样竖向打字 电磁屏蔽罩的屏蔽效果好还是滤波器的效果好 死神。。。虚化的时候为什么要戴面具啊?? 死神里哪一集出现了这种虚化? 独立声卡用屏蔽罩有效果吗 为什么手机里面得芯片需要屏蔽罩遮住,这样有什么好处?越详细越好 死神里一户每次虚化面具上的花纹有变化吗?是变多还是变少? 死神 黑崎一护身上的骷髅面具是什么 死神中一护带一半面具失控虚化的集数有哪些? 死神虚化和面具 真空断路器的屏蔽罩有什么作用? 本人菜鸟,不知道真空断路器屏蔽罩是干什么用的,那位告诉下? 死神的虚化和虚的死神化是什么? 屏蔽罩是什么啊? 五金屏蔽罩压线起什么作用 液晶电视逻辑板为什么装屏蔽罩? 屏蔽罩的构成及应用 玉石戒指、指环是怎么加工的?用到设备都有哪些?请教高人 玉石首饰加工费是怎么算的 卖二手车时保险怎么算法 自己磨戒指,玉石的,需要什么工具、工序 加工一个玉石指环多少钱? 玉石戒指怎么磨成钻石面 将玉石加工打磨成漂亮的首饰的过程中玉石发生的是什么变化因为没有什么的生成? 自己带玉石到金店包戒指要多少手工费? 哈尔滨哪里可以做镶玉的戒指,我自己提供玉石,只需要他提供一个指环! 已经成戒指的玉可以切割吗 微信二代打印机可以调字大小嘛? 如何把玉从戒指上面剥离下来!有块很老的小和田种,但是粘在戒指上面现在想剥离下来,怎么办 微信2代ETC走人工通道怎么办? 福建莆田 与时俱进 拓展市场 做大做强莆田宝玉石首饰产业 微信绑定银行卡二代的,超了一万还能收到转账吗? 这件翡翠玉石戒指求鉴定及估价 无保QQ可以用微信申诉二代吗, 需要什么条件. 悬赏可加, 求大神 怎么同时下载两个微信 微信网上青少年挂号为什么显示二代身份证格式错误 把文件都存在云盘上安全吗