本文最后更新于:2023年1月11日 下午
奇异椭圆定义
从代数上来说,如果椭圆曲线方程 y 2 = x 3 + A x + B y^2=x^3+Ax+B y 2 = x 3 + A x + B 的判别式 Δ = 4 A 3 + 27 B 2 = 0 \Delta=4A^3+27B^2=0 Δ = 4 A 3 + 2 7 B 2 = 0 ,那么该椭圆就是奇异的。从几何图像上来看,就是椭圆曲线关于 x x x 轴的交点有重根,这是因为 ( ( r 1 − r 2 ) ( r 1 − r 3 ) ( r 2 − r 3 ) ) 2 = − Δ ((r_1-r_2)(r_1-r_3)(r_2-r_3))^2=-\Delta ( ( r 1 − r 2 ) ( r 1 − r 3 ) ( r 2 − r 3 ) ) 2 = − Δ ,其中 r 1 , r 2 , r 3 r_1,r_2,r_3 r 1 , r 2 , r 3 为交点横坐标。
两种奇异椭圆曲线
接下来研究两种简单的奇异椭圆,本文主要就是对它们与其他域的同态进行讨论。
1.y^2=x^3
针对这种椭圆曲线,是构造同态:
E ( K ) → K , ( x , y ) ↦ x y E(K)\rightarrow K , \quad (x, y) \mapsto \frac{x}{y}
E ( K ) → K , ( x , y ) ↦ y x
两边都为域K K K 中的加群。
可以证明,如果 ( x 1 , y 1 ) + ( x 2 , y 2 ) = ( x 3 , y 3 ) (x_1,y_1)+(x_2,y_2)=(x_3,y_3) ( x 1 , y 1 ) + ( x 2 , y 2 ) = ( x 3 , y 3 ) ,就有 t 1 + t 2 = t 3 t_1+t_2=t_3 t 1 + t 2 = t 3 ,t i = x i / y i t_i=x_i/y_i t i = x i / y i 。
2.y^2=x^2(x+a)
这种情况的同态稍微有点复杂。记 α 2 = a \alpha ^2=a α 2 = a ,考虑同态:
ψ : ( x , y ) ↦ y + α x y − α x \psi :(x,y) \mapsto \frac{y+\alpha x}{y-\alpha x}
ψ : ( x , y ) ↦ y − α x y + α x
1. 如果 α ∈ K \alpha \in K α ∈ K ,那么 ψ \psi ψ 给出了加法群到乘法群F p F_p F p 的同态。
2. 如果 α ∉ K \alpha \notin K α ∈ / K ,那么就有 E ( K ) ≃ { u + α v ∣ u , v ∈ K , u 2 − a v 2 = 1 } E(K) \simeq \{u+\alpha v|u,v\in K,u^2-av^2=1 \} E ( K ) ≃ { u + α v ∣ u , v ∈ K , u 2 − a v 2 = 1 } 。同样是加法群到乘法群的同态。后者与Q [ 2 ] Q[\sqrt2] Q [ 2 ] 很像。
题目
首先题目给出了一种运算,显然和椭圆曲线有关:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 p = 193387944202565886198256260591909756041 i = lambda x: pow (x, p-2 , p)def add (A, B ): (u, v), (w, x) = A, B assert u != w or v == x if u == w: m = (3 *u*w + 4 *u + 1 ) * i(v+x) else : m = (x-v) * i(w-u) y = m*m - u - w - 2 z = m*(u-y) - v return y % p, z % pdef mul (t, A, B=0 ): if not t: return B return mul(t//2 , add(A,A), B if not t&1 else add(B,A) if B else A)
注意到这里计算斜率的方式有一点不一样,在计算 2 P 2P 2 P 时,一般情况下,由 y 2 = x 3 + A x + B y^2=x^3+Ax+B y 2 = x 3 + A x + B 可知:d y d x = 3 x 2 + A 2 y \frac{dy}{dx}=\frac{3x^2+A}{2y} d x d y = 2 y 3 x 2 + A ,而这里却是 d y d x = 3 x 2 + 4 x + 1 2 y \frac{dy}{dx}=\frac{3x^2+4x+1}{2y} d x d y = 2 y 3 x 2 + 4 x + 1 。分离变量积分可得 y 2 = x 3 + 2 x 2 + x + C y^2=x^3+2x^2+x+C y 2 = x 3 + 2 x 2 + x + C 。
然后题目用了一个随机数x x x ,和坐标 P ( 4 , 10 ) P(4,10) P ( 4 , 1 0 ) ,给出了 m u l ( x , P ) mul(x, P) m u l ( x , P ) 的结果Q Q Q ,要我们求x。
这里可以将 P P P 代入我们得到的方程,可得C = 0 C=0 C = 0 。为了能使方程 y 2 = x 3 + 2 x 2 + x y^2=x^3+2x^2+x y 2 = x 3 + 2 x 2 + x 变为 y 2 = x 2 ( x + a ) y^2=x^2(x+a) y 2 = x 2 ( x + a ) 的形式,就让 x = x − 1 x=x-1 x = x − 1 。同时P,Q也要做相应变换。
最后利用上述同态的方法,先求出 α \alpha α ,然后将 P , Q P,Q P , Q 分别映射为u = y P + α x P y P − α x P u=\frac{y_P+\alpha x_P}{y_P-\alpha x_P} u = y P − α x P y P + α x P 和 v = y Q + α x Q y Q − α x Q v=\frac{y_Q+\alpha x_Q}{y_Q-\alpha x_Q} v = y Q − α x Q y Q + α x Q ,使用离散对数求解即可。
值得注意的是,离散对数的解不只一个,需要计算 u u u 的阶随后逐一检验。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 p = 193387944202565886198256260591909756041 P.<x> = GF(p)[] f = x^3 + 2 *x^2 + x P = (4 , 10 ) Q = (65639504587209705872811542111125696405 , 125330437930804525313353306745824609665 ) P_ = (P[0 ] +1 , P[1 ]) Q_ = (Q[0 ] +1 , Q[1 ]) t = GF(p)(193387944202565886198256260591909756040 ).square_root() u = (P_[1 ] + t*P_[0 ])/(P_[1 ] - t*P_[0 ]) % p v = (Q_[1 ] + t*Q_[0 ])/(Q_[1 ] - t*Q_[0 ]) % pprint (v.log(u)) d = multiplicative_order(u)