Modular exponentiation: Difference between revisions
Content added Content deleted
m (added whitespace.) |
(factorised out function exp_factor to improve structure) |
||
Line 466: | Line 466: | ||
Mod > 0 -> |
Mod > 0 -> |
||
binary_exp_mod(Base,Exp,Mod). |
binary_exp_mod(Base,Exp,Mod). |
||
⚫ | |||
⚫ | |||
binary_exp(_,0,Result) -> |
|||
⚫ | |||
binary_exp(Base,Exponent,Acc) -> |
|||
binary_exp(Base,Exponent,Acc,Exponent band 1). |
|||
binary_exp(Base,Exponent,Acc,0) -> |
|||
binary_exp(Base*Base,Exponent bsr 1,Acc); |
|||
binary_exp(Base,Exponent,Acc,1) -> |
|||
binary_exp(Base*Base,Exponent bsr 1,Base*Acc). |
|||
binary_exp_mod(Base,Exponent,Mod) -> |
binary_exp_mod(Base,Exponent,Mod) -> |
||
binary_exp_mod(Base,Exponent,Mod,1). |
binary_exp_mod(Base rem Mod,Exponent,Mod,1). |
||
binary_exp_mod(_,0,_,Result) -> |
binary_exp_mod(_,0,_,Result) -> |
||
Result; |
Result; |
||
binary_exp_mod(Base,Exponent,Mod,Acc) -> |
binary_exp_mod(Base,Exponent,Mod,Acc) -> |
||
binary_exp_mod(Base |
binary_exp_mod((Base*Base) rem Mod, |
||
Exponent bsr 1,Mod,(Acc * exp_factor(Base,Exponent))rem Mod). |
|||
exp_factor(_,0) -> |
|||
binary_exp_mod(Base,Exponent,Mod,Acc,0) -> |
|||
⚫ | |||
binary_exp_mod((Base*Base) rem Mod,Exponent bsr 1,Mod,Acc); |
|||
exp_factor(Base,1) -> |
|||
Base; |
|||
binary_exp_mod((Base*Base) rem Mod,Exponent bsr 1,Mod,(Acc*Base) rem Mod). |
|||
⚫ | |||
⚫ | |||
test() -> |
test() -> |