qua*_*231 8 checksum crc modulo polynomials
我是一名电子工程师,并没有发现从纯粹的数学角度考虑CRC非常重要.但是,我有以下问题:
当我们计算CRC时,为什么要在消息中添加n个零,n是生成多项式的次数?我已经在modulo-2 long division以及CRC的硬件实现中看到了这一点
为什么我们希望生成多项式可以被(x + 1)整除?
为什么我们希望生成多项式不能被x整除?
n
在计算n
-bit CRC 时添加零,因为当将CRC附加到消息并发送整个(电信中的常规做法)时:
n
比特缓冲器,并且在发送端它几乎没有增加复杂性(x(n)
在CRC传输期间,AND门强制消息比特减少的额外条款为零,并且执行n
额外的减少步骤,因为CRC是发送).(M(x) * x^n) mod P(x) = R(x)
(可能在一些常数内,或者/或者可能在开始时添加一些规定的位M(x)
,对应于CRC寄存器的初始化),并且在接收侧计算的CRC在串联M(x)
和R(x)
,即(M(x) * x^n + R(x)) mod P(x)
零(或称为常数).C(x)
为M(x) mod P(x)
,当错误检测中使用的大多数多项式确保检测到任何两位错误达到某个大的消息大小时,翻转最后一位M(x)
和最后一位C(x)
将不会被检测到.x+1
,因为它确保检测到影响奇数位的任何错误.然而,这种做法并不普遍,并且它有时会阻止选择更好的多项式以获得更好的一些有用定义,包括最大化消息长度以便m
总是检测到错误(假设没有同步丢失),对于某些组合m
和n
.特别是,如果我们希望能够检测到尽可能长的消息(n
包括n
-bit CRC的2 -1位)的任何2位错误,我们需要多项式是原始的,因此不可简化,因此(对于n
> 1)不能被整除x+1
.x
,因为否则生成的CRC的最后一位将是恒定的,并且无助于检测其余信息+ CRC中的错误.