Een binaire veelterm is een veelterm waarvan de coëfficiënten 0 of 1 zijn.
Bewerkingen op de coëfficiënten van de veelterm worden steeds modulo 2 uitgevoerd.
Programmeer het onderstaande in de klasse $$\verb!BinaireVeelterm!$$:
-
een constructor met één argument, namelijk een lijst gehele getallen. Deze getallen stellen de termen van de
veelterm voor waarvoor de coëfficiënt verschillend is van 0. Zo wordt de veelterm
$$x^5+x^4+1$$ bijvoorbeeld voorgesteld door de lijst $$\verb![4, 5, 0]!$$ (dezelfde getallen in een
andere volgorde, stellen dezelfde veelterm voor. Een lege lijst stelt de nulveelterm voor.
Let erop om uit de argumentlijst alle strikt negatieve getallen weg te filteren, en ook dubbels niet op
te nemen in de veeltermvoorstelling.
-
de methode $$\verb!__str__()!$$ die de veelterm afdrukt als som van niet-nultermen.
Indien het om de nulveelterm gaat, wordt $$\verb!0!$$ weergegeven. De constante term
wordt als $$\verb!1!$$ weergegeven (indien aanwezig). Alle andere termen worden
voorgesteld als $$\verb!x**macht!$$, indien de term aanwezig is in de veelterm.
Op die manier wordt de veelterm met coëfficiëntenlijst $$\verb![0, 5, 4]!$$
afgedrukt als $$\verb!x**5+x**4+1!$$. De termen worden in afdalende graad weergegeven.
-
de operator "==" die aangeeft wanneer 2 veeltermen identiek zijn (let op: de volgorde
van de originele coëfficiëntenlijst speelt hierbij geen rol!).
-
een geschikte $$\verb!__repr__()!$$-methode.
-
de methode $$\verb!get_graad()!$$. Deze methode geeft de graad van de veelterm als resultaat terug.
-
de methode $$\verb!get_coef()!$$. Deze methode geeft de lijstvoorstelling van
de veelterm als bitpatroon terug. Noemen we het resultaat de lijst $$\verb!c!$$, dan
stelt $$\verb!c[i]!$$ de coëfficiënt van $$x^i$$ voor. De lijst is dus 1 langer
dan de graad van de veelterm, en bevat typisch zowel '1'-en als '0'-en (geheel). Voor de nulveelterm kiezen we als voorstelling de lijst $$\verb![0]!$$.
-
de binaire operator "+": berekent een nieuwe veelterm als som van de operandi.
-
de binaire operator "*": berekent een nieuwe veelterm als het product van de operandi.
Ter herinnering: nemen we de veeltermen $$a(x)$$ en $$b(x)$$ als
$$a(x)=\sum_{i=0}^{N}a_ix^i$$
en
$$b(x)=\sum_{i=0}^{M}b_ix^i$$
(dus respectievelijk van de graad $$N$$ en $$M$$), dan wordt hun product
$$c(x)=a(x)b(x)$$
gegeven door
$$c(x)=\sum_{k=0}^{M+N}\big(\sum_{l=0}^{k}a_l b_{k-l} \big) x^k$$
De coëfficiënten van de veelterm
$$c(x)=\sum_{k=0}^{M+N}c_kx^k$$
van de graad $$M+N$$ worden dus gegeven door
$$c_k=\sum_{l=0}^{k}a_l b_{k-l}$$
Voorbeeld
v0 = BinaireVeelterm([6, 4, 0, 3])
print(v0) # x**6+x**4+x**3+1
v1 = BinaireVeelterm([3, 8, 8, 1])
print(v1) # x**8+x**3+x**1
v2 = BinaireVeelterm([])
print(v2) # 0
print(v0.get_graad()) # 6
print(v0.get_coef()) # [1, 0, 0, 1, 1, 0, 1]
print(v1.get_graad()) # 8
print(v1.get_coef()) # [0, 1, 0, 1, 0, 0, 0, 0, 1]
print(v2.get_graad()) # 0
print(v2.get_coef()) # [0]
print(v0 + v1) # x**8+x**6+x**4+x**1+1
print(v0 * v1) # x**14+x**12+x**11+x**9+x**8+x**6+x**5+x**4+x**3+x**1