2010-10-18 2 views
13

Краткая версия: Меня интересует некоторый код Clojure, который позволит мне указать преобразования x (например, перестановки, вращения), при которых значение функции f (x) инвариантно, так что Я могу эффективно генерировать последовательность x, удовлетворяющую r = f (x). Есть ли какое-то развитие в компьютерной алгебре для Clojure? Для (тривиального) примераКомпьютерная алгебра для Clojure

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

я мог бы назвать (прообраз F # {0}), и было бы эффективно возвращать # {3} 4 7. Естественно, он также мог бы правильно кодировать кодомену. Какие-либо предложения?

Более длинная версия: У меня есть конкретная проблема, которая заставляет меня заинтересоваться выяснением развития компьютерной алгебры для Clojure. Может ли кто-нибудь указать мне на такой проект? Моя конкретная проблема заключается в поиске всех комбинаций слов, которые удовлетворяют F (x) = r, где F - функция ранжирования, а r - целое положительное число. В моем конкретном случае е может быть вычислена как сумма

Р (х) = Р (х [0]) + F (х [1]) + ... F (х [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))))))))) 

Это выполняет свою работу, но пропускает основное изображение. Например, если ассоциативная операция была продуктом, а не суммой, мне пришлось бы переписать части.

+0

Откажитесь от [Expresso] (https://github.com/clojure-numerics/expresso) с 2013 года. – Zaz

ответ

1

Я не знаю ни одной системы компьютерной алгебры, написанной на Clojure. Однако, для моих довольно простых математических потребностей, я нашел, что часто полезно использовать Maxima, который написан в lisp. Можно взаимодействовать с Maxima с помощью s-выражений или представлений более высокого уровня, что может быть действительно удобным. Maxima также имеет некоторые рудиментарные функции комбинаторики, которые могут быть тем, что вы ищете.

Если вы пытаетесь использовать Clojure, в краткосрочной перспективе, возможно, бросив ваши данные взад и вперед между Maxima и Clojure, вы сможете достичь своих целей.

В более долгосрочной перспективе мне будет интересно узнать, что вы придумали!

2

Там в Clojuratica, интерфейс между Clojure и Mathematica:

http://clojuratica.weebly.com/

Смотрите также эту mailing list post автором Clojuratica в.

В то время как не CAS, Incanter также имеет несколько очень приятных функций и может быть хорошей ссылкой/основой для создания ваших собственных идей.

Относительно «Например, если ассоциативная операция была продуктом вместо суммы, мне пришлось бы переписать части».: если вы структурируете свой код соответственно, не могли бы вы выполнить это, используя функции более высокого порядка и передав ассоциативную операцию? Подумайте, снимите карту.

1

Система ниже не поддерживает комбинаторика, хотя это не было бы огромным усилием, чтобы добавить их, загрузок хорошего кода уже существует, и это может быть хорошей платформой для его трансплантации, поскольку основы довольно хороши , Я надеюсь, что короткая вилка не здесь неуместно, это единственный серьезный Clojure CAS я не знаю, но эй, что система ...

=======

Это может представлять интерес читателям этой темы, что Gerry Sussman's scmutils система портирована в Clojure. Это очень продвинутый CAS, предлагающий такие вещи, как автоматическая дифференциация, литеральные функции и т. Д., Многое в стиле Maple. Используется в MIT для продвинутых программ по динамике и дифференциальной геометрии, а также для частичной электротехники. Кроме того, система, используемая в Сассмен & Мудрости «продолжение» (LOL), чтобы SICP, SICM (Структура и интерпретация классической механики). Хотя изначально программа Scheme, это не прямой перевод, а переименование, чтобы воспользоваться лучшими функциями Clojure. Он был назван sicmutils, оба в честь оригинала и книги Это превосходное усилие - это работа Колина Смита, и вы можете найти его на https://github.com/littleredcomputer/sicmutils.

Я считаю, что это может стать основой удивительной компьютерной алгебраической системы для Clojure, конкурентоспособной с любым доступным. Хотя это довольно огромный зверь, как вы можете себе представить, и тонны вещей по-прежнему нужно портировать, основы там очень много, система будет дифференцироваться и отлично справляться с литералами и буквальными функциями. Это незавершенное производство. Система также использует «общий» подход, предложенный Суссманом, посредством чего операции могут быть применены к функциям, создавая отличную абстракцию, которая упрощает обозначения без конца.

Вот дегустатор:

> (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 вводит два новых типа вектора «вверх» и «вниз» (так называемая «структура»), они работают довольно много, как можно было бы ожидать векторы, но есть некоторые специальные математические (ковариантные, контравариантные) свойства, а также некоторые свойства программирования, поскольку они исполняемы!

> (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).

Надеюсь, это пошло на то, чтобы поднять аппетит достаточно, чтобы посетить сайт и дать ему вихрь. Вам даже не нужен Clojure, вы можете запустить его из предоставленного файла jar.