矩陣快速冪求斐波那契數列

2021-07-30 09:55:31 字數 1934 閱讀 2408

求數a

aa的n

nn次冪,可以採用二分法進行快速計算,即

a n=

a^}\cdot a^}, & n為偶數\\ a\cdot a^}\cdot a^}, & n為奇數 \end\right.

an=a^n&=a^\\ &=a^\\ &=a^\cdot a^\cdot a^\cdot a^\cdots a^\\ &=a^\cdot (a\cdot a)^\cdot (a^2\cdot a^2)^\cdot (a^4\cdot a^4)^\cdots (a^}\cdot a^})^\end

an​=a(

b0​b

1​b2

​b3​

⋯bk​

)2​=

ab0​

20+b

1​21

+b2​

22+b

3​23

+⋯bk

​2k=

a1b0

​⋅a2

b1​⋅

a4b2

​⋅a8

b3​⋯

abk​

2k=a

b0​⋅

(a⋅a

)b1​

⋅(a2

⋅a2)

b2​⋅

(a4⋅

a4)b

3​⋯(

a2k−

1⋅a2

k−1)

bk​​

public

intpower

(int a,

int n)

n /=2;

// 還可以用 n = n >> 1,表示二進位制右移一位

a *= a;

// 迭代計算下一位的基數

}return result;

}

和上述思路完全一樣,只是全部對於矩陣乘法。斐波那契數列定義如下

f (n

)=

0, & n=0\\ 1, & n=1\\ f(n-2)+f(n-1), & n\ge2 \end\right.

f(n)=⎩

⎨⎧​0

,1,f

(n−2

)+f(

n−1)

,​n=

0n=1

n≥2​

可以構造矩陣a=[

1110

]a=\left[\begin1 \quad 1\\ 1 \quad 0\end\right]

a=[111

0​],則[f(

n+1)

f(n)

f(n)

f(n−

1)]=

an

\left[\beginf(n+1) \quad f(n)\\ f(n) \quad f(n-1)\end\right]=a^n

[f(n+1

)f(n

)f(n

)f(n

−1)​

]=an

。其中a

na^n

an就可以使用矩陣快速冪計算。

public

class

fibonacci

r[i]

[j]= tmp;}}

return r;

}static

intfibonacci

(int n),}

;int

a =

newint

,};while

(n >0)

n /=2;

a =dot(a, a);}

return result[0]

[0];

}public

static

void

main

(string[

] args)

}

矩陣快速冪(求斐波那契數列)

矩陣快速冪求斐波那契數列的模板 因為fib n 至於最近的倆個序列有關 及fib n 1 和fib n 2 所以我們儲存最近的那倆個就行了。設f n 表示乙個1 2的矩陣,f n fib n fib n 1 可以看成 a,b a b,b 所以可以變成f n f n 1 a a表示乙個二維矩陣 a 2...

矩陣快速冪 斐波那契數列

time limit 1000 ms memory limit 128 mb 通過小l的不懈努力,他即將成為大神啦,他登上了大神專屬的頒獎臺。在頒獎台上,他即將領取代表著大神的無限榮譽的勳章。小l走上頒獎台後,在台上發現了乙個製作精美的盒子。榮譽勳章就在盒子裡面。小l發現這個盒子被上了鎖,在這個盒子...

矩陣快速冪 斐波那契數列

先來實現乙個矩陣相乘的函式吧。const int mod 10000 struct mat mat mat mul mat x,mat y 實現兩個矩陣相乘,返回的還是乙個矩陣。return res 其實和普通快速冪類似,只不過這裡需要得到的是乙個矩陣下面來實現乙個矩陣快速冪 int pow int...