小于n的最大素数python_找到小于n的最大素数,n=~10^230

当n可以达到~10^230时,我找到小于n的最大素数有什么问题吗?有什么更好的方法吗?在

下面是我的尝试,使用Python中的Miller-Rabin素性测试的以下版本:from random import randrange

small_primes = [

2, 3, 5, 7, 11, 13, 17, 19, 23, 29,

31, 37, 41, 43, 47, 53, 59, 61, 67, 71,

73, 79, 83, 89, 97,101,103,107,109,113,

127,131,137,139,149,151,157,163,167,173,

179,181,191,193,197,199,211,223,227,229,

233,239,241,251,257,263,269,271,277,281,

283,293,307,311,313,317,331,337,347,349,

353,359,367,373,379,383,389,397,401,409,

419,421,431,433,439,443,449,457,461,463,

467,479,487,491,499,503,509,521,523,541,

547,557,563,569,571,577,587,593,599,601,

607,613,617,619,631,641,643,647,653,659,

661,673,677,683,691,701,709,719,727,733,

739,743,751,757,761,769,773,787,797,809,

811,821,823,827,829,839,853,857,859,863,

877,881,883,887,907,911,919,929,937,941,

947,953,967,971,977,983,991,997

]

def probably_prime(n, k):

"""Return True if n passes k rounds of the Miller-Rabin primality

test (and is probably prime). Return False if n is proved to be

composite.

"""

if n < 2: return False

for p in small_primes:

if n < p * p: return True

if n % p == 0: return False

r, s = 0, n - 1

while s % 2 == 0:

r += 1

s //= 2

for _ in range(k):

a = randrange(2, n - 1)

x = pow(a, s, n)

if x == 1 or x == n - 1:

continue

for _ in range(r - 1):

x = pow(x, 2, n)

if x == n - 1:

break

else:

return False

return True

我从测试probably_prime(n)开始,在那里我递减并测试n的每个值,直到得到一个“大概素数”。当我对n=~10^230的值进行测试时,我发现相隔20-30个数的素数。在阅读了更多关于prime gap的文章后,我的结果似乎不太可能,因为我不应该如此频繁地找到素数。我测试了高达50000的k值,得到了相同的答案。我做错了什么?有什么更好的解决办法吗?在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值