15

短いバージョン: x のシーケンスを効率的に生成できるように、関数 f(x) の値が不変である x の変換 (順列、回転など) を指定できる Clojure コードに興味があります。 r = f(x) を満たします。Clojure 用のコンピューター代数の開発はありますか? (些細な)例として

(defn #^{:domain #{3 4 7} 
         :range #{0,1,2}
         :invariance-group :full} 
          f [x]  (- x x))

(preimage f #{0}) を呼び出すと、効率的に #{3 4 7} が返されます。当然、コドメインに正しく注釈を付けることもできます。助言がありますか?

より長いバージョン: Clojure 用のコンピューター代数の開発について知りたいと思わせる特定の問題があります。誰かが私にそのようなプロジェクトを教えてもらえますか? 私の特定の問題は、F(x) = r を満たす単語のすべての組み合わせを見つけることです。ここで、F はランキング関数であり、ra は正の整数です。私の特定のケースでは、 f は合計として計算できます

F(x) = f(x[0]) + f(x[1]) + ... f(x[N-1])

さらに、s の a、b、S の s に対して f(a)=f(b) となるように、素集合 S = {s_i} のセットがあります。したがって、F(x) = となるすべての x を生成する戦略r は、この F の因数分解と、各 s_i の下での f の不変性に依存する必要があります。つまり、合計が r になる 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)))))))))

これにより、仕事は完了しますが、根底にある全体像が失われます。たとえば、連想演算が合計ではなく積である場合、一部を書き直す必要があります。

4

3 に答える 3

2

Clojure と Mathematica の間のインターフェースである Clojuratica があります。

http://clojurateca.weebly.com/

Clojurateca の作成者によるこのメーリング リストへの投稿も参照してください。

CAS ではありませんが、Incanterにはいくつかの非常に優れた機能もあり、独自のアイデアを構築するための優れた参照/基盤になる可能性があります。

「たとえば、連想演算が和ではなく積だったら、部分的に書き換えないといけない」について。: コードを適切に構成する場合、高階関数を使用して連想演算を渡すことでこれを達成できませんか? map-reduce を考えてみてください。

于 2010-10-19T12:24:28.207 に答える
1

私は、Clojure で書かれたコンピューター代数システムを知りません。しかし、かなり単純な数学的ニーズのために、lisp で書かれたMaximaを使用すると便利な場合が多いことがわかりました。s 式またはより高レベルの表現を使用して Maxima と対話することが可能であり、これは非常に便利です。Maxima には、あなたが探しているかもしれないいくつかの初歩的な組み合わせ関数もあります。

Clojure の使用に熱中している場合、短期的には Maxima と Clojure の間でデータを行き来させることが目標の達成に役立つでしょう。

長期的には、あなたが何を思い付くか見てみたいと思います!

于 2010-10-19T08:06:41.880 に答える