多项式如何转换二进制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多项式如何转换二进制相关的知识,希望对你有一定的参考价值。

G(X)=X4+X3+X+1 转换成二进制的过程

  多项式转换为二项式:
  在串行传送(磁盘、通讯)中,广泛采用循环冗余校验码(CRC)。CRC也是给信息码加上几位校验码,以增加整个编码系统的码距和查错纠错能力。 CRC的理论很复杂,一般书上只介绍已有生成多项式后计算校验码的方法。检错能力与生成多项式有关,只能根据书上的结论死记。 循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码又叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。 校验码的具体生成过程为:假设发送信息用信息多项式C(X)表示,将C(x)左移R位,则可表示成C(x)*2R,这样C(x)的右边就会空出R位,这就是校验码的位置。通过C(x)*2R除以生成多项式G(x)得到的余数就是校验码。
几个基本概念
1、多项式与二进制数码
多项式和二进制数有直接对应关系:x的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0。可以看出:x的最高幂次为R,转换成对应的二进制数有R+1位。
多项式包括生成多项式G(x)和信息多项式C(x)。
如生成多项式为G(x)=x4+x3+x+1, 可转换为二进制数码11011。
而发送信息位 1111,可转换为数据多项式为C(x)=x3+x2+x+1。

2、生成多项式
是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。
在发送方,利用生成多项式对信息多项式做模2除生成校验码。在接受方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。
应满足以下条件:
a、生成多项式的最高位和最低位必须为1。
b、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做模2除后应该使余数不为0。
c、不同位发生错误时,应该使余数不同。
d、对余数继续做模2除,应使余数循环。
参考技术A 问问首页 问题库 问问之星| 问问团队 全部问题 >教育/科学>理工科>问题页 “我的问问 我的2009”活动奖品发放通知! 已解决问题 收藏 转载到QQ空间 假设CRC的生成多项式G(x)=x3+x+1转换成对应的2进制除数1011是如何转换成二进制的 [ 标签:crc 多项式,crc,二进制 ] 假设CRC的生成多项式G(x)=x3+x+1,信息码为11001校验码是多少,码字多少是CRC错误。 /wx梦想 回答:1 人气:1 解决时间:2009-04-29 18:27 满意答案在串行传送(磁盘、通讯)中,广泛采用循环冗余校验码(CRC)。CRC也是给信息码加上几位校验码,以增加整个编码系统的码距和查错纠错能力。 CRC的理论很复杂,一般书上只介绍已有生成多项式后计算校验码的方法。检错能力与生成多项式有关,只能根据书上的结论死记。 循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码又叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。 校验码的具体生成过程为:假设发送信息用信息多项式C(X)表示,将C(x)左移R位,则可表示成C(x)*2R,这样C(x)的右边就会空出R位,这就是校验码的位置。通过C(x)*2R除以生成多项式G(x)得到的余数就是校验码。 几个基本概念 1、多项式与二进制数码 多项式和二进制数有直接对应关系:x的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0。可以看出:x的最高幂次为R,转换成对应的二进制数有R+1位。 多项式包括生成多项式G(x)和信息多项式C(x)。 如生成多项式为G(x)=x4+x3+x+1, 可转换为二进制数码11011。 而发送信息位 1111,可转换为数据多项式为C(x)=x3+x2+x+1。 2、生成多项式 是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。 在发送方,利用生成多项式对信息多项式做模2除生成校验码。在接受方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。 应满足以下条件: a、生成多项式的最高位和最低位必须为1。 b、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做模2除后应该使余数不为0。 c、不同位发生错误时,应该使余数不同。 d、对余数继续做模2除,应使余数循环本回答被提问者采纳

多项式的转换,多项式变基

  • 多项式的概念:\\large a_{1}x^{n-1}+a_{2}x^{n-2}+a_{3}x^{n-3}+...+a_{n}x^{0}
  • 多项式在计算机程序中的表示:用一个变量表示多项式的基 var base =  \\large _{}x,用一个数组表示系数 var arr = [a1, a2, a3, ... , an],数组的长度就是项数 n
  • 任何一个数字都可以用不同 base 的多项式表示,所以一个多项式也可以转换为另一个不同 base 的多项式

 

问题1:给定一个多项式,base已知,系数数组已知,如何计算它的和?

var sum = (base, arr) => {
    let t = 0;
    arr.forEach((item, index) => {
        t += item * Math.pow(base, arr.length - 1 - index);
    });
    return t;
};

