楕円曲線の追加


29

楕円曲線の追加

免責事項:これは、楕円曲線の豊富なトピックに関する正義を行いません。かなり簡素化されています。楕円曲線は最近、暗号化のコンテキストで多くのメディアの注目を集めたため、楕円曲線の「計算」が実際にどのように機能するかについて、いくつかの小さな洞察を提供したかったのです。

前書き

楕円曲線は(x,y)、フォームの平面内の点の集合ですy^2 = x^3+Ax+B。(さらに、4A^3+27B^2 ≠ 0厄介な特異点を避けるために。)これらの曲線はどのフィールドでも考慮することができます。実数のフィールドを使用すると、曲線を視覚化でき、次のようになります。

楕円曲線の2つの例
ソース

これらの曲線の特別な点は、加算に類似した算術演算が組み込まれていることです。ポイントを追加および削除することができ、この操作は結合的および可換的(アーベル群)です。

追加はどのように機能しますか?

注:楕円曲線上の点の追加は直感的ではありません。この種類の追加は、特定の優れたプロパティがあるため、そのまま定義されています。奇妙ですが、動作します。

楕円曲線はグループを形成するため、0に相当する付加的な同一性があり0ます。つまり、任意のポイントに追加しても結果は変わりません。この付加的なアイデンティティは、無限の「ポイント」です。平面上のすべての線にはこの点が無限遠に含まれるため、追加しても違いはありません。

与えられた線が3点で曲線と交差すると仮定します0。これはである可能性があり、これら3点の合計は0です。それを念頭に置いて、この画像を見てください。

楕円曲線追加の特別な場合
ソース

