Related Articles
Fast Doubling method to find the Nth Fibonacci number
• Difficulty Level : Expert
• Last Updated : 26 Mar, 2021

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

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

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:

Start with:
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 methodvoid 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 codeint 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 Methodclass GFG{ // Function calculate the N-th fibanacci// number using fast doubling methodstatic 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 codepublic 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 MethodMOD = 1000000007 # Function calculate the N-th fibanacci# number using fast doubling methoddef 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 codeN = 6res =  * 2 FastDoubling(N, res) print(res)     # This code is contributed by divyamohan123

## C#

 // C# program to find the Nth Fibonacci// number using Fast Doubling Methodusing System;class GFG{ // Function calculate the N-th fibanacci// number using fast doubling methodstatic 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 codepublic static void Main(){    int N = 6;    int []res = new int;     FastDoubling(N, res);     Console.Write(res);}} // This code is contributed by Code_Mech

## Javascript

 
Output:
8

Time Complexity: Repeated squaring reduces time from linear to logarithmic . Hence, with constant time arithmetic, the time complexity is O(log n).

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up