Homeに戻る  一覧に戻る 

Factoring with Elliptic Curves Method


[2001.03.22]楕円曲線を使った素因数分解


1.楕円曲線とは

楕円曲線は、3次または4次の代数方程式
  y2=x3+ax2+bx+c  (Weierstrassの標準形) ---- (1)
または
  y2=ax3+bx2+cx+d (ただし、a≠0) ---- (2)
または
  y2=ax4+bx3+cx2+dx+e (ただし、a≠0) ---- (3)
で定義される曲線である。ここでx,yは有理数体Q,複素数体C,代数体などの元として考える。

Weierstrassの標準形(1)では、右辺はxの3次式でx3の係数は1となっている。
(2)では、x3の係数はaであるが、双有理変換
    X=ax,
    Y=a2y
つまり、
    x=X/a,
    y=Y/a2
によって、Weierstrassの標準形
    Y2=X3+a3bX2+a3cX+a3d
に変形できる。
(3)のように、右辺がxの4次式の場合でも、ある双有理変換を通して、上記の標準形に帰着できる。

以下では、右辺が3次式のWeierstrass標準形の楕円曲線のみを扱う。
(1)の右辺の3次式の判別式は
    D=-4a3c+a2b2+18abc-4b3-27c2
である。
D≠0の場合、この曲線を非特異楕円曲線と呼ぶが、これは、種数1の代数曲線と同値である。
D=0の場合は、特異楕円曲線と呼ぶ。
ここで、種数とは、x,yを複素数で考えた場合に、これらの曲線(浮輪のような閉曲面になる)の穴の数である。
楕円曲線上の点(x,y)について、x,yが共に有理整数であるものを整点と呼び、x,yが共に有理数であるものを有理点と呼ぶ。Diophantus方程式(1)の(有理)整数解や有理数解を求めることは、その代数曲線上の整点や有理点を求めることと同値である。

2.楕円曲線上の点に対する-,+,*演算

楕円曲線C上の点P,Qに対して、同じ曲線C上の点-P,P+Q,P*Qを次のように定義することができる。
定義より直ちに、楕円曲線C上の任意の点P,Q,Rに対して、
  P+Q=Q+P,
  P*Q=Q*P,
  (P+Q)+R=P+(Q+R),
  (P*Q)*R=P*(Q*R)
が成立する。
また、(y軸方向の)無限遠点Oも楕円曲線C上の点と考えると、
  O+P=P+O=P,
  P+(-P)=(-P)+P=O
が成立する。

楕円曲線y2=x3+ax2+bx+c上の点P(x1,y1),Q(x2,y2)について、(P*Q)(x3,y3)を具体的に計算すると、
  λ=(y2-y1)/(x2-x1)  if x1≠x2
     =(3x12+2ax1+b)/2y1    if x1=x2
  ν=y1-λx1=y2-λx2
として、
  x32-a-x1-x2
  y3=λx3
となる。よって、(P+Q)(x3,-y3)となる。

3.楕円曲線上のk倍点,位数


楕円曲線C上の点Pに対して、P+Pを2Pと書き、Pの2倍点と呼ぶ。
楕円曲線 y2=x3+ax2+bx+c上の点P(x,y)の2倍点を2P(x2,y2)とすると、
y!=0のとき、
  x2 = λ2-2x-a
  y2 = -(λ32(2x+a)+ν)
ただし
  λ = {3x2+2ax+b}/{2y}
  ν = {-x3+bx+c}/{2y}

つまり、
  x2 = ({3x2+2ax+b}/{2y})2-2x-a
  y2 = -(({3x2+2ax+b}/{2y})3-(2x+a)({3x2+2ax+b}/{2y})+{-x3+bx+c}/{2y})
