|
|
|
#define PUT(x) std::cout << #x "=" << (x) << std::endl;
|
|
|
|
#include <cybozu/test.hpp>
|
|
|
|
#include <cybozu/xorshift.hpp>
|
|
|
|
#include <cybozu/benchmark.hpp>
|
|
|
|
|
|
|
|
#if 1
|
|
|
|
#include <mcl/bn384.hpp>
|
|
|
|
using namespace mcl::bn384;
|
|
|
|
#else
|
|
|
|
#include <mcl/bn256.hpp>
|
|
|
|
using namespace mcl::bn256;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define PUT(x) std::cout << #x "=" << (x) << std::endl;
|
|
|
|
|
|
|
|
void testGLV(const mcl::bn::CurveParam& cp)
|
|
|
|
{
|
|
|
|
bn384init(cp);
|
|
|
|
G1::setCompressedExpression(false);
|
|
|
|
|
|
|
|
G1 P0, P1, P2;
|
|
|
|
BN::mapToG1(P0, 1);
|
|
|
|
cybozu::XorShift rg;
|
|
|
|
mcl::bn::GLV<Fp> glv;
|
|
|
|
glv.init(BN::param.r, BN::param.z, BN::param.isNegative);
|
|
|
|
for (int i = 1; i < 100; i++) {
|
|
|
|
BN::mapToG1(P0, i);
|
|
|
|
Fr s;
|
|
|
|
s.setRand(rg);
|
|
|
|
mpz_class ss = s.getMpz();
|
|
|
|
G1::mulBase(P1, P0, ss);
|
|
|
|
glv.mul(P2, P0, ss);
|
|
|
|
CYBOZU_TEST_EQUAL(P1, P2);
|
|
|
|
glv.mul(P2, P0, ss, true);
|
|
|
|
CYBOZU_TEST_EQUAL(P1, P2);
|
|
|
|
}
|
|
|
|
for (int i = -100; i < 100; i++) {
|
|
|
|
mpz_class ss = i;
|
|
|
|
G1::mulBase(P1, P0, ss);
|
|
|
|
glv.mul(P2, P0, ss);
|
|
|
|
CYBOZU_TEST_EQUAL(P1, P2);
|
|
|
|
glv.mul(P2, P0, ss, true);
|
|
|
|
CYBOZU_TEST_EQUAL(P1, P2);
|
|
|
|
}
|
|
|
|
for (int i = -100; i < 100; i++) {
|
|
|
|
mpz_class ss = i * glv.v;
|
|
|
|
G1::mulBase(P1, P0, ss);
|
|
|
|
glv.mul(P2, P0, ss);
|
|
|
|
CYBOZU_TEST_EQUAL(P1, P2);
|
|
|
|
glv.mul(P2, P0, ss, true);
|
|
|
|
CYBOZU_TEST_EQUAL(P1, P2);
|
|
|
|
}
|
|
|
|
for (int i = -100; i < 100; i++) {
|
|
|
|
mpz_class ss = -i * glv.v + -i * glv.c;
|
|
|
|
G1::mulBase(P1, P0, ss);
|
|
|
|
glv.mul(P2, P0, ss);
|
|
|
|
CYBOZU_TEST_EQUAL(P1, P2);
|
|
|
|
glv.mul(P2, P0, ss, true);
|
|
|
|
CYBOZU_TEST_EQUAL(P1, P2);
|
|
|
|
}
|
|
|
|
Fr s;
|
|
|
|
BN::mapToG1(P0, 123);
|
|
|
|
CYBOZU_BENCH_C("Ec::mul", 100, P1 = P0; s.setRand(rg); G1::mul, P2, P1, s.getMpz());
|
|
|
|
CYBOZU_BENCH_C("Ec::glv", 100, P1 = P0; s.setRand(rg); glv.mul, P2, P1, s.getMpz());
|
|
|
|
}
|
|
|
|
|
|
|
|
CYBOZU_TEST_AUTO(glv)
|
|
|
|
{
|
|
|
|
testGLV(mcl::bn::CurveFp382_1);
|
|
|
|
testGLV(mcl::bn::CurveFp382_2);
|
|
|
|
testGLV(mcl::bn::CurveFp254BNb);
|
|
|
|
}
|