如何在Julia的复合类型中指定条件?

时间:2018-10-12 14:55:33

标签: julia elliptic-curve

我正在尝试在Julia中创建表示椭圆曲线上点的复合类型。 如果满足y ^ 2 == x ^ 3 + a * x + b或x和y都等于零,则点有效。请注意,后一种情况表示无穷远处的点。

我想出了下面的代码,但无法弄清楚如何计算无穷远点。

  • 有没有办法处理struct中的不同异常?
  • 异常可以简单地返回有效类型而不是错误吗?例如如果x ==没什么&& y ==没什么,那么Point(nothing,nothing,a,b)

IntOrNothing = Union{Int,Nothing} struct Point x::IntOrNothing y::IntOrNothing a::Int b::Int Point(x,y,a,b) = x == nothing || y == nothing || y^2 != x^3 + a*x + b ? error("Point is not on curve") : new(x,y,a,b) end

1 个答案:

答案 0 :(得分:3)

我将为Point定义两个内部构造函数,如下所示:

IntOrNothing = Union{Int,Nothing}
struct Point
    x::IntOrNothing
    y::IntOrNothing
    a::Int
    b::Int
    Point(x::Nothing,y::Nothing,a,b) = new(x,y,a,b)
    Point(x,y,a,b) = y^2 != x^3 + a*x + b ? error("Point is not on curve") : new(x,y,a,b)
end

因为我认为这是最易读的内容。

请注意,如果您调用MethodError,则会得到Point(nothing,2,1,3),但是我想从您的代码中,您并不关心抛出的异常的类型,只要将异常抛出到无效数据上即可。

它可以解决您的问题吗?