(uiop:define-package :st-buchberger/src/ring-element
(:mix :cl)
(:mix-reexport :st-buchberger/src/ring)
(:export #:ring-element #:ring-division-by-zero
#:ring-copy #:ring-zero-p #:ring-equal-p
#:ring-identity-p
#:ring+ #:ring- #:ring* #:ring/ #:ring-mod
#:add #:sub #:mul #:divides-p #:div #:div-mod
#:element->string #:ring-lcm #:base-ring))
(in-package :st-buchberger/src/ring-element)
;; (defgeneric monomial (future-term))
;; (defgeneric coefficient (future-term))
(defclass ring-element ()
(base-ring)
(:documentation "Base class for ring elements."))
(define-condition ring-division-by-zero (error)
((operands
:initarg :operands
:reader operands)))
(defgeneric ring-copy (element)
(:documentation "Returns a deep copy of an element"))
(defgeneric ring-zero-p (element)
(:documentation "Returns t if element is zero, nil otherwise"))
(defgeneric ring-equal-p (e1 e2)
(:documentation "Returns t if e1 equals e2, nil otherwise"))
(defgeneric ring-identity-p (element)
(:documentation "Returns t if element is the multiplicative
identity, nil otherwise"))
(defgeneric ring+ (element &rest more-elements))
(defgeneric ring- (element &rest more-elements))
(defgeneric ring* (element &rest more-elements))
(defgeneric ring/ (element &rest more-elements))
(defgeneric ring-mod (element &rest more-elements))
(defgeneric add (e1 e2)
(:documentation "Adds ring elements"))
(defgeneric sub (e1 e2)
(:documentation "Subtracts ring elements"))
(defgeneric mul (e1 e2)
(:documentation "Multiplies ring elements"))
(defgeneric divides-p (e1 e2)
(:documentation "Returns t if e1 divides e2 in the base ring"))
(defgeneric div (e1 e2)
(:documentation "Divides ring elements"))
(defgeneric divmod (element divisors)
(:documentation "Returns quotient(s) and remainder if we are working
in an Euclidean ring."))
(defgeneric element->string (element &key &allow-other-keys)
(:documentation "Returns a human-readable string representation of
an element"))
(defgeneric ring-lcm (e1 e2)
(:documentation "Returns the LCM of e1 and e2"))