因此,我正在为Python中的uni项目制作BCH解码器。它需要一个10位的代码字,无论有无错误,都应该检测并更正发现的任何错误。对于双重错误纠正,有一个数学公式可以检测这些错误的位置和大小:formula for error pos and mag
i = (-Q + ((Q^2-4*P*R)^(1/2))/2*P)<br/>
j = (-Q - ((Q^2-4*P*R)^(1/2))/2*P)
b = (i*s1-s2)/(i-j)<br/>
a = s1-b
我已经正确计算了QPR和s1,s2。因此,我正在使用此示例(2 error BCH example)进行调试。它具有要传送到8888880747
的数字8899880747
,因此在位置3和4上都由于1的小节而出现2
错误。到目前为止,我的程序生成了正确的syndromes(s1 to s4 - 2,7,3,3)
和正确的PQR值(10,7,10)
但是当对i和j进行计算时,我得到的值与示例中的值不同-10.7
和10.6
,而不是3
和4
。这是我为i和j编写的代码:
#work out error positions i and j
sqrt = ((Q**2 - 4*P*R) % 11)**(1/2)
i = (((-Q+sqrt)/(2*P))%11)
j = (((-Q-sqrt)/(2*P))%11)
谁能看到我在做什么错?谢谢。
[该运算应在GF(11)
中进行,换言之,它们应在模11中进行。平方根和除法模11与它们的实数不同。
[]有一些先进的算法可以进行平方根运算和模逆运算,但是对于小至11的数字,您可以使用蛮力或预先计算表格。在这里遵循首要原则。对于sqrt(x),请尝试[0,1,2,... 10]并查看平方的哪个等于x。那是平方根。对于除法(倒数)1 / x,请尝试[0,1,2,... 10],然后看看乘以x的哪一个等于1 mod11。现在我们将这些值插入以获得i = 3,j = 4。
因此,通过计算mod 11,我们得到:
P,Q,R =(10,7,10)(Q ** 2-4-* P * R)= -351,-351%11 = 1这很方便,因为1的平方根仅为1 mod 11。查看下面的两个方程,我们将需要计算1 /(2 * P)mod 11,换句话说,我们需要找到2 * P mod 11的逆,即(2P)-1] > mod 11。2 * P%11 = 20%11 =9。通过尝试所有可能性,我们发现9 -1 mod 11为5。