讓計算機很快地求出a b c

2022-05-23 20:18:08 字數 1410 閱讀 4946

讓計算機很快地求出ab

暴力相乘的話,電腦要計算 b 次。用快速冪,計算次數在 log 2(b) 級別,很實用。

原理 i

(1)如果將 a 自乘一次,就會變成 a2 。再把 a2 自乘一次就會變成 a4 。然後是 a^8

…… 自乘 n 次的結果是 a^2 n

(2)axay = ax

+y,這個容易。

(3)將 b轉化為二進位制**一下:

比如b=(11)10 就是 (1011) 2 。從左到右,這些 11 分別代表十進位制的 8,2,18,2,1。可以說 a11= a8 × a2 × a1

為什麼要這樣表示?因為在快速冪的過程中,我們會把 a 自乘為 a^2

,然後 a2a 自乘為 a4……像上面第一條說的。

過程會是這樣:

(好長,可以不看,如果要閱讀下面的模擬過程的話,要慢慢地看噢)·假設我們拿到了 a,並且 b=11。想求 a^11 ,但是又不想乘11次,有點慢。·以電腦視角稍稍觀察一下 b=11,二進位制下是 b=1011。·製作乙個 base。現在 base=a,表示的是,a1 = a。待會base會變的。·製作乙個 ansans,初值 11,準備用來做答案。

while(b > 0)

·迴圈二,再看看 b,最後一位還是 1。這說明有「 ×a 2 」,ans∗=base。 繼續努力,通過 base∗=base 讓自己變成了 a 4 。然後 b 也右移 一位,b=10。迴圈三,可是 b 的最後一位不再是 1 了,說明不存在「 × a4 」。base 自我昇華,達到了 a8 。且 b>>=1。這一步中,答案沒有增加,可是畢竟 b>0,還有希望。·迴圈四,b 的最後一位是 1,這說明「 ×a8 」的存在。ans *= base。由於 b 再右移一位就是 0 了,迴圈結束。

總的來說,如果 b在二進位製上的某一位是 1,我們就把答案乘上對應的 。不懂的話,請結合**理解~

實現

int quickpower(int a, int b)//是求a的b次方

return ans;

}

取餘運算

快速冪經常要結合取餘運算。這裡也講一點。

取餘運算有一些好用的性質,包括:

(a+b) \mod b = (a \mod b + b \mod b) \mod b

(a×b) \mod b = ((a \mod b) × (b \mod b)) \mod b

證明都很簡單,如果要說服自己的話拿起筆試試吧。可設 a = k_a × b + r_a

於是快速冪過程中可以

while(b > 0)

base *= base;

base %= m;

b >>= 1;

}

能保證這樣下來最後的結果與「先乘到最後,再取餘」的結果一樣。

讓計算機思考

引言 從乙個簡單的猜拳小遊戲來窺探 ai,人們對於 ai 的認知是從什麼角度出發的?又是從什麼角度對自己來認知的?本文參照於 程式是怎麼跑起來的 ai artificial intelligence 英 t f l 人造的 英 n tel d ns 智力 整體思路 1 直覺 想法 2 習慣 概率 3...

求出計算機的最大遞迴深度

由於計算機棧的記憶體有限,而函式遞迴會呼叫到棧,所以函式的遞迴深度有限 用以下的 可以求出在本機最大遞迴深度,用二分法測出來的。python和c 差這麼多的原因可能是編譯器分配的棧記憶體不同 棧的記憶體可以自己調整 python def get dep num if num 1 return 1el...

C 讓計算機自動重啟

怎樣讓計算機重新啟動 關機登出 主要是利用win32裡面的函式呼叫.bool exitwindow uint uflags,dword dwreason 第乙個引數關閉型別 有以下幾種型別 1 ewx logoff 關閉所有的程序 2 ewx poweroff 關閉電源 3 ewx reboot 關...