割线的椭圆曲线

时间:2018-11-10 07:28:38

标签: c++ math geometry elliptic-curve

当前,我正在尝试解决以下情况的问题:

worker_threads

简单地说,我真正需要做的是用两个点P和Q绘制图形的割线,并尝试检查是否存在任何交点。如果存在,请获取该点的x和y。我很难解决这个问题。有人可以给我一些提示吗?

1 个答案:

答案 0 :(得分:0)

我将其均匀化为x^3 + axz^2 + bz^3 - y^2z = 0并指向P = [Px : Py : Pz]Q = [Qx : Qy : Qz]。那么任何点R =λP+μQ((λ,μ)≠(0,0)都位于P和Q所跨越的线上。如果要避免均质化,则需要λ+μ= 1,但这通常会导致我宁愿避免使用,直到最后。

将R的所得坐标插入到椭圆曲线的均质方程中,您将获得λ和μ的齐次立方方程,即类似

αλ³ + βλ²μ + γλμ² + δμ³ = 0

,其中α,β,γ和δ取决于您的a,b,P,Q。对于μ= 0,您将获得一个坐标向量,该向量是P的倍数,并且当齐次坐标标识倍数时,您将获得点P本身,就在曲线上。因此,μ= 0必须满足该方程式,因此即使在计算前您也知道α= 0。同样,λ= 0表示Q,因此如果该点位于曲线上,则δ= 0。你留下了

(βλ + γμ)λμ = 0

后两个因素编码了我刚才提到的两个已知交点。括号是第三个交点,即您需要的那个。现在,只需选择λ=γ和μ=-β即可得到交点第三点的简单表达式。

如果要在最后进行去均质,只需将所得齐次坐标矢量的前两个坐标除以第三个坐标即可。

如果我不搞乱自己的sympy计算,那么您有

β = 3*Px^2*Qx + 2*Px*Pz*Qz*a - Py^2*Qz - 2*Py*Pz*Qy + Pz^2*Qx*a + 3*Pz^2*Qz*b
γ = 3*Px*Qx^2 + 2*Pz*Qx*Qz*a - Pz*Qy^2 - 2*Py*Qy*Qz + Px*Qz^2*a + 3*Pz*Qz^2*b

在P和Q中应该是非常对称的。因此从本质上讲,您只需要一个函数,然后得到β= f(P,Q)和γ= f(Q,P)。

在C ++中,并且已实现整个均质化/去均质化:

inline double f(double Px, double Py, double Qx, double Qy, double a, double b) {
  return 3*Px*Px*Qx + 2*Px*a - Py*Py - 2*Py*Qy + Qx*a + 3*b;
}

std::pair<double, double> third_intersection(double Px, double Py, double Qx, double Qy, double a, double b) {
  double beta = f(Px, Py, Qx, Qy, a, b);
  double gamma = f(Qx, Qy, Px, Py, a, b);
  double denominator = gamma - beta;  // Might be zero if line PQ is an asymptote!
  double x = (gamma*Px - beta*Qx) / denominator;
  double y = (gamma*Py - beta*Qy) / denominator;
  return std::make_pair(x, y);
}