С помощью этих двух методов, чтобы преобразовать назад и вперед к маленькому младшим целочисленному представлению:
ОТ GF2X К Little Endian ЦЕЛОГО
void MyBytesFromGF2X(unsigned char* buffer, NTL::GF2X& p, int numbytes) {
int degree = NTL::deg(p);
memset(buffer,0,numbytes);
for(int i=0; i<=degree; i++) {
if(NTL::IsOne(NTL::coeff(p,i))) {
buffer[i/8] |= 1 << i%8;
}
}
}
В конце buffer
содержит число, представленное p
в нормальный малый стиль.
Если вы хотите, чтобы получить целое число, то предполагается, что максимальная степень p
составляет 32, то вы делаете следующее:
ИСПОЛЬЗОВАНИЯ
unsigned char buffer[4];
int *integer = buffer;
NTL::GF2X p;
NTL::SetCoeff(p,1,1); // set the coefficient of x^1 to 1
NTL::SetCoeff(p,30,1); // set the coefficient of x^30 to 1
MyBytesFromGF2X(buffer,p,4);
printf("%d",integer);
//result will be LE integer representation of 2^30+2^1
Для того, чтобы преобразовать обратно в GF2X
вы ча использовать эту функцию:
ОТ Little Endian INTEGER К GF2X
void MyBytesToGF2X(const unsigned char* buffer, NTL::GF2X& p, int numbytes) {
for(int i=0; i<numbytes; i++) {
for(int j=0; j<8; j++) {
int bit = (buffer[i]>>j)&1;
NTL::SetCoeff(p, i*8+j, bit);
}
}
}
Посмотрите на мой EDIT. Я думаю, что мой код более эффективен, чем вы предлагали. И есть способ получить степень GF2X (см. Мой код). – Bush
@Bush Nice. Я не видел «NTL: deg». И да, возможно, ваше решение быстрее. Я только опубликовал наивное решение, которое работает. Я буду работать с NTL: deg' в мое решение. – AbcAeffchen