矩陣快速冪

2021-08-22 19:38:20 字數 2154 閱讀 7790

1.引入

//整數快速冪

為了引入矩陣的快速冪,我先看了求整數的冪,即x^n

例如求x^8  就是x*x*x*x*x*x*x*x

正常的運算方式是,x的值乙個個往上乘上去,乘法運算執行7次

(x  x)(x x) (x x)(x x)

也可以採用這種運算方式,先進行乘法得到x^2再對x^2進行三次乘法。這種運算要明顯比第一種情況要快

所以對於整數快速冪,也是結合了這種思想

(x^m)*(x^n)=x^(m+n)

x^19=(x^16)(x^2)(x^1)

//整數快速冪

int quickpow(int x,int n)

res = res*res;

n = n>>1;

}return ans;

}

我們用 x^19來走這個函式

舉例:x^19   

19的二進位制為:1 0 0 1 1

初始:ans = 1 ; res = x ;

則10011最後1位是1,為奇數

ans = res *ans =x ;

res =res * res = x ^ 2 ;

然後右移一位,1001

最後一位為1,為奇數

ans = res*ans = x*(x^2) = x^3;

res = res*res = x^2*x^2 = x^4 ;

然後右移一位, 100

為偶數res = res*res = x^4*x^4 = x^8;

然後右移一位,10

為偶數res=res*res=x^8*x^8=x^16;

然後右移一位,1

為奇數ans = ans*res = (x^3)*(x^16) = x^19;

res = res*res = x^32

res=x^m,m始終是與二進位制位置上的權值是相互對應的。

當二進位制為0時候,我們只讓res*res使得冪指數乘2,對應下乙個二進位制權值;

當二進位制為1時候,我們讓ans=ans*res,乘上了x冪次。

2.矩陣快速冪

看完了整數快速冪之後,再來學習一下,矩陣快速冪,

設有乙個n*n的方陣a。

給出乙個數m,即計算矩陣a的m次冪 a^m

struct matrix  //結構體,矩陣型別

ans,res;

//計算矩陣乘法的函式,引數是矩陣a,矩陣b和乙個n,代表這兩個矩陣是幾階方陣

maxtrix mul(maxtrix a,maxtrix b,int n)

//快速冪演算法,求矩陣res的n次冪

void quickpower(int n,int n)

while(n)

}

這是簡單的計算矩陣冪,在實際中的運用的話,

3.實際應用

我們以最為常見的斐波那契數列為例:

f[n]=f[n-1]+f[n-2]

f[0]=0,f[1]=1;

斐波那契數列是乙個遞推式求出來的

第n+1項由第n項和第n-1項遞推而來

因此可以用矩陣表示:

poj3070/nyoj148

給出了矩陣相乘的定義,要你求出斐波那契的第n項對1e4取餘。

#include #include #include #include using namespace std;

typedef long long ll;

const int mod=10000;

typedef vectorvec;

typedef vectormat;

mat mul(mat &a,mat &b)//表示不會這樣用,,,,}}

return c;

}mat pow(mat a,ll n)

return 0;

}

快速冪(矩陣快速冪)

求 3 0 3 1 3 n mod 1000000007 input 輸入乙個數n 0 n 10 9 output 輸出 計算結果 sample input 3sample output 40 分析 利用等比數列的求和公式得所求和是 3 n 1 1 2,如果暴力求3 n 1 會超時,這裡引入快速冪來...

快速冪 矩陣快速冪

快速冪 正常情況下求乙個數的冪時間複雜度為o n 而快速冪能把時間複雜度降到o logn 舉個例子 求5的13次方 思想首先把13化為二進位制 1101,即13 1101 8 1 4 1 2 0 1 1 即5 13 58 1 54 1 52 0 5 1 15 5 8 1 5 4 1 5 2 0 5 ...

快速冪 矩陣快速冪

快速冪 我們求a ba b ab最直接的方法就是把a乘b次這樣的話複雜度就是o n o n o n 但是在比賽時面對1e9的資料時還是會輕鬆超時的,此時就需要一種更快的乘法來幫助我們 我們把b拆成二進位制的形式得到a ba b ab a 10.01 a a1 0.01此時對b分解得到的序列10.01...