(defclass ideal ()
((ring
:initarg :ring
:initform (error "You must specify a ring for the polynomial ideal.")
:accessor ring)
(generators
:initarg :generators
:initform (error "You must provide a set of generators for the ideal.")
:accessor generators)
(cached-basis)))
(defun make-ideal (&rest generators)
"Create a new ideal generated by the elements contained in the
GENERATORS list."
(when generators
(let* ((g (first generators))
(base-ring (base-ring g)))
(unless (every (lambda (x) (eq x base-ring))
(mapcar #'base-ring (rest generators)))
(error "Every generator must belong to the same ring."))
(make-instance 'ideal
:ring base-ring
:generators (make-array (length generators)
:element-type (class-of g)
:initial-contents generators)))))