-3 octets -1 octet grâce à ThePirateBay
-8 -9 octets grâce à Neil.
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]
Essayez-le en ligne!
Remarque: cette solution repose sur le fait qu'il n'y a jamais plusieurs solutions minimales.
Preuve qu'il n'y a jamais de solutions multiples:
Soit FIB(a,b,k)
la séquence de Fibonacci commençant par 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)
Lemme 1
La différence entre les séquences de type Fibonacci est elle-même de type Fibonacci, c'est-à-dire FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)
. La preuve est laissée au lecteur.
Lemme 2
Car n >= 5
, il a,b
existe une solution satisfaisante a+b < n
:
si n
c'est pair,FIB(0,n/2,3) = n
si n
c'est étrange,FIB(1,(n-1)/2,3) = n
Preuve
Cas où n < 5
peuvent être vérifiés de manière exhaustive.
Supposons que nous ayons deux solutions minimales pour n >= 5
, a0,b0
et a1,b1
avec a0 + b0 = a1 + b1
et a0 != a1
.
Il existe alors k0,k1
tel FIB(a0,b0,k0) = FIB(a1,b1,k1) = n
.
Cas 1: k0 = k1
WLOG suppose b0 < b1
(et donc a0 > a1
)
Soit DIFF(k)
la différence entre les séquences de type Fibonnaci commençant par a1,b1
et a0,b0
:
DIFF(k) = FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)
(Lemme 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
Une fois qu'une séquence de type Fibonnaci a 2 termes positifs, tous les termes suivants sont positifs.
Ainsi, le seul moment DIFF(k) = 0
est le moment k = 2
, donc le seul choix k0 = k1
est 2
.
Par conséquent n = FIB(a0,b0,2) = a0 + b0 = a1 + b1
La minimalité de ces solutions contredit le lemme 2.
Cas 2 k0 != k1
::
WLOG suppose k0 < k1
.
On a FIB(a1,b1,k1) = n
Laisser a2 = FIB(a1,b1,k1-k0)
Laisser b2 = FIB(a1,b1,k1-k0+1)
Ensuite FIB(a2,b2,k0) = FIB(a1,b1,k1) = FIB(a0,b0,k0)
(exercice pour le lecteur)
Puisque FIB(a1,b1,k)
est non négatif pour k >= 0
, il est également non décroissant.
Cela nous donne a2 >= b1 > a0
et b2 >= a1+b1 = a0+b0
.
Soit ensuite DIFF(k) = FIB(a2,b2,k) - FIB(a0,b0,k) = FIB(a2-a0,b2-b0,k)
(Lemme 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
Encore une fois, DIFF
a 2 termes positifs et donc tous les termes suivants sont positifs.
Ainsi, le seul moment où il est possible que DIFF(k) = 0
est k = 1
, donc le seul choix pour k0
est 1
.
FIB(a0,b0,1) = n
b0 = n
Cela contredit le lemme 2.
a>=0
eta<b
y a-t-il déjà plusieurs solutions?