<> <> DIRECTORY Rope USING [ROPE], Basics, IO USING [STREAM], AlgebraClasses, Variables, DistribPolys; Polynomials: CEDAR DEFINITIONS IMPORTS DistribPolys ~ BEGIN OPEN AC: AlgebraClasses, VARS: Variables, DP: DistribPolys; <> Polynomial: TYPE = REF PolynomialRec; -- Recursive rep PolynomialStructure: TYPE = { constant, nonconstant }; PolynomialRec: TYPE = RECORD [ numVars: CARDINAL, -- 0 <=> constant variant data: SELECT type: PolynomialStructure FROM constant => [ value: REF ], nonconstant => [ leadingTerm: Term, reductum: Polynomial], <> ENDCASE ]; Term: TYPE = RECORD [ exponent: CARDINAL, coefficient: Polynomial ]; ZeroPoly: Polynomial = NIL; PolynomialSeq: TYPE = REF PolynomialSeqRec; PolynomialSeqRec: TYPE = RECORD [SEQUENCE lengthPlus1:[1..4096] OF Polynomial]; <> polynomialsOverRingClass: AC.StructureClass; -- Class record for all polynomial rings. polynomialsOverFieldClass: AC.StructureClass; -- Class record for all polynomial rings. <> PolynomialRingData: TYPE = REF PolynomialRingDataRec; PolynomialRingDataRec: TYPE = RECORD [ coeffRing: AC.Structure, variables: VARS.VariableSeq ]; <> UnivariateMonomialConstructorOp: TYPE = PROC [coeff: REF, exp: CARDINAL] RETURNS [out: Polynomial]; <> MultivariateMonomialConstructorOp: TYPE = PROC [coeff: Polynomial, exp: CARDINAL] RETURNS [out: Polynomial]; <> PolynomialOps: TYPE = REF PolynomialOpsRec; -- prop key is $PolynomialRing. Skew, i.e. noncommutative, fields ok) PolynomialOpsRec: TYPE = RECORD [ univariateMonomial: UnivariateMonomialConstructorOp, multivariateMonomial: MultivariateMonomialConstructorOp, differentiate: AC.UnaryOp, leadingCoefficient: AC.UnaryOp, mainVariableDegree: AC.ElementRankOp ]; <> PolynomialsOverRing: PROC [coeffRing: AC.Structure, V: VARS.VariableSeq] RETURNS [polynomialRing: AC.Structure]; <> PolynomialsOverField: PROC [coeffField: AC.Structure, V: VARS.VariableSeq] RETURNS [polynomialRing: AC.Structure]; <> <> IsPolynomialRing: PROC [ring: AC.Structure] RETURNS [BOOL]; <<>> <> UnivariateMonomial: PROC [polynomialRing: AC.Structure] RETURNS [UnivariateMonomialConstructorOp]; <> <<>> MultivariateMonomial: PROC [polynomialRing: AC.Structure] RETURNS [MultivariateMonomialConstructorOp]; <> <<>> Differentiate: PROC [polynomialRing: AC.Structure] RETURNS [AC.UnaryOp]; <> <<>> LeadingCoefficient: PROC [polynomialRing: AC.Structure] RETURNS [AC.UnaryOp]; <> <<>> MainVariableDegree: PROC [polynomialRing: AC.Structure] RETURNS [AC.ElementRankOp]; <> UnivariateMonomialConstructor: UnivariateMonomialConstructorOp; MultivariateMonomialConstructor: MultivariateMonomialConstructorOp; <> <<>> ReadPoly: PROC [in: IO.STREAM, V: VARS.VariableSeq, coeffRing: AC.Structure] RETURNS [poly: Polynomial]; PolyFromRope: PROC [in: Rope.ROPE, V: VARS.VariableSeq, coeffRing: AC.Structure] RETURNS [out: Polynomial]; <<>> PolyFullRepToRope: PROC [in: Polynomial, V: VARS.VariableSeq, coeffRing: AC.Structure] RETURNS [out: Rope.ROPE]; <> <<>> PolyToRope: PROC [in: Polynomial, V: VARS.VariableSeq, coeffRing: AC.Structure, termRope: Rope.ROPE _ DP.DollarRope] RETURNS [out: Rope.ROPE]; <> WritePoly: PROC [in: Polynomial, V: VARS.VariableSeq, coeffRing: AC.Structure, out: IO.STREAM, termRope: Rope.ROPE _ DP.DollarRope]; <<>> ReadPolySeq: PROC [in: IO.STREAM, V: VARS.VariableSeq, coeffRing: AC.Structure] RETURNS [seq: PolynomialSeq]; PolySeqFromRope: PROC [in: Rope.ROPE, V: VARS.VariableSeq, coeffRing: AC.Structure] RETURNS [out: PolynomialSeq]; PolySeqToRope: PROC [in: PolynomialSeq, V: VARS.VariableSeq, coeffRing: AC.Structure] RETURNS [out: Rope.ROPE]; WritePolySeq: PROC [in: PolynomialSeq, V: VARS.VariableSeq, coeffRing: AC.Structure, out: IO.STREAM]; PolyFromDPoly: PROC [in: DP.DPolynomial, V: VARS.VariableSeq] RETURNS [out: Polynomial]; DPolyFromPoly: PROC [in: Polynomial, V: VARS.VariableSeq] RETURNS [out: DP.DPolynomial]; <> Add: PROC [in1, in2: Polynomial, coeffRing: AC.Structure] RETURNS [out: Polynomial]; Negate: PROC [in: Polynomial, coeffRing: AC.Structure] RETURNS [out: Polynomial]; Subtract: PROC [in1, in2: Polynomial, coeffRing: AC.Structure] RETURNS [Polynomial]; Multiply: PROC [in1, in2: Polynomial, coeffRing: AC.Structure] RETURNS [out: Polynomial]; Remainder: PROC [dividend, divisor: Polynomial, polynomialsOverField: AC.Structure] RETURNS [Polynomial]; <> Diff: PROC [in: Polynomial, coeffRing: AC.Structure] RETURNS [out: Polynomial]; <> Equal: PROC [in1, in2: Polynomial, coeffRing: AC.Structure] RETURNS [BOOL _ FALSE]; Sign: PROC [in: Polynomial, coeffRing: AC.Structure] RETURNS [Basics.Comparison]; <> Abs: PROC [in: Polynomial, coeffRing: AC.Structure] RETURNS [out: Polynomial]; Compare: PROC [in1, in2: Polynomial, coeffRing: AC.Structure] RETURNS [Basics.Comparison]; <> LeadingCoeff: PROC [in: Polynomial] RETURNS [out: REF]; <> <<>> MainVariableDeg: PROC [in: Polynomial] RETURNS [CARDINAL]; <<>> END.