2010-10-18 33 views
13

Phiên bản ngắn: Tôi quan tâm đến một số mã Clojure cho phép tôi chỉ định biến đổi của x (ví dụ hoán vị, phép quay) theo đó giá trị của hàm f (x) là bất biến. Tôi có thể tạo ra một chuỗi x thỏa mãn r = f (x) một cách hiệu quả. Có một số phát triển trong đại số máy tính cho Clojure không? Đối (một tầm thường) ví dụĐại số máy tính cho Clojure

(defn #^{:domain #{3 4 7} 
     :range #{0,1,2} 
     :invariance-group :full} 
      f [x] (- x x)) 

tôi có thể gọi số (preimage f # {0}) và nó có hiệu quả sẽ trở lại # {3 4 7}. Đương nhiên, nó cũng sẽ có thể chú thích tên miền chính xác. Bất kỳ đề xuất?

Phiên bản dài hơn: Tôi có một vấn đề cụ thể khiến tôi quan tâm đến việc tìm hiểu về phát triển đại số máy tính cho Clojure. Bất cứ ai có thể chỉ cho tôi một dự án như vậy? Vấn đề cụ thể của tôi liên quan đến việc tìm kiếm tất cả các kết hợp của các từ thỏa mãn F (x) = r, trong đó F là hàm xếp hạng và r là số nguyên dương. Trong trường hợp cụ thể của tôi f có thể được tính như một số tiền

F (x) = f (x [0]) + f (x [1]) + ... f (x [N-1])

Hơn nữa tôi có một tập hợp các bộ phân tách S = {s_i}, sao cho f (a) = f (b) cho a, b trong s, s trong S. Vì vậy, một chiến lược tạo tất cả x sao cho F (x) = r nên dựa vào yếu tố này của F và sự bất biến của f theo từng s_i. Nói cách khác, tôi tính tất cả hoán vị của các trang web chứa các phần tử của S tổng hợp thành r và soạn chúng với tất cả các kết hợp của các phần tử trong mỗi s_i. Điều này được thực hiện khá cẩu thả trong những điều sau đây:

(use 'clojure.contrib.combinatorics) 
(use 'clojure.contrib.seq-utils) 


(defn expand-counter [c] 
(flatten (for [m c] (let [x (m 0) y (m 1)] (repeat y x))))) 

(defn partition-by-rank-sum [A N f r] 
    (let [M (group-by f A) 
    image-A (set (keys M)) 
    ;integer-partition computes restricted integer partitions, 
    ;returning a multiset as key value pairs 
    rank-partitions (integer-partition r (disj image-A 0)) 
    ] 
    (apply concat (for [part rank-partitions] 
     (let [k (- N (reduce + (vals part))) 
      rank-map (if (pos? k) (assoc part 0 k) part) 
      all-buckets (lex-permutations (expand-counter rank-map)) 
      ] 
      (apply concat (for [bucket all-buckets] 
     (let [val-bucket (map M bucket) 
       filled-buckets (apply cartesian-product val-bucket)] 
      (map vec filled-buckets))))))))) 

Việc này được thực hiện nhưng bỏ qua hình ảnh cơ bản. Ví dụ, nếu các hoạt động liên kết là một sản phẩm thay vì một số tiền tôi sẽ phải viết lại các phần.

+0

Xem [Expresso] (https://github.com/clojure-numerics/expresso) từ năm 2013. – Zaz

Trả lời

1

Tôi không biết về bất kỳ hệ thống đại số máy tính nào được viết bằng Clojure. Tuy nhiên, đối với các nhu cầu toán học khá đơn giản của tôi, tôi đã tìm thấy nó thường hữu ích để sử dụng Maxima, được viết bằng lisp. Có thể tương tác với Maxima bằng cách sử dụng biểu thức s hoặc biểu diễn mức cao hơn, có thể thực sự thuận tiện. Maxima cũng có một số chức năng tổ hợp thô sơ có thể là những gì bạn đang tìm kiếm.

Nếu bạn đang say mê sử dụng Clojure, trong ngắn hạn có lẽ việc ném dữ liệu của bạn qua lại giữa Maxima và Clojure sẽ giúp bạn đạt được mục tiêu của mình.

Về lâu dài, tôi sẽ quan tâm đến việc thấy những gì bạn nghĩ ra!

2

Có Clojuratica, một giao diện giữa Clojure và Mathematica:

http://clojuratica.weebly.com/

Xem thêm mailing list post này bằng cách tác giả Clojuratica của.

Trong khi không phải là CAS, Incanter cũng có một số tính năng rất đẹp và có thể là một tài liệu tham khảo/nền tảng tốt để xây dựng ý tưởng của riêng bạn.

Về "Ví dụ: nếu hoạt động liên kết là sản phẩm thay vì số tiền, tôi sẽ phải ghi lại các phần".: nếu bạn cấu trúc mã của mình sao cho phù hợp, bạn không thể thực hiện điều này bằng cách sử dụng các hàm bậc cao hơn và đi qua trong hoạt động liên kết? Hãy suy nghĩ bản đồ-giảm.

1

Hệ thống dưới đây chưa hỗ trợ tổ hợp, mặc dù nó sẽ không phải là một nỗ lực lớn để thêm chúng, tải mã tốt đã tồn tại và đây có thể là nền tảng tốt để ghép nó lên. . Tôi hy vọng một plug ngắn gọn là không phù hợp ở đây, đây là chỉ nghiêm trọng Clojure CAS tôi biết, nhưng hey, thật là một hệ thống ...

=======

Nó có thể quan tâm cho độc giả của chủ đề này rằng hệ thống scmutils của Gerry Sussman đang được chuyển đến Clojure. Đây là một CAS rất tiên tiến, cung cấp những thứ như sự khác biệt tự động, chức năng chữ, vv, nhiều trong phong cách của Maple. Nó được sử dụng tại MIT cho các chương trình tiên tiến về động lực học và hình học vi phân, và một chút công bằng của các công cụ kỹ thuật điện. Đây cũng là hệ thống được sử dụng trong "phần tiếp theo" Sussman & Wisdom của (LOL) để SICP, SICM (Cấu trúc và Giải thích từ Classical Mechanics). Mặc dù ban đầu là một chương trình Đề án, đây không phải là bản dịch trực tiếp, mà là viết lại từ đầu để tận dụng các tính năng tốt nhất của Clojure. Nó được đặt tên là sicmutils, cả hai trong danh dự của bản gốc và của cuốn sách nỗ lực tuyệt vời này là công việc của Colin Smith và bạn có thể tìm thấy nó tại https://github.com/littleredcomputer/sicmutils.

Tôi tin rằng điều này có thể hình thành cơ sở của Hệ thống đại số máy tính tuyệt vời cho Clojure, cạnh tranh với bất kỳ thứ gì khác có sẵn. Mặc dù nó khá là một con thú khổng lồ, như bạn có thể tưởng tượng, và hàng tấn những thứ vẫn được chuyển đến, những điều cơ bản là khá nhiều ở đó, hệ thống sẽ phân biệt, và xử lý các chữ và các hàm theo nghĩa đen. Đó là một công việc đang tiến triển. Hệ thống này cũng sử dụng cách tiếp cận "chung chung" được Sussman ủng hộ, theo đó các hoạt động có thể được áp dụng cho các hàm, tạo ra một trừu tượng tuyệt vời để đơn giản hóa ký hiệu không có kết thúc.

Dưới đây là một taster:

> (def unity (+ (square sin) (square cos))) 
> (unity 2.0) ==> 1.0 
> (unity 'x) ==> 1 ;; yes we can deal with symbols 
> (def zero (D unity)) ;; Let's differentiate 
> (zero 2.0) ==> 0 

SicmUtils giới thiệu hai loại vector mới “lên” và “xuống” (gọi tắt là “cấu trúc”), họ làm việc khá nhiều như bạn mong chờ vectơ, nhưng có một số đặc biệt các thuộc tính toán học (covariant, contravariant), và một số thuộc tính lập trình, ở chỗ chúng có thể thực thi được!

> (def fnvec (up sin cos tan)) => fnvec 
> (fnvec 1) ==> (up 0.8414709848078965 0.5403023058681398 1.5574077246549023) 
> ;; differentiated 
> ((D fnvec) 1) ==> (up 0.5403023058681398 -0.8414709848078965 3.425518820814759) 
> ;; derivative with symbolic argument 
> ((D fnvec) 'θ) ==> (up (cos θ) (* -1 (sin θ)) (/ 1 (expt (cos θ) 2))) 

biệt một phần được hỗ trợ đầy đủ

> (defn ff [x y] (* (expt x 3)(expt y 5))) 
> ((D ff) 'x 'y) ==> (down (* 3 (expt x 2) (expt y 5)) (* 5 (expt x 3) (expt y 4))) 
> ;; i.e. vector of results wrt to both variables 

Hệ thống cũng hỗ trợ đầu ra TeX, nhân tử đa thức, và một loạt các tính năng khác. Rất nhiều thứ, tuy nhiên, có thể dễ dàng thực hiện đã không được thực hiện hoàn toàn do thiếu nguồn nhân lực. Đầu ra đồ họa và giao diện "notepad/worksheet" (sử dụng Gorilla của Clojure) cũng đang được thực hiện.

Tôi hy vọng điều này đã đi một số cách để làm cho cảm giác thèm ăn của bạn đủ để truy cập trang web và cho nó một sự thay đổi. Bạn thậm chí không cần Clojure, bạn có thể chạy nó ra khỏi tập tin jar được cung cấp.

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