diff options
author | MITSUNARI Shigeo <herumi@nifty.com> | 2019-03-07 13:05:05 +0800 |
---|---|---|
committer | MITSUNARI Shigeo <herumi@nifty.com> | 2019-03-07 13:05:05 +0800 |
commit | 03d8d6d17c05d3f1fd469cc35da2facddb9f7fc6 (patch) | |
tree | abb5c69ff11c43ee07e016ec4c8b077a39871a28 | |
parent | 27a7a0140ee82bb8dd2d515f9499387dd4a5ecf2 (diff) | |
download | dexon-mcl-03d8d6d17c05d3f1fd469cc35da2facddb9f7fc6.tar.gz dexon-mcl-03d8d6d17c05d3f1fd469cc35da2facddb9f7fc6.tar.zst dexon-mcl-03d8d6d17c05d3f1fd469cc35da2facddb9f7fc6.zip |
shortcut of modp if small
-rw-r--r-- | include/mcl/gmp_util.hpp | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/include/mcl/gmp_util.hpp b/include/mcl/gmp_util.hpp index a8631a2..c2f1859 100644 --- a/include/mcl/gmp_util.hpp +++ b/include/mcl/gmp_util.hpp @@ -861,37 +861,45 @@ public: /* Barrett Reduction + for non GMP version + mod of GMP is faster than Modp */ struct Modp { static const size_t unitBitSize = sizeof(mcl::fp::Unit) * 8; mpz_class p_; mpz_class u_; mpz_class a_; + size_t pBitSize_; size_t N_; // x &= 1 << (unitBitSize * unitSize) void shrinkSize(mpz_class &x, size_t unitSize) const { - size_t u = mcl::gmp::getUnitSize(x); + size_t u = gmp::getUnitSize(x); if (u < unitSize) return; bool b; - mcl::gmp::setArray(&b, x, mcl::gmp::getUnit(x), unitSize); + gmp::setArray(&b, x, gmp::getUnit(x), unitSize); assert(b); } void init(const mpz_class& p) { p_ = p; - size_t bitSize = mcl::gmp::getBitSize(p); - N_ = (bitSize + unitBitSize - 1) / unitBitSize; + pBitSize_ = gmp::getBitSize(p); + N_ = (pBitSize_ + unitBitSize - 1) / unitBitSize; u_ = (mpz_class(1) << (unitBitSize * 2 * N_)) / p_; a_ = mpz_class(1) << (unitBitSize * (N_ + 1)); } void modp(mpz_class& r, const mpz_class& t) const { - assert(0 <= t && t < mpz_class(1) << (unitBitSize * 2 * N_)); - if (t < p_) { + const size_t tBitSize = gmp::getBitSize(t); + assert(tBitSize <= unitBitSize * 2 * N_); + if (tBitSize < pBitSize_) { r = t; return; } + if (tBitSize <= unitBitSize * N_) { + gmp::mod(r, t, p_); + return; + } mpz_class q; q = t; q >>= unitBitSize * (N_ - 1); |