项目作者: dcasella

项目描述 :
Multivariate polynomials manipulation libraries for Lisp and Prolog
高级语言: Common Lisp
项目地址: git://github.com/dcasella/multivariate-polynomials.git
创建时间: 2016-11-15T09:05:28Z
项目社区:https://github.com/dcasella/multivariate-polynomials

开源协议:GNU General Public License v3.0

下载


Multivariate Polynomials

Translated and adapted from MV-201701 PDF written by Marco Antoniotti and Gabriella Pasi.

One of the first and most important computer applications was the symbolic manipulation of mathematical operations. In particular, known systems like Computer Algebra Systems preoccupy to offer multivariate polynomials manipulation functionalities.
The Project consists in Common Lisp and Prolog libraries implementing multivariate polynomials manipulation.

List of contents

Representation

Common Lisp

Expression:

  1. Variable X 'x
  2. Monomial XY^3 → '(* x (expt y 3))
  3. Monomial 5XW '(* 5 x w)
  4. Polynomial XY^3 + 5XW → '(+ (* x (expt y 3)) (* 5 x w))

VarPower: (V Power Variable)

  1. ; X^5
  2. (V 5 X)

Monomial: (M Coefficient TotalDegree VarPowers)

  1. ; 2*X^4*Y
  2. (M 2 5 ((V 4 X) (V 1 Y)))

Polynomial: (P Monomials)

  1. ; 4*X*Y + 2*Y*Z
  2. (P ((M 4 2 ((V 1 X) (V 1 Y))) (M 2 2 ((V 1 Y) (V 1 Z)))))

Prolog

Expression:

  1. Variable X x
  2. Monomial XY^3 x * y^3
  3. Monomial 5XW 5 * x * w
  4. Polynomial XY^3 + 5XW x * y^3 + 5 * x * w

VarPower: v(Power, Variable)

  1. % X^5
  2. v(5, x)

Monomial: m(Coefficient, TotalDegree, VarPowers)

  1. % 2*X^4*Y
  2. m(2, 5, [v(4, x), v(1, y)])

Polynomial: poly(Monomials)

  1. % 4*X*Y + 2*Y*Z
  2. poly(m(4, 2, [v(1, x), v(1, y)]), m(2, 2, [v(1, y), v(1, z)]))

Interface

Common Lisp

(coefficients Poly) → Coefficients

(variables Poly) → Variables

(monomials Poly) → Monomials

(maxdegree Poly) → Degree

(mindegree Poly) → Degree

(polyplus Poly1 Poly2) → Result

(polyminus Poly1 Poly2) → Result

(polytimes Poly1 Poly2) → Result

(as_monomial Expression) → Monomial

(as_polynomial Expression) → Monomial

(polyval Polynomial VariableValues) → Value

(pprint_polynomial Polynomial) → NIL

Prolog

coefficients(+Poly, -Coefficients)

variables(+Poly, -Variables)

monomials(+Poly, -Monomials)

maxdegree(+Poly, -Degree)

mindegree(+Poly, -Degree)

polyplus(+Poly1, +Poly2, -Result)

polyminus(+Poly1, +Poly2, -Result)

polytimes(+Poly1, +Poly2, -Result)

as_monomial(+Expression, -Monomial)

as_polynomial(+Expression, -Monomial)

polyval(+Polynomial, +VariableValues, -Value)

pprint_polynomial(+Polynomial)

Examples

Common Lisp

  1. CL-USER> (as-monomial '(* 3 y w (expt u 3)))
  2. (M 3 5 ((V 3 U) (V 1 W) (V 1 Y)))
  3. CL-USER> (setf qd (as-monomial 42))
  4. (M 42 0 NIL)
  5. CL-USER> (setf m1 (as-monomial '(* y (expt s 3) (expt u 3))))
  6. (M 1 7 ((V 3 S) (V 3 U) (V 1 Y)))
  7. CL-USER> (setf p1 (as-polynomial '(+ (* -1 x) (* x y))))
  8. (P ((M -1 1 ((V 1 X))) (M 1 2 ((V 1 X) (V 1 Y)))))
  9. CL-USER> (setf p2 (as-polynomial '(+ (* y (expt s 3) (expt u 3)) -4 (* x y))))
  10. (P ((M -4 0 NIL)
  11. (M 1 2 ((V 1 X) (V 1 Y)))
  12. (M 1 7 ((V 3 S) (V 3 U) (V 1 Y)))))
  13. CL-USER> (polytimes m1 p1)
  14. (P ((M -1 8 ((V 3 S) (V 3 U) (V 1 X) (V 1 Y)))
  15. (M 1 9 ((V 3 S) (V 3 U) (V 1 X) (V 2 Y)))))
  16. CL-USER> (pprint-polynomial *)
  17. -1 * S^3 * U^3 * X * Y + S^3 * U^3 * X * Y^2
  18. NIL

Prolog

  1. ?- as_monomial(3 * y * w * u^3, M).
  2. M = m(3, 5, [v(3, u), v(1, w), v(1, y)]).
  3. ?- as_monomial(42, QD).
  4. QD = m(42, 0, []).
  5. ?- as_polynomial(-1 * x + x * y, P1), variables(P1, Vs).
  6. P1 = poly([m(-1, 1, [v(1, x)]), m(1, 2, [v(1, x), v(1, y)])]),
  7. Vs = [x, y].
  8. ?- as_monomial(y * s^3 * u^3, M1),
  9. | as_polynomial(-1 * x + x * y, P1),
  10. | polytimes(M1, P1, R),
  11. | pprint_polynomial(R).
  12. -1 * S^3 * U^3 * X * Y + S^3 * U^3 * X * Y^2
  13. M1 = m(1, 7, [v(3, s), v(3, u), v(1, y)]),
  14. P1 = poly([m(-1, 1, [v(1, x)]), m(1, 2, [v(1, x), v(1, y)])]),
  15. R = poly([m(-1, 8, [v(3, s), v(3, u), v(1, x), v(1, y)]),
  16. m(1, 9, [v(3, s), v(3, u), v(1, x), v(2, y)])]).