60 lines
1.3 KiB
C
60 lines
1.3 KiB
C
#include<stdio.h>
|
|
enum {SIZE=2};
|
|
|
|
/* Функция умножает матрицу a на b и результат заносит в a */
|
|
void mulMatr(int a[][SIZE], int b[][SIZE])
|
|
{
|
|
int res[SIZE][SIZE] = {{0}};
|
|
|
|
for (int i = 0; i < SIZE; i++)
|
|
for (int j = 0; j < SIZE; j++)
|
|
for (int k = 0; k < SIZE; k++)
|
|
{
|
|
res[i][j] += a[i][k] * b[k][j];
|
|
}
|
|
for (int i = 0; i < SIZE; i++)
|
|
for (int j = 0; j < SIZE; j++)
|
|
a[i][j] = res[i][j];
|
|
}
|
|
|
|
/* Функция бинарного возведение в степень матриц*/
|
|
int fibMatr(int pow)
|
|
{
|
|
int t[2][2] = {
|
|
{1,0},
|
|
{0,1}
|
|
};
|
|
int p[2][2] = {
|
|
{0,1},
|
|
{1,1}
|
|
};
|
|
while(pow > 0)
|
|
{
|
|
if( pow%2 == 1)//нечетная степень
|
|
mulMatr(t,p);//переходим к чет
|
|
mulMatr(p,p);
|
|
pow /= 2;
|
|
}
|
|
return t[1][0];
|
|
}
|
|
/*
|
|
|0 1|n |F(n-1) F(n) |
|
|
|1 1| = |F(n) F(n+1)|
|
|
*/
|
|
void printMatr(int a[][SIZE])
|
|
{
|
|
for (int i = 0; i < SIZE; i++) {
|
|
for (int j = 0; j < SIZE; j++)
|
|
{
|
|
printf("%2d",a[i][j]);
|
|
}
|
|
printf("\n");
|
|
}
|
|
}
|
|
int main(void)
|
|
{
|
|
printf("%d",fibMatr(10)); // 55
|
|
return 0;
|
|
}
|
|
|