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. AlgebraicNumbersImpl.mesa Last Edited by: Arnon, July 19, 1985 2:54:46 pm PDT Errors Constructors IO 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 }; ΚO˜Jšœ™J™3J™šΟk ˜ Jšœ˜Icodešœ˜Jšœ˜J˜Jšœ ˜ Jšœ ˜ Jšœ˜—J˜head2šœœ˜#Jšœ!˜(Jšœ˜J˜—Jš œœœœ œœ ˜ahead™Jš œœœœœ˜DJš œ œœœœ˜=—šœ ™ šΟnœœœœœœœœœœ˜ΊJšœœœ˜@Jšœœ˜/Kšœ&œ0œœ"˜‡šœœ˜Kšœ0œœ˜=šœœ˜"Jšœ˜Jšœ$˜$Jšœ˜—J˜—šœ˜Kšœœ!œœ˜2Kšœ'œœ˜4Jšœœœœ˜&šœœ˜"Jšœ˜Jšœ%˜%Jšœœ˜ Jšœ$˜$Jšœ˜—J˜—J˜——™šžœœœœœœœœœ˜‚Jšœœœ,Οc"˜xJšœœœ˜@Jšœœ˜/Jšœ œ˜Kšœœ œœ"˜Lšœœ˜Kšœ0œœ˜=šœœ˜"Jšœ˜Jšœ$˜$Jšœ˜—J˜—šœ˜Jšœœ ˜"Jšœ˜Jšœ˜Jšœœ˜2Jšœ˜Jšœœ˜+šœœ˜"Jšœ˜Jšœ%˜%Jšœœ˜ Jšœ$˜$Jšœ˜—J˜—K˜J˜—šžœœœœœœ œ™rJšœM™MJšœœœ™;JšœœpŸ™”K™J˜—šžœœœ œœœœœ˜†Jšœœœ˜9Jšœ˜J™—š žœœœœ œ˜UJšœM˜MJšœ œœ+˜TJ˜J˜—š žœœœœœ˜KJšœ(˜(Jšœ˜J˜—J˜—Jšœ˜—…— ˆΩ