2010-07-21 27 views
26

我需要操縱像1 + sqrt(3)這樣的表達式,並進行基本的算術,如加法,減法和除法。我希望結果具有某種規範形式,以便它可以用作地圖中的關鍵字。由於舍入問題,將1 + sqrt(3)轉換爲浮點數是不可行的。像SymPy一樣的Haskell庫?

我在SymPy中使用了Python中的這個任務。 Haskell有一個等效的本地庫嗎?

+2

你想'√2 - 1 == 1 /(√2+ 1)'? – kennytm 2010-07-21 13:53:55

回答

7

請檢查出the numbers package。如果您只需存儲「1 +√3」等確切數字,則可能需要使用Data.Number.CReal而不是符號算術。它存儲表達式,並可在需要時計算爲任意數量的數字。

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

軟件包中還有一個Data.Number.Symbolic模塊,但描述中顯示「它主要用於調試」。

+1

CReal雖然不會給你平等,對吧?所以我認爲這是一個不行。 – sclv 2010-07-21 13:11:05

+0

@sclv:它實現了CReal,除非它正確完成可能需要無限長的時間。 CReal的'=='在40個數字後終止。 – kennytm 2010-07-21 13:58:17

+0

「請注意,對CReal的比較操作可能會有分歧,因爲(必要時)不可能正確實施它們並始終終止。」 這爲我排除了CReal。我需要避免轉換爲實數來散列這些值。 – 2010-07-22 03:37:51

8

看來您正在尋找Haskell中的計算機代數系統(CAS)。儘管Haskell包/模塊名稱中引用了很多代數對象,但我從未聽說過Haskell中的通用目的和維護良好的CA系統(如SymPy或Python中的Sage)。

但是在the list of Computer Algebra Systems在維基百科上,我發現了一個參考

DoCon. The Algebraic Domain Constructor

它採用了non-standard license,但我敢說它仍然是開源的(雖然重命名和歸屬的需求)。截至2010年7月docon-2.11仍然使用GHC 6.12.1構建並運行演示/測試(我只需在演示文件的一個文件中插入LANGUAGE FlexibleContexts編譯指示)。

DoCon有據可查(362頁手冊)。它的手冊是擠滿了源拉鍊的裏面,所以我把它放到網上分別爲方便:

DoCon 2.11 Manual.ps

請瀏覽並檢查它是否適合你的需要。

+0

DoCon對於海報的目的似乎有點重量級。 – sclv 2010-07-21 15:21:42

+0

我同意,但我不知道Haskell的其他任何內容。 – sastanin 2010-07-21 16:30:52

+0

DoCon看起來非常強大。我真正需要的是Haskell實現了Landau的解除自由基的算法(以及用有理數和平方根等進行基本算術的東西)。 – 2010-07-23 05:15:17

4

查看cyclotomic包,該包實現了分圓數的精確算術運算。這些包括所有代數數字(因此特別是1 + sqrt(3))和關鍵操作(如相等)是可確定的。

它們沒有提供Ord實例(出於同樣的原因,複數不需要),但是如果所有人都需要將它們用作查找表中的鍵,則可以實現非語義實例。您可能需要聯繫作者,瞭解如何正確執行此操作,因爲可能存在一些不明顯的不變量(例如,可能需要注意地圖中的零點)。