Fibonacci數列 利用矩陣快速冪

2021-08-19 10:01:02 字數 2966 閱讀 4511

fibonacci數列就形如:0, 1, 1, 2, 3, 5, 8, 13, ....

現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項

可以看出 第1項為0, 第2項為1, 第三項為1, 第四項為2 = 第三項+第二項, ...... 第n項 = 第(n-1)項+第(n-2)項

即  f(n) = f(n-1) + f(n-2) 設 

a為m×p

的矩陣,

b為p×n

的矩陣,那麼稱 

m×n的矩陣 

c為 矩陣 a和 

b的乘積,記作

又矩陣乘法滿足結合律,即 

那我們就需要求出 a^(n-1)

例如 4 = 100

4 = 1 * 2 ^(2) + 0 * 2 ^(1) + 0 * 2 ^(0)

a = a ^(1*2^(2)) * a^(0*2^(1)) * a

^(0*2^(0))

**:

public static class matrix 

matrix(int row, int col, int op)

}matrix(matrix matrix) }}

matrix multiply(matrix matrix) }}

return ret;

}matrix power(int n)

n = n / 2;

matrix = matrix.multiply(matrix); // 算 a(^n)

}return ret;}}

public static int fibonacci(int n)

if (m == 1)

matrix a = new matrix(2, 2);

matrix b = new matrix(2, 1);

a.value[0][0] = 1; a.value[0][1] = 1;

a.value[1][0] = 1; a.value[1][1] = 0;

b.value[0][0] = 1;

b.value[1][0] = 0;

return a.power(m - 1).multiply(b).value[0][0];    // f(n) = c(n)[0][0] = a^(n-1) b [0][0]

}public static void main(string args)

我們將公式修改一下

f(n) = 6 * f(n-1) + 5 * f(n-2) + n^2 + 6 * n + 5

同樣的, 需要先找出 矩陣 a 和矩陣 b

同樣的 c = ab, 我們需要找的 f(n) = c(n)[0][0]

我們擬構造一下

當 n = 2 和 n = 3 時,

矩陣a 需要做的 就是 n = 3 時 的結果 是 n=2 時的結果 和 矩陣a 相乘

n=3時:

第一行: f(2) = 6 * f(1) + 5 * f(0) + (2+1)^2 + 6 * 2 + 5

第二行:  f(1) = n為2時的第一行

第三行:  (2+1) ^ 2 = 2^2 + 2*2*1 + 1^2

第四行:  2+1 = 2  +   1

第五行:  1 = 1

體現在矩陣a 中:

我們模擬一下資料:

第乙個數 f(0) : 0

第二個數 f(1) : 1

第三個數 f(2) : 27

第四個數 f(3) : 199

第五個數 f(4) : 1374

......

最後我們修改一下**來實現

我們只需要修改一下矩陣a 和矩陣b就可以了, 帶入剛剛推出來的矩陣a 和矩陣b

public static int fibonacci(int n) 

if (m == 1)

int x = ,,,

,};int y = ,,,

,};matrix a = new matrix(5, 5);

matrix b = new matrix(5, 1);

a.value = x;

b.value = y;

return a.power(m - 1).multiply(b).value[0][0];

}

其他的地方不變

測試一下

第6個數 為 f(5) = 6 * f(4) + 5 * f(3) + 5^2 + 6 * 5 + 5 =  9299

缺陷: 當第n個數過大時, 使用int型別裝不下會產生溢位

Fibonacci數列的矩陣運算

fibonacci數列這一族的acm層出不窮,屢屢坑爹,每次好容易看出是它結果又死在o n 演算法上 下面貼出來的是fibonacci數列的o log n 的矩陣演算法 include typedef long long ll typedef struct valuepair valuepair,v...

fibonacci數列矩陣快速冪

對於矩陣 1 1 1 0 的n次冪,第一行第二個元素 右上角 的元素即為fibonacci數列的第n項,由此可以根據矩陣的乘法計算fibonacci數列的元素值 矩陣的快速冪利用的也是冪乘的二分法,只不是換成了矩陣的乘法,可以用函式處理。可以定義乙個二維陣列的結構體 typedef struct m...

優美的Fibonacci數列與矩陣

題目 題意 給定fibonacci數列f,令 分析 對於fibonacci數列的題目來說一般要構造矩陣。那麼本題應該怎樣解決?首先我們設 因為所以得到 那麼,我們繼續有 然後我們可以構造矩陣了。如下 到了這裡,本題完美解決!include include include using namespac...