我正在尝试在Julia中创建表示椭圆曲线上点的复合类型。 如果满足y ^ 2 == x ^ 3 + a * x + b或x和y都等于零,则点有效。请注意,后一种情况表示无穷远处的点。
我想出了下面的代码,但无法弄清楚如何计算无穷远点。
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
答案 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)
,但是我想从您的代码中,您并不关心抛出的异常的类型,只要将异常抛出到无效数据上即可。
它可以解决您的问题吗?