Пример #1
0
    def findErrors(self, forney_syndromes: Polynomial,
                   length_message: int) -> list:
        """
        Berlekamp-Massey + Chien search to find the 0s of the error locator polynomial
        :param forney_syndromes: the polynomial representation of the Forney syndromes
        :param length_message: the length of the message + parity bits
        :return: the error locator polynomial
        """

        error_loc_polynomial = Polynomial([1])
        last_known = Polynomial([1])

        # generate the error locator polynomial
        # - Berklekamp-Massey algorithm
        for i in range(0, len(forney_syndromes)):

            # d = S[k] + C[1]*S[k-1] + C[2]*S[k-2] + ... + C[l]*S[k-L]
            # This is the discrepancy delta
            delta = forney_syndromes[i]
            for j in range(1, len(error_loc_polynomial)):
                delta ^= self.GF.gfMul(error_loc_polynomial[-(j + 1)],
                                       forney_syndromes[i - j])

            # Calculate the next degree of the polynomial
            last_known.append(0)

            # If delta is not 0, correct for it
            if delta != 0:
                if len(last_known) > len(error_loc_polynomial):
                    new_polynomial = last_known.scale(delta)
                    last_known = error_loc_polynomial.scale(
                        self.GF.gfInv(delta))
                    error_loc_polynomial = new_polynomial

                error_loc_polynomial += last_known.scale(delta)

        error_loc_polynomial = error_loc_polynomial[::-1]

        # Stop if too many errors
        error_count = len(error_loc_polynomial) - 1
        if error_count * 2 > len(forney_syndromes):
            raise ReedSolomonError("Too many errors to correct")

        # Find the zeros of the polynomial using Chien search
        error_list = []
        for i in range(self.GF.lowSize):
            error_z = error_loc_polynomial.eval(self.GF.gfPow(2, i))
            if error_z == 0:
                error_list.append(length_message - i - 1)

        # Sanity checking
        if len(error_list) != error_count:
            raise ReedSolomonError("Too many errors to correct")
        else:
            return error_list
Пример #2
0
    def findErrors(self, forney_syndromes: Polynomial, length_message: int) -> list:
        """
        BM算法和Chien钱搜索找到0的错误定位多项式
        :param forney_syndromes: 表示forney伴随式的多项式
        :param length_message: 信息长度和校验位长度之和
        :return: 错误定位多项式
        """

        error_loc_polynomial = Polynomial([1])
        last_known = Polynomial([1])

        # 生成错误定位多项式
        # BM算法
        for i in range(0, len(forney_syndromes)):

            # d = S[k] + C[1]*S[k-1] + C[2]*S[k-2] + ... + C[l]*S[k-L]
            # 偏差delta
            delta = forney_syndromes[i]
            for j in range(1, len(error_loc_polynomial)):
                delta ^= self.GF.gfMul(error_loc_polynomial[-(j+1)], forney_syndromes[i - j])

            # 计算多项式次幂
            last_known.append(0)

            # 如果偏差delta不为0 改正
            if delta != 0:
                if len(last_known) > len(error_loc_polynomial):
                    new_polynomial = last_known.scale(delta)
                    last_known = error_loc_polynomial.scale(self.GF.gfInv(delta))
                    error_loc_polynomial = new_polynomial

                error_loc_polynomial += last_known.scale(delta)

        error_loc_polynomial = error_loc_polynomial[::-1]

        # 如果错误太多 停止
        error_count = len(error_loc_polynomial) - 1
        if error_count * 2 > len(forney_syndromes):
            raise ReedSolomonError("Too many errors to correct")

        # 用钱(Chien)搜索找到多项式的零点
        error_list = []
        for i in range(self.GF.lowSize):
            error_z = error_loc_polynomial.eval(self.GF.gfPow(2, i))
            if error_z == 0:
                error_list.append(length_message - i - 1)

        # 完整性检查
        if len(error_list) != error_count:
            raise ReedSolomonError("Too many errors to correct")
        else:
            return error_list
Пример #3
0
def interpolateLagrange(points):
	runningSum = Polynomial([0.0])
	for j in range(len(points)):
		
		runningProduct = Polynomial([1])
		for k in range(len(points)):
			if k != j:
				scale = points[j][0] - points[k][0]
				runningProduct *= Polynomial([-points[k][0]/scale, 1/scale])
		
		runningSum += runningProduct.scale(points[j][1])
	
	return runningSum
def interpolateLagrange(points):
    runningSum = Polynomial([0.0])
    for j in range(len(points)):

        runningProduct = Polynomial([1])
        for k in range(len(points)):
            if k != j:
                scale = points[j][0] - points[k][0]
                runningProduct *= Polynomial(
                    [-points[k][0] / scale, 1 / scale])

        runningSum += runningProduct.scale(points[j][1])

    return runningSum