行列[2,2][1,0]があります。この2*2行列のn番目の乗算が必要です。単純な乗算を使用する場合、O(n)またはO(logn)で実行できます。O(logn)コード:
int NUM(int n)
{
int F[2][2] = {{2,2},{1,0}};
if(n == 0)
return 0;
power(F, n-1);
return F[0][0];
}
/* Optimized version of power() */
void power(int F[2][2], int n)
{
if( n == 0 || n == 1)
return;
int M[2][2] = {{2,2},{1,0}};
power(F, n/2);
multiply(F, F);
if( n%2 != 0 )
multiply(F, M);
}
nの値が小さい場合は問題なく動作しますが、nが10 ^ 9以上の場合、int、long int、long long intでも機能しないため、この方法はあまり役に立たないと思います。 。
基本的に私の問題は、数値がかなり大きくなり、長い整数でさえも来ないということです。それでは、どうすればそれに対処できますか。
nが10^9のときに2*2行列[2,2][1,0]のn乗を取得するための式またはアルゴリズムを誰かが私に提案できますか?
ありがとう