Gab*_*ell 15 clojure symbolic-math computer-algebra-systems symmetry
简短版本:我对一些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 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)))))))))
Run Code Online (Sandbox Code Playgroud)
这可以完成工作,但错过了潜在的图片.例如,如果关联操作是产品而不是总和,我将不得不重写部分.
下面的系统还不支持组合,虽然添加它们并不是一项巨大的努力,已经存在大量优质代码,这可能是一个很好的平台,因为它的基础非常合理.我希望这里的短插头不合适,这是我所知道的唯一严肃的Clojure CAS,但是嘿,这是一个什么样的系统......
=======
对于这个帖子的读者来说,Gerry Sussman的scmutils系统正被移植到Clojure 可能会引起人们的兴趣.这是一个非常先进的CAS,提供自动差异化,文字功能等等,与Maple风格相似.它在麻省理工学院用于动力学和微分几何的高级程序,以及相当多的电气工程.它也是Sussman&Wisdom的"续集"(LOL)中用于SICP,SICM(经典力学的结构和解释)的系统.虽然最初是一个Scheme程序,但这不是直接翻译,而是利用Clojure的最佳功能进行重新编写.它被命名为sicmutils,无论是为了纪念原版还是本书.这项精湛的工作是Colin Smith的工作,您可以在https://github.com/littleredcomputer/sicmutils找到它.
我相信这可以构成一个惊人的Clojure计算机代数系统的基础,与其他任何可用的竞争对手.虽然它是一个非常巨大的野兽,你可以想象,还有大量的东西需要移植,基础知识几乎就在那里,系统会有所区别,并且很好地处理文字和文字功能.这是一项正在进行的工作.该系统还使用Sussman倡导的"通用"方法,从而可以将操作应用于函数,创建一个简单的抽象,简化符号的结束.
这是一个品尝者:
> (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
Run Code Online (Sandbox Code Playgroud)
SicmUtils引入了两个新的矢量类型"向上"和"向下"(称为"结构"),它们的工作方式与您期望的矢量相似,但具有一些特殊的数学(协变,逆变)属性,以及一些编程属性,他们是可执行的!
> (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)))
Run Code Online (Sandbox Code Playgroud)
完全支持部分区分
> (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
Run Code Online (Sandbox Code Playgroud)
该系统还支持TeX输出,多项式因子分解和许多其他好东西.然而,许多可以轻松实施的东西并非完全出于缺乏人力资源.图形输出和"记事本/工作表"界面(使用Clojure的Gorilla)也在进行中.
我希望这已经在某种程度上促使你的胃口足以访问该网站并给它一个旋转.你甚至不需要Clojure,你可以从提供的jar文件中运行它.
我不知道有任何用 Clojure 编写的计算机代数系统。然而,对于我相当简单的数学需求,我发现使用Maxima通常很有用用 lisp 编写的可以使用 s 表达式或更高级别的表示与 Maxima 进行交互,这非常方便。Maxima 还具有一些基本的组合函数,这可能正是您正在寻找的。
如果您执意要使用 Clojure,短期内也许在 Maxima 和 Clojure 之间来回传输数据会帮助您实现目标。
从长远来看,我有兴趣看看你能想出什么!