# Fast Doubling method to find the Nth Fibonacci number

Given an integer N, the task is to find the N-th Fibonacci numbers.

Examples:

Input: N = 3
Output: 2
Explanation:
F(1) = 1, F(2) = 1
F(3) = F(1) + F(2) = 2

Input: N = 6
Output: 8

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach:

• The Matrix Exponentiation Method is already discussed before. The Doubling Method can be seen as an improvement to the matrix exponentiation method to find the N-th Fibonacci number although it doesn’t use matrix multiplication itself.
• The Fibonacci recursive sequence is given by

F(n+1) = F(n) + F(n-1)

• The Matrix Exponentiation method uses the following formula • The method involves costly matrix multiplication and moreover Fn is redundantly computed twice.
On the other hand, Fast Doubling Method is based on two basic formulas:

F(2n) = F(n)[2F(n+1) – F(n)]
F(2n + 1) = F(n)2 + F(n+1)2
• Here is a short explanation of the above results:

F(n+1) = F(n) + F(n-1) &
F(n) = F(n)
It can be rewritten in the matrix form as: For doubling, we just plug in “2n” into the formula: Substituting F(n-1) = F(n+1)- F(n) and after simplification we get, Below is the implementation of the above approach:

## C++

 // C++ program to find the Nth Fibonacci  // number using Fast Doubling Method  #include  using namespace std;     int a, b, c, d;  #define MOD 1000000007     // Function calculate the N-th fibanacci  // number using fast doubling method  void FastDoubling(int n, int res[])  {      // Base Condition      if (n == 0) {          res = 0;          res = 1;          return;      }      FastDoubling((n / 2), res);         // Here a = F(n)      a = res;         // Here b = F(n+1)      b = res;         c = 2 * b - a;         if (c < 0)          c += MOD;         // As F(2n) = F(n)[2F(n+1) – F(n)]      // Here c  = F(2n)      c = (a * c) % MOD;         // As F(2n + 1) = F(n)^2 + F(n+1)^2      // Here d = F(2n + 1)      d = (a * a + b * b) % MOD;         // Check if N is odd      // or even      if (n % 2 == 0) {          res = c;          res = d;      }      else {          res = d;          res = c + d;      }  }     // Driver code  int main()  {      int N = 6;      int res = { 0 };         FastDoubling(N, res);         cout << res << "\n";      return 0;  }

## Java

 // Java program to find the Nth Fibonacci  // number using Fast Doubling Method  class GFG{      // Function calculate the N-th fibanacci  // number using fast doubling method  static void FastDoubling(int n, int []res)  {      int a, b, c, d;      int MOD = 1000000007;             // Base Condition      if (n == 0)       {          res = 0;          res = 1;          return;      }      FastDoubling((n / 2), res);         // Here a = F(n)      a = res;         // Here b = F(n+1)      b = res;         c = 2 * b - a;         if (c < 0)          c += MOD;         // As F(2n) = F(n)[2F(n+1) – F(n)]      // Here c = F(2n)      c = (a * c) % MOD;         // As F(2n + 1) = F(n)^2 + F(n+1)^2      // Here d = F(2n + 1)      d = (a * a + b * b) % MOD;         // Check if N is odd      // or even      if (n % 2 == 0)      {          res = c;          res = d;      }      else     {          res = d;          res = c + d;      }  }     // Driver code  public static void main(String []args)  {      int N = 6;      int res[] = new int;         FastDoubling(N, res);         System.out.print(res);  }  }     // This code is contributed by rock_cool

## Python3

 # Python3 program to find the Nth Fibonacci   # number using Fast Doubling Method   MOD = 1000000007    # Function calculate the N-th fibanacci   # number using fast doubling method   def FastDoubling(n, res):              # Base Condition       if (n == 0):           res = 0         res = 1         return                FastDoubling((n // 2), res)          # Here a = F(n)       a = res          # Here b = F(n+1)       b = res          c = 2 * b - a          if (c < 0):           c += MOD          # As F(2n) = F(n)[2F(n+1) – F(n)]       # Here c = F(2n)       c = (a * c) % MOD          # As F(2n + 1) = F(n)^2 + F(n+1)^2       # Here d = F(2n + 1)       d = (a * a + b * b) % MOD          # Check if N is odd       # or even       if (n % 2 == 0):           res = c           res = d       else :           res = d           res = c + d          # Driver code   N = 6 res =  * 2    FastDoubling(N, res)      print(res)          # This code is contributed by divyamohan123

## C#

 // C# program to find the Nth Fibonacci  // number using Fast Doubling Method  using System;  class GFG{      // Function calculate the N-th fibanacci  // number using fast doubling method  static void FastDoubling(int n, int []res)  {      int a, b, c, d;      int MOD = 1000000007;             // Base Condition      if (n == 0)       {          res = 0;          res = 1;          return;      }      FastDoubling((n / 2), res);         // Here a = F(n)      a = res;         // Here b = F(n+1)      b = res;         c = 2 * b - a;         if (c < 0)          c += MOD;         // As F(2n) = F(n)[2F(n+1) – F(n)]      // Here c = F(2n)      c = (a * c) % MOD;         // As F(2n + 1) = F(n)^2 + F(n+1)^2      // Here d = F(2n + 1)      d = (a * a + b * b) % MOD;         // Check if N is odd      // or even      if (n % 2 == 0)      {          res = c;          res = d;      }      else     {          res = d;          res = c + d;      }  }     // Driver code  public static void Main()  {      int N = 6;      int []res = new int;         FastDoubling(N, res);         Console.Write(res);  }  }     // This code is contributed by Code_Mech

Output:

8


Time Complexity: Repeated squaring reduces time from linear to logarithmic . Hence, with constant time arithmetic, the time complexity is O(log n). My Personal Notes arrow_drop_up If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.