RosettaCodeData/Task/Curzon-numbers/ALGOL-68/curzon-numbers.alg
2024-11-04 21:53:44 -08:00

46 lines
1.4 KiB
Text

BEGIN # find some generalised Curzon numbers - translation of the C++ sample #
PROC modpow = ( LONG INT rqd base, rqd exp, mod )LONG INT:
IF mod = 1
THEN 0
ELSE
LONG INT result := 1;
LONG INT base := rqd base MOD mod;
LONG INT ex := rqd exp;
WHILE ex > 0 DO
IF ODD ex THEN
result TIMESAB base MODAB mod
FI;
base TIMESAB base MODAB mod;
ex OVERAB 2
OD;
result
FI # modpow # ;
PROC is curzon = ( LONG INT n, k )BOOL:
BEGIN
LONG INT m = k * n + 1;
modpow( k, n, m ) + 1 = m
END # is curzon # ;
FOR k FROM 2 BY 2 TO 10 DO
print( ( "Curzon numbers with base ", whole( k, 0 ), ":", newline ) );
INT count := 0, n := 0;
WHILE n +:= 1;
count < 50
DO
IF is curzon( n, k ) THEN
print( ( whole( n, -4 )
, IF ( count +:= 1 ) MOD 10 = 0 THEN newline ELSE " " FI
)
)
FI
OD;
WHILE IF is curzon( n, k ) THEN count +:= 1 FI;
count < 1000
DO
n +:= 1
OD;
print( ( "1000th Curzon number with base ", whole( k, 0 ), ": ", whole( n, 0 ) ) );
print( ( newline, newline ) )
OD
END