uint: Implement modulo operations for special moduli #108
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
For a project of mine where the modulus can be chosen to be close to
UInt::MAX
, I created optimized implementations of modular operations. I thought maybe others can benefit from them, too, so I ported my implementation to the crypto-bigint crate.This commit implements modulo operations (
neg
,add
,sub
,mul
) for special moduli that are so close toMAX
that the difference to overflow fits in a singleLimb
. For such moduli, these new implementations are much faster than the existing generic modulus implementations. (Formul
there's no comparison since there's no corresponding generic modulus implementation, yet.)For
U256
, I benchmarked the generic against the specialized implementations using criterion-rs on Intel Core i7-8565U @ 1.80GHz and obtained the following average times. Note that I used aconst
modulus known at compile-time, which enables some compiler optimizations after inlining. With a modulus known only at runtime, times might differ.U256::add_mod
U256::sub_mod
U256::mul_mod
_special