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

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

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

Здравствуйте, помогите пожалуйста реализовать на Lisp'е данный код
domains
int=integer
intl=int*
 
predicates
len(intl,int)
elt(intl,int,int)
pcoeff(intl,intl,int,int,int)
coeff(intl,intl,int,int,int)
poly_mult(intl,intl,int,intl)
polymult(intl,intl,intl)
 
clauses
len([],0).
len([_|T],N) :- len(T,N1), N=N1+1.
 
elt([],_,0)    :- !.  
elt([X|_],0,X) :- !.
elt([_|T],N,X) :- N1=N-1, elt(T,N1,X).
 
pcoeff(PX,PY,I,J,Q) :- elt(PX,I,XX), elt(PY,J,YY), Q=XX*YY.
 
coeff(_,_,N,I,0)  :- I>N, !.
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.
 
poly_mult(PX,PY,I,[])    :- len(PX,N1), len(PY,N2), N=N1+N2-2, I>N, !.
poly_mult(PX,PY,I,[Q|T]) :- coeff(PX,PY,I,0,Q), I1=I+1, poly_mult(PX,PY,I1,T). 
 
polymult(PX,PY,R) :- poly_mult(PX,PY,0,R).
Заранее спасибо

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

textual
Листинг программы
(defun poly-add (p1 p2)
   (let* ((n1 (- (length p1) 1))
          (n2 (- (length p2) 1))
          (n (max n1 n2))
          (res nil))
    (iter (for i from 0 to n)
      (cond ((and (<= i n1) (<= i n2)) (collecting (+ (nth i p1) (nth i p2)) into res))
            ((<= i n1) (collecting (nth i p1) into res))
            (t (collecting (nth i p2) into res))))
    res))
 
==> poly-add
 
(defun poly-by-mon (p c m) ;; с-коэфф, m-степень
   (append (replicate 0 m) (mapcar #'(lambda (q) (* c q)) p)))
 
==> poly-by-mon
 
(defun poly-mult (p1 p2 &optional (c 0) (r (list 0)))
  (cond ((null p1) r)
        (t (let ((pp2 (poly-by-mon p2 (car p1) c)))
                 (poly-mult (cdr p1) p2 (+ c 1) (poly-add r pp2))))))
 
==> poly-mult
 
(poly-mult '(1 1) '(1 -1))
 
==> (1 0 -1)
 
(poly-mult '(1 1) '(1 1))
 
==> (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
Похожие ответы