PROGRAM RATIONAL_ARITH ! ! for rosettacode.org ! TYPE RATIONAL=(NUM,DEN) DIM SUM:RATIONAL,ONE:RATIONAL,KF:RATIONAL DIM A:RATIONAL,B:RATIONAL PROCEDURE ABS(A.->A.) A.NUM=ABS(A.NUM) END PROCEDURE PROCEDURE NEG(A.->A.) A.NUM=-A.NUM END PROCEDURE PROCEDURE ADD(A.,B.->A.) LOCAL T T=A.DEN*B.DEN A.NUM=A.NUM*B.DEN+B.NUM*A.DEN A.DEN=T END PROCEDURE PROCEDURE SUB(A.,B.->A.) LOCAL T T=A.DEN*B.DEN A.NUM=A.NUM*B.DEN-B.NUM*A.DEN A.DEN=T END PROCEDURE PROCEDURE MULT(A.,B.->A.) A.NUM*=B.NUM A.DEN*=B.DEN END PROCEDURE PROCEDURE DIVIDE(A.,B.->A.) A.NUM*=B.DEN A.DEN*=B.NUM END PROCEDURE PROCEDURE EQ(A.,B.->RES%) RES%=A.NUM*B.DEN=B.NUM*A.DEN END PROCEDURE PROCEDURE LT(A.,B.->RES%) RES%=A.NUM*B.DENRES%) RES%=A.NUM*B.DEN>B.NUM*A.DEN END PROCEDURE PROCEDURE NE(A.,B.->RES%) RES%=A.NUM*B.DEN<>B.NUM*A.DEN END PROCEDURE PROCEDURE LE(A.,B.->RES%) RES%=A.NUM*B.DEN<=B.NUM*A.DEN END PROCEDURE PROCEDURE GE(A.,B.->RES%) RES%=A.NUM*B.DEN>=B.NUM*A.DEN END PROCEDURE PROCEDURE NORMALIZE(A.->A.) LOCAL A,B,T A=A.NUM B=A.DEN WHILE B<>0 DO T=A A=B B=T-B*INT(T/B) END WHILE A.NUM/=A A.DEN/=A IF A.DEN<0 THEN A.NUM*=-1 A.DEN*=-1 END IF END PROCEDURE BEGIN ONE.NUM=1 ONE.DEN=1 FOR N=2 TO 2^19-1 DO SUM.NUM=1 SUM.DEN=N FOR K=2 TO SQR(N) DO IF N=K*INT(N/K) THEN KF.NUM=1 KF.DEN=K ADD(SUM.,KF.->SUM.) NORMALIZE(SUM.->SUM.) KF.DEN=INT(N/K) ADD(SUM.,KF.->SUM.) NORMALIZE(SUM.->SUM.) END IF END FOR EQ(SUM.,ONE.->RES%) IF RES% THEN PRINT(N;" is perfect") END IF END FOR END PROGRAM