2015-10-19 4 views
1

Есть ли способ получить целочисленное представление этого вектора коэффициентов? то есть таким образом, что коэффициент максимальной степени является MSB этого целого числа, а коэффициент при x^0 является LSB? при использовании метода BytesFromGF2X это приводит к странному представлению, которое не является ни большим, ни маленьким.NTL - как получить целочисленное представление элемента в GF (2^n)

Например, если элемент равен x^23 + x^20 + x + 1, тогда я хотел бы получить целое число: 2^23 + 2^20 + 2 + 1.

ответ

1

С помощью этих двух методов, чтобы преобразовать назад и вперед к маленькому младшим целочисленному представлению:

ОТ 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); 
     } 
    } 
} 
1

Как об этом:

GF2X P; 
SetCoeff(P, 0, 1); 
SetCoeff(P, 20, 1); 
SetCoeff(P, 23, 1); 

ZZ number; 
clear(number); 
long degree = NTL::deg(P); 
for(long i = 0; i <= degree; ++i) 
    number += conv<ZZ>(P[i]) * power2_ZZ(i); 

Примечание: P выглядит как массив размера 24, если вы распечатать его. Но это не так. Он всегда печатается как список коэффициентов, так что самый высокий - 1. Но P знает, что каждый коэффициент для высших степеней равен нулю.

+0

Посмотрите на мой EDIT. Я думаю, что мой код более эффективен, чем вы предлагали. И есть способ получить степень GF2X (см. Мой код). – Bush

+1

@Bush Nice. Я не видел «NTL: deg». И да, возможно, ваше решение быстрее. Я только опубликовал наивное решение, которое работает. Я буду работать с NTL: deg' в мое решение. – AbcAeffchen