以上代码简单的计算了多项式的和,有个问题就是多项式的和可能超出一个变量所能表示的数字的最大值导致溢出,这里不解决该问题。

 

问题2:给定一个多项式,base已知,系数数组已知,如果要把它转换为另一个base2的多项式,base2 < base,那么base2需要一个多大的数组表示?

很明显,高base转低base,项数肯定会增多。首先,假设第一个多项式 base = b1 共 n 项,转换为第二个多项式 base = b2 共 m 项,现在就是要计算 m 的最小值。

m 什么时候最小,就是该多项式的和最大的时候,每一项都是 b2 - 1,和为 b2^m - 1,第一个多项式的和也需要在最大的情况下,才能计算出m的最小值,也就是 b1^n - 1

两个多项式的和相等,所以 b2^m = b1^n,\\large m = n log_{b2}^{b1}     ,根据换底公式,\\large m = n ln_{}^{b1}/ln_{}^{b2},注意,m 的值大概率不是整数,如果是小数就要取大于该小数的最小整数,可以用Math.ceil()函数

 

问题3:给定一个多项式,base已知,系数数组已知,如何用程序转换为另一个已知base2(base2 < base)的多项式?

首先,假设第一个多项式 base = b1 共 n 项,转换为第二个多项式 base = b2 共 m 项,m已经在上一步计算出来了。

第一个多项式可以表示为 \\large ((((a_{1}b_{1}+a_{2})b_{1}+a_{3})b_{1}+a_{4})b_{1}+...a_{n-1})b_{1}+a_{n}        这步很重要,下面的更重要

然后先用除法计算a1的b2多项式,就像用十进制计算二进制那样计算,会得到一个数组arr,每一项都小于b2,该多项式的和为a1。

然后(这句比较难懂后面有例子),再用该数组从末位开始乘b1+a2,然后除以b2,然后依次进位,得到a1b1+a2的b2多项式数组,和为a1b1+a2,然后如此重复,直到计算完an这一项,例子如下:

十进制数字 a1 =  295 共三位数,数组就是 [2, 9, 5],b1=16,a2假设=7,b2 = 10,从个位开始 5*16+7 = 87 进位 8 余 7,然后计算十位 9*16+8 = 152 ,进 15 余 2,然后百位 2*16+15 = 47,进 4 余 7,

所以新数组就是:[4, 7, 2, 7],也就是十进制数字4727,4727 = 295*16+7,完美,上面用十进制和十六进制举例子,其他进制也是一样。

程序如下:

var sum = (base, arr) => {
    let t = 0;
    arr.forEach((item, index) => {
        t += item * Math.pow(base, arr.length - 1 - index);
    });
    return t;
};
const PolynomialTransformation = (base1, arr1, base2) => {

    //先排除开头的0
    let start = 0;
    for(let i = 0; i < arr1.length; i++){
        if(arr1[i] !== 0){
            break;
        }
        else{
            start++;
        }
    }
    //全0返回空数组
    if(start === arr1.length){
        return [];
    }

    let arr2Length = Math.ceil((arr1.length - start) * (Math.log(base1) / Math.log(base2)));
    let arr2 = new Array(arr2Length).fill(0);

    let stepLength = arr2.length - 1;

    for(let i = 0; i < arr1.length; i++){

        let carry = arr1[i];

        let place = arr2.length - 1;


        while(true) {
            carry += base1 * arr2[place];
            arr2[place] = carry % base2;
            carry = Math.floor(carry / base2);
            if(carry === 0 && place < stepLength){
                stepLength = place;
                break;
            }
            place--;
        }
    }

    return arr2;
};

var base1 = 16;
var arr1 = [5, 15, 9, 10, 15];
var base2 = 3;

console.log(sum(base1, arr1)); //391599
let arr2 = PolynomialTransformation(base1, arr1, base2);
console.log(arr2.toString()); //0,2,0,1,2,2,0,0,1,1,2,0,0
console.log(sum(base2, arr2)); //391599


 

以上是关于多项式如何转换二进制的主要内容,如果未能解决你的问题,请参考以下文章

CRC多项式转换二进制

怎样将多项式转化二进制,要细致的过程,知道的请帮忙回答一下,谢谢啦!

以二进制计算二项式系数

已知生成多项式G(X),如何转变为二进制的系数啊

2019-2020-1学期20192403《网络空间安全专业导论》第一周学习总结

P2084 进制转换