25 lines
1.2 KiB
Plaintext
25 lines
1.2 KiB
Plaintext
# allow for large integers in Algol 68G #
|
|
PR precision 200 PR
|
|
|
|
# modular integer type #
|
|
MODE MODULARINT = STRUCT( LONG LONG INT v, INT modulus );
|
|
|
|
# modular integer + and * operators #
|
|
# where both operands are modular, they must have the same modulus #
|
|
OP + = ( MODULARINT a, b )MODULARINT: ( ( v OF a + v OF b ) MOD modulus OF a, modulus OF a );
|
|
OP + = ( MODULARINT a, INT b )MODULARINT: ( ( v OF a + b ) MOD modulus OF a, modulus OF a );
|
|
OP * = ( MODULARINT a, b )MODULARINT: ( ( v OF a * v OF b ) MOD modulus OF a, modulus OF a );
|
|
OP ** = ( MODULARINT a, INT b )MODULARINT: ( ( v OF a ** b ) MOD modulus OF a, modulus OF a );
|
|
|
|
# f(x) function - can be applied to either LONG LONG INT or MODULARINT values #
|
|
# the result is always a LONG LONG INT #
|
|
PROC f = ( UNION( LONG LONG INT, MODULARINT ) x )LONG LONG INT:
|
|
CASE x
|
|
IN ( LONG LONG INT ix ): ( ix**100 + ix + 1 )
|
|
, ( MODULARINT mx ): v OF ( mx**100 + mx + 1 )
|
|
ESAC;
|
|
|
|
print( ( whole( f( MODULARINT( 10, 13 ) ), 0 ), newline ) );
|
|
# additional test to avoid a warning that the * operator isn't used... #
|
|
print( ( whole( f( MODULARINT( 10, 13 ) * MODULARINT( 10, 13 ) ), 0 ), newline ) )
|