我是一名电子工程师,并没有发现从纯粹的数学角度考虑CRC非常重要。但是,我有以下问题:
为什么在计算CRC时我们在消息中添加n个零,n是生成多项式的次数?我在模2长分区以及CRC
为什么我们希望生成多项式可以被(x + 1)整除?
为什么我们希望生成多项式不能被x整除?
答案 0 :(得分:7)
n
位CRC时添加n
个零,因为当将CRC附加到消息并发送整个(电信中的常规做法)时:
n
位缓冲区,在发送端,它几乎没有增加复杂性(x(n)
的额外项在CRC传输期间减少到AND门强制消息位为零,以及在发送CRC时执行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
的组合。特别是,如果我们希望能够检测到可能的最长消息的任何2位错误(这将是2 n
-1位,包括n
位CRC ),我们需要多项式是原始的,因此是不可简的,因此(n
> 1)不能被x+1
整除。x
整除,因为否则生成的CRC的最后一位将是常量,并且无助于检测其余信息中的错误+ CRC。