2016-12-24 77 views
1
import java.math.BigInteger; 
import java.util.Random; 

class Karatsuba { 
private final static BigInteger ZERO = new BigInteger("0"); 

public static BigInteger karatsuba(BigInteger x, BigInteger y) { 

    // cutoff to brute force 
    int N = Math.max(x.bitLength(), y.bitLength()); 
    if (N <= 2000) return x.multiply(y);    // optimize this parameter 

    // number of bits divided by 2, rounded up 
    N = (N/2) + (N % 2); 

    // x = a + 2^N b, y = c + 2^N d 
    BigInteger b = x.shiftRight(N); 
    BigInteger a = x.subtract(b.shiftLeft(N)); 
    BigInteger d = y.shiftRight(N); 
    BigInteger c = y.subtract(d.shiftLeft(N)); 

    // compute sub-expressions 
    BigInteger ac = karatsuba(a, c); 
    BigInteger bd = karatsuba(b, d); 
    BigInteger abcd = karatsuba(a.add(b), c.add(d)); 

    return ac.add(abcd.subtract(ac).subtract(bd).shiftLeft(N)).add(bd.shiftLeft(2*N)); 
} 


public static void main(String[] args) { 
    long start, stop, elapsed; 
    Random random = new Random(); 
    int N = Integer.parseInt(args[0]); 
    BigInteger a = new BigInteger(N, random); 
    BigInteger b = new BigInteger(N, random); 

    start = System.currentTimeMillis(); 
    BigInteger c = karatsuba(a, b); 
    stop = System.currentTimeMillis(); 
    StdOut.println(stop - start); 

    start = System.currentTimeMillis(); 
    BigInteger d = a.multiply(b); 
    stop = System.currentTimeMillis(); 
    StdOut.println(stop - start); 

    StdOut.println((c.equals(d))); 
} 
} 

N =數字爲什麼不是karatsuba O(n^2)的複雜性?

號因爲我們有一點複雜程度處理使每一個除了會採取O(n)和每個遞歸調用有一個至少一個除導致總的(正2000)* N。我在這裏做錯了什麼?

代碼從 - http://introcs.cs.princeton.edu/java/99crypto/Karatsuba.java.html

回答

2

因爲只有3遞歸調用,而不是4 See slide 5

BigInteger ac = karatsuba(a, c); 
BigInteger bd = karatsuba(b, d); 
BigInteger abcd = karatsuba(a.add(b), c.add(d)); 
+0

仍然沒有得到它。 (1 + 2)*(3 + 4)-A2-B2。在這個等式中(1 + 2)需要1步,3 + 4也是這樣,減法「-a2-b2」也是這樣,乘法也是這樣。然後返回步驟再次需要2次加法和3次乘法。我很難理解如何不超過n^2。你能否進一步澄清這一點? –

+1

我們在這裏處理大量數據。增加和乘法的成本是不同的。我們知道增加大數字是O(n)。所以2個添加將花費O(n)。乘法的複雜性是什麼?那麼,它是上述算法的複雜性,因爲它是我們正在使用的乘法算法。因此,我們計算出,重複T(n)= 3T(n/2)+ O(n)= 3次乘以1/2大小的數字+少數加法。那有意義嗎? –

相關問題