簡短版本: 我對一些Clojure代碼感興趣,它允許我指定函數f(x)值不變的x(例如,置換,旋轉)的變換,我可以有效地生成一個滿足r = f(x)的x序列。 Clojure的計算機代數有一些發展嗎? 對於(一個微不足道的)示例Clojure的計算機代數
(defn #^{:domain #{3 4 7}
:range #{0,1,2}
:invariance-group :full}
f [x] (- x x))
我可以調用(原像F#{0}),它會有效地返回#{3 4 7}。當然,它也能夠正確地註釋codomain。有什麼建議麼?
更長的版本: 我有一個特定的問題,讓我感興趣的是發現計算機代數的Clojure的發展。任何人都可以指點我這樣的項目嗎?我的具體問題包括找到滿足F(x)= r的所有單詞組合,其中F是排名函數,r是正整數。 f(x)= f(x [0])+ f(x [1])+ ... f(x [N-1])
(在我的具體情況下,f可以計算爲一個和數F
此外我有一組不相交的集合S = {} S_I,使得f(A)= F(b)用於A,b爲S,S在S.因此,一個策略,以產生所有的x,使得F(X )= r應該依賴於F的這個因式分解和每個s_i下f的不變性。換句話說,我計算包含S的元素的所有排列組合,並將它們與每個s_i中的元素的所有組合組合。這是做得相當不穩定在以下內容:
(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)))))))))
這將完成工作,但錯過了底層的圖片。例如,如果關聯操作是一個產品而不是總和,我將不得不重寫部分。
從2013年退房[Expresso](https://github.com/clojure-numerics/expresso)。 – Zaz 2015-11-07 09:11:34