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.  AlgebraicNumbersImpl.mesa Last Edited by: Arnon, July 19, 1985 2:54:46 pm PDT Errors Constructors IO ReadAlgebraicNumber: PUBLIC PROC [in: IO.STREAM, minPolyRing: AC.Structure] RETURNS [out: AlgebraicNumber] ~ { minimalPolynomial: POL.Polynomial _ NARROW[minPolyRing.class.read[in, minPolyRing] ]; -- should check monic, irreducible out _ NEW[AlgebraicNumberRec _ [minPolyRing: minPolyRing, minimalPolynomial: minimalPolynomial]]; }; ReadRealAlgebraicNumber: PUBLIC PROC [in: IO.STREAM, minPolyRing: AC.Structure] RETURNS [out: AlgebraicNumber] ~ { conjugatesDefinition: AlgebraicNumber _ ReadAlgebraicNumber[in, minPolyRing]; isolatingInterval: RI.RatInterval _ RI.ReadRatInterval[in]; out _ NEW[RealAlgebraicNumberRec _ [conjugatesDefinition: conjugatesDefinition, isolatingInterval: isolatingInterval] ]; -- groundField must be real }; AlgebraicNumberFromRope: PUBLIC PROC [in: Rope.ROPE, minPolyVariable: VARS.VariableSeq _ defaultMinPolyVariable] RETURNS [out: AlgebraicNumber] = { out _ ReadAlgebraicNumber[IO.RIS[in], minPolyVariable]; }; Κ0˜Jšœ™J™3J™šΟk ˜ Jšœ˜Icodešœ˜Jšœ˜Jšœ ˜ Jšœ ˜ Jšœ˜—J˜head2šœœ˜#Jšœ˜Jšœ˜J˜—Jš œœœœœ!˜Thead™Jš œœœœœ˜D—šœ ™ šΟnœœœœœœœœœœ˜ΊJšœœœ˜@Jšœœ˜/Kšœ$œ.œœ"˜ƒšœœ˜Kšœ0œœ˜=šœœ˜"Jšœ˜Jšœ$˜$Jšœ˜—J˜—šœ˜Kšœœ!œœ˜2Kšœ'œœ˜4Jšœœœœ˜&šœœ˜"Jšœ˜Jšœ%˜%Jšœœ˜ Jšœ$˜$Jšœ˜—J˜—J˜——™šžœœœœœœ œ™nJšœœœ,Οc"™xJšœœX™aK™J™—šžœœœœœœ œ™rJšœM™MJšœœœ™;JšœœpŸ™”K™J˜—š žœœœ œœ'œ™“Jšœœœ™7Jšœ™J™—š žœœœœ œ˜UJšœ[˜[Jšœ œœ+˜TJ˜J˜—š žœœœœœ˜KJšœ(˜(Jšœ˜J˜—J˜—Jšœ˜—…—x Θ