NTL - 如何在GF(2 ^ n)中获取元素的整数表示

时间:2015-10-19 21:20:58

标签: c++ ntl

有没有办法获得该系数向量的整数表示?即,最高度系数是该整数的MSB,x ^ 0的系数是LSB?当使用方法BytesFromGF2X时,它会产生一个奇怪的表示,既不是大端也不是小端。

例如,如果元素为x ^ 23 + x ^ 20 + x + 1,那么我想得到整数:2 ^ 23 + 2 ^ 20 + 2 + 1.

2 个答案:

答案 0 :(得分:2)

使用这两种方法来回转换为小端整数表示:

从GF2X到小端整数

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,则执行以下操作:

<强> USAGE

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你可以使用:

从小端整数到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 :(得分: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知道更高度数的每个系数都是零。