Clojure的计算机代数

Clojure的计算机代数,clojure,symbolic-math,computer-algebra-systems,symmetry,Clojure,Symbolic Math,Computer Algebra Systems,Symmetry,简短版本: 我对一些Clojure代码感兴趣,它允许我指定x的变换(例如置换、旋转),在此变换下函数f(x)的值是不变的,因此我可以有效地生成满足r=f(x)的x序列。Clojure在计算机代数方面有什么进展吗? 举个(微不足道的)例子 我可以调用(预映像f{0}),它将有效地返回{3 4 7}。当然,它也能够正确地注释编码域。有什么建议吗 较长版本: 我有一个特别的问题,让我有兴趣了解Clojure计算机代数的发展。有人能告诉我这样一个项目吗?我的具体问题是找到满足F(x)=r的所有单词组合,

简短版本: 我对一些Clojure代码感兴趣,它允许我指定x的变换(例如置换、旋转),在此变换下函数f(x)的值是不变的,因此我可以有效地生成满足r=f(x)的x序列。Clojure在计算机代数方面有什么进展吗? 举个(微不足道的)例子

我可以调用(预映像f{0}),它将有效地返回{3 4 7}。当然,它也能够正确地注释编码域。有什么建议吗

较长版本: 我有一个特别的问题,让我有兴趣了解Clojure计算机代数的发展。有人能告诉我这样一个项目吗?我的具体问题是找到满足F(x)=r的所有单词组合,其中F是排名函数,r是正整数。在我的特殊情况下,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的分解和f在每个S_I下的不变性。换句话说,我计算了包含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)))))))))

这可以完成工作,但却忽略了基本情况。例如,如果关联运算是一个乘积而不是一个和,我就必须重写部分

我不知道有任何计算机代数系统是用Clojure编写的。然而,对于我相当简单的数学需求,我发现它通常很有用,它是用lisp编写的。可以使用s表达式或更高级别的表示与Maxima交互,这非常方便。Maxima也有一些基本的组合函数,这可能是您正在寻找的

如果你执意要使用Clojure,那么在短期内,也许在Maxima和Clojure之间来回传递数据会帮助你实现目标


从长远来看,我很想看看你的想法

有Clojuratica,Clojure和Mathematica之间的接口:

请参见Clojuratica的作者的文章

虽然不是CAS,但它也有一些非常好的特性,可能是构建自己想法的良好参考/基础


关于“例如,如果关联运算是一个乘积而不是一个和,我将不得不重写部分。”:如果你相应地构造代码,你不能通过使用高阶函数并传递关联运算来完成吗?想一想map reduce。

下面的系统还不支持组合运算,尽管添加组合运算不会花费很大的精力,但已经存在大量好的代码,这可能是一个很好的平台,可以将其移植到上面,因为基础知识非常完善。我希望短插头在这里不是不合适的,这是我所知道的唯一一个严重的Clojure CAS,但是,嘿,这是一个多么好的系统

=======

本帖读者可能会感兴趣的是,Gerry Sussman的scmutils系统正在移植到Clojure。 这是一个非常先进的CAS,提供自动微分、文字函数等功能,非常类似于Maple。 它在麻省理工学院用于动力学和微分几何的高级课程,以及相当一部分电子工程的东西。它也是Sussman&Wisdom的《SICP续集》(LOL)中使用的系统,SICM(经典力学的结构和解释)。 虽然最初是一个Scheme程序,但这不是直接翻译,而是利用Clojure的最佳功能进行的彻底重写。它被命名为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
SicmUtils引入了两种新的向量类型“up”和“down”(称为“structures”),它们的工作原理与您所期望的向量差不多,但具有一些特殊的数学(协变、逆变)特性,以及一些编程特性,因为它们是可执行的

> (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)))  
完全支持部分微分

> (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
该系统还支持TeX输出、多项式分解和许多其他功能。然而,许多可以轻松实施的工作并不是纯粹因为缺乏人力资源而完成的。图形输出和“记事本/工作表”界面(使用Clojure的Gorilla)也正在开发中

我希望这在一定程度上刺激了你的胃口,让你可以访问这个网站并体验一下。您甚至不需要Clojure,您可以从提供的jar文件中运行它。

从2013年开始检查。
> (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