2010-07-21 9 views
26

Potrzebuję manipulować wyrażeniami takimi jak 1 + sqrt (3) i wykonywać podstawowe operacje arytmetyczne, takie jak dodawanie, odejmowanie i dzielenie. Chciałbym, żeby wynik był w jakiejś formie kanonicznej, aby mógł być używany jako klucz w mapie. Przekształcenie 1 + sqrt (3) w float nie jest możliwe z powodu problemów z zaokrąglaniem.Biblioteka Haskell jak SymPy?

Użyłem SymPy do tego zadania w Pythonie. Czy istnieje odpowiednik natywnej biblioteki dla Haskella?

+2

Czy chcesz '√2 - 1 == 1/(√2 + 1)'? – kennytm

Odpowiedz

7

Proszę sprawdzić the numbers package. Jeśli potrzebujesz tylko zapisywać dokładne liczby, takie jak "1 + √3", możesz zamiast tego użyć arytmetyki symbolicznej Data.Number.CReal. Przechowuje wyrażenia i może być obliczona do dowolnej liczby cyfr w razie potrzeby.

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

Istnieje również Data.Number.Symbolic moduł w pakiecie ale opis mówi „Jest to przydatne głównie do debugowania”.

+1

CReal nie da ci równości, prawda? Więc myślę, że to nie jest. – sclv

+0

@sclv: Implementuje CReal, z tym wyjątkiem, że może to potrwać nieskończenie długo, jeśli zostanie wykonane poprawnie. CR = "==" kończy się po 40 cyfrach. – kennytm

+0

"Należy zauważyć, że operacje porównania w CReal mogą się różnić, ponieważ jest (z konieczności) niemożliwe ich prawidłowe wdrożenie i zawsze kończenie." To wyklucza dla mnie CReal. Muszę unikać konwersji na liczby rzeczywiste, aby uformować te wartości. –

8

Wygląda na to, że szukasz systemu algebry komputerowej (CAS) w Haskell. Pomimo tylu odniesień do obiektów algebraicznych w nazwach pakietów/modułów Haskell, nigdy nie słyszałem o uniwersalnym i dobrze utrzymanym systemie CA w Haskell (jak SymPy lub Sage w Pythonie).

Jednak w the list of Computer Algebra Systems na Wikipedii znalazłem odniesienie do

DoCon. The Algebraic Domain Constructor

Używa non-standard license, ale ośmielę się powiedzieć, że jest nadal Open Source (choć z wymaganiami przemianowania i atrybucji). Od lipca 2010 r. docon-2.11 nadal buduje z GHC 6.12.1 i uruchamia dema/testy (musiałem tylko wstawić pragma LANGUAGE FlexibleContexts w jednym pliku demo).

DoCon jest dobrze udokumentowany (362 strony podręcznika). Jego Podręcznik jest zapakowany wewnątrz zamek ze źródeł, więc umieścić go w Internecie dla wygody oddzielnie:

DoCon 2.11 Manual.ps

Proszę przejrzeć, aby sprawdzić, czy odpowiada Twoim potrzebom.

+0

DoCon wydaje się nieco cięższy do celu plakatu. – sclv

+0

Zgadzam się, ale nie wiem nic więcej o Haskellowi. – sastanin

+0

DoCon wygląda bardzo groźnie.Jedyne, czego naprawdę potrzebuję, to implementacja algorytmu Landaua Haskella do denestowania rodników (i coś do zrobienia podstawowej arytmetyki z wymiernymi i pierwiastkowymi itd.). –

4

Sprawdź pakiet cyclotomic, który implementuje dokładną arytmetyczną liczbę cyklotomiczną. Obejmują one wszystkie liczby algebraiczne (stąd w szczególności 1 + sqrt (3)) i kluczowe operacje (takie jak równość) są rozstrzygalne.

Nie dostarczają one instancji Ord (z tego samego powodu, dla którego liczby zespolone nie mają), ale można wdrożyć niesąstyczne wystąpienie, jeśli wszystko, czego potrzeba, to użyć ich jako kluczy w tabeli odnośników. Możesz skontaktować się z autorem, aby dowiedzieć się, jak to zrobić poprawnie, ponieważ mogą istnieć niezmienniki, które nie są oczywiste (np. Być może trzeba uważać na zera na mapie coeffs).