public class NativeBigInteger extends BigInteger
BigInteger that takes advantage of the jbigi library for the modPow operation, which accounts for a massive segment of the processing cost of asymmetric crypto. The jbigi library itself is basically just a JNI wrapper around the GMP library - a collection of insanely efficient routines for dealing with big numbers.
There are three environmental properties for configuring this component:If jbigi.enable is set to false, this class won't even attempt to use the
native library, but if it is set to true (or is not specified), it will first
check the platform specific library path for the "jbigi" library, as defined by
Runtime.loadLibrary(java.lang.String)
- e.g. C:\windows\jbigi.dll or /lib/libjbigi.so, as
well as the CLASSPATH for a resource named 'jbigi'. If that fails, it reviews
the jbigi.impl environment property - if that is set, it checks all of the
components in the CLASSPATH for the file specified and attempts to load it as
the native library. If jbigi.impl is not set, it uses the jcpuid library
described below. If there is still no matching resource, or if that resource
is not a valid OS/architecture specific library, the NativeBigInteger will
revert to using the pure java implementation.
When attempting to load the native implementation as a resource from the CLASSPATH, the NativeBigInteger will make use of the jcpuid component which runs some assembly code to determine the current CPU implementation, such as "pentium4" or "k623". We then use that, combined with the OS, to build an optimized resource name - e.g. "net/i2p/util/libjbigi-freebsd-pentium4.so" or "net/i2p/util/jbigi-windows-k623.dll". If that resource exists, we use it. If it doesn't (or the jcpuid component fails), we try a generic native implementation using "none" for the CPU (ala "net/i2p/util/jbigi-windows-none.dll").
Running this class by itself does a basic unit test and benchmarks the NativeBigInteger.modPow vs. the BigInteger.modPow by running a 2Kbit op 100 times. At the end of each test, if the native implementation is loaded this will output something like:
native run time: 6090ms (60ms each) java run time: 68067ms (673ms each) native = 8.947066860593239% of pure java time
If the native implementation is not loaded, it will start by saying:
WARN: Native BigInteger library jbigi not loaded - using pure java
Then go on to run the test, finally outputting:
java run time: 64653ms (640ms each) However, we couldn't load the native library, so this doesn't test much
ONE, TEN, ZERO
Constructor and Description |
---|
NativeBigInteger(BigInteger integer)
Creates a new NativeBigInteger with the same value
as the supplied BigInteger.
|
NativeBigInteger(byte[] val) |
NativeBigInteger(int signum,
byte[] magnitude) |
NativeBigInteger(int bitlen,
int certainty,
Random rnd) |
NativeBigInteger(int numbits,
Random rnd) |
NativeBigInteger(String val) |
NativeBigInteger(String val,
int radix) |
Modifier and Type | Method and Description |
---|---|
static String |
cpuModel() |
static String |
cpuType() |
boolean |
equals(Object o) |
static int |
getJbigiVersion()
Get the jbigi version
|
static String |
getLibGMPVersion()
Get the libgmp version
|
static String |
getLoadedResourceName()
The name of the library loaded, if known.
|
int |
hashCode() |
static boolean |
isNative() |
static String |
loadStatus() |
static void |
main(String[] args)
Compare the BigInteger.modPow vs the NativeBigInteger.modPow of some
really big (2Kbit) numbers 100 different times and benchmark the
performance.
|
BigInteger |
modInverse(BigInteger m) |
BigInteger |
modPow(BigInteger exponent,
BigInteger m) |
BigInteger |
modPowCT(BigInteger exponent,
BigInteger m) |
byte[] |
toByteArray()
caches
|
abs, add, and, andNot, bitCount, bitLength, clearBit, compareTo, divide, divideAndRemainder, doubleValue, flipBit, floatValue, gcd, getLowestSetBit, intValue, isProbablePrime, longValue, max, min, mod, multiply, negate, nextProbablePrime, not, or, pow, probablePrime, remainder, setBit, shiftLeft, shiftRight, signum, subtract, testBit, toString, toString, valueOf, xor
byteValue, shortValue
public NativeBigInteger(byte[] val)
public NativeBigInteger(int signum, byte[] magnitude)
public NativeBigInteger(int bitlen, int certainty, Random rnd)
public NativeBigInteger(int numbits, Random rnd)
public NativeBigInteger(String val)
public NativeBigInteger(String val, int radix)
public NativeBigInteger(BigInteger integer)
public static int getJbigiVersion()
public static String getLibGMPVersion()
public BigInteger modPow(BigInteger exponent, BigInteger m)
modPow
in class BigInteger
m
- must be postiveexponent
- must be postiveArithmeticException
- if m <= 0 or exponent <=0public BigInteger modPowCT(BigInteger exponent, BigInteger m)
exponent
- must be postivem
- must be postive and oddArithmeticException
- if m <= 0 or m is even or exponent <=0public BigInteger modInverse(BigInteger m)
modInverse
in class BigInteger
ArithmeticException
- if not coprime with m, or m <= 0public byte[] toByteArray()
toByteArray
in class BigInteger
public static boolean isNative()
public static String loadStatus()
public static String getLoadedResourceName()
public static String cpuType()
public static String cpuModel()
public static void main(String[] args)
Compare the BigInteger.modPow vs the NativeBigInteger.modPow of some really big (2Kbit) numbers 100 different times and benchmark the performance.
args
- -n Disable native testpublic boolean equals(Object o)
equals
in class BigInteger
public int hashCode()
hashCode
in class BigInteger