Teorema de Zeckendorf (Representación de Fibonacci no vecina)

El teorema de Zeckendorf establece que cada número entero positivo se puede escribir de forma única como una suma de distintos números de Fibonacci no vecinos. Dos números de Fibonacci son vecinos si van uno tras otro en la secuencia de Fibonacci (0, 1, 1, 2, 3, 5, ..). Por ejemplo, 3 y 5 son vecinos, pero 2 y 5 no lo son.

Dado un número, encuentre una representación del número como suma de números de Fibonacci no consecutivos.

Ejemplos:

Input:  n = 10
Output: 8 2
8 and 2 are two non-consecutive Fibonacci Numbers
and sum of them is 10.

Input:  n = 30
Output: 21 8 1
21, 8 and 1 are non-consecutive Fibonacci Numbers
and sum of them is 30.

Le recomendamos encarecidamente que minimice su navegador y que pruebe esto usted mismo primero.
La idea es usar el Algoritmo Codicioso

1) Let n be input number

2) While n >= 0
     a) Find the greatest Fibonacci Number smaller than n.
        Let this number be 'f'.  Print 'f'
     b) n = n - f 

C++

// C++ program for Zeckendorf's theorem. It finds
// representation of n as sum of
// non-neighbouring Fibonacci Numbers.
#include <bits/stdc++.h>
using namespace std;
 
// Returns the greatest Fibonacci Number smaller than
// or equal to n.
int nearestSmallerEqFib(int n)
{
    // Corner cases
    if (n == 0 || n == 1)
        return n;
 
    // Find the greatest Fibonacci Number smaller
    // than n.
    int f1 = 0, f2 = 1, f3 = 1;
    while (f3 <= n)
    {
        f1 = f2;
        f2 = f3;
        f3 = f1 + f2;
    }
    return f2;
}
 
// Prints Fibonacci Representation of n using
// greedy algorithm
void printFibRepresntation(int n)
{
    while (n > 0)
    {
        // Find the greates Fibonacci Number smaller
        // than or equal to n
        int f = nearestSmallerEqFib(n);
 
        // Print the found fibonacci number
        cout << f << " ";
 
        // Reduce n
        n = n - f;
    }
}
 
// Driver code
int main()
{
    int n = 30;
    cout << "Non-neighbouring Fibonacci Representation of "
         << n << " is \n";
    printFibRepresntation(n);
    return 0;
}

Java

// Java program for Zeckendorf's theorem. It finds
// representation of n as sum of non-neighbouring
// Fibonacci Numbers.
class GFG {
    public static int nearestSmallerEqFib(int n)
    {
        // Corner cases
        if (n == 0 || n == 1)
            return n;
 
        // Find the greatest Fibonacci Number smaller
        // than n.
        int f1 = 0, f2 = 1, f3 = 1;
        while (f3 <= n) {
            f1 = f2;
            f2 = f3;
            f3 = f1 + f2;
        }
        return f2;
    }
 
    // Prints Fibonacci Representation of n using
    // greedy algorithm
    public static void printFibRepresntation(int n)
    {
        while (n > 0) {
            // Find the greates Fibonacci Number smaller
            // than or equal to n
            int f = nearestSmallerEqFib(n);
 
            // Print the found fibonacci number
            System.out.print(f + " ");
 
            // Reduce n
            n = n - f;
        }
    }
 
    // Driver method to test
    public static void main(String[] args)
    {
        int n = 30;
        System.out.println("Non-neighbouring Fibonacci "
                           + " Representation of " + n + " is");
 
        printFibRepresntation(n);
    }
}
 
// Code Contributed by Mohit Gupta_OMG

Python3

# Python program for Zeckendorf's theorem. It finds
# representation of n as sum of non-neighbouring
# Fibonacci Numbers.
 
# Returns the greatest Fibonacci Number smaller than
# or equal to n.
def nearestSmallerEqFib(n):
     
    # Corner cases
    if (n == 0 or n == 1):
        return n
        
    # Finds the greatest Fibonacci Number smaller
    # than n.
    f1, f2, f3 = 0, 1, 1
    while (f3 <= n):
        f1 = f2;
        f2 = f3;
        f3 = f1 + f2;
    return f2;
 
 
# Prints Fibonacci Representation of n using
# greedy algorithm
def printFibRepresntation(n):
     
    while (n>0):
 
        # Find the greates Fibonacci Number smaller
        # than or equal to n
        f = nearestSmallerEqFib(n);
  
        # Print the found fibonacci number
        print (f,end=" ")
  
        # Reduce n
        n = n-f
 
# Driver code test above functions
n = 30
print ("Non-neighbouring Fibonacci Representation of", n, "is")
printFibRepresntation(n)

C#

// C# program for Zeckendorf's theorem.
// It finds the representation of n as
// sum of non-neighbouring  Fibonacci
// Numbers.
using System;
 
class GFG {
    public static int nearestSmallerEqFib(int n)
    {
        // Corner cases
        if (n == 0 || n == 1)
            return n;
 
        // Find the greatest Fibonacci
        // Number smaller than n.
        int f1 = 0, f2 = 1, f3 = 1;
        while (f3 <= n) {
            f1 = f2;
            f2 = f3;
            f3 = f1 + f2;
        }
        return f2;
    }
 
