RosettaCodeData/Task/Modular-exponentiation/Refal/modular-exponentiation.refal
2026-04-30 12:34:36 -04:00

31 lines
970 B
Text

$ENTRY Go {
, '2988348162058574136915891421498819466320163312926952423791023078876139': e.A
, '2351399303373464486466122544523690094744975233415544072992656881240319': e.B
= <Prout <Symb <ModPow
(<Numb e.A>) (<Numb e.B>) (<Pow (10) (40)>)>>>;
};
ModPow {
(e.B) (e.P) (e.M) = <ModPow (e.B) (e.P) (e.M) (1)>;
(e.B) (0) (e.M) (e.R) = e.R;
(e.B) (e.P) (e.M) (e.R),
<Divmod (e.P) 2>: (e.P2) s.S,
<Mod (<Mul (e.B) e.B>) e.M>: e.B2,
s.S: {
0 = <ModPow (e.B2) (e.P2) (e.M) (e.R)>;
1, <Mod (<Mul (e.R) e.B>) e.M>: e.R2 =
<ModPow (e.B2) (e.P2) (e.M) (e.R2)>;
};
};
Pow {
(e.B) (e.P) = <Pow (e.B) (e.P) (1)>;
(e.B) (0) (e.R) = e.R;
(e.B) (e.P) (e.R),
<Mul (e.B) e.B>: e.B2,
<Divmod (e.P) 2>: (e.P2) s.S,
s.S: {
0 = <Pow (e.B2) (e.P2) (e.R)>;
1 = <Pow (e.B2) (e.P2) (<Mul (e.B) e.R>)>;
};
};