📜  策肯多夫定理(非邻近斐波那契表示)(1)

📅  最后修改于: 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的非邻近斐波那契表示。

这个定理可以被广泛应用于密码学中,例如对称密钥加密,哈希函数等等。