RosettaCodeData/Task/Modular-exponentiation/Nim/modular-exponentiation.nim

20 lines
474 B
Nim
Raw Permalink Normal View History

2023-07-01 11:58:00 -04:00
import bigints
proc powmod(b, e, m: BigInt): BigInt =
2026-02-01 16:33:20 -08:00
assert e >= 0'bi
2023-07-01 11:58:00 -04:00
var e = e
var b = b
2026-02-01 16:33:20 -08:00
let t = 2'bi
2023-07-01 11:58:00 -04:00
result = initBigInt(1)
2026-02-01 16:33:20 -08:00
while e > 0'bi:
if e mod t == 1'bi:
2023-07-01 11:58:00 -04:00
result = (result * b) mod m
2026-02-01 16:33:20 -08:00
e = e div t
2023-07-01 11:58:00 -04:00
b = (b.pow 2) mod m
var
a = initBigInt("2988348162058574136915891421498819466320163312926952423791023078876139")
b = initBigInt("2351399303373464486466122544523690094744975233415544072992656881240319")
2026-02-01 16:33:20 -08:00
echo powmod(a, b, 10'bi.pow 40)