#include 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; }