aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMITSUNARI Shigeo <herumi@nifty.com>2017-06-26 10:02:33 +0800
committerMITSUNARI Shigeo <herumi@nifty.com>2017-06-26 10:02:33 +0800
commit9532de91a0035bb0a904089ea41378c668a5bd77 (patch)
tree3c0cb06968dd9aeb0c3603fa4fd4a3bbae56b62b
parent17e356700f850116f820bb22c2c4c7b2bfc266a2 (diff)
downloadtangerine-mcl-9532de91a0035bb0a904089ea41378c668a5bd77.tar.gz
tangerine-mcl-9532de91a0035bb0a904089ea41378c668a5bd77.tar.zst
tangerine-mcl-9532de91a0035bb0a904089ea41378c668a5bd77.zip
move Frobenius to Fp2
-rw-r--r--include/mcl/bn.hpp31
-rw-r--r--include/mcl/fp_tower.hpp20
-rw-r--r--include/mcl/op.hpp2
-rw-r--r--src/fp.cpp1
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));
diff --git a/src/fp.cpp b/src/fp.cpp
index 7607b11..a22ed1c 100644
--- a/src/fp.cpp
+++ b/src/fp.cpp
@@ -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