📅  最后修改于: 2023-12-03 15:11:32.133000             🧑  作者: Mango
策肯多夫定理是指对于任意一个正整数n,都可以表示为若干个不相邻的斐波那契数之和。
斐波那契数列的定义为:f(0)=0, f(1)=1, f(i)=f(i-1)+f(i-2) (i>=2)
由此可以得到一个非邻近斐波那契表示,用以表示n。
def z(n):
if n <= 1:
return [n]
elif n == 2:
return [1, 1]
else:
k = int((2*n+1)**0.5-1)/2
a_k = 2**(k-1)*[1] + [0]
b_k = a_k[::-1]
if n - sum(a_k)*b_k[1] == 0:
return [1]*(2*k-1)
elif n - sum(a_k)*b_k[1] == 1:
return a_k[:-1] + [2] + b_k[:-1]
else:
return a_k + [1] + b_k
上面的函数可以用来实现这个定理。
其中,k表示最大的斐波那契数能够比n小多少,a_k是一个长度为k的列表,其中每一个元素都表示它前面的那个非邻近斐波那契数是否要选取(1为选取,0为不选取),b_k表示与a_k镜像的列表。
最后再判断剩余的数是否等于0或1,从而得到n的非邻近斐波那契表示。
这个定理可以被广泛应用于密码学中,例如对称密钥加密,哈希函数等等。