能否在O nlogn 時間內實現大數的進製轉換?

時間 2021-05-31 07:24:21

1樓:影月

這裡有些乾貨, 看了其他的答案,似乎沒什麼特別好的回答.

f(x) = a0*x^0 + a1*x^1 + a2*x^2 + a3*x^3 + a4*x^4 + ....

=B0*x^0 + B1*x^1 + B2*x^2 + B3*x^3 + B4*x^4 + …. (1)

= (B0 + B1*x^1)*x^0 + (B2+B3*x)*x^2 + (B4 + B5*x)*x^4 + …..

= C0*x^0 + C2*x^2 + C4*x^4 + ….. (2)

= D0*x^0 + D4*x^4 + …. (3)

= N0*x^0 + N(n/2) * x^(n/2) (t)

= M簡單起見, 合理假設k * k 長度的乘法複雜度是 k logk

複雜度計算位

(1) (2) (3) ….(t)

每行的複雜度為 N / k * k logk = N * logk

共 logN行

O(N) = N * log1 + N * log2 + N * log4 + N * log8 + ….NlogN

= N * LogN * (1/LogN + ….1 / 4 + 1/2 + 1/1) (準確值)

= N*logN

PS:這裡有幾個地方是是有較大的修正:

1)在實際工程上, (1/LogN + ….1 / 4 + 1/2 + 1/1) 這一坨這裡N 可以認為不可能大於 2^32次方, 因此這裡基本上就是乙個很小的常數K,

2)由於以上的計算只是簡單地把 k * k位乘法看成 klogk的乘法,實際上,這個估算是估算大了,如果k不大的情況下,k * k 有比klogk的FFT更好的演算法.

3)每一層 * x^k這個乘法,由於 *x^K在每層都是固定的, 實際上FFT裡面的3次傅利葉變換,有一次傅利葉變換在每層裡面都是可以共用的. 因此每次* x^k 實際上平均下來相當於只要2次變換多一些就可以了

因此這個

(準確值) 裡面的 NlogN 的係數實際上並不大.

另外,這個演算法跟多少進製轉換到多少進製無關.

2樓:凌人

以二進位制轉十進位制為例:

已知大數 B0,可以通過貪心演算法得到小於但是接近 B0 的十進位制數 D0 (10^n, n = 2^x)

將 B0 轉成 D0 進製的 B1

將 B1 轉成 D1 (10^(n / 2)) 進製的 B2按上述方式迭代至 Dm = 10 得到的 Bm 為期望解,且符合期望時間複雜度

突然剛發現貪心演算法部分需要用到 n*n 複雜度的乘法,乖乖用模板元生查詢表成然後二分查詢吧

3樓:靈劍

先解決其中的兩種特例,再通過和2進製相互轉換的方式解決其它情況。這裡預設用到的a或者b進製的係數本身的加減乘除運算都是O(1)的,不考慮2^1000-1進製這種情況。

第一種最簡單,如果a和b存在正整數m和n滿足 ,那麼這個轉換是很容易的,只需要a進製每m位轉換成b進製n位即可,這個應該很好理解,就不具體說了。

第二種我們考慮a和b互質的情況,這裡考慮應用尤拉定理,對於任意的正整數k,有:

這裡 是尤拉函式,代表1-n中與n互質的數的個數。注意到與 互質的數一定與b也互質,很容易得到

也就有我們可以將同余式改寫成

注意到有

將 本身用b進製表示的話,這個遞推式本身是需要乘法的,這裡需要應用多項式快速乘法的原理,將所有的b進製數都表示成FFT變換的形式(FFT的大小可以提前通過最大需要的位數估算出來),這樣多項式的b次方的計算可以通過FFT計算,複雜度可以降到 ,由於 的位數不超過 ,當k為 時算出 到 整體的複雜度也是

現在,將乙個n位a進製數A轉換為b進製,且a與b互質時,我們首先取k使得

然後將這個數分解成後 位和前面的位數,這兩個分解後的a進製數分別記為B和C,即

如果遞迴計算出B和B+C的b進製表示式,接下來同樣用FFT計算一次乘法,再移位、相加,額外的複雜度為 ,而B和C的長度不超過 ,整體複雜度應該不超過 。如果中間保留FFT結果(B和C都遞迴計算出FFT結果),考慮到FFT結果可以以 的時間複雜度進行乘法、加法、移位和擴張(點數加倍),整體複雜度可以降到 ,但是需要證明這種情況下進製處理的複雜度不會增加。

接下來我們來處理a和b不互質的情況,考慮到如果我們可以將所有進製的數都和2進製進行 的相互轉換,那也就等於所有進製之間都可以互相轉換了,所以我們接下來的重點考慮和2進製的相互轉換。奇數進製、 進製的情況前面解決了,我們接下來解決 ,其中q是大於或等於3的奇數的情況。

首先是a進製向2進製轉換,跟之前一樣我們有

跟之前一樣寫成

兩邊同時乘以乙個係數有

即剩下的和之前做法差不多,首先將n位數A分解為

然後變成

遞迴轉換B和C,然後通過相同的方法做乘法、移位、加法,就可以實現轉換。

接下來是2進製向a進製轉換,和之前一樣有

寫成同時乘以 得

也就是之後也是分解

和剛才略有不同的是,這次是先移位相加,然後再分別轉換,但複雜度是一樣的。

至此,所有進製都可以和2進製相互轉換,因此所有進製之間也都可以進行相互轉換了。

4樓:

參見 Numerical Recipes in C: The Art of Scientific Computing. Second Edition by William H.

Press, Saul A. Teukolsky, William T. Vetterling and Brian P.

Flannery 第922頁,書裡實現的是 的方法,但是書裡說了

NOTE: For simplicity, this routine implements a slow algorithm. Fast , more complicated, radix conversion algorithms do exist.

書裡前一段是這麼說的

Itispossible to do the radix conversion as a fast operation by a "divide and conquer" strategy.

所以應該是用分治法

5樓:XSBZYHZBYP

如果這個問題的答案有了,你是不是就想顛覆現有計算機的數學架構哦?

從這個數可以確定一組泛函。轉換前後的兩個不同數制的陣列,分別以整數的形式落在兩個一元多項式上,如果可以快速轉換,各種不同的數制平行計算即可實現,我理解這實際上就是量子模擬計算。

從實數出發,這一想法已經被5次以上無根式解鎖定,現在就看有沒有其它捷徑了。

如何通過勤奮兼職在短時間內實現每天賺100元?

朵阿貝 看了以上那些回答有些困惑 靠努力兼職日賺100元很困難嗎?1.掛在補習班做兼職老師。語數外物化生都可以,興趣班那種也行,一堂課也至少能賺個40塊錢,一天教兩到三堂課就有100多了,當然下班時間估計會晚。2.擺地攤或者做那種流動小吃。 劉豪 哈哈!如果我有一百萬的話我肯定不會發在餘額寶,我也不...

怎樣在短時間內擺脫拖延?

楊楊 1.想嚴重的後果。想想這件事如果不做,會對自己有什麼嚴重的後果。2.先想只做這件事情的第一步,讓想象的阻力減少。即騙自己的大腦。因為拖延的發生就是因為大腦想這件事情後,產生的阻力太大,所以便拖延不願意做。當你做第一步之後,便能繼續做了。所以重要的是開始。比如,想洗一件衣服,原來想到的是拿衣服,...

請問怎麼在短時間內提高成績

TSe 巧了我也初一,我嘛就是上課好好聽,作業好好寫,總之主動一點就好了,初一我覺得沒有必要啥的熬夜刷題。老師要求幹的認真幹,自己薄弱的地方自己清楚,多補一下就可以的。 一池萍碎 By putting enough efforts.No pains,no gains.Also,try to conc...