Common Lisp - вычисление символьных полиномов

Я хотел бы выполнить некоторые символьные вычисления на lisp. Я нашел полезную производную функцию и хотел бы знать, как написать простую рекурсивную функцию для добавления/вычитания/и т. д. многочлены.

Ввод (например): (addpolynomial '(+ (^ (* 2 x) 5) 3) '(+ (^ (* 3 x) 5) (^ (* 3 x) 2)))

Выход: (+ (^ (* 5 x) 5) (^ (* 3 x) 2)) 3)

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


person kzz    schedule 16.11.2015    source источник
comment
Вам может помочь добавление двух списков.   -  person Joshua Taylor    schedule 16.11.2015
comment
Это бесполезно, мне нужно выполнить символьные вычисления с полиномами представления в виде функций, чисел орехов, таких как (3 . 4).   -  person kzz    schedule 17.11.2015
comment
Вы ничего не показываете с функциями. У вас есть такие списки, как '(+ (^ (* 2 x) 5) 3). Однако обозначение (^ (* 2 x) 5) довольно странное. Вы действительно имеете в виду 2x в пятой степени? Обычно мы пишем это [32 раза [x до 5]], или в нотации Лиспи (* 32 (^ x 5)). Но большая часть полиномиальной арифметики такого рода сводится к выяснению соответствующих коэффициентов. Вот почему (^ (* 2 x) 5)` действительно неудобно работать, а (* 32 (^ x 5)) довольно удобно.   -  person Joshua Taylor    schedule 17.11.2015
comment
Вы правы - плохой пример. Однако я хотел бы добавить, например. (* 32 (^ x 5)) в (* 2 (^ x 4)) и получите (+ (* 32 (^ x 5)) (* 2 (^ x 4))) без каких-либо упрощений (если применимо)   -  person kzz    schedule 17.11.2015


Ответы (1)


Когда я имел дело с полиномами в Лиспе в прошлом, я использовал массивы чисел (предполагая переменную, что означает, что я не мог тривиально иметь такие вещи, как «x*x + y», но поскольку я не это надо...).

Это позволяет вам представлять "2x^5 + 3" как #(3 0 0 0 0 2), находить множитель x^n с помощью (aref poly n) и выполнять другие удобные операции.

Это также позволяет вам определить сложение как просто (map 'vector #'+ ...) (умножение требует немного больше работы).

person Vatine    schedule 17.11.2015