RosettaCodeData/Task/Prime-decomposition/Simula/prime-decomposition.simula

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;