Números GCD y Fibonacci

Se le dan dos números positivos M y N. La tarea es imprimir el máximo común divisor de M’th y N’th Números de Fibonacci .
Los primeros números de Fibonacci son 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …. 
Tenga en cuenta que 0 se considera como el 0’th Número de Fibonacci.
Ejemplos: 
 

Input  : M = 3, N = 6
Output :  2
Fib(3) = 2, Fib(6) = 8
GCD of above two numbers is 2

Input  : M = 8, N = 12
Output :  3
Fib(8) = 21, Fib(12) = 144
GCD of above two numbers is 3

Una solución simple es seguir los pasos a continuación. 
1) Encuentra el M-ésimo número de Fibonacci. 
2) Encuentre el N’th Número de Fibonacci. 
3) Devolver MCD de dos números.
Una mejor solución se basa en la siguiente identidad
 

GCD(Fib(M), Fib(N)) = Fib(GCD(M, N))

The above property holds because Fibonacci Numbers follow
Divisibility Sequence, i.e., if M divides N, then Fib(M)
also divides N. For example, Fib(3) = 2 and every third
third Fibonacci Number is even.

Source : Wiki

Los pasos son: 
1) Encuentra el MCD de M y N. Sea GCD g. 
2) Devolver Fib(g).
A continuación se muestran implementaciones de la idea anterior.
 

C++

// C++ Program to find GCD of Fib(M) and Fib(N)
#include <bits/stdc++.h>
using namespace std;
const int MAX = 1000;
 
// Create an array for memoization
int f[MAX] = { 0 };
 
// Returns n'th Fibonacci number using table f[].
// Refer method 6 of below post for details.
// https://www.geeksforgeeks.org/program-for-nth-fibonacci-number/
int fib(int n)
{
    // Base cases
    if (n == 0)
        return 0;
    if (n == 1 || n == 2)
        return (f[n] = 1);
 
    // If fib(n) is already computed
    if (f[n])
        return f[n];
 
    int k = (n & 1) ? (n + 1) / 2 : n / 2;
 
    // Applying recursive formula [Note value n&1 is 1
    // if n is odd, else 0.
    f[n] = (n & 1)
               ? (fib(k) * fib(k) + fib(k - 1) * fib(k - 1))
               : (2 * fib(k - 1) + fib(k)) * fib(k);
 
    return f[n];
}
 
// Function to return gcd of a and b
int gcd(int M, int N)
{
    if (M == 0)
        return N;
    return gcd(N % M, M);
}
 
// Returns GCD of Fib(M) and Fib(N)
int findGCDofFibMFibN(int M, int N)
{
    return fib(gcd(M, N));
}
 
// Driver code
int main()
{
    int M = 3, N = 12;
    cout << findGCDofFibMFibN(M, N);
    return 0;
}

C

// C Program to find GCD of Fib(M) and Fib(N)
#include <stdio.h>
const int MAX = 1000;
 
// Returns n'th Fibonacci number using table arr[].
// Refer method 6 of below post for details.
// https://www.geeksforgeeks.org/program-for-nth-fibonacci-number/
int fib(int n)
{
 
    // Create an array for memoization
    int arr[MAX];
    for (int i = 0; i < MAX; i++)
        arr[i] = 0;
    // Base cases
    if (n == 0)
        return 0;
    if (n == 1 || n == 2)
        return (arr[n] = 1);
 
    // If fib(n) is already computed
    if (arr[n])
        return arr[n];
 
    int k = (n & 1) ? (n + 1) / 2 : n / 2;
 
    // Applying recursive formula [Note value n&1 is 1
    // if n is odd, else 0.
    arr[n]
        = (n & 1)
              ? (fib(k) * fib(k) + fib(k - 1) * fib(k - 1))
              : (2 * fib(k - 1) + fib(k)) * fib(k);
 
    return arr[n];
}
 
// Function to return gcd of a and b
int gcd(int M, int N)
{
    if (M == 0)
        return N;
    return gcd(N % M, M);
}
 
// Returns GCD of Fib(M) and Fib(N)
int findGCDofFibMFibN(int M, int N)
{
    return fib(gcd(M, N));
}
 
