aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMITSUNARI Shigeo <herumi@nifty.com>2019-03-07 13:05:05 +0800
committerMITSUNARI Shigeo <herumi@nifty.com>2019-03-07 13:05:05 +0800
commit03d8d6d17c05d3f1fd469cc35da2facddb9f7fc6 (patch)
treeabb5c69ff11c43ee07e016ec4c8b077a39871a28
parent27a7a0140ee82bb8dd2d515f9499387dd4a5ecf2 (diff)
downloaddexon-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.hpp20
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);