简短版本: 我对一些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