<> <> <<>> DIRECTORY Rope, IO, AlgebraClasses, Polynomials, RatIntervals, AlgebraicNumbers; AlgebraicNumbersImpl: CEDAR PROGRAM IMPORTS Rope, IO, RatIntervals EXPORTS AlgebraicNumbers = BEGIN OPEN AC: AlgebraClasses, POL: Polynomials, RI: RatIntervals, AlgebraicNumbers; <> BadGroundField: PUBLIC ERROR [groundStructure: AC.Structure] = CODE; <> MakeAlgebraicNumber: PUBLIC PROC [minPolyRing: AC.Structure, minimalPolynomial: POL.Polynomial, real: BOOL _ FALSE, isolatingInterval: RI.RatInterval _ NIL] RETURNS [AlgebraicNumber] ~ { data: POL.PolynomialRingData _ NARROW[minPolyRing.instanceData]; groundStructure: AC.Structure _ data.coeffRing; IF groundStructure.class.flavor#field AND groundStructure.class.flavor#divisionAlgebra THEN ERROR BadGroundField[groundStructure]; IF NOT real THEN { IF groundStructure.class.algebraicallyClosedField THEN ERROR; RETURN[ NEW[AlgebraicNumberRec _ [ minPolyRing: minPolyRing, minimalPolynomial: minimalPolynomial ]] ] } ELSE { IF NOT groundStructure.class.realField THEN ERROR; IF groundStructure.class.realClosedField THEN ERROR; IF isolatingInterval = NIL THEN ERROR; RETURN[ NEW[AlgebraicNumberRec _ [ minPolyRing: minPolyRing, minimalPolynomial: minimalPolynomial, real: TRUE, isolatingInterval: isolatingInterval ]] ] }; }; <> <> <> <> <<};>> <<>> <> <> <> <> <<};>> <> <> <<};>> <<>> AlgebraicNumberToRope: PUBLIC PROC [in: AlgebraicNumber] RETURNS [out: Rope.ROPE] ~ { out _ Rope.Concat[in.minPolyRing.class.toRope[in.minimalPolynomial, in.minPolyRing], "\n"]; IF in.real THEN out _ Rope.Concat[out, RI.RatIntervalToRope[in.isolatingInterval] ]; }; WriteAlgebraicNumber: PUBLIC PROC [in: AlgebraicNumber, out: IO.STREAM] = { out.PutRope[ AlgebraicNumberToRope[in] ] }; END.