EXTERNAL CLASS BIGNUM; BIGNUM BEGIN CLASS TEXTLIST; BEGIN CLASS TEXTARRAY(N); INTEGER N; BEGIN TEXT ARRAY DATA(1:N); END TEXTARRAY; PROCEDURE EXPAND(N); INTEGER N; BEGIN REF(TEXTARRAY) NEWARR; INTEGER I; NEWARR :- NEW TEXTARRAY(N); FOR I := 1 STEP 1 UNTIL SIZE DO BEGIN NEWARR.DATA(I) :- ARR.DATA(I); END; ARR :- NEWARR; END EXPAND; PROCEDURE APPEND(T); TEXT T; BEGIN IF SIZE = ARR.N THEN EXPAND(2*ARR.N); SIZE := SIZE+1; ARR.DATA(SIZE) :- T; END EXPAND; TEXT PROCEDURE GET(I); INTEGER I; GET :- ARR.DATA(I); REF(TEXTARRAY) ARR; INTEGER SIZE; EXPAND(20); END TEXTLIST; REF(TEXTLIST) PROCEDURE PRIME_FACTORS(N); TEXT N; BEGIN REF(TEXTLIST) FACTORS; REF(DIVMOD) DM; TEXT P; FACTORS :- NEW TEXTLIST; IF TCMP(N, "1") < 0 THEN GOTO RETURN; P :- "2"; FOR DM :- TDIVMOD(N,P) WHILE TISZERO(DM.MOD) DO BEGIN N :- DM.DIV; FACTORS.APPEND(P); END; P :- "3"; WHILE TCMP(N,"1") > 0 AND THEN TCMP(TMUL(P,P),N) <= 0 DO BEGIN FOR DM :- TDIVMOD(N, P) WHILE TISZERO(DM.MOD) DO BEGIN N :- DM.DIV; FACTORS.APPEND(P); END; P :- TADD(P,"2"); END; IF TCMP(N,"1") > 0 THEN FACTORS.APPEND(N); RETURN: PRIME_FACTORS :- FACTORS; END PRIME_FACTORS; REF(TEXTLIST) FACTORS; TEXT INP; INTEGER I; FOR INP :- "536870911", "6768768", "1957", "64865899369365843" DO BEGIN FACTORS :- PRIME_FACTORS(INP); OUTTEXT("PRIME FACTORS OF "); OUTTEXT(INP); OUTTEXT(" => ["); FOR I := 1 STEP 1 UNTIL FACTORS.SIZE DO BEGIN IF I > 1 THEN OUTTEXT(", "); OUTTEXT(FACTORS.GET(I)); END; OUTTEXT("]"); OUTIMAGE; END; END;