Implement number theoretic transform for large integer multiplication#282
Implement number theoretic transform for large integer multiplication#282byeongkeunahn wants to merge 73 commits into
Conversation
Previously 3 primes were used, which was suboptimal in terms of speed. Currently, the threshold for switching from 2 to 3 primes is 2^38.
Despite the simple implementation with obvious inefficiencies (e.g., not reusing the NTT of the shorter array), this leads to speed gains in multiple benchmarks, although there is a small regression in others.
The prime numbers were replaced by larger ones to allow for tighter packing. Also, we compute the maximum number of bits that can be packed into one digit more precisely.
Make ntt.rs shorter
Make ntt.rs shorter
Make ntt.rs shorter
Make ntt.rs shorter
Make ntt.rs shorter
Make ntt.rs shorter
Improve NTT planning
|
Does the chart shows that current algorithm is faster than GMP? That's impressive. |
|
I ran benchmark fib_hex 100m from https://github.com/tczajka/bigint-benchmark-rs on this PR and it made num-bigint twice faster than malachite, slightly faster than gmp and 12x faster than itself. |
|
Obviously the performance here is impressive, as I said before. However, as I finally started to try reviewing this, I have a few high level objections.
(that particular one does pass under tree-borrows though) |
|
Thanks for your review and comments! I’ll try to address the issues, including removing the unsafe code and cleaning up the commit history, even if that comes at the cost of a small performance regression. Integrating the Montgomery reduction code with
|
|
We can treat the monty-consolidation as "nice to have". However, any specific tailoring needs comments, lest that work be undone by a later contributor or maintainer. I'm skeptical that those optimizations wouldn't be useful to the other monty use as well though... |
This commit implements number theoretic transform (NTT) for large integer multiplication (issue #169).
On Ryzen 7 2700X, 64bit, it takes about 15ms for 2.7Mbits x 2.7Mbits and 170ms for 27Mbits x 27Mbits multiplication. This seems comparable to GMP 6.2.1.