Skip to content

Instantly share code, notes, and snippets.

@ityonemo
Created May 29, 2017 02:21
Show Gist options
  • Save ityonemo/c74ebd8a968e5fc7826762bf6a442e6a to your computer and use it in GitHub Desktop.
Save ityonemo/c74ebd8a968e5fc7826762bf6a442e6a to your computer and use it in GitHub Desktop.
trivial and possibly inefficient prime field implementation
#primefield.jl
type PrimeField{P}
intval::UInt64
function PrimeField(n)
new(n % P)
end
end
Base.:+{P}(x::PrimeField{P}, y::PrimeField{P}) = PrimeField{P}(x.intval + y.intval)
Base.:+{P}(x::PrimeField{P}, y::Int64) = PrimeField{P}(x.intval + y)
Base.:+{P}(x::Int64, y::PrimeField{P}) = PrimeField{P}(x + y.intval)
Base.:-{P}(x::PrimeField{P}) = PrimeField{P}(P - x.intval)
Base.:-{P}(x::PrimeField{P}, y::PrimeField{P}) = PrimeField{P}(P + x.intval - y.intval)
Base.:-{P}(x::PrimeField{P}, y::Int64) = PrimeField{P}(P + x.intval - (y % P))
Base.:-{P}(x::Int64, y::PrimeField{P}) = PrimeField{P}(P + (x % P) - y.intval)
Base.:*{P}(x::PrimeField{P}, y::PrimeField{P}) = PrimeField{P}(x.intval * y.intval) #may not work if P > sqrt(max(UInt64))
Base.:*{P}(x::Int64, y::PrimeField{P}) = x >= 0 ? PrimeField{P}(x * y.intval) : -(PrimeField{P}(-x * y.intval))
Base.:/{P}(x::PrimeField{P}) = x^(P-2)
Base.:/{P}(x::PrimeField{P},y::PrimeField{P}) = x * (/(y))
Base.one{P}(::Type{PrimeField{P}}) = PrimeField{P}(one(UInt64))
Base.zero{P}(::Type{PrimeField{P}}) = PrimeField{P}(zero(UInt64))
Base.convert{P}(::Type{PrimeField{P}}, n::Int64) = PrimeField{P}(UInt64(n))
Base.promote_rule{P}(::Type{Int64}, ::Type{PrimeField{P}}) = PrimeField{P}
Base.:(==){P}(a::PrimeField{P}, b::PrimeField{P}) = a.intval == b.intval
"""
PF = PrimeField{15733}
PrimeField{15733}
julia> EC = EllipticCurve{1,3}
y^2 = x^3 + 1x + 3
julia> p1 = EllipticPoint{PF, EC}(PF(6),PF(15))
EllipticPoint{PrimeField{15733},EllipticCurve{1,3}}(PrimeField{15733}(0x0000000000000006),PrimeField{15733}(0x000000000000000f))
julia> p2 = EllipticPoint{PF, EC}(PF(2),PF(3103))
EllipticPoint{PrimeField{15733},EllipticCurve{1,3}}(PrimeField{15733}(0x0000000000000002),PrimeField{15733}(0x0000000000000c1f))
julia> p3 = EllipticPoint{PF, EC}(PF(8),PF(1267))
EllipticPoint{PrimeField{15733},EllipticCurve{1,3}}(PrimeField{15733}(0x0000000000000008),PrimeField{15733}(0x00000000000004f3))
julia> p1x2 = p1 + p1
EllipticPoint{PrimeField{15733},EllipticCurve{1,3}}(PrimeField{15733}(0x00000000000009c5),PrimeField{15733}(0x000000000000243b))
julia> p1 + p1 + p1 + p1
EllipticPoint{PrimeField{15733},EllipticCurve{1,3}}(PrimeField{15733}(0x00000000000029fb),PrimeField{15733}(0x000000000000134c))
julia> p1x2 + p1x2
EllipticPoint{PrimeField{15733},EllipticCurve{1,3}}(PrimeField{15733}(0x00000000000029fb),PrimeField{15733}(0x000000000000134c))
julia> 2 * p1x2
EllipticPoint{PrimeField{15733},EllipticCurve{1,3}}(PrimeField{15733}(0x00000000000029fb),PrimeField{15733}(0x000000000000134c))
julia> (p1 + p2) + p3
EllipticPoint{PrimeField{15733},EllipticCurve{1,3}}(PrimeField{15733}(0x0000000000003b22),PrimeField{15733}(0x0000000000003498))
julia> p1 + (p2 + p3)
EllipticPoint{PrimeField{15733},EllipticCurve{1,3}}(PrimeField{15733}(0x0000000000003b22),PrimeField{15733}(0x0000000000003498))
"""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment