gf2m: lowlevel speedups
This commit is contained in:
parent
1ef1b4277b
commit
be13fe8dca
59
src/gf2m.cpp
59
src/gf2m.cpp
|
@ -32,11 +32,6 @@ int gf2p_degree (uint p)
|
||||||
return r - 1;
|
return r - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline uint gf2p_add (uint a, uint b)
|
|
||||||
{
|
|
||||||
return a ^ b;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint gf2p_mod (uint a, uint p)
|
uint gf2p_mod (uint a, uint p)
|
||||||
{
|
{
|
||||||
if (!p) return 0;
|
if (!p) return 0;
|
||||||
|
@ -88,14 +83,6 @@ 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.
|
||||||
|
@ -143,49 +130,3 @@ bool gf2m::create (uint M)
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint gf2m::add (uint a, uint b)
|
|
||||||
{
|
|
||||||
return gf2p_add (a, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint gf2m::mult (uint a, uint b)
|
|
||||||
{
|
|
||||||
return gf2p_tablemult (a, b, n, log, antilog);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint gf2m::exp (uint a, int k)
|
|
||||||
{
|
|
||||||
if (!a) return 0;
|
|
||||||
if (a == 1) return 1;
|
|
||||||
if (k < 0) {
|
|
||||||
a = inv (a);
|
|
||||||
k = -k;
|
|
||||||
}
|
|
||||||
uint r = 1;
|
|
||||||
while (k) {
|
|
||||||
if (k & 1) r = mult (r, a);
|
|
||||||
a = mult (a, a);
|
|
||||||
k >>= 1;
|
|
||||||
}
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint gf2m::exp (int k)
|
|
||||||
{
|
|
||||||
//return x^k
|
|
||||||
return exp (1 << 1, k);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint gf2m::inv (uint a)
|
|
||||||
{
|
|
||||||
if (!a) return 0;
|
|
||||||
return antilog[ (n - 1 - log[a]) % (n - 1) ];
|
|
||||||
}
|
|
||||||
|
|
||||||
uint gf2m::sq_root (uint a)
|
|
||||||
{
|
|
||||||
for (uint i = 1; i < m; ++i)
|
|
||||||
a = mult (a, a);
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
36
src/gf2m.h
36
src/gf2m.h
|
@ -37,12 +37,36 @@ public:
|
||||||
|
|
||||||
std::vector<uint> log, antilog;
|
std::vector<uint> log, antilog;
|
||||||
|
|
||||||
uint add (uint, uint);
|
inline uint add (uint a, uint b) {
|
||||||
uint mult (uint, uint);
|
return a ^ b;
|
||||||
uint exp (uint, int);
|
}
|
||||||
uint exp (int);
|
|
||||||
uint inv (uint);
|
inline uint mult (uint a, uint b) {
|
||||||
uint sq_root (uint);
|
if (! (a && b) ) return 0;
|
||||||
|
return antilog[ (log[a] + log[b]) % (n - 1)];
|
||||||
|
}
|
||||||
|
|
||||||
|
inline uint exp (uint a, int k) {
|
||||||
|
if (!a) return 0;
|
||||||
|
return antilog[ (log[a] * k) % (n - 1)];
|
||||||
|
}
|
||||||
|
|
||||||
|
inline uint exp (int k) {
|
||||||
|
//return x^k
|
||||||
|
return exp (1 << 1, k);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline uint inv (uint a) {
|
||||||
|
if (!a) return 0;
|
||||||
|
return antilog[ (n - 1 - log[a]) % (n - 1)];
|
||||||
|
}
|
||||||
|
|
||||||
|
inline uint sq_root (uint a) {
|
||||||
|
if (!a) return 0;
|
||||||
|
uint t = log[a];
|
||||||
|
if (t % 2) return antilog[ (t + n - 1) >> 1];
|
||||||
|
else return antilog[t >> 1];
|
||||||
|
}
|
||||||
|
|
||||||
sencode* serialize();
|
sencode* serialize();
|
||||||
bool unserialize (sencode*);
|
bool unserialize (sencode*);
|
||||||
|
|
Loading…
Reference in a new issue