Saturday, January 21, 2012

Fibbonacci Matrix Modular

#include <stdio.h>
#include <math.h>


long long FM[40][2][2], M ; // M = MOD value


void FiMatMultiply ( long long P[2][2], long long a[2][2], long long b[2][2] )
{
long long t[2][2] ;


t[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0] ;
t[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1] ;
t[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0] ;
t[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1] ;


P[0][0] = t[0][0] % M ;
P[0][1] = t[0][1] % M ;
P[1][0] = t[1][0] % M ;
P[1][1] = t[1][1] % M ;
}


long long fibonacci ( long long N )
{
int i ;
long long P[2][2] ;


P[0][0] = P[1][1] = 1 ;
P[1][0] = P[0][1] = 0 ;


for ( i = 0; N > 0; i++ )
{
if ( N % 2 )
{
FiMatMultiply ( P, P, FM[i] ) ;
}
N /= 2 ;
}
return P[1][0] ;
}


void fiboMatrix ()
{
int i ;
FM[0][0][0] = 0 ;
FM[0][1][1] = 1 ;
FM[0][1][0] = 1 ;
FM[0][0][1] = 1 ;


for ( i = 1; i < 32; i++ )
{
FiMatMultiply ( FM[i], FM[i-1], FM[i-1] ) ;
}
}


int main ()
{
long m, Fn, n ;


while ( scanf ( "%ld%ld", &n, &m ) == 2 )
{
M = pow ( 2, m ) ;//Mode value
fiboMatrix () ;


Fn = fibonacci ( n ) ;


printf ( "%ld\n", Fn ) ;
}
return 0 ;
}
/*
Input:
20
57
345
Output:
6765
365435296162
563963353180680437428706474693749258212475354428320807161115873039415970
*/

No comments:

Post a Comment