Двоичные полиномы по модулю — Python

У меня есть двоичные полиномы, которые я представляю как двоичные числа. Например

a = 0b10011 
b = 0b101

a равно x^4+x+1, а b равно x^2+1. Так что я хочу этого

a%b = 2 # 10 as polynomial x

Я хотел бы спросить, как я могу это сделать? Я думаю, что стандартная операция % двух полиномов не сработает.


person martin    schedule 06.05.2018    source источник
comment
ты имеешь в виду bin(a%b)?   -  person juanpa.arrivillaga    schedule 07.05.2018
comment
@ juanpa.arrivillaga нет, из-за этого я не получаю правильного результата. На самом деле x^4+x+1 % x^2+1 равно x (10)..... если я сделаю %b, я получу 100, что будет x^2   -  person martin    schedule 07.05.2018
comment
В вашем коде a и b — это обычные целые числа, которым вы присвоили значения, используя синтаксис Python для указания целочисленной константы в двоичной записи. Вместо этого вы можете определить класс для представления бинарных полиномов и в этом классе определить, что делает оператор по модулю %. Вам также потребуется определить все остальные стандартные операторы, которые вам нужны.   -  person martineau    schedule 07.05.2018


Ответы (1)


Вот простая идея, учитывая обычную процедуру деления полиномов, вы можете создать собственный класс для представления двоичных полиномов, а затем просто переопределить оператор (%), может быть, что-то вроде этого:

from math import fabs


def poly_div(p1, p2):
    def degree(poly):
        while poly and poly[-1] == 0:
            poly.pop()
        return len(poly)-1

    p2_degree = degree(p2)
    p1_degree = degree(p1)

    if p2_degree < 0:
        raise ZeroDivisionError

    if p1_degree >= p2_degree:
        q = [0] * p1_degree
        while p1_degree >= p2_degree:
            d = [0]*(p1_degree - p2_degree) + p2
            mult = q[p1_degree - p2_degree] = p1[-1] / float(d[-1])
            d = [coeff*mult for coeff in d]
            p1 = [fabs(p1_c - p2_c) for p1_c, p2_c in zip(p1, d)]
            p1_degree = degree(p1)
        r = p1
    else:
        q = [0]
        r = p1

    return q, r


class BinPoly:

    def __init__(self, poly):
        self.poly = [int(bit) for bit in list(poly)]

    def __mod__(self, other):
        return poly_div(self.poly, other.poly)


if __name__ == '__main__':
    a = BinPoly('10011')
    b = BinPoly('101')
    print(a%b)

Как вы можете видеть, вы строите многочлены из строки, настройка класса для использования вместо этого двоичных чисел не должна быть слишком сложной, оставляем читателю в качестве упражнения;)

person BPL    schedule 06.05.2018