81 lines
2.1 KiB
Plaintext
81 lines
2.1 KiB
Plaintext
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(20);
|
|
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;
|