-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmodBigint.nim
38 lines (28 loc) · 921 Bytes
/
modBigint.nim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import pkg/[
bigints
]
template modBigint*(m: untyped) =
const MOD* {.inject.} = m.initBigInt
const Zero* {.inject.} = 0.initBigInt
const One* {.inject.} = 1.initBigInt
const Two* {.inject.} = 2.initBigInt
type
mint* {.inject.} = distinct BigInt
proc `+`*(x, y: mint): mint {.inline.} =
(((x.BigInt mod MOD) + (y.BigInt mod MOD) + MOD) mod MOD).mint
proc `-`*(x, y: mint): mint {.inline.} =
(((x.BigInt mod MOD) - (y.BigInt mod MOD) + MOD) mod MOD).mint
proc `*`*(x, y: mint): mint {.inline.} =
((x.BigInt mod MOD) * (y.BigInt mod MOD) mod MOD).mint
proc `**`*(x, y: mint): mint =
result = One.mint
var x = x
var y = y.BigInt
while y > Zero:
if (y and One) != Zero: result = result * x
x = x * x
y = y shr 1
proc `/`*(x, y: mint): mint =
x * (y ** ((MOD - Two).mint))
proc initMint*(n: int): mint {.inline.} =
initBigInt(n).mint