2010-07-21 33 views
26

Tôi cần thao tác các biểu thức như 1 + sqrt (3) và thực hiện số học cơ bản như cộng, trừ và chia. Tôi muốn kết quả ở một dạng dạng kinh điển nào đó để nó có thể được sử dụng như một chìa khóa trong bản đồ. Chuyển 1 + sqrt (3) thành phao không khả thi do các vấn đề về vòng.Thư viện Haskell như SymPy?

Tôi đã sử dụng SymPy cho tác vụ này bằng Python. Có một thư viện bản địa tương đương cho Haskell không?

+2

Bạn có muốn '√2 - 1 == 1/(√2 + 1)' không? – kennytm

Trả lời

7

Vui lòng xem the numbers package. Nếu tất cả những gì bạn cần là lưu trữ các số chính xác như "1 + √3", bạn có thể muốn sử dụng Data.Number.CReal thay vì các ký hiệu tượng trưng. Nó lưu trữ các biểu thức và có thể được tính toán tùy ý số chữ số khi cần thiết.

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

Ngoài ra còn có mô-đun Data.Number.Symbolic trong gói nhưng mô tả cho biết "Chủ yếu là hữu ích để gỡ lỗi".

+1

CReal sẽ không cung cấp cho bạn sự bình đẳng, đúng không? Vì vậy, tôi nghĩ rằng đó là một không-đi. – sclv

+0

@sclv: Nó thực hiện CReal, ngoại trừ việc nó có thể mất nhiều thời gian nếu được thực hiện đúng. '==' của CReal kết thúc sau 40 chữ số. – kennytm

+0

"Lưu ý rằng các phép so sánh trên CReal có thể phân kỳ vì nó là (bởi sự cần thiết) không thể triển khai chúng một cách chính xác và luôn luôn chấm dứt." Quy tắc đó không được sử dụng cho tôi. Tôi cần tránh chuyển đổi sang các số thực để băm các giá trị này. –

8

Dường như bạn đang tìm kiếm Hệ thống đại số máy tính (CAS) trong Haskell. Kiểm tra quá nhiều tham chiếu đến các đối tượng đại số trong tên của các gói/mô-đun Haskell, tôi chưa bao giờ nghe nói về mục đích chung và hệ thống CA được duy trì tốt trong Haskell (như SymPy hoặc Sage trong Python).

Tuy nhiên trong the list of Computer Algebra Systems trên Wikipedia Tôi đã tìm thấy một tài liệu tham khảo để

DoCon. The Algebraic Domain Constructor

Nó sử dụng một non-standard license, nhưng tôi dám nói nó vẫn là mã nguồn mở (mặc dù có yêu cầu đổi tên và ghi công). Tính đến tháng 7 năm 2010 docon-2.11 vẫn được xây dựng với GHC 6.12.1 và chạy demo/thử nghiệm (tôi chỉ phải chèn một pragma LANGUAGE FlexibleContexts trong một tệp của bản trình diễn).

DoCon được ghi lại đầy đủ (362 trang trong sách hướng dẫn). Hướng dẫn sử dụng của nó được đóng gói bên trong zip với nguồn khác nhau, vì vậy tôi đặt nó trực tuyến riêng cho tiện theo dõi:

DoCon 2.11 Manual.ps

Hãy xem xét thông qua để kiểm tra nếu nó phù hợp với nhu cầu của bạn.

+0

DoCon có vẻ hơi nặng đối với mục đích của người đăng. – sclv

+0

Tôi đồng ý, nhưng tôi không biết về bất cứ điều gì khác cho Haskell. – sastanin

+0

DoCon trông khá ghê gớm.Tất cả tôi thực sự cần là một thực hiện Haskell của thuật toán Landau cho denesting gốc tự do (và một cái gì đó để làm số học cơ bản với hợp lý và rễ vuông và vv). –

4

Kiểm tra gói cyclotomic, thực hiện số học chính xác về số cyclotomic. Chúng bao gồm tất cả các số đại số (do đó cụ thể là 1 + sqrt (3)) và các hoạt động chính (như bình đẳng) là decidable.

Chúng không cung cấp trường hợp Ord (vì lý do tương tự các số phức), nhưng có thể triển khai thực thể không ngữ nghĩa nếu tất cả mọi người cần là sử dụng chúng làm khóa trong bảng tra cứu. Bạn có thể liên hệ với tác giả về cách thực hiện điều này một cách chính xác, vì có thể có một số bất biến không rõ ràng (ví dụ: có thể cần phải cẩn thận về số không trong bản đồ coeffs).

Các vấn đề liên quan