|
3 | 3 | module ModInts
|
4 | 4 | export ModInt
|
5 | 5 |
|
6 |
| -import Base: +, -, * |
| 6 | +import Base: +, -, *, /, inv |
7 | 7 |
|
8 | 8 | immutable ModInt{n} <: Integer
|
9 | 9 | k::Int
|
10 | 10 | ModInt(k) = new(mod(k,n))
|
11 | 11 | end
|
12 | 12 |
|
13 |
| --{n}(a::ModInt{n}) = ModInt{n}(-a.k) |
| 13 | +Base.show{n}(io::IO, k::ModInt{n}) = |
| 14 | + print(io, get(io, :compact, false) ? k.k : "$(k.k) mod $n") |
| 15 | + |
14 | 16 | +{n}(a::ModInt{n}, b::ModInt{n}) = ModInt{n}(a.k+b.k)
|
15 | 17 | -{n}(a::ModInt{n}, b::ModInt{n}) = ModInt{n}(a.k-b.k)
|
16 | 18 | *{n}(a::ModInt{n}, b::ModInt{n}) = ModInt{n}(a.k*b.k)
|
| 19 | +-{n}(a::ModInt{n}) = ModInt{n}(-a.k) |
17 | 20 |
|
18 |
| -Base.convert{n}(::Type{ModInt{n}}, i::Int) = ModInt{n}(i) |
19 |
| -Base.promote_rule{n}(::Type{ModInt{n}}, ::Type{Int}) = ModInt{n} |
20 |
| - |
21 |
| -Base.show{n}(io::IO, k::ModInt{n}) = print(io, "$(k.k) mod $n") |
22 |
| -Base.showcompact(io::IO, k::ModInt) = print(io, k.k) |
| 21 | +inv{n}(a::ModInt{n}) = ModInt{n}(invmod(a.k, n)) |
| 22 | +/{n}(a::ModInt{n}, b::ModInt{n}) = a*inv(b) # broaden for non-coprime? |
23 | 23 |
|
24 |
| -Base.inv{n}(a::ModInt{n}) = ModInt{n}(invmod(a.k, n)) |
| 24 | +Base.promote_rule{n}(::Type{ModInt{n}}, ::Type{Int}) = ModInt{n} |
| 25 | +Base.convert{n}(::Type{ModInt{n}}, i::Int) = ModInt{n}(i) |
25 | 26 |
|
26 | 27 | end # module
|
0 commit comments