设计一个程序实现两个任意长的整数的求和运算_深入 Python (7) Karatsuba 实现长整数乘法...
Python 的長整數(shù)乘法使用了 Karatsuba 算法,昨天寫的比較粗,今天仔細研究了下它的實現(xiàn),真是妙啊。
多項式乘法
在一切開始之前,需要回顧多項式乘法公式:
(a + b)(c + d) = ac + ad + bc + bd
這是基本的初等數(shù)學知識,Karatsuba 算法的實現(xiàn)本質(zhì)上就是對這個公式的變形。
長整數(shù)切分
為了計算長整數(shù)的乘法,一種典型的思路是使用分治思想,將長整數(shù)切分為較短的部分計算。這里需要注意的是,計算機在計算一個數(shù)的 2^n 倍非???#xff0c;只需要將內(nèi)存左移 n 位即可。
對于一個無符號整數(shù) A,可以將其切分高低兩部分,假設將其切分為高低 8 位:
那么 A 就可以表示為
,這里 n = 8。實際上 n 可以是任意正整數(shù),對于長整數(shù),為了便于計算,通常將 n 設置為較長整數(shù)寬度的一半。
兩個長整數(shù)的乘積
由于我們可以將兩個長整數(shù)按照低位均為 n 位切分:
此時 A * B 就是一個多項式乘法:
這里需要注意一下,
,回顧前面提到的乘法實現(xiàn),2^(n + n) 相當于將內(nèi)存中的值整體左移 2n 位。
Python 中的 Karatsuba 乘法實現(xiàn)
首先 Python 申請一個長度為 sizeA + sizeB 的內(nèi)存 Result,用于保存最終的結(jié)果,這一個連續(xù)區(qū)域被劃分為三部分:
由低到高分別是寬度為 n、n 及剩余的區(qū)間,如果對較淺色區(qū)域加 X,實際上相當于 Result + X * 2^n,在較深區(qū)域加 Y,相當于 Result + Y * 2^(2n),這兩項剛好是上一部分講到的多項式乘法的二次項和一次項。
完成結(jié)果對象的創(chuàng)建后,首先將 A、B 分割為低位寬度為 n 的兩部分,先計算 A_hi * B_hi? 并將結(jié)果保存到 深色區(qū)域,對照上一節(jié)中的公式,此時
再計算 A_lo??B_lo?,結(jié)果放在最低 n 位,此時
,二次項和常數(shù)項都有了,下面是計算中間的一次項。
之后分別將
的結(jié)果加到左移 n 位的位置,內(nèi)存看起來是這樣:
此時
可以看到這種內(nèi)存布局的巧妙之處,三段內(nèi)存獨立求和,假如存在進位,剛好自動計入更高分片。
對比完整公式,還欠缺一次項的 K。
最后在左移 n 位的位置加 K,就得到了最終的乘法結(jié)果。
關注我,了解程序員的燒腦日常,還有開源 Python 教程。
總結(jié)
以上是生活随笔為你收集整理的设计一个程序实现两个任意长的整数的求和运算_深入 Python (7) Karatsuba 实现长整数乘法...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OPPO Pad 2 平板预热:搭载 7
- 下一篇: python 物联网开发板_物联网学什么