となる。
同様に、3P=2P+P,4P=3P+P,5P=4P+P,...,kP=(k-1)P+P,...をPの3倍点, 4倍点,5倍点,...,k倍点,...と呼ぶ。
kP=Oとなる最小の自然数kが存在する場合、kをPの位数(order)と呼ぶ。また、Pを有限位数の点(ねじれ点)と呼ぶ。
kP=Oとなる自然数kが存在しない場合、Pを無限位数の点と呼ぶ。
楕円曲線上でy座標が0の点P(x,0)は、P=-Pつまり2P=Oとなるので、位数2のねじれ点である。

4.射影平面上の楕円曲線[2001/04/29追加]

楕円曲線の無限遠点を通常の点と対等に取り扱うためには、射影平面
    P2={[a:b:c]:(a,b,c)!=(0,0,0)}/〜
    ただし、[a:b:c]〜[a':b':c']は、あるt!=0が存在して、a=ta',b=tb',c=tc'となることと定義する。
上で考えると良い。
(1)を同次化して、
  y2z=x3+ax2z+bxz2+cz3   ---- (4)
を考える。(4)上にある(射影平面上の)点[x:y:z]が無限遠点でなければ、z!=0であり、(1)上にある(平面上の)点(x/z,y/z)に対応する。
[0:1:0]はP2上の(y軸方向の)無限遠点であるが、[0:-1:0]と同一の点である。
また、[1:0:0]は[0:1:0]とは異なる(x軸方向の)無限遠点である。同様に、[1:1:0]は直線y=x方向の無限遠点である。

5.有限体上の楕円曲線

楕円曲線Cを有限体Fq上の曲線と考える。 つまり、x,yをFqの元とする。 ただし、qはFの位数であり、素数pまたは素数pの巾pmである。
この場合でも、楕円曲線上の点P(x,y)について、-,*,+の演算を同様に定義することができる。 x,yの演算は、Fqの演算(mod qの演算)とする。

6.楕円曲線を使った素因数分解[Lenstraの方法]

合成数mに対して、有限環Fm(+,-,*演算をmod mで行なう)を考える。Fmを体と見なして/の演算をすることにより、Fm上の非特異楕円曲線Cについて、その曲線上の点P(x,y)のk倍点を計算することができる。
今、mのある素因数pに対して、p-1が小さい素数の小さい巾の積となっているとする。Fp上の楕円曲線上のP(x,y)の集合C(Fp)を考えると、C(Fp)の元の個数#C(Fp)がたまたまkを割り切るならば、kP=Oとなる。よって、点Pのk倍点の計算は途中で失敗するが、その過程でmの素因数が得られる。
k倍点の計算に成功したら、特に何も言えないので、別のkまたは別の点P(x,y)または別の楕円曲線Cについて、再度、計算する。
例えば、kは、十分大きな数nに対して、k=lcm{1,2,...,n}とする。
ここでは、単純な点(2,1),(3,1)などを通る楕円曲線
    y2=x3+bx+c
を使う。ただし、
    c=-7-2b  点(2,1)を通る場合,
    c=-26-3b  点(3,1)を通る場合
とする。
Pのk倍点kPの計算では、2P,22P,23P,...を順に計算し, kの2進数表示に従って、例えば、13P=P+22P+23Pのように加算して求める。

7.プログラムについて

数年前から楕円曲線について興味を持ち、その応用である暗号アルゴリズムや素因数分解についても調べている時に、その原理を理解するために作成した。
最初に作成したのはCommon LISP版であり、bignumを標準で持っているので、作成しやすかった。コンパイルすることにより、高速に実行できる。
2001年になって、rubyもbignumを持っていることを知り、このプログラムを移植した。rubyはインタプリタであり、実行速度はGNU Common LISPより少し落ちるが、使用メモリも小さく十分に使えることがわかった。

[2021.04.22追記]
2倍点公式が誤っていたので、修正した。


[参考文献]


Last Update: 2021.04.24
H.Nakao

Homeに戻る[Homeに戻る]  一覧に戻る[一覧に戻る]