close Warning: Can't synchronize with repository "(default)" (The repository directory has changed, you should resynchronize the repository with: trac-admin $ENV repository resync '(default)'). Look in the Trac log for more information.

source: branches/f4grobner/term.lisp@ 2701

Last change on this file since 2701 was 2701, checked in by Marek Rychlik, 9 years ago

* empty log message *

File size: 4.8 KB
Line 
1;;; -*- Mode: Lisp -*-
2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3;;;
4;;; Copyright (C) 1999, 2002, 2009, 2015 Marek Rychlik <rychlik@u.arizona.edu>
5;;;
6;;; This program is free software; you can redistribute it and/or modify
7;;; it under the terms of the GNU General Public License as published by
8;;; the Free Software Foundation; either version 2 of the License, or
9;;; (at your option) any later version.
10;;;
11;;; This program is distributed in the hope that it will be useful,
12;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14;;; GNU General Public License for more details.
15;;;
16;;; You should have received a copy of the GNU General Public License
17;;; along with this program; if not, write to the Free Software
18;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19;;;
20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
21
22(defpackage "TERM"
23 (:use :cl :monom :ring)
24 (:export "TERM" "MAKE-TERM-VARIABLE")
25 (:documentation "Implements class TERM. A term is a product of a
26scalar and powers of some variables, such as 5*X^2*Y^3. The part of
27the term without the coefficient is a monomial X^2*Y^3, which is
28represented by class MONOM. In this implementation, a TERM specializes
29MONOL. Also, a monomial can be considered a TERM whose coefficient is
30the unit element (1) of the underlying ring. The generic method
31CHANGE-CLASS can be used to convert between a MONOM and a TERM,
32observing this convention.")
33
34(in-package :term)
35
36(proclaim '(optimize (speed 3) (space 0) (safety 0) (debug 0)))
37
38(defclass term (monom)
39 ((coeff :initarg :coeff :accessor term-coeff
40 :documentation "The coefficient."))
41 (:default-initargs :dimension nil :exponents nil :coeff nil)
42 (:documentation "Implements a polynomial."))
43
44(defmethod r-coeff ((self term))
45 (term-coeff self))
46
47(defmethod (setf r-coeff) (new-value (self term))
48 (setf (term-coeff self) new-value))
49
50
51(defmethod print-object ((self term) stream)
52 (format stream "#<TERM DIMENSION=~A EXPONENTS=~A COEFF=~A>"
53 (r-dimension self)
54 (r-exponents self)
55 (r-coeff self)))
56
57(defmethod shared-initialize ((self term) slot-names
58 &rest
59 initargs
60 &key
61 coeff
62 &allow-other-keys)
63 (declare (ignore initargs))
64 (if (eq slot-names t) (setf slot-names '(coeff)))
65 (dolist (slot-name slot-names)
66 (case slot-name
67 (coeff
68 (setf (slot-value self 'coeff) coeff)))))
69
70(defmethod update-instance-for-different-class :after ((old monom)
71 (new term)
72 &key)
73 ;; Changing an instance of class MONOM to class TERM may also
74 ;; happen when OLD is an instance of TERM, in which case the
75 ;; value of the coefficient should be preserved.
76 ;; This implementation calls R-COEFF, which satisfies
77 ;; this requirement.
78 (setf (slot-value new 'coeff) (r-coeff old)))
79
80
81#|
82(defun make-term-variable (nvars pos
83 &optional
84 (power 1)
85 (coeff 1))
86 "Construct a term in the polynomial ring RING[X[0],X[1],X[2],...X[NVARS-1]]
87over the ring RING which represents a single variable. It assumes
88number of variables NVARS and the variable is at position
89POS. Optionally, the variable may appear raised to power POWER.
90Optionally, the term may appear with an arbitrary coefficient, which
91defaults to the unit of the RING."
92 (declare (type fixnum nvars pos))
93 (make-term :monom (make-monom-variable nvars pos power)
94 :coeff coeff))
95
96|#
97
98(defmethod r* :around ((term1 term) (term2 term))
99 "Returns the product of the terms TERM1 and TERM2,
100or NIL when the product is 0. This definition takes care of divisors of 0
101in the coefficient ring."
102 (let ((result (change-class (call-next-method) 'term)))
103 (setf (r-coeff result) (r* (r-coeff term1) (r-coeff term2)))
104 result))
105
106(defmethod multiply-by ((self term) (other monom))
107 "Returns the product of the terms TERM1 and TERM2,
108or NIL when the product is 0. This definition takes care of divisors of 0
109in the coefficient ring."
110 (setf (r-coeff self) (multiply-by (r-coeff self) (r-coeff other)))
111 self)
112
113(defmethod multiply-by ((self term) (other scalar))
114 "Returns the product of the terms TERM1 and TERM2,
115or NIL when the product is 0. This definition takes care of divisors of 0
116in the coefficient ring."
117 (setf (r-coeff self) (multiply-by (r-coeff self) other))
118 self)
119
120(defmethod unary-minus ((self term))
121 (setf (term-coeff self) (unary-minus (term-coeff self)))
122 self)
123
124#|
125
126(defun term->cons (term)
127 "A human-readable representation of a term as a cons (MONOM . COEFF)."
128 (declare (type term term))
129 (cons (monom->list (term-monom term)) (term-coeff term)))
130
131|#
Note: See TracBrowser for help on using the repository browser.