Краткая версия: Меня интересует некоторый код 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)))))))))
Это выполняет свою работу, но пропускает основное изображение. Например, если ассоциативная операция была продуктом, а не суммой, мне пришлось бы переписать части.
Откажитесь от [Expresso] (https://github.com/clojure-numerics/expresso) с 2013 года. – Zaz