-
Notifications
You must be signed in to change notification settings - Fork 13
Description
Hi Simon,
I love your project, but I'ld like to point out that it is not beating Java's BigInteger in every respect.
Since Java 8, BigInteger may use intrinsics, say optimized assembler code, and that is hard to beat.
With intrinsics, BigInteger.multiplyToLen() is about twice as fast as your "naive multiplication" implementation.
BigInteger.squareToLen() has been prepared for intrinsics in Java8, but on my platform (x86, Windows) the assembler code has not been added before Java9. If intrinsics are present, the squaring code is even better than the multiplication intrinsics.
It seems to be possible to call the intrinsic methods by reflection without notable performance loss. But since your implementation is little-endian and Java uses big-endian encoding, reverting arrays before and after the invocation is required.
Another performance issue is division. Java's BigInteger implements the Burnikel-Ziegler algorithm for larger arguments, and my tests suggest that it is better than your Knuth implementation for inputs > 10000 bits.