// Driver code
int main()
{
    int M = 3, N = 12;
    printf("%d", findGCDofFibMFibN(M, N));
    return 0;
}
 
// This code is contributed by Aditya Kumar (adityakumar129)

Java

// Java Program to find GCD of Fib(M) and Fib(N)
class gcdOfFibonacci
{
    static final int MAX = 1000;
    static int[] f;
 
    gcdOfFibonacci()  // Constructor
    {
        // Create an array for memoization
        f = new int[MAX];
    }
 
    // Returns n'th Fibonacci number using table f[].
    // Refer method 6 of below post for details.
    // https://www.geeksforgeeks.org/program-for-nth-fibonacci-number/
    private static int fib(int n)
    {
        // Base cases
        if (n == 0)
            return 0;
        if (n == 1 || n == 2)
            return (f[n] = 1);
 
        // If fib(n) is already computed
        if (f[n]!=0)
            return f[n];
 
        int k = ((n & 1)==1)? (n+1)/2 : n/2;
 
        // Applying recursive formula [Note value n&1 is 1
        // if n is odd, else 0.
        f[n] = ((n & 1)==1)? (fib(k)*fib(k) + fib(k-1)*fib(k-1))
               : (2*fib(k-1) + fib(k))*fib(k);
 
        return f[n];
    }
 
    // Function to return gcd of a and b
    private static int gcd(int M, int N)
    {
        if (M == 0)
            return N;
        return gcd(N%M, M);
    }
 
    // This method returns GCD of Fib(M) and Fib(N)
    static int findGCDofFibMFibN(int M,  int N)
    {
        return fib(gcd(M, N));
    }
 
    // Driver method
    public static void main(String[] args)
    {
        // Returns GCD of Fib(M) and Fib(N)
        gcdOfFibonacci obj = new gcdOfFibonacci();
        int M = 3, N = 12;
        System.out.println(findGCDofFibMFibN(M, N));
    }
}
// This code is contributed by Pankaj Kumar

Python3

# Python Program to find
# GCD of Fib(M) and Fib(N)
 
MAX = 1000
  
# Create an array for memoization
f=[0 for i in range(MAX)]
  
# Returns n'th Fibonacci
# number using table f[].
# Refer method 6 of below
# post for details.
# https://www.geeksforgeeks.org/program-for-nth-fibonacci-number/
def fib(n):
 
    # Base cases
    if (n == 0):
        return 0
    if (n == 1 or n == 2):
        f[n] = 1
  
    # If fib(n) is already computed
    if (f[n]):
        return f[n]
  
    k = (n+1)//2 if(n & 1) else n//2
  
    # Applying recursive
    # formula [Note value n&1 is 1
    # if n is odd, else 0.
    f[n] = (fib(k)*fib(k) + fib(k-1)*fib(k-1)) if(n & 1) else ((2*
           fib(k-1) + fib(k))*fib(k))
  
    return f[n]
 
  
# Function to return
# gcd of a and b
def gcd(M, N):
 
    if (M == 0):
        return N
    return gcd(N % M, M)
 
  
# Returns GCD of
# Fib(M) and Fib(N)
def findGCDofFibMFibN(M, N):
 
    return fib(gcd(M, N))
 
  
# Driver code
 
M = 3
N = 12
 
print(findGCDofFibMFibN(M, N))
 
# This code is contributed
# by Anant Agarwal.

C#

// C# Program to find GCD of
// Fib(M) and Fib(N)
using System;
 
class gcdOfFibonacci {
     
    static int MAX = 1000;
    static int []f;
 
    // Constructor
    gcdOfFibonacci()
    {
        // Create an array
        // for memoization
        f = new int[MAX];
    }
 
