Polynomiale Faktorisierung in Haskell

8

Mit hammars Hilfe habe ich ein Template-Haskell-Bit erstellt, das kompiliert

%Vor%

bis

%Vor%

Ich stehe jetzt vor einem Problem, von dem ich glaube, dass ich es nicht lösen kann.

Bemerkenswert an Polynomen ist, dass sie in den Rationalen irreduzibel sind, wenn sie nicht reduzierbar modulo einige Primzahl p sind. Ich habe bereits eine Methode, bei der Brute-Force versucht, Polynome über ein gegebenes (endliches) Feld zu faktorisieren.

Ich möchte versuchen, diese Funktion für mehrere Felder auszuführen. Hier ist was ich will:

%Vor%

Grundsätzlich möchte ich meinen Factoring-Algorithmus für eine große Anzahl von Definitionen von "division" ausführen.

Ich denke, das ist möglich mit TH, aber es scheint, als würde es ewig dauern. Ich frage mich, ob es einfacher wäre, meine arithmetischen Operationen als Parameter an isIrreducible zu übergeben.

Alternativ scheint es, als könnte das etwas sein, mit dem das Newtype-Modul helfen könnte, aber ich kann mir nicht vorstellen, wie es funktionieren würde, ohne TH auf eine Art zu verwenden, die genauso hart wäre ...

Hat jemand irgendwelche Gedanken darüber, wie man das am besten erreicht?

    
Xodarap 07.10.2011, 13:15
quelle

2 Antworten

3

Sie können Berechnungen in endlichen Feldern mit numerischen Numeric-Typen durchführen, zum Beispiel mit dem type-level -Paket:

%Vor%

Dieser Ansatz hat den Vorteil, dass für jeden numerischen Typ keine neue Vorlage-Haskell-Instanz erforderlich ist. Der Nachteil ist, dass es wahrscheinlich langsamer als die Template-Haskell-Lösung ist, da jede Operation die Größe des endlichen Feldes über ein Klassenwörterbuch umgeht.

    
Judah Jacobson 07.10.2011, 21:00
quelle
2

Es hängt ein bisschen davon ab, wie Poly.T aussieht, aber Sie können eine Funktion vom Typ schreiben (zum Beispiel)

%Vor%

? Wenn dies der Fall ist, kann es sinnvoll sein, einen Z -Typ zu haben, dessen Operationen zur Laufzeit fehlschlagen, wenn ihr Modul nicht übereinstimmt:

%Vor%

Dann kannst du so etwas in ganz normalem Haskell schreiben:

%Vor%

Natürlich ist das ein bisschen weniger typsicher. Aber es ist klar aus der Parametrisierung, dass fmap (Z m) keine nicht übereinstimmenden Module einführen wird.

    
Daniel Wagner 07.10.2011 14:43
quelle