Every positive integer can be uniquely expressed as the sum of distinct, non-consecutive Fibonacci numbers. This is known as Zeckendorf's Theorem, and such a sum a Zeckendorf representation. We derive the computation of such sums.
From the Fibonacci Index page, we get the following verbs: fib n produces the n-th Fibonacci number, and n=:fi y satisfies ((fib n)<:y) *. y<fib n+1 .
fib=: 3 : 0 " 0
mp=. +/ .*
{.{: mp/ mp~^:(I.|.#:y) 2 2$0 1 1 1x
)
phi=: -:1+%:5
fi =: 3 : 'n - y<fib n=. 0>.(1=y)-~>.(phi^.%:5)+phi^.y'The Fibonacci sum derives by choosing the largest Fibonacci number m less than or equal to y , then applying the same thing to y-m , and so on until the difference is 3 or less.
fsum=: 3 : 0
z=. 0$r=. y
while. 3<r do.
m=. fib fi r
z=. z,m
r=. r-m
end.
z,r$~(*r)+.0=y
)
fsum 100
89 8 3
fsum 200
144 55 1
fsum&.> i.10 5
┌──────┬────────┬──────┬────────┬───────┐
│0 │1 │2 │3 │3 1 │
├──────┼────────┼──────┼────────┼───────┤
│5 │5 1 │5 2 │8 │8 1 │
├──────┼────────┼──────┼────────┼───────┤
│8 2 │8 3 │8 3 1 │13 │13 1 │
├──────┼────────┼──────┼────────┼───────┤
│13 2 │13 3 │13 3 1│13 5 │13 5 1 │
├──────┼────────┼──────┼────────┼───────┤
│13 5 2│21 │21 1 │21 2 │21 3 │
├──────┼────────┼──────┼────────┼───────┤
│21 3 1│21 5 │21 5 1│21 5 2 │21 8 │
├──────┼────────┼──────┼────────┼───────┤
│21 8 1│21 8 2 │21 8 3│21 8 3 1│34 │
├──────┼────────┼──────┼────────┼───────┤
│34 1 │34 2 │34 3 │34 3 1 │34 5 │
├──────┼────────┼──────┼────────┼───────┤
│34 5 1│34 5 2 │34 8 │34 8 1 │34 8 2 │
├──────┼────────┼──────┼────────┼───────┤
│34 8 3│34 8 3 1│34 13 │34 13 1 │34 13 2│
└──────┴────────┴──────┴────────┴───────┘
$ fsum 2^60x
25
5 5 $ fsum 2^60x
1100087778366101931 37889062373143906 14472334024676221 308061521170129 117669030460994
44945570212853 1548008755920 86267571272 12586269025 4807526976
1836311903 165580141 39088169 9227465 514229
196418 28657 6765 2584 987
377 34 13 5 2fsumcheck has the same argument and result as fsum , but incorporates checks:
fsumcheck=: 3 : 0 z=. fsum y assert. y = +/z assert. z -: \:~ z assert. (z-:fib j) *. 1<2-/\j=. fi z )
See also
Contributed by RogerHui.
