Python 斐波那契-非常大n个数的六个最高有效位(最右边)
我试图通过只保留最右边的六位数字来有效地计算第n个Fibonacci值,这个值可能非常大。例如,fib(1000000)将只返回546875 我知道一些递归矩阵求幂算法,我一直在测试一个O(logn)实现,如下所示-Python 斐波那契-非常大n个数的六个最高有效位(最右边),python,fibonacci,Python,Fibonacci,我试图通过只保留最右边的六位数字来有效地计算第n个Fibonacci值,这个值可能非常大。例如,fib(1000000)将只返回546875 我知道一些递归矩阵求幂算法,我一直在测试一个O(logn)实现,如下所示- def solution(n): fibs = {0: 0, 1: 1} def fib(n): # recursive helper function if n in fibs: return fibs[n]
def solution(n):
fibs = {0: 0, 1: 1}
def fib(n):
# recursive helper function
if n in fibs:
return fibs[n]
if n % 2 == 0:
fibs[n] = ((2 * fib((n / 2) - 1)) + fib(n / 2)) * fib(n / 2) % 1000000
return fibs[n]
else:
fibs[n] = (fib((n - 1) / 2) ** 2) + (fib((n+1) / 2) ** 2) % 1000000
return fibs[n]
answer = fib(n)
return answer % 1000000
在n=1000000之前,所有答案似乎都有效。10的所有后面的指数都应该返回相同的答案吗?10^k其中k=[7,8,9,10…]全部返回546875(一百万的值)。我假设它们应该是,当你将它们模化10^6时,这些值有相同的零余数。所以我想知道这个实现是否正确?所以我做了一些简单的代码来证明/反驳你当前的定理,我偶然发现了这个特殊的模式:代码最后6位的斐波那契序列似乎每150万个序列重复一次 这是100万、1000万、1亿等值匹配的部分原因;1000万-900万=100万,但900万=6*150万 所以,为了回答您的问题,您需要在代码中实现的只是先将模n乘以1500000,然后计算您的答案,例如:
answer=fib(n%1500000)
我提供了在模重复时查找的代码(find_repeating_length),以及检查模是否按预期工作的函数(check)
希望有帮助
def solution(n):
fibs = {0: 0, 1: 1}
def fib(n):
# simple linear-time fib function
if n in fibs:
return fibs[n]
fibs[n] = (fibs[n-1]+fibs[n-2]) % 1000000
return fibs[n]
def find_repeating_length():
find_number = [0, 1] # find these two numbers of the sequence
for i in range(0, 10000001):
n_0 = fib(i)
if (n_0 in find_number):
print(str(n_0) + ":" + str(i))
def check(): # check that first 10,000,000 nums follow sequence
for i in range(2, 10000001):
n_0 = fib(i)
if (i >= 1500000):
left = n_0
right = fib(i - 1500000)
# if (left == right):
# print("Success at " + str(i) + " Values: " +
# str(n_0))
if (left != right):
return("Fail at " + str(i) + " Values: " +
str(n_0) + ":" + str(right))
return "Success, repeats"
find_repeating_length()
print(check())
solution()
输出(稍微格式化,输出值:序列格式):
0:0
1:1
1:2
0:750000
1:1499999
0:1500000
1:1500001
1:1500002
0:2250000
1:299999
0:300万
1:3000001
1:3000002
0:3750000
1:449999
0:4500000
1:4500001
1:4500002
0:5250000
1:599999
0:6000000
1:6000001
1:6000002
0:6750000
1:749999
0:7500000
1:7500001
1:7500002
0:8250000
1:899999
0:9000000
1:9000001
1:9000002
0:9750000
成功,重复
为什么第8行、第11行和第15行有
%1000000
?@galaxy001他保留了最右边的6个数字我看到第一百万个FIB序列号以“484376”结尾。。。