This is an improved version of java.math.BigInteger
that uses fast algorithms for multiplying and dividing large numbers. It is based on Alan Eliasen's BigInteger patch which provides the Karatsuba and Toom-Cook implementations.
Depending on the input size, numbers are multiplied using Long Multiplication, Karatsuba, Toom-Cook, or Schönhage-Strassen. For division, Long Division, Burnikel-Ziegler Division, or Barrett Division is used.
Benchmark results for multiplication of two n-digit numbers (Intel E2160 @1.8 GHz, 32-bit mode):
n | OpenJDK 6 BigInteger | Improved BigInteger | Speedup factor | Algorithm |
---|---|---|---|---|
10 | 0.00005ms | 0.00006ms | .8 | Long |
25 | 0.00018ms | 0.00018ms | 1.0 | Long |
50 | 0.00047ms | 0.00046ms | 1.0 | Long |
75 | 0.00067ms | 0.00069ms | 1.0 | Long |
100 | 0.00128ms | 0.00132ms | 1.0 | Long |
250 | 0.00635ms | 0.00647ms | 1.0 | Long |
500 | 0.02517ms | 0.02194ms | 1.1 | Kara |
750 | 0.05679ms | 0.04603ms | 1.2 | Toom |
1000 | 0.10030ms | 0.07294ms | 1.4 | Toom |
2500 | 0.62099ms | 0.29881ms | 2.1 | Toom |
5000 | 2.48014ms | 0.80627ms | 3.1 | Toom |
7500 | 5.61238ms | 1.53449ms | 3.7 | Toom |
10000 | 10.02289ms | 2.38305ms | 4.2 | Toom |
25000 | 62.33890ms | 9.44067ms | 6.6 | Toom |
50000 | 251.21408ms | 26.00191ms | 9.7 | Toom |
75000 | 563.95811ms | 46.20780ms | 12.2 | SS |
100000 | 1003.29212ms | 75.03685ms | 13.4 | Toom |
250000 | 6.28s | .22s | 28.5 | SS |
500000 | 25.14s | .50s | 50.3 | SS |
750000 | 56.82s | 1.08s | 52.6 | SS |
1000000 | 101.56s | 1.08s | 94.0 | SS |
2500000 | 645.63s | 2.57s | 251.2 | SS |
5000000 | 2576.74s | 5.51s | 467.6 | SS |
7500000 | 5807.67s | 13.55s | 428.6 | SS |
10000000 | 8584.36s | 13.49s | 636.3 | SS |
Benchmark results for division of a 2n-digit number by a n-digit number (Intel E2160 @1.8 GHz, 32-bit mode):
n | OpenJDK 6 BigInteger | Improved BigInteger | Speedup factor | Algorithm |
---|---|---|---|---|
10 | 0.0002ms | 0.0002ms | 1.0 | Long |
25 | 0.0008ms | 0.0008ms | 1.0 | Long |
50 | 0.0015ms | 0.0015ms | 1.0 | Long |
75 | 0.0021ms | 0.0021ms | 1.0 | Long |
100 | 0.0032ms | 0.0032ms | 1.0 | Long |
250 | 0.0125ms | 0.0125ms | 1.0 | Long |
500 | 0.0426ms | 0.0426ms | 1.0 | Long |
750 | 0.0922ms | 0.0865ms | 1.07 | BZ |
1000 | 0.1600ms | 0.1292ms | 1.24 | BZ |
2500 | 0.9587ms | 0.5757ms | 1.67 | BZ |
5000 | 3.7766ms | 1.7067ms | 2.21 | BZ |
7500 | 8.4126ms | 3.1889ms | 2.64 | BZ |
10000 | 14.9409ms | 4.8979ms | 3.05 | BZ |
25000 | 92.7651ms | 19.8670ms | 4.67 | BZ |
50000 | 372.3610ms | 56.6618ms | 6.57 | BZ |
75000 | 836.4312ms | 102.0544ms | 8.20 | BZ |
100000 | 1.51s | 0.16s | 9.44 | BZ |
250000 | 9.29s | 0.62s | 14.98 | BZ |
500000 | 37.27s | 1.81s | 20.59 | BZ |
750000 | 84.29s | 3.25s | 25.94 | BZ |
1000000 | 150.46s | 4.68s | 32.15 | Barr |
2500000 | 950.75s | 13.38s | 71.06 | BZ |
5000000 | 3797.64s | 30.31s | 125.29 | BZ |
7500000 | 8546.75s | 53.71s | 159.12 | Barr |
10000000 | 15227.41s | 54.22s | 280.84 | Barr |