#ifndef __BEE2_GF2_H
#define __BEE2_GF2_H
#include "bee2/math/qr.h"
#ifdef __cplusplus
extern "C" {
#endif
bool_t gf2Create(
qr_o* f,
const size_t p[4],
void* stack
);
size_t gf2Create_keep(size_t m);
size_t gf2Create_deep(size_t m);
bool_t gf2IsOperable(
const qr_o* f
);
bool_t gf2IsValid(
const qr_o* f,
void* stack
);
size_t gf2IsValid_deep(size_t n);
size_t gf2Deg(
const qr_o* f
);
#define gf2IsIn(a, f)\
(gf2Deg(f) % B_PER_W == 0 || wwCmp(a, (f)->mod, (f)->n) < 0)
#define gf2Add(c, a, b, f)\
wwXor(c, a, b, (f)->n)
#define gf2Add2(b, a, f)\
wwXor2(b, a, (f)->n)
#define gf2Sub(c, a, b, f)\
wwXor(c, a, b, (f)->n)
#define gf2Sub2(b, a, f)\
wwXor2(b, a, (f)->n)
#define gf2Neg(b, a, f)\
wwCopy(b, a, (f)->n)
bool_t gf2Tr(
const word a[],
const qr_o* f,
void* stack
);
size_t gf2Tr_deep(size_t n, size_t f_deep);
bool_t gf2QSolve(
word x[],
const word a[],
const word b[],
const qr_o* f,
void* stack
);
size_t gf2QSolve_deep(size_t n, size_t f_deep);
#ifdef __cplusplus
}
#endif
#endif