Rozwiązanie zadania "Ilorazy pierścienia wielomianów" #35
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "(deleted):zad4"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Dziękuję, kod wygląda ok.
Kilka uwag/pytań:
deg = len(self.elements) - 1
; to oczywiście nie jest poprawnie, bo najwyższy współczynnik może być0 (mod int_mod)
. Przy dodawaniu, mnożeniu itd. nie sprawia to problemu, natomiast metoda__eq__
w ogóle nie bierze pod uwagę istnienia zerowych współczynników. Co więcej metoda__eq__
jest niezwrotna:całe szczęście że jej Pan nie używa ;-) gdyby ją dobrze zaimplementować, możnaby uniknąć potworków takich jak np. ta kaskada w
invertibles()
i pisać po prostu(f*g) % self.poly_modulo == Poly(self.int_modulo, [1])
jest ok, ale
skutkuje nieskończoną pętlą:
Jeśli chce Pan to poprawić, ma Pan czas do jutra, 24:00;
Już na samym początku tworzenia klasy wielomianu pojawiły się 2 problemy: Działania na wielomianach i prostota sprawdzenia tych działań w innych programach, czy nawet na kartce. Choć dodawanie/odejmowanie nie byłoby szczególnym problemem, bo zmieniają się tylko i wyłącznie współczynniki, tak cała reszta już jest, bo w grę wchodzi manipulacja pojawiających się i znikających indeksów w różnych miejscach listy. Słowniki pomogły na tyle ominąć ten problem, że wstawiamy tylko klucz zawierający odpowiedni stopień, nie martwiąc się o jego miejsce. Był też, tak jak wspomniałem powyżej, dodatkowy bonus: mogłem wyświetlić wielomian w postaci do jakiej jestem bardziej przyzwyczajony tj. od najwyższej potęgi i z podanym x. Zamysł głównie estetyczny, ale mogłem go wykorzystać jeszcze przed napisaniem
___str___(self)
.Czy źle podszedłem do tematu? Prawdopodobnie. Na pewno istnieje bardziej optymalny sposób rozwiązania tego co napisałem wyżej i tego o czym nie napisałem bo ten post jest już wystarczająco długi, a to zaledwie pierwszy punkt.
Mogę tylko i wyłącznie przyznać, że o niedokładności
deg
zapomniałem, natomiast___eq___(self, other)
jest efektem mojego lenistwa (bo koniec końców interesuje nas tylko sprawdzenie elementów obiektu).Postaram się napisać poprawę kodu. Dam znać jeśli będzie gotowa.
Być może Pana zaskoczę, ale Pana podejście bynajmniej nie jest błędne, a w niektórych przypadkach jest nawet lepsze (wielokrotnie szybsze) ;-)
Jeśli wiemy, że wielomian ma niewiele niezerowych współczynników przy wysokim stopniu (tj. lista współczynników jest będzie się składała głównie z zer), to Pana podejście (słownikowe, lub przez
SparseArray
, co na jedno wychodzi) jest wielokrotnie szybsze i oszczędniejsze (pamięciowo). Oczywiście dlatego, że nie trzeba przechowywać/manipulować zer. No i wiemy, że np. mnożenie wielomianów zachowuje ich (relatywną, względem stopnia) rzadkość.O łatwości manipulacji wielomianów (którą Pan się kierował) nie wspomnę ;-) Byłem tylko ciekawy, czy było to Pana zamierzeniem, czy wyszło "przypadkiem".
Czekam więc na poprawiony kod, całość wygląda przyzwoicie!
Przy okazji: mnożenie wielomianów (które jak Pan zauważył może być łatwo wyrażone przez (nieobecną w podstawowej bibliotece pythona) operację splotu dyskretnego (
convolution
).Wprowadziłem kilka poprawek, teraz modulo jest wykonywane jako pierwsze więc konstruktor powinien zagwarantować, że pierwszy współczynnik nie będzie 0.
Liczę, że ta wersja będzie bardziej satysfakcjonująca.
ok, dziękuję;
Pull request closed