Умножение многочленов - Lisp

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, помогите пожалуйста реализовать на Lisp'е данный код
Листинг программы
  1. domains
  2. int=integer
  3. intl=int*
  4. predicates
  5. len(intl,int)
  6. elt(intl,int,int)
  7. pcoeff(intl,intl,int,int,int)
  8. coeff(intl,intl,int,int,int)
  9. poly_mult(intl,intl,int,intl)
  10. polymult(intl,intl,intl)
  11. clauses
  12. len([],0).
  13. len([_|T],N) :- len(T,N1), N=N1+1.
  14. elt([],_,0) :- !.
  15. elt([X|_],0,X) :- !.
  16. elt([_|T],N,X) :- N1=N-1, elt(T,N1,X).
  17. pcoeff(PX,PY,I,J,Q) :- elt(PX,I,XX), elt(PY,J,YY), Q=XX*YY.
  18. coeff(_,_,N,I,0) :- I>N, !.
  19. coeff(PX,PY,N,I,S) :- J=N-I, pcoeff(PX,PY,I,J,Q), I1=I+1, coeff(PX,PY,N,I1,S1), S=S1+Q.
  20. poly_mult(PX,PY,I,[]) :- len(PX,N1), len(PY,N2), N=N1+N2-2, I>N, !.
  21. poly_mult(PX,PY,I,[Q|T]) :- coeff(PX,PY,I,0,Q), I1=I+1, poly_mult(PX,PY,I1,T).
  22. polymult(PX,PY,R) :- poly_mult(PX,PY,0,R).
Заранее спасибо

Решение задачи: «Умножение многочленов»

textual
Листинг программы
  1. (defun poly-add (p1 p2)
  2.    (let* ((n1 (- (length p1) 1))
  3.           (n2 (- (length p2) 1))
  4.           (n (max n1 n2))
  5.           (res nil))
  6.     (iter (for i from 0 to n)
  7.       (cond ((and (<= i n1) (<= i n2)) (collecting (+ (nth i p1) (nth i p2)) into res))
  8.             ((<= i n1) (collecting (nth i p1) into res))
  9.             (t (collecting (nth i p2) into res))))
  10.     res))
  11.  
  12. ==> poly-add
  13.  
  14. (defun poly-by-mon (p c m) ;; с-коэфф, m-степень
  15.    (append (replicate 0 m) (mapcar #'(lambda (q) (* c q)) p)))
  16.  
  17. ==> poly-by-mon
  18.  
  19. (defun poly-mult (p1 p2 &optional (c 0) (r (list 0)))
  20.   (cond ((null p1) r)
  21.         (t (let ((pp2 (poly-by-mon p2 (car p1) c)))
  22.                  (poly-mult (cdr p1) p2 (+ c 1) (poly-add r pp2))))))
  23.  
  24. ==> poly-mult
  25.  
  26. (poly-mult '(1 1) '(1 -1))
  27.  
  28. ==> (1 0 -1)
  29.  
  30. (poly-mult '(1 1) '(1 1))
  31.  
  32. ==> (1 2 1)

Объяснение кода листинга программы

В данном коде представлена реализация функции poly-mult, которая выполняет умножение двух многочленов. Список вызовов функций и переменных:

  1. poly-add - функция сложения многочленов
  2. poly-by-mon - функция создания многочлена из другого многочлена по коэффициенту и степени
  3. replicate - функция создания списка одинаковых элементов
  4. mapcar - функция применения функции к каждому элементу списка
  5. poly-mult - функция умножения многочленов
  6. null - функция проверки на пустоту списка
  7. car - функция получения первого элемента списка
  8. cdr - функция получения списка без первого элемента
  9. poly-add - функция сложения многочленов
  10. poly-by-mon - функция создания многочлена из другого многочлена по коэффициенту и степени
  11. replicate - функция создания списка одинаковых элементов
  12. mapcar - функция применения функции к каждому элементу списка
  13. poly-mult - функция умножения многочленов
  14. c - переменная для хранения коэффициента
  15. r - переменная для хранения результата умножения многочленов Давайте рассмотрим каждый из представленных функций:
  16. poly-add - функция сложения многочленов. Функция принимает два многочлена p1 и p2 и возвращает их сумму. Внутри функции определяются переменные n1 и n2, которые хранят длины многочленов p1 и p2 соответственно. Затем определяется переменная n, которая хранит максимальную из длин n1 и n2. Далее, с помощью цикла iter происходит итеративное сложение соответствующих элементов многочленов p1 и p2 с использованием функции collecting для накопления результата в переменной res. В конце функция возвращает значение res.
  17. poly-by-mon - функция создания многочлена из другого многочлена по коэффициенту и степени. Функция принимает многочлен p, коэффициент c и степень m и возвращает новый многочлен q, в котором каждый элемент q равен c умноженному на соответствующий элемент p с учетом его степени. Для этого используется функция replicate, которая создает список одинаковых элементов, и функция mapcar, которая применяет функцию к каждому элементу списка.
  18. poly-mult - функция умножения многочленов. Функция принимает два многочлена p1 и p2 и возвращает их произведение. Если p1 равно nil (т.е. пустой список), то возвращается r, иначе выполняется следующее: создается новый многочлен pp2 из p2 с использованием коэффициента c и степени m с помощью функции poly-by-mon. Затем рекурсивно вызывается функция poly-mult для cdr p1 и pp2, а результат сохраняется в переменной r. Значение c увеличивается на 1. В приведенном примере кода вызывается функция poly-mult с двумя многочленами (1 1) и (1 -1). Результатом выполнения будет (1 0 -1), так как умножение многочленов (1 1) и (1 -1) дает (1 0 -1).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.143 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы