помогите с умножением многочленов в lisp - PullRequest
1 голос
/ 15 мая 2010

например: (3x 2 - 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)

и вы получите этот ответ: 21x 3 + 32x 2 + 9x + 2

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

1 Ответ

0 голосов
/ 15 мая 2010

Для первого этапа вам необходимо соединить каждый компонент 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
...