    // Returns n'th Fibonacci number
    // using table f[]. Refer method
    // 6 of below post for details.
    // https://www.geeksforgeeks.org/program-for-nth-fibonacci-number/
    private static int fib(int n)
    {
        // Base cases
        if (n == 0)
            return 0;
        if (n == 1 || n == 2)
            return (f[n] = 1);
 
        // If fib(n) is
        // already computed
        if (f[n]!=0)
            return f[n];
 
        int k = ((n & 1)==1)? (n+1)/2 : n/2;
 
        // Applying recursive formula
        // [Note value n&1 is 1
        // if n is odd, else 0.
        f[n] = ((n & 1) == 1) ? (fib(k) * fib(k) +
               fib(k - 1) * fib(k - 1)) :
               (2 * fib(k - 1) + fib(k)) * fib(k);
 
        return f[n];
    }
 
    // Function to return gcd of a and b
    private static int gcd(int M, int N)
    {
        if (M == 0)
            return N;
        return gcd(N%M, M);
    }
 
    // This method returns GCD of
    // Fib(M) and Fib(N)
    static int findGCDofFibMFibN(int M, int N)
    {
        return fib(gcd(M, N));
    }
 
    // Driver method
    public static void Main()
    {
        // Returns GCD of Fib(M) and Fib(N)
        new gcdOfFibonacci();
        int M = 3, N = 12;
        Console.Write(findGCDofFibMFibN(M, N));
    }
}
 
// This code is contributed by nitin mittal.

PHP

<?php
// PHP Program to find
// GCD of Fib(M) and Fib(N)
$MAX = 1000;
 
// Create an array for memoization
$f = array_fill(0, $MAX, 0);
 
// Returns n'th Fibonacci number
// using table f[]. Refer method
// 6 of below post for details.
function fib($n)
{
    global $f;
     
    // Base cases
    if ($n == 0)
        return 0;
    if ($n == 1 or $n == 2)
        $f[$n] = 1;
 
    // If fib(n) is already computed
    if ($f[$n])
        return $f[$n];
 
    $k = ($n & 1) ? ($n + 1) / 2 : $n / 2;
 
    // Applying recursive formula [Note
    // value n&1 is 1, if n is odd, else 0.
    $f[$n] = ($n & 1) ?
             (fib($k) * fib($k) + fib($k - 1) * fib($k - 1)) :
              ((2 * fib($k - 1) + fib($k)) * fib($k));
 
    return $f[$n];
}
 
// Function to return gcd of a and b
function gcd($M, $N)
{
    if ($M == 0)
        return $N;
    return gcd($N % $M, $M);
}
 
// Returns GCD of Fib(M) and Fib(N)
function findGCDofFibMFibN($M, $N)
{
    return fib(gcd($M, $N));
}
 
// Driver code
$M = 3;
$N = 12;
 
print(findGCDofFibMFibN($M, $N))
 
// This code is contributed
// by mits
?>

Javascript

<script>
      // JavaScript Program to find GCD of Fib(M) and Fib(N)
      const MAX = 1000;
 
      // Create an array for memoization
      var f = [...Array(MAX)];
      f.fill(0);
 
      // Returns n'th Fibonacci number using table f[].
      // Refer method 6 of below post for details.
      // https://www.geeksforgeeks.org/program-for-nth-fibonacci-number/
      function fib(n) {
        // Base cases
        if (n == 0) return 0;
        if (n == 1 || n == 2) return (f[n] = 1);
 
        // If fib(n) is already computed
        if (f[n]) return f[n];
 
        var k = n & 1 ? (n + 1) / 2 : n / 2;
 
        // Applying recursive formula [Note value n&1 is 1
        // if n is odd, else 0.
        f[n] =
          n & 1
            ? fib(k) * fib(k) + fib(k - 1) * fib(k - 1)
            : (2 * fib(k - 1) + fib(k)) * fib(k);
 
        return f[n];
      }
 
      // Function to return gcd of a and b
      function gcd(M, N) {
        if (M == 0) return N;
        return gcd(N % M, M);
      }
 
      // Returns GCD of Fib(M) and Fib(N)
      function findGCDofFibMFibN(M, N) {
        return fib(gcd(M, N));
      }
 
      // Driver code
 
      var M = 3,
        N = 12;
      document.write(findGCDofFibMFibN(M, N));
       
      // This code is contributed by rdtank.
    </script>

Producción: 
 

2

Este artículo es una contribución de Shubham Agrawal . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
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 *