さて、自然な質問は、何P+Qですか?まあ、if P+Q+R = 0、then P+Q = -R(またはとして書かれていますR')。どこ-Rですか?ここでR + (-R) = 0、はからX軸の反対側にあるRため、それらを通る線は、、、およびのみRと交差-R0ます。この画像の最初の部分でこれを見ることができます:

楕円曲線上のさまざまな追加の図 ソース

これらの画像で確認できるもう1つの点は、ポイントとそれ自体の合計が、線が曲線に接していることを意味していることです。

直線と楕円曲線の交点を見つける方法

2つの異なるポイントの場合

一般に2点を通る正確に1本の線がありP=(x0,y0), Q=(x1,y1)ます。それが垂直ではなく、2つのポイントが明確であると仮定すると、と書くことができますy = m*x+q。楕円曲線との交点を見つけたいとき、次のように書くことができます。

0 = x^3+Ax+B-y^2 = x^3+Ax+B-(m*x+q)^2

これは3次多項式です。これらは一般的に解くのはそれほど簡単ではありませんが、この多項式の2つのゼロを既に知っています。追加したい2点の2つのx座標x0, x1

このように我々の線形因子アウト因子(x-x0)(x-x1)、そのルートである第三の線形因子が残されているx点の-座標R。(-R。あまりにも対称性のためであればその注意してくださいR = (x2,y2)、その後を-R = (x2,-y2)-グループからであり、それはベクトルマイナスではありません。)

P自身に1つのポイントを追加する場合

この場合、で曲線の正接を計算する必要がありますP=(x0,y0)。私たちは、直接書き込むことができますmqの観点A,B,x0,y0

     3*x0^2 + A
m = ------------
        2*y0

     -x0^3 + A*x0 + 2*B
q = --------------------
          2*y0

方程式を取得し、y = m*x+q上記の段落と同じ方法で進めることができます。

完全なケースツリー

これは、これらすべてのケースを処理する方法の完全なリストです。

ましょうP,Q楕円曲線上の点(「無限」点を含む0

  • もしP = 0またはQ = 0、その後、P+Q = QまたはP+Q = P、それぞれ
  • それ以外の場合P ≠ 0、およびQ ≠ 0let P = (x0,y0)およびQ = (x1,y1)
    • if P = -Q(つまりx0 = x1and y0 = -y1)thenP+Q = 0
    • その他 P ≠ -Q
      • もしそうならx0 = x1、をP=Q取得するためにタンジェントを計算します(上記のセクションを参照)R。それからP+Q = P+P = 2P = -R
      • それ以外の場合:をy = m*x+y計算するために、これらの2つのポイント(上記のセクションを参照)を介してフォームの行を作成できますR。それからP+Q=-R

有限フィールド

この挑戦のために我々は唯一のサイズのフィールドを検討するpところp素数である(そしてのでいくつかの詳細のp ≠ 2, p ≠ 3)。これには、単純に計算できるという利点がありますmod p。他のフィールドでの演算は、はるかに複雑です。

この例ではこれを設定しp = 5、ここでのすべての平等は合同mod 5です。

2+4 ≡ 6 ≡ 1
2-4 ≡ -2 ≡ 3
2*4 ≡ 8 ≡ 3
2/4 ≡ 2*4 ≡ 3 because 4*4 ≡ 16 ≡ 1, therefore 1/4 ≡ 4

チャレンジ

A,B楕円曲線のパラメーター、素数フィールドの特性p、およびP,Q楕円曲線上の2つのポイントを指定すると、それらの合計が返されます。

  • パラメーターがA,B実際に楕円曲線を記述すると仮定できます4A^3+27B^2 ≠ 0
  • これP,Qは実際に楕円曲線または-点上の点であると仮定でき0ます。
  • あなたはそれp ≠ 2,3が素数であると仮定することができます。

テストケース

MATLAB / Octaveで(非常にエレガントではない)実装を作成しました。これを独自のテストケースに使用できます。ideone.com正しいことを願っています。少なくとも手作業で行ったいくつかの計算を再現しました。

ここで考慮するすべての曲線に対して機能する簡単なテストケースに注意してください。

ゼロの追加:P+0 = P 逆の追加:(x,y) + (x,-y) = 0


以下のためのp = 7, A = 0, B = 5二点P = (3,2)及びQ = (6,2)楕円曲線上にあります。その後、次のことが成り立ちます。

2*Q = Q+Q = P
2*P = P+P = (5,2)
3*P = P+P+P = (5,2)+P = (6,5)
4*P = P+P+P+P = (5,2)+(5,2) = (6,5)+(5,2) = Q

楕円曲線上のすべてのポインは (3,2),(5,2),(6,2),(3,5),(5,5),(6,5),0


以下のためにp = 13, A = 3, B = 8我々が得ます

(1,8)+(9,7) = (2,10)
(2,3)+(12,11) = (9,7)
2*(9,6) = (9,7)
3*(9,6) = 0

p = 17, A = 2, B = 2P=(5,1) 我々が得ます

2*P = (6,3)
3*P = (10,6)
4*P = (3,1)
5*P = (9,16)
6*P = (16,13)
7*P = (0,6)
8*P = (13,7)
9*P = (7,6)
10*P = (7,11)

本当に野心的な人は

p = 1550031797834347859248576414813139942411
A = 1009296542191532464076260367525816293976
x0 = 1317953763239595888465524145589872695690
y0 = 434829348619031278460656303481105428081
x1 = 1247392211317907151303247721489640699240
y1 = 207534858442090452193999571026315995117

そして、nそのような自然数を見つけようとしますn*(x0,y0) = (x1,y1)詳細はこちら。

付録

まず、私の下書きをレビューして編集してくれた@ El'endiaStarmanに感謝します!

なぜ楕円曲線なのか?

まあ、それは任意の式のいくつかの種類のように見えるかもしれないが、それはありませんが、それはかなり一般的である:一般的に我々はそれらの幾何学的な「形」を検討射影平面を「無限大」はどこから来ているであること(私たちはすべての存在を検討してください。この長いワイエルシュトラス形式の楕円曲線である。これらは、基本的に我々が考えられ、ちょうどやや斜めに同じ曲線である。線形座標変換を使用すると、簡単に短いWeierstrasは、その。のうち方程式作ることができますたとえば、まだすべて保持します、興味深いプロパティ。均質で 3 次の多項式(次の低次または高次の多項式は、難しすぎるか、調べるのが簡単です。)希望する優れた特性を得るためにいくつかの制限を適用し、それらの多項式を非均質化した後(3つのアフィン平面のいずれかに投影します) )のような方程式で終わるy^2+a*x*y+b*y = x^3+c*x^2+d*x+e

なぜ除外したのp=2,3ですか?

これは、短いワイエルシュトラス型の場合、4A^3+27B^2 ≠ 0特異点を回避するために制限が必要であるという事実と関係があります(詳細については後述)。特性2 4 = 0のフィールドと特性3のフィールドでは27 = 0、これらの種類のフィールドに対して短いワイエルシュトラス形式の曲線を作成することはできません。

特異点とは何ですか?

方程式4A^3+27B^2=0が成り立つ場合、次のような特異点があります。これらのポイントでわかるように、微分を見つけることができず、したがって接線がなく、操作を「殺します」。方程式を見y^2 = x^3たり、y^2 = x^3-3*x+2

とにかく楕円曲線と呼ばれるのはなぜですか?

その理由は、この形状の方程式が楕円積分でポップアップするためです。たとえば、楕円の弧長などを計算したいときに得られるものです。名前の由来についての短いスライドショー。

彼らは暗号化と何の関係があるのでしょうか?

nP = P+P+...+P非常に効率的に計算する方法があります。これは例えばDiffie Hellman鍵交換で使用できます。モジュラー演算は、ねじれサブグループの追加で置き換えることができます。これらは、有限次数を持つ曲線上の点にすぎません。(つまりmP = 0、一部のm、基本的には単に計算することを意味しますmod m)。

回答:


4

Pyth、105の 100バイト

A,@Q3eQ?qGZH?qHZG?&=YqhHhGqeG%_eHhQZ_m%dhQ,-*J?Y*+*3^hG2@Q1^*2eG-hQ2*-eGeH^-hGhH-hQ2-hGK--^J2hGhHeGK

入力はとして期待されます(p, A, P, Q)。ここでPおよびQは、フォームの2つのポイント、(x, y)または特別な0ポイントである場合は、ちょうど0です。こちらからオンライン試すことができます。最後の2つの例は、特別な0仕組みを示しています。

数バイトを節約するために、私mod pは最後の回答でのみ使用します。これは、x0^pモジュラーべき乗を行わずに数回実行することを意味するため、非常に遅い可能性があります。

このPython関数とほぼ同じロジックに従って動作します:

def add_ellip(p, A, P, Q): # points are in format (x, y)
    z = 0 # representing special 0 point

    if (P == z):
        return Q
    if (Q == z):
        return P

    if P[0] == Q[0]:
        if (P == (Q[0], -Q[1] % p)):
            return z
        else:
            m = ((3*pow(P[0], 2, p) + A)*pow(2*P[1], p-2, p)) % p
    else:
        m = (P[1] - Q[1])*pow(P[0] - Q[0], p-2, p) % p

    x = (pow(m, 2, p) - P[0] - Q[0]) % p
    y = (m*(P[0] - x) - P[1]) % p
    return (x, y)

これは、のモジュラ逆数があるという事実に大きく依存しているxに等しいx^(p-2) mod p場合はp素数です。したがってm、分母のモジュラー乗法逆数を見つけて、それを分子で乗算することにより、ラインの勾配を計算できます。かなり便利です。Python関数は、の使用により、より大きな問題をもう少し効率的に計算するはずですpow

また、このテーマに関するウィキペディアのページに示されているショートカットも使用しました。それは私がA一度だけ使用することになり、Bまったく使用しないことに非常に興味深いです。

また、ただの楽しみのために:

def pow2floor(x):
    p = 1
    x >>= 1
    while (x > 0):
        x >>= 1
        p <<= 1
    return p

def multi_nP(p, A, n, P):
    d = {}

    def rec_helper(n, P):
        if (n == 0):
            return (0, 0)
        elif (n == 1):
            return P
        elif (n in d):
            return d[n]
        else:
            p2f = pow2floor(n)
            remainder = n - p2f

            lower_half = rec_helper(p2f//2, P)
            d[p2f//2] = lower_half
            nP = add_ellip(p, A, lower_half, lower_half)

            if (remainder):
                nP = add_ellip(p, A, nP, rec_helper(remainder, P))

            d[n] = nP
            return nP

    return rec_helper(n, P)

このmulti_nP関数n*Pは、指定された整数nとポイントに対して計算しPます。これは、再帰的分割による戦略使用するn2つの部分にp2fremainderなるようにp2f + remainder = n、それをp2f = 2^k。次に、それらの部分で関数を再度呼び出し、結果をで追加しadd_ellipます。また、すでに計算された値をdictに保存することにより、基本的な動的プログラミングアプローチを使用しましたd

次の関数は、同じ戦略を使用してボーナスの質問を理論的に解決します。

def find_nPQ(p, A, P, Q): # P is input point, Q is what we're looking for
    d = {}
    found_Q = False

    def rec_helper(n, P):
        if (n == 0):
            return (0, 0)
        elif (n == 1):
            return P
        elif (n in d):
            return d[n]
        else:
            p2f = pow2floor(n)
            remainder = n - p2f

            lower_half = rec_helper(p2f//2, P)
            d[p2f//2] = lower_half

            nP = add_ellip(p, A, lower_half, lower_half)

            if (remainder):
                nP = add_ellip(p, A, nP, rec_helper(remainder, P))

            d[n] = nP
            return nP


    for x in range(p):
        xP = rec_helper(x, P)
        if (xP == Q):
            return x

残念ながら、それを計算するのに十分な速さでは実行されません。特にのすべての可能な値を反復処理する必要がない場合、これを行うためのはるかに効率的な方法があるかもしれないと推測していますn


素晴らしく、正直に言って、もう下水道は期待していませんでした=)無限遠でポイントをどのように扱いますか?(これy^2 = x^3 + xは有効な楕円曲線であり(0,0) ≠ 0、曲線上の点です!)
flawr

素晴らしい質問...私はそれを処理しなかったと思います!:P申し訳ありませんが、最初の写真を見て、どこB = 0でどのように機能0するか疑問に思いました...そしてそれを忘れました。B昨夜遅くに0になることはないと思いました。このために入力がどのようにすべきかについての提案はありますか?もしかしたらB = 0、定義する0 = (-1, -1)?コードを調整してそれを処理できることをうれしく思います。他のサブミッションにも標準化されていればいいと思うだけです
。– Rhyzomatic

さて、私はその投稿を開いたままにして、投稿に便利なものを使用できるようにしました。しかし、もちろん、たとえば、曲線上のすべての有限点は非負の座標を持ち、他のすべては無限点または類似のものと見なされます。または、より簡単な場合は、入力[0](1つの座標のみ)が無限大の点、または同様のものであると想定することもできます。
flawr

それで十分に処理できない場合はお知らせください。おかげで、実際に5バイト節約できました!
リゾマティック

@flawr、私が効率的なコンピューティングの正しい軌道に乗っているかどうかを教えてもらえnPますか?考えを流してもらうために、このテーマに関するリソースを教えてください。グーグルで何かを見つけるのに苦労しています。ありがとう!
リゾマティック

0

Python 3、193 191バイト

RhyzomaticのPythの回答とPythonロジックに基づくソリューション。特に。私は、彼らがモニック三次多項式の第三ルートを発見した方法を言っていx^3 + bx^2 + cx + dますが、2つの根を持っているときx_1x_2ことに注目することによってb == x_1 + x_2 + x_3、それに応じて差し引きます。説明を追加し、これをゴルフし、Rubyが短くなった場合は、おそらくそれをRubyに変換する予定です。

def e(p,A,B,P,Q):
 if P==0:return Q
 if Q==0:return P
 f,g=P;j,k=Q
 if f==j:
  if g==-k%p:return 0
  m=(3*f*f+A)*pow(2*j,p-2)
 else:m=(g-k)*pow(f-j,p-2)
 x=m*m-f-j;y=m*(f-x)-g;return(x%p,y%p)

アンゴルフ:

def elliptic_curve_addition(p, A, B, P, Q):
    if P == 0:
        return Q
    if Q == 0:
        return P
    f,q = P
    j,k = Q
    if f==j:
        if g == (-k) % p:
            return 0
        m = (3 * f**2 + A) * pow(2*j, p-2)
    else:
        m = (g-k) * pow(f-j, p-2)
    x = m**2 - f - j
    y = m * (f-x) - g
    return (x%p, y%p)

Pythonの長さがPythの回答の2倍に満たないことに驚いています!
-flawr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.