예제 #1
0
    def divide_with_remainder(dividend, divider):
        biggest_dividend_power = Utils.get_biggest_power(dividend)
        biggest_divider_power = Utils.get_biggest_power(divider)

        # Jeśli dzielnik mniejszy od dzielnej lub równy 0 nie trzeba dzielić
        if biggest_dividend_power < biggest_divider_power or (
                biggest_dividend_power >= 1 and biggest_divider_power == 0):
            return [[0], dividend]

        max_power = max(biggest_dividend_power, biggest_divider_power)
        result = [[0] * max_power] * 2
        new_dividend = list(dividend)
        while True:
            i = len(new_dividend) - 1
            while new_dividend[i] == 0 and i > 0:
                i -= 1
            if i < 0:
                return result

            # Dzielenie przez najwyższą potęgę dzielnej
            current_power = i - biggest_divider_power

            # Jeśli potęga mniejsza od zera to koniec dzielenia
            if current_power < 0:
                if i == 0:
                    return [dividend, [0] * max_power]
                else:
                    return result

            # Dzielenie największego wyrazu dzielnej przez największy wyraz dzielnika
            div_result = [0] * (current_power + 1)
            gfs1 = GF.GFSimple(new_dividend[i], 2)
            gfs2 = GF.GFSimple(divider[biggest_divider_power], 2)
            gfs_result = gfs1 * (~gfs2)
            div_result[current_power] = gfs_result.value

            # Dodanie wyniku dzielenia do result
            result[0] = Utils.add_polynomials(result[0], div_result)

            # Mnożenie dzielnika przez wynik dzielenia
            subtrahend = Utils.mul_polynomials(divider, div_result)

            # Odejmowanie wymnożonej wartości od dzielnej
            new_dividend = Utils.sub_polynomials(new_dividend, subtrahend)

            # Zwrócenie wyniku jeśli nie można dalej dzielić
            if Utils.get_biggest_power(new_dividend) < biggest_divider_power:
                result[1] = new_dividend
                return result
예제 #2
0
 def sub_polynomials(poly1, poly2):
     if len(poly1) >= len(poly2):
         for i in range(0, len(poly2)):
             gfs1 = GF.GFSimple(poly1[i], 2)
             gfs2 = GF.GFSimple(poly2[i], 2)
             gfs_result = gfs1 + (~gfs2)
             poly1[i] = gfs_result.value
         return poly1
     else:
         for i in range(0, len(poly1)):
             gfs1 = GF.GFSimple(poly1[i], 2)
             gfs2 = GF.GFSimple(poly2[i], 2)
             gfs_result = gfs1 + (~gfs2)
             poly2[i] = gfs_result.value
         return poly2
예제 #3
0
    def mul_polynomials(poly1, poly2):
        max_power = Utils.get_biggest_power(poly1) + Utils.get_biggest_power(
            poly2)

        mul_result = [0] * (max_power + 1)
        for i in range(len(poly1) - 1, -1, -1):
            for j in range(len(poly2) - 1, -1, -1):
                gfs1 = GF.GFSimple(poly1[i], 2)
                gfs2 = GF.GFSimple(poly2[j], 2)
                gfs_mul_result = gfs1 * gfs2
                if gfs_mul_result.value > 0:
                    power = i + j
                    gfs3 = GF.GFSimple(mul_result[power], 2)
                    gfs_add_result = gfs3 + gfs_mul_result
                    mul_result[power] = gfs_add_result.value
        return mul_result