This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

有关6678的新指令GMPY



6678提供的GMPY的算法为什么和GMPY4的不一样?

GMPY的算法原型是什么?

感觉指令集说明提供的GMPY算法和GMPY4所用算法有关系,但有所区别,请问区别在哪里?

  • ti liu你好:

    GMPY是新增的指令,比GMPY4有所增强。

    其主要区别在于GMPY可以完成小于等于32次方的多项式的CRC计算,而GMPY4只能完成小于等于8次方的多项式计算。

    谢谢!

    GMPY的C函数实现过程如下:

    uword gmpy(uword src1,uword src2,uword polynomial)

    {

    // the multiply is always between GF(2^9) and GF(2^32)

    // so no size information is needed

    uint pp;

    uint mask, tpp;

    uint I;

    pp = 0;

    mask = 0x00000100; // multiply by computing

    // partial products.

    for ( I=0; i<8; I++ ){

    if ( src2 & mask ) pp ^= src1;

    mask >>= 1;

    tpp = pp << 1;

    if (pp & 0x80000000) pp = polynomial ^ tpp;

    else pp = tpp;

    }

    if ( src2 & 0x1 ) pp ^= src1;

    return (pp) ; // leave it asserted left.

    }

  • 我想你误会我的意思了,c语言代码在指令集解释中已经给出。我的疑惑是,gmpy并不是gmpy4的简单扩充位宽,为什么?有什么区别?gmpy指令的数学来源是什么?crc计算是指什么?

  • ti liu 您好:

    GMPY和GMPY4的处理是类似的。数学来源就是伽罗华域为2的求余计算,通常应用在信道编码时的CRC校验计算上。

    一般要理解GMPY4和GMPY的算法需要了解伽罗华域的求余运算,其原理是一致的,实现可以根据不同的方法有不同的算法。

    区别还是在于GMPY4一次可以做四个求余运算,但是每个求余的方程式和输入bit只能是8bit。

    GMPY一次只能做1个求余运算,但方程式可以扩展到32bit。

    但具体实现是灵活的,比如输入bit是24个,方程式为x4+x3+x+1:

    那如果用GMPY4实现,则可以将24按照顺序变成3个8bit,按照伽罗华域求余规则生成另外两个方程式,这样就有3个8bit的输入,和3个方程式,这时使用GMPY4求出3个有效值,最好将3个有效值异或就得到结果。

    如果是GMPY实现,则直接可以实现。

    不知这样回答您是否满意,有问题可以再交流。谢谢!

  • 我用他给的例程12345678*126 生成多项式87654321怎么也算不出来他给的结果。后来才发现原来他给的生成多项式其实应该是187654321,这样才能得出结果。anyway谢谢你的答案

  • 呵呵,这时伽罗华域的方程式,比如x4+x3+x+1,那么就可以表示为x4 = x3+x+1,对应的二进制就是1011,最高位是默认的。