[英]Finding nth number of primes in Fibonacci sequence (Faster)
我正在上第一门编程课程,我的任务是列出斐波那契数列中第n个素数。 到目前为止,我已经提出了:
num = int(input("Enter a number: "))
a = 1
b = 1
c = 0
count = 0
isPrime = True
while (count < num):
isPrime = True
c = a + b
for i in range(2,c):
if (c % i == 0):
isPrime = False
break
if (isPrime):
print (c)
count = count + 1
a = b
b = c
这可行,但是对于任何大于10的输入,它都需要花费很长时间,有人可以帮助我弄清楚如何使其更快一点吗? 我认为这是因为a,b和c最终变得非常大,但是我不确定如何解决此问题。
fib = lambda n:reduce(lambda x,n:[x[1],x[0]+x[1]], range(n),[0,1])[0]
最短和最快的斐波那契数词在python中是一个衬里脚本。
>>> fib(1000)
43466557686937456435688527675040625802564660517371780402481729089536555417949051
89040387984007925516929592259308032263477520968962323987332247116164299644090653
3187938298969649928516003704476137795166849228875L
在这里找到。
将斐波纳契数的生成与素性测试分开是最容易的。 这是Miller-Rabin素数测试的Python实现:
def isPrime(n, k=5): # miller-rabin
from random import randint
if n < 2: return False
for p in [2,3,5,7,11,13,17,19,23,29]:
if n % p == 0: return n == p
s, d = 0, n-1
while d % 2 == 0:
s, d = s+1, d/2
for i in range(k):
x = pow(randint(2, n-1), d, n)
if x == 1 or x == n-1: continue
for r in range(1, s):
x = (x * x) % n
if x == 1: return False
if x == n-1: break
else: return False
return True
然后很容易生成斐波那契数并测试它们的素性:
a, b, f = 1, 1, 2
while True:
if isPrime(f): print f
a, b, f = b, f, b+f
找到第22个素数斐波纳契数不会太久:
您可以在http://ideone.com/L1oQgO上看到正在运行的程序。 有关更多信息,请参见A005478或A001605 。
您绝对应该使用以下众所周知的启发式方法:
要检查
N
是否为质数,您只需将其除以2到sqrt(N)
的数字即可。
@ user448810在Miller-Rabin素数测试中隐式使用它。 但是以防万一,您只是想改进自己的代码。
此代码与一行代码相同,并且可读性更高:
def fib(n):
a=1
b=1
for i in range(n-2):
a,b = b,a+b
return b
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.