gf2m: faster operations using a lookup table
This commit is contained in:
parent
1c2e807f69
commit
022d20aa30
|
@ -118,6 +118,8 @@ public:
|
||||||
|
|
||||||
bool create (uint m);
|
bool create (uint m);
|
||||||
|
|
||||||
|
std::vector<uint> log, antilog;
|
||||||
|
|
||||||
uint add (uint, uint);
|
uint add (uint, uint);
|
||||||
uint mult (uint, uint);
|
uint mult (uint, uint);
|
||||||
uint exp (uint, sint);
|
uint exp (uint, sint);
|
||||||
|
|
33
lib/gf2m.cpp
33
lib/gf2m.cpp
|
@ -70,18 +70,39 @@ bool is_irreducible_gf2_poly (uint p)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint gf2p_tablemult (uint a, uint b, uint n,
|
||||||
|
const std::vector<uint>&log,
|
||||||
|
const std::vector<uint>&antilog)
|
||||||
|
{
|
||||||
|
if (! (a && b) ) return 0;
|
||||||
|
return antilog[ (log[a] + log[b]) % (n - 1) ];
|
||||||
|
}
|
||||||
|
|
||||||
bool gf2m::create (uint M)
|
bool gf2m::create (uint M)
|
||||||
{
|
{
|
||||||
if (M < 1) return false; //too small.
|
if (M < 1) return false; //too small.
|
||||||
m = M;
|
m = M;
|
||||||
n = 1 << m;
|
n = 1 << m;
|
||||||
if (!n) return false; //too big.
|
if (!n) return false; //too big.
|
||||||
for (uint t = (1 << m)+1, e = 1 << (m+1); t < e; t += 2)
|
for (uint t = (1 << m) + 1, e = 1 << (m + 1); t < e; t += 2)
|
||||||
if (is_irreducible_gf2_poly (t) ) {
|
if (is_irreducible_gf2_poly (t) ) {
|
||||||
poly = t;
|
poly = t;
|
||||||
return true;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
log.resize (n);
|
||||||
|
antilog.resize (n);
|
||||||
|
log[0] = n - 1;
|
||||||
|
antilog[n-1] = 0;
|
||||||
|
|
||||||
|
uint xi = 1; //x^0
|
||||||
|
for (uint i = 0; i < n - 1; ++i) {
|
||||||
|
log[xi] = i;
|
||||||
|
antilog[i] = xi;
|
||||||
|
|
||||||
|
xi <<= 1; //multiply by x
|
||||||
|
xi = gf2p_mod (xi, poly);
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint gf2m::add (uint a, uint b)
|
uint gf2m::add (uint a, uint b)
|
||||||
|
@ -91,7 +112,7 @@ uint gf2m::add (uint a, uint b)
|
||||||
|
|
||||||
uint gf2m::mult (uint a, uint b)
|
uint gf2m::mult (uint a, uint b)
|
||||||
{
|
{
|
||||||
return gf2p_modmult (a, b, poly);
|
return gf2p_tablemult (a, b, n, log, antilog);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint gf2m::exp (uint a, sint k)
|
uint gf2m::exp (uint a, sint k)
|
||||||
|
@ -113,8 +134,8 @@ uint gf2m::exp (uint a, sint k)
|
||||||
|
|
||||||
uint gf2m::inv (uint a)
|
uint gf2m::inv (uint a)
|
||||||
{
|
{
|
||||||
if (n == 2) return a;
|
if (!a) return 0;
|
||||||
return exp (a, n - 2);
|
return antilog[ (n-1-log[a]) % (n - 1) ];
|
||||||
}
|
}
|
||||||
|
|
||||||
uint gf2m::sq_root (uint a)
|
uint gf2m::sq_root (uint a)
|
||||||
|
|
Loading…
Reference in a new issue