Algorithms_in_C++  1.0.0
Set of algorithms implemented in C++.
fibonacci_matrix_exponentiation.cpp File Reference

This program computes the N^th Fibonacci number in modulo mod input argument . More...

#include <iostream>
#include <vector>
#include <cassert>
Include dependency graph for fibonacci_matrix_exponentiation.cpp:

Functions

uint64_t fibo (uint64_t n, uint64_t mod)
 
void test ()
 
int main ()
 

Detailed Description

This program computes the N^th Fibonacci number in modulo mod input argument .

Takes O(logn) time to compute nth Fibonacci number

Author
villayatali123
[unknown author]()
See also
fibonacci.cpp, fibonacci_fast.cpp, string_fibonacci.cpp, fibonacci_large.cpp

Function Documentation

◆ fibo()

uint64_t fibo ( uint64_t  n,
uint64_t  mod 
)

This function finds nth fibonacci number in a given modulus

Parameters
nnth fibonacci number
modmodulo number
24 {
28  n--;
29  result[0]=1, result[1]=1;
30  Identity[0][0]=1; Identity[0][1]=0;
31  Identity[1][0]=0; Identity[1][1]=1;
32 
33  transition[0][0]=0;
34  transition[1][0]=transition[1][1]=transition[0][1]=1;
35 
36  while(n)
37  {
38  if(n%2)
39  {
41  for(int i=0;i<2;i++)
42  {
43  for(int j=0;j<2;j++)
44  {
45  for(int k=0;k<2;k++)
46  {
47  res[i][j]=(res[i][j]%mod+((Identity[i][k]%mod*transition[k][j]%mod))%mod)%mod;
48  }
49  }
50  }
51  for(int i=0;i<2;i++)
52  {
53  for(int j=0;j<2;j++)
54  {
55  Identity[i][j]=res[i][j];
56  }
57  }
58  n--;
59  }
60  else{
62  for(int i=0;i<2;i++)
63  {
64  for(int j=0;j<2;j++)
65  {
66  for(int k=0;k<2;k++)
67  {
68  res1[i][j]=(res1[i][j]%mod+((transition[i][k]%mod*transition[k][j]%mod))%mod)%mod;
69  }
70  }
71  }
72  for(int i=0;i<2;i++)
73  {
74  for(int j=0;j<2;j++)
75  {
76  transition[i][j]=res1[i][j];
77  }
78  }
79  n=n/2;
80  }
81  }
82  return ((result[0]%mod*Identity[0][0]%mod)%mod+(result[1]%mod*Identity[1][0]%mod)%mod)%mod;
83 }
uint64_t result(uint64_t n)
Definition: fibonacci_sum.cpp:76

◆ main()

int main ( void  )

Main function

107 {
108  test();
109  uint64_t mod=1000000007;
110  std::cout<<"Enter the value of N: ";
111  uint64_t n=0; std::cin>>n;
112  std::cout<<n<<"th Fibonacci number in modulo " << mod << ": "<< fibo( n , mod) << std::endl;
113 }
T endl(T... args)
uint64_t fibo(uint64_t n, uint64_t mod)
Definition: fibonacci_matrix_exponentiation.cpp:23
void test()
Definition: fibonacci_matrix_exponentiation.cpp:88
Here is the call graph for this function:

◆ test()

void test ( )

Function to test above algorithm

89 {
90  assert(fibo(6, 1000000007 ) == 8);
91  std::cout << "test case:1 passed\n";
92  assert(fibo(5, 1000000007 ) == 5);
93  std::cout << "test case:2 passed\n";
94  assert(fibo(10 , 1000000007) == 55);
95  std::cout << "test case:3 passed\n";
96  assert(fibo(500 , 100) == 25);
97  std::cout << "test case:3 passed\n";
98  assert(fibo(500 , 10000) == 4125);
99  std::cout << "test case:3 passed\n";
100  std::cout << "--All tests passed--\n";
101 }
Here is the call graph for this function: