<> <> <<>> DIRECTORY Rope, IO, AlgebraClasses, BigRats, RatIntervals, Polynomials, AlgebraicNumbers; AlgebraicNumbersImpl: CEDAR PROGRAM IMPORTS Rope, IO, RatIntervals, BigRats EXPORTS AlgebraicNumbers = BEGIN OPEN AC: AlgebraClasses, BR: BigRats, RI: RatIntervals, POL: Polynomials, AlgebraicNumbers; <> BadGroundField: PUBLIC ERROR [groundStructure: AC.Structure] = CODE; SyntaxError: PUBLIC ERROR [kind: ATOM _ $Unspecified] = 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.category#field AND groundStructure.class.category#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 ]] ] }; }; <> ReadAlgebraicNumber: PUBLIC PROC [in: IO.STREAM, minPolyRing: AC.Structure, real: BOOL _ FALSE] RETURNS [out: AlgebraicNumber] ~ { minimalPolynomial: POL.Polynomial _ NARROW[minPolyRing.class.read[in, minPolyRing] ]; -- should check monic, irreducible data: POL.PolynomialRingData _ NARROW[minPolyRing.instanceData]; groundStructure: AC.Structure _ data.coeffRing; puncChar: CHAR; IF groundStructure # BR.BigRats THEN ERROR BadGroundField[groundStructure]; IF NOT real THEN { IF groundStructure.class.algebraicallyClosedField THEN ERROR; RETURN[ NEW[AlgebraicNumberRec _ [ minPolyRing: minPolyRing, minimalPolynomial: minimalPolynomial ]] ] } ELSE { isolatingInterval: RI.RatInterval; []_ in.SkipWhitespace[]; puncChar _ in.GetChar[]; IF puncChar # ', THEN SyntaxError[$CommaExpected]; []_ in.SkipWhitespace[]; isolatingInterval _ RI.ReadRatInterval[in]; RETURN[ NEW[AlgebraicNumberRec _ [ minPolyRing: minPolyRing, minimalPolynomial: minimalPolynomial, real: TRUE, isolatingInterval: isolatingInterval ]] ] }; }; <> <> <> <> <<};>> AlgebraicNumberFromRope: PUBLIC PROC [in: Rope.ROPE, minPolyRing: AC.Structure, real: BOOL _ FALSE] RETURNS [out: AlgebraicNumber] = { out _ ReadAlgebraicNumber[IO.RIS[in], minPolyRing, real]; }; <<>> AlgebraicNumberToRope: PUBLIC PROC [in: AlgebraicNumber] RETURNS [out: Rope.ROPE] ~ { out _ Rope.Concat[in.minPolyRing.class.toRope[in.minimalPolynomial], ", \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.