diff options
author | MITSUNARI Shigeo <herumi@nifty.com> | 2017-06-26 10:02:33 +0800 |
---|---|---|
committer | MITSUNARI Shigeo <herumi@nifty.com> | 2017-06-26 10:02:33 +0800 |
commit | 9532de91a0035bb0a904089ea41378c668a5bd77 (patch) | |
tree | 3c0cb06968dd9aeb0c3603fa4fd4a3bbae56b62b | |
parent | 17e356700f850116f820bb22c2c4c7b2bfc266a2 (diff) | |
download | tangerine-mcl-9532de91a0035bb0a904089ea41378c668a5bd77.tar.gz tangerine-mcl-9532de91a0035bb0a904089ea41378c668a5bd77.tar.zst tangerine-mcl-9532de91a0035bb0a904089ea41378c668a5bd77.zip |
move Frobenius to Fp2
-rw-r--r-- | include/mcl/bn.hpp | 31 | ||||
-rw-r--r-- | include/mcl/fp_tower.hpp | 20 | ||||
-rw-r--r-- | include/mcl/op.hpp | 2 | ||||
-rw-r--r-- | src/fp.cpp | 1 |
4 files changed, 31 insertions, 23 deletions
diff --git a/include/mcl/bn.hpp b/include/mcl/bn.hpp index ad96eff..4eabd62 100644 --- a/include/mcl/bn.hpp +++ b/include/mcl/bn.hpp @@ -436,7 +436,6 @@ struct ParamT { bool isNegative; mpz_class p; mpz_class r; - uint32_t pmod4; Fp Z; static const size_t gN = 5; /* @@ -485,7 +484,6 @@ struct ParamT { const int rCoff[] = { 1, 6, 18, 36, 36 }; p = eval(pCoff, z); assert((p % 6) == 1); - pmod4 = mcl::gmp::getUnit(p, 0) % 4; r = eval(rCoff, z); Fp::init(p.get_str(), mode); Fp2::init(cp.xi_a); @@ -520,7 +518,7 @@ struct ParamT { } for (size_t i = 0; i < gN; i++) { Fp2 t(g[i].a, g[i].b); - if (pmod4 == 3) Fp::neg(t.b, t.b); + if (Fp::getOp().pmod4 == 3) Fp::neg(t.b, t.b); Fp2::mul(g2[i], t, g[i]); g3[i] = g[i] * g2[i]; } @@ -601,23 +599,10 @@ struct BNT { ((a + bv + cv^2)w)^p in Fp12 = (F(a) g + F(b) g^3 v + F(c) g^5 v^2)w */ - static void Frobenius(Fp2& y, const Fp2& x) - { - if (param.pmod4 == 1) { - if (&y != &x) { - y = x; - } - } else { - if (&y != &x) { - y.a = x.a; - } - Fp::neg(y.b, x.b); - } - } static void Frobenius(Fp12& y, const Fp12& x) { for (int i = 0; i < 6; i++) { - Frobenius(y.getFp2()[i], x.getFp2()[i]); + Fp2::Frobenius(y.getFp2()[i], x.getFp2()[i]); } for (int i = 1; i < 6; i++) { y.getFp2()[i] *= param.g[i - 1]; @@ -630,7 +615,7 @@ struct BNT { Frobenius(y, y); #else y.getFp2()[0] = x.getFp2()[0]; - if (param.pmod4 == 1) { + if (Fp::getOp().pmod4 == 1) { for (int i = 1; i < 6; i++) { Fp2::mul(y.getFp2()[i], x.getFp2()[i], param.g2[i]); } @@ -648,9 +633,9 @@ struct BNT { Frobenius(y, y); Frobenius(y, y); #else - Frobenius(y.getFp2()[0], x.getFp2()[0]); + Fp2::Frobenius(y.getFp2()[0], x.getFp2()[0]); for (int i = 1; i < 6; i++) { - Frobenius(y.getFp2()[i], x.getFp2()[i]); + Fp2::Frobenius(y.getFp2()[i], x.getFp2()[i]); y.getFp2()[i] *= param.g3[i - 1]; } #endif @@ -665,9 +650,9 @@ struct BNT { */ static void FrobeniusOnTwist(G2& D, const G2& S) { - Frobenius(D.x, S.x); - Frobenius(D.y, S.y); - Frobenius(D.z, S.z); + Fp2::Frobenius(D.x, S.x); + Fp2::Frobenius(D.y, S.y); + Fp2::Frobenius(D.z, S.z); D.x *= param.g[0]; D.y *= param.g[3]; } diff --git a/include/mcl/fp_tower.hpp b/include/mcl/fp_tower.hpp index 5d3cae2..d5d06b3 100644 --- a/include/mcl/fp_tower.hpp +++ b/include/mcl/fp_tower.hpp @@ -248,6 +248,26 @@ public: Fp::sqr(bb, x.b); Fp::add(y, aa, bb); } + /* + Frobenius + i^2 = -1 + (a + bi)^p = a + bi^p in Fp + = a + bi if p = 1 mod 4 + = a - bi if p = 3 mod 4 + */ + static void Frobenius(Fp2T& y, const Fp2T& x) + { + if (Fp::getOp().pmod4 == 1) { + if (&y != &x) { + y = x; + } + } else { + if (&y != &x) { + y.a = x.a; + } + Fp::neg(y.b, x.b); + } + } static uint32_t get_xi_a() { return xi_a_; } static void init(uint32_t xi_a) diff --git a/include/mcl/op.hpp b/include/mcl/op.hpp index b2660dc..1be640e 100644 --- a/include/mcl/op.hpp +++ b/include/mcl/op.hpp @@ -143,6 +143,7 @@ struct Op { Unit rp; Unit p[maxUnitSize]; mpz_class mp; + uint32_t pmod4; mcl::SquareRoot sq; FpGenerator *fg; Unit half[maxUnitSize]; // (p + 1) / 2 @@ -219,6 +220,7 @@ struct Op { rp = 0; memset(p, 0, sizeof(p)); mp = 0; + pmod4 = 0; sq.clear(); // fg is not set memset(half, 0, sizeof(half)); @@ -402,6 +402,7 @@ void Op::init(const std::string& mstr, size_t maxBitSize, Mode mode, size_t mclM } gmp::getArray(p, (maxBitSize + fp::UnitBitSize - 1) / fp::UnitBitSize, mp); bitSize = gmp::getBitSize(mp); + pmod4 = gmp::getUnit(mp, 0) % 4; /* priority : MCL_USE_XBYAK > MCL_USE_LLVM > none Xbyak > llvm_mont > llvm > gmp_mont > gmp |