Chcę rozwiązać równań liniowych i kwadratowych modułowych w Haskell w jednej zmiennej. Sposób, w jaki robię to teraz polega na umieszczeniu x = [1..]
w równaniu jeden po drugim i znalezieniu pozostałej części (expr `rem` p == 0
, jeżeli równanie to jest modulo p
(niekoniecznie podstawowym), gdzie expr
ma zmienną x
). Uważam, że jest to bardzo nieefektywny proces. Czy istnieje lepszy sposób na zrobienie tego?modułowa równania w Haskell
7
A
Odpowiedz
5
Rozwiązywanie modularnych równań kwadratowych obejmuje łączenie:
- Tonelli-Shanks algorithm
- Chinese Remainder Theorem
- i kwadratowa formuła (tj ukończenie kwadrat)
Dla Haskell pakiet arithmoi ma implementacje tych algorytmów. W szczególności, patrz funkcje chineseRemainder, sqrtModP i sqrtModPP.
Tutaj można znaleźć kilka przykładów: pracował
+2
Bądź bardzo ostrożny z pakiet 'arithmoi'. Ma co najmniej jeden błąd w swoim głównym kodzie sita, który powoduje nieregularne błędy segmentacji. Kod jest * wyjątkowo * owłosiony i słabo udokumentowany, a pomimo tego, że pakiet ma nowego opiekuna, nie ma oznak, że w najbliższym czasie się poprawi. – dfeuer
[To może pomóc] (http://math.stackexchange.com/a/261900/88047) –
@BartekBanachewicz ja szukam metoda ogólna. W rzeczywistości w wyrażeniu są też inne stałe, które są określane przy użyciu innych środków, więc nie mogę ręcznie rozwiązać tego problemu, a następnie użyć tych wyników. – Iguana
jest to metoda numeryczna/algrotihm? jeśli tak, możesz dodać odpowiedni tag. –