    // Prints Fibonacci Representation
    // of n using greedy algorithm
    public static void printFibRepresntation(int n)
    {
        while (n > 0) {
            // Find the greates Fibonacci
            // Number smallerthan or equal
            // to n
            int f = nearestSmallerEqFib(n);
 
            // Print the found fibonacci number
            Console.Write(f + " ");
 
            // Reduce n
            n = n - f;
        }
    }
 
    // Driver method
    public static void Main()
    {
        int n = 40;
        Console.WriteLine("Non-neighbouring Fibonacci "
                          + " Representation of " + n + " is");
 
        printFibRepresntation(n);
    }
}
 
// Code Contributed by vt_m

PHP

<?php
// PHP program for Zeckendorf's theorem.
// It finds representation of n as sum
// of non-neighbouring Fibonacci Numbers.
 
// Returns the greatest Fibonacci
// Number smaller than or equal
// to n.
function nearestSmallerEqFib($n)
{
     
    // Corner cases
    if ($n == 0 || $n==1)
    return $n;
 
    // Find the greatest Fibonacci
    // Number smaller than n.
    $f1 = 0;
    $f2 = 1;
    $f3 = 1;
    while ($f3 <= $n)
    {
        $f1 = $f2;
        $f2 = $f3;
        $f3 = $f1 + $f2;
    }
    return $f2;
}
 
// Prints Fibonacci Representation
// of n using greedy algorithm
function printFibRepresntation($n)
{
    while ($n > 0)
    {
         
        // Find the greates Fibonacci
        // Number smaller than or
        // equal to n
        $f = nearestSmallerEqFib($n);
 
        // Print the found
        // fibonacci number
        echo $f, " ";
 
        // Reduce n
        $n = $n - $f;
    }
}
 
    // Driver Code
    $n = 30;
    echo "Non-neighbouring Fibonacci Representation of ",
                                            $n, " is \n";
    printFibRepresntation($n);
 
// This code is contributed by ajit
?>

Javascript

<script>
    // Javascript program for Zeckendorf's theorem.
// It finds representation of n as sum
// of non-neighbouring Fibonacci Numbers.
 
// Returns the greatest Fibonacci
// Number smaller than or equal
// to n.
function nearestSmallerEqFib(n)
{
     
    // Corner cases
    if (n == 0 || n==1)
    return n;
 
    // Find the greatest Fibonacci
    // Number smaller than n.
    let f1 = 0;
    let f2 = 1;
    let f3 = 1;
    while (f3 <= n)
    {
        f1 = f2;
        f2 = f3;
        f3 = f1 + f2;
    }
    return f2;
}
 
// Prints Fibonacci Representation
// of n using greedy algorithm
function printFibRepresntation(n)
{
    while (n > 0)
    {
         
        // Find the greates Fibonacci
        // Number smaller than or
        // equal to n
        let f = nearestSmallerEqFib(n);
 
        // Print the found
        // fibonacci number
        document.write(f, " ");
 
        // Reduce n
        n = n - f;
    }
}
 
    // Driver Code
    let n = 30;
    document.write("Non-neighbouring Fibonacci Representation of " +
                                            n + " is <br>");
    printFibRepresntation(n);
 
// This code is contributed by _saurabh_jaiswal
</script>
Producción

Non-neighbouring Fibonacci Representation of 30 is 
21 8 1 

Complejidad de tiempo:   O(N*LogN)

¿Cómo funciona el algoritmo codicioso anterior?  
Sea fib(i) [i-ésimo número de Fibonacci] el mayor número de Fibonacci menor o igual que ‘n’. 
Entonces n – fib(i) tendrá su propia representación como suma de números de Fibonacci no vecinos.
Todo lo que queremos asegurarnos es que no haya ningún problema vecino. Por inducción, n-fib(i) no tiene un problema vecino, entonces la única forma en que n podría tener un problema vecino es si n-fib(i) usa fib(i-1) en su representación. 
Así que todo lo que tenemos que probar es que n-fib(i) no usa fib(i-1) en su representación
. Probémoslo usando la contradicción. Si n-fib(i) = fib(i-1) + fib(ix) +…, entonces fib(i) no puede ser el número de Fibonacci más pequeño más cercano a n, ya que fib(i) + fib(i-1) en sí mismo es fib(i+1). 
Entonces, si n-fib(i) contiene fib(i-1) en su representación, entonces fib(i+1) sería el número de fib más pequeño más cercano a n, contradiciendo nuestra suposición de que fib(i) es el número de fib más pequeño más cercano a n .

¿Puede ser útil esta representación?  
Como representación binaria. Esta puede ser una representación alternativa para representar números positivos. Una observación importante sobre esta representación es que el número de 1 en la representación de Fibonacci tiende a ser mucho menor que el número de 1 en la representación binaria. Por lo tanto, si en alguna aplicación donde es más costoso almacenar un 1 que almacenar un 0, tendría sentido usar la representación de Fibonacci.
Este artículo es una contribución de Gaurav Saxena . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *