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...