简短版本:我对一些Clojure代码很感兴趣,它允许我指定x的变换(例如置换,旋转),在该变换下函数f(x)的值是不变的,这样我就可以有效地生成x的序列满足r = f(x).Clojure的计算机代数有一些发展吗?对于(一个微不足道的)例子
(defn #^{:domain #{3 4 7}
:range #{0,1,2}
:invariance-group :full}
f [x] (- x x))
Run Code Online (Sandbox Code Playgroud)
我可以打电话(preimage f#{0}),它会有效地返回#{3 4 7}.当然,它也能够正确地注释codomain.有什么建议?
更长的版本:我有一个特定的问题让我有兴趣了解Clojure计算机代数的开发.谁能指点我这样的项目?我的具体问题涉及找到满足F(x)= r的所有单词组合,其中F是排名函数,ra是正整数.在我的特定情况下,f可以作为总和来计算
F(x)= f(x [0])+ f(x [1])+ ... f(x [N-1])
此外,我有一组不相交的集合S = {s_i},使得f(a)= f(b)表示a,b表示s,s表示S.所以生成所有x的策略使得F(x)= r应该依赖于F的这种因式分解和每个s_i下f的不变性.换句话说,我计算包含S元素的站点的所有排列,这些元素总和为r,并用每个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 …Run Code Online (Sandbox Code Playgroud)