坑 快速冪中的大數乘法

2021-10-19 10:17:07 字數 1361 閱讀 8975

小朋友,你是否有很多問號:

明明用了快速冪,為啥還是 tle

\colortle

tle ?

快速冪||取餘數

簡單描述一下:求 bpm

od

kb^p\ mod\ k

bpmodk

一般人會利用 (a⋅

b)%c

=(a%

c)⋅(

b%c)

%c

(a\cdot b)\%\ c\ =(a\%c)\cdot(b\%c)\%c

(a⋅b)%

c=(a

%c)⋅

(b%c

)%c 這個性質,在迴圈內部取餘,防止結果太大爆掉。但是 python 自帶高精度啊,咱有恃無恐,所以直接呼叫 fastpow(a, b)%k 來計算結果。然後就妥妥 tle

\colortle

tle 了。

為啥呢?因為快速冪 o(l

ogn)

o(log\ n)

o(logn

) 複雜度的前提是乘法運算是常數時間

高精度雖然不會爆掉,但是它的乘法是大數乘法,並不是常數時間。

來做個實驗:

import timeit

defpow

(a, b)

: p =

1for i in

range

(b):

p *= a

return p

deffastpow

(a, b)

: p =

1while b !=0:

if b &1:

p *= a

a *= a

b >>=1

return p

t1 = timeit.default_timer(

)a =

pow(1,

999999

)t2 = timeit.default_timer(

)a = fastpow(3,

999999

)t3 = timeit.default_timer(

)print(''

.format

(t2-t1)

)print(''

.format

(t3-t2)

)

結果如下:

0.030459

0.186064

「神奇」 的現象出現了:

快速冪比樸素演算法還慢好多!

另外,這題利用 python 內建函式 pow(b, p, k) 可以直接得到結果。

快速冪 大數乘法取模

求冪的優化 快速冪 大數相乘取模 快速大數冪 快速冪 在的標頭檔案中自帶的pow 函式在呼叫時需要一系列型別轉換,所以數值並不是很嚴格精確,存在誤差,執行效率低,最好不要用,最好自己編寫。ll mypow ll x,ll n,ll mod return res 大數乘法取模 在計算 x x mod ...

快速乘法 快速冪

description 從 n 個不同元素中任取 m m n 個元素,按照一定的順序排列起來,叫做從 n 個不同元素中取出 m 個元素的乙個排列。當 m n 時所有的排列情況叫全排列。你覺得 xxy 會問你全排列的個數嗎?xxy 這個問題能淹死你,我才不問呢。我 要問的是求 n 的全排列中,先遞增後...

快速冪乘法

原創作者 by 夜 深 感謝作者 在 上一直沒有找到有關於快速冪演算法的乙個詳細的描述和解釋,這裡,我給出快速冪演算法的完整解釋,用的是c 語言,不同語言的讀者只好換個位啦,畢竟讀 c的人較多 所謂的快速冪,實際上是快速冪取模的縮寫,簡單的說,就是快速的求乙個冪式的模 餘 在程式設計過程中,經常要去...