2010-07-21 12 views
26

Ich muss Ausdrücke wie 1 + sqrt (3) manipulieren und Grundrechenarten wie Addition, Subtraktion und Division. Ich möchte, dass das Ergebnis in einer Art kanonischer Form vorliegt, damit es als Schlüssel in einer Karte verwendet werden kann. Das Drehen von 1 + sqrt (3) in einen Float ist aufgrund von Abrundungsproblemen nicht möglich.Haskell Bibliothek wie SymPy?

Ich habe SymPy für diese Aufgabe in Python verwendet. Gibt es eine entsprechende native Bibliothek für Haskell?

+2

Wollen Sie '√2 - 1 == 1/(√2 + 1)'? – kennytm

Antwort

7

Bitte überprüfen Sie the numbers package. Wenn Sie nur exakte Zahlen wie "1 + √3" speichern müssen, können Sie anstelle der symbolischen Arithmetik Data.Number.CReal verwenden. Es speichert die Ausdrücke und kann bei Bedarf zu einer beliebigen Anzahl von Ziffern berechnet werden.

Prelude Data.Number.CReal> let cx = 1 + sqrt (3 :: CReal) 
Prelude Data.Number.CReal> showCReal 400 cx 
"2.7320508075688772935274463415058723669428052538103806280558069794519330169088000370811461867572485756756261414154067030299699450949989524788116555120943736485280932319023055820679748201010846749232650153123432669033228866506722546689218379712270471316603678615880190499865373798593894676503475065760507566183481296061009476021871903250831458295239598329977898245082887144638329173472241639845878553977" 

Es gibt auch einen Data.Number.Symbolic Modul im Paket aber die Beschreibung sagt „Es ist für das Debuggen in erster Linie nützlich ist“.

+1

CReal gibt dir zwar keine Gleichheit, oder? Also würde ich denken, das ist ein No-Go. – sclv

+0

@sclv: Es implementiert CReal, außer dass es unendlich lange dauern kann, wenn es richtig gemacht wird. CReal '==' endet nach 40 Ziffern. – kennytm

+0

"Beachten Sie, dass die Vergleichsoperationen auf CReal abweichen können, da es (unbedingt) unmöglich ist, sie korrekt zu implementieren und immer zu beenden." Das schließt CReal für mich aus. Ich muss die Konvertierung in reelle Zahlen vermeiden, um diese Werte zu hashen. –

8

Es scheint, dass Sie nach Computer Algebra System (CAS) in Haskell suchen. Trotz so vieler Verweise auf algebraische Objekte in den Namen von Haskell-Paketen/Modulen habe ich noch nie von einem allgemeinen und gut gepflegten CA-System in Haskell gehört (wie SymPy oder Sage in Python).

jedoch in the list of Computer Algebra Systems auf Wikipedia Ich habe einen Verweis auf

DoCon. The Algebraic Domain Constructor

Es verwendet ein non-standard license gefunden, aber ich wage zu sagen, dass es immer noch Open Source ist (wenn auch mit Umbenennungs und Zuschreibung Anforderungen). Stand Juli 2010 docon-2.11 baut immer noch mit GHC 6.12.1 und läuft Demos/Tests (ich musste nur ein LANGUAGE FlexibleContexts Pragma in eine Datei der Demo einfügen).

DoCon ist gut dokumentiert (362 Seiten des Handbuchs). Sein Handbuch ist im Inneren des Reißverschlusses mit Quellen gepackt, so dass ich es online gestellt separat für Bequemlichkeit:

DoCon 2.11 Manual.ps

Bitte schauen Sie durch zu überprüfen, ob es Ihren Bedürfnissen entspricht.

+0

DoCon scheint ein bisschen Schwergewicht für den Zweck des Posters. – sclv

+0

Ich stimme zu, aber ich weiß nichts über Haskell. – sastanin

+0

DoCon sieht ziemlich beeindruckend aus.Alles, was ich wirklich brauche, ist eine Haskell-Implementierung von Landaus Algorithmus für das Entfernen von Radikalen (und etwas, das Grundrechenarten mit rationalen und quadratischen Wurzeln usw. ausführt). –

4

Schauen Sie sich das Paket cyclotomic an, das exakte arithmetische Berechnungen für die zyklotomischen Zahlen durchführt. Dazu gehören alle algebraischen Zahlen (also insbesondere 1 + sqrt (3)) und die Schlüsseloperationen (wie Gleichheit) sind entscheidbar.

Sie bieten keine Ord Instanz (aus dem gleichen Grund, die komplexen Zahlen nicht), aber man kann eine nicht-semantische Instanz implementieren, wenn alles, was sie benötigt, ist, sie als Schlüssel in einer Nachschlagetabelle zu verwenden. Vielleicht möchten Sie den Autor darüber informieren, wie Sie das richtig machen, da es einige Invarianten geben kann, die nicht offensichtlich sind (z. B. muss man in der coeffs Karte auf Nullen achten).