-3 bajty -1 bajt dzięki ThePirateBay
-8 -9 bajtów dzięki Neilowi.
f=(n,a=1,b=0,c=(a,b)=>b<n?c(a+b,a):b>n)=>c(a,b)?b+2<a?f(n,a-1,b+1):f(n,b-~a):[b,a]
Wypróbuj online!
Uwaga: to rozwiązanie polega na tym, że nigdy nie ma wielu minimalnych rozwiązań.
Dowód, że nigdy nie ma wielu rozwiązań:
Niech FIB(a,b,k)
będzie sekwencją Fibonacciego zaczynającą się od a,b
:
FIB(a,b,0) = a
FIB(a,b,1) = b
FIB(a,b,k) = FIB(a,b,k-1) + FIB(a,b,k-2)
Lemat 1
Różnica między sekwencjami podobnymi do Fibonacciego jest sama w sobie podobna do Fibonacciego, tj FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)
. Dowód pozostawiono czytelnikowi.
Lemat 2
Na n >= 5
roztwór a,b
istnieje spełniającycha+b < n
:
jeśli n
jest nawetFIB(0,n/2,3) = n
jeśli n
jest dziwne,FIB(1,(n-1)/2,3) = n
Dowód
Przypadki, w których n < 5
można dokładnie sprawdzić.
Załóżmy, że mamy dwa rozwiązania minimalne n >= 5
, a0,b0
a a1,b1
z a0 + b0 = a1 + b1
a a0 != a1
.
Potem istnieją k0,k1
takie, że FIB(a0,b0,k0) = FIB(a1,b1,k1) = n
.
Przypadek 1: k0 = k1
Założono WLOG b0 < b1
(i dlategoa0 > a1
)
Niech DIFF(k)
będzie różnica między sekwencjami podobnymi do Fibonnaci zaczynającymi się od a1,b1
i a0,b0
:
DIFF(k) = FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)
(Lemat 1)
DIFF(0) = a1 - a0 < 0
DIFF(1) = b1 - b0 > 0
DIFF(2) = (a1+b1) - (a0+b0) = 0
DIFF(3) = DIFF(1) + DIFF(2) = DIFF(1) > 0
DIFF(4) = DIFF(2) + DIFF(3) = DIFF(3) > 0
Gdy sekwencja podobna do Fibonnaci ma 2 dodatnie wyrażenia, wszystkie kolejne wyrażenia są dodatnie.
Zatem jedynym momentem DIFF(k) = 0
jest kiedy k = 2
, więc jedynym wyborem k0 = k1
jest2
.
W związku z tym n = FIB(a0,b0,2) = a0 + b0 = a1 + b1
Minimalność tych rozwiązań stoi w sprzeczności z Lemat 2.
Przypadek 2 k0 != k1
:
Założono WLOG k0 < k1
.
Mamy FIB(a1,b1,k1) = n
Pozwolić a2 = FIB(a1,b1,k1-k0)
Pozwolić b2 = FIB(a1,b1,k1-k0+1)
Następnie FIB(a2,b2,k0) = FIB(a1,b1,k1) = FIB(a0,b0,k0)
(ćwiczenie dla czytelnika)
Ponieważ FIB(a1,b1,k)
nie jest ujemny k >= 0
, nie zmniejsza się.
To daje nam a2 >= b1 > a0
i b2 >= a1+b1 = a0+b0
.
Więc pozwól DIFF(k) = FIB(a2,b2,k) - FIB(a0,b0,k) = FIB(a2-a0,b2-b0,k)
(Lemma 1)
DIFF(0) = a2 - a0 > 0
DIFF(1) = b2 - b0 >= (a0 + b0) - b0 = a0 >= 0
DIFF(2) = DIFF(0) + DIFF(1) >= DIFF(0) > 0
DIFF(3) = DIFF(1) + DIFF(2) >= DIFF(2) > 0
Jeszcze raz DIFF
ma 2 pozytywne warunki, a zatem wszystkie kolejne warunki są pozytywne.
Tak więc, tylko czas, kiedy jest to możliwe, że DIFF(k) = 0
jest k = 1
, więc jedynym wyborem k0
jest 1
.
FIB(a0,b0,1) = n
b0 = n
Jest to sprzeczne z Lemma 2.
a>=0
ia<b
czy kiedykolwiek istnieje wiele rozwiązań?