помогите с умножением многочленов в lisp

например: (3x2 - 5x + 2)(7x + 1) и вы упрощаете это следующим образом:

((3 2)(-5 1)(2 0))((7 1)(1 0))
((21 3)(3 2)(-35 2)(-5 1)(14 1)(2 0))
(21 3)(32 2)(9 1)(2 0)

и вы получите такой ответ: 21x3 + 32x2 + 9x + 2

мне нужно это решение в lisp, пожалуйста, помогите


person iulia    schedule 15.05.2010    source источник
comment
Это домашнее задание? Если это так, вы должны пометить его как таковой.   -  person Marcelo Cantos    schedule 15.05.2010
comment
Во-первых, проверьте свою алгебру — ваш ответ неверен. Затем покажите нам, что вы уже пробовали. С чем у вас проблемы?   -  person Jim Lewis    schedule 15.05.2010
comment
а почему неправильно? вы пишете: (3x2-5x+2) как ((3 2) (-5 1) (2 0)) поэтому вы сначала пишете 3, а затем мощность 2, если 5 имеет простой x, то это 1, если мы не есть x, то это 0, на следующем шаге вы умножаете и добавляете ((a b)(c d))((f g)(j k))=(((af) (b+g)) ((a j)(b+k))((cf)(d+g))((cj)(d+k))) и затем вы объединяете: (3 2) с (- 35 2) и (-5 1) с (14 1), а затем вы преобразуете и вычисляете 21x3+32x2+9x+2   -  person iulia    schedule 15.05.2010


Ответы (1)


На первом этапе вам необходимо соединить каждый компонент LHS с каждым компонентом RHS; декартово произведение двух множеств. Для этого требуется двухуровневая карта, за которой следует объединение списков пар второго уровня в один список верхнего уровня (например, (apply #'append ...).

Второй этап может быть выполнен с помощью редукции, которая создает список ассоциаций, введенный в экспоненту.

РЕДАКТИРОВАТЬ: Позвольте мне решить для вас другую проблему, и пусть вы поймете, как перевести ее в решение вашей проблемы:

Вычислите (a + b + ... + k) * (l + m + ... + z), сначала разложив на пары, а затем просуммировав продукты:

(defun mul-sums (aa bb)
  (reduce #'+
          (apply #'append
                 (map 'list
                      #'(lambda (a)
                          (map 'list
                               #'(lambda (b)
                                   (* a b))
                               bb))
                      aa))))
; Compute (1 + 2 + 3) * (3 + 4).
> (mul-sums '(1 2 3) '(3 4))
42
person Marcelo Cantos    schedule 15.05.2010