Eliptik Eğrilere Ekleme


29

Eliptik Eğrilere Ekleme

Feragatname: Bu, eliptik eğrilerin zengin konusuyla ilgili herhangi bir adalet sağlamaz. Çok basitleştirildi. Eliptik eğriler son zamanlarda şifreleme bağlamında medyanın dikkatini çektiği için, eliptik bir eğri üzerinde "hesaplama" işleminin gerçekte nasıl çalıştığı hakkında küçük bir fikir vermek istedim.

Giriş

Eliptik eğriler (x,y), form düzlemindeki nokta kümeleridir y^2 = x^3+Ax+B. (Ayrıca, 4A^3+27B^2 ≠ 0kötü tekillikleri önlemek için.) Bu eğrileri herhangi bir alanda düşünebilirsiniz. Gerçek sayılar alanını kullanırsanız, eğriler görselleştirilebilir ve şöyle görünürler:

iki eliptik eğri örneği
Kaynak

Bu eğriler hakkındaki özel şey , eklemelerin analogu olan yerleşik bir aritmetik işlem yapmalarıdır . Puan ekleyip çıkarabilirsiniz ve bu işlem hem birleştirici hem de değişmelidir (bir abelyan grubu).

Ekleme nasıl çalışır?

Not: eliptik eğrilere noktaların eklenmesi sezgisel değildir. Bu tür bir ekleme, bazı güzel özelliklere sahip olması nedeniyle olduğu gibi tanımlanır. Garip ama işe yarıyor.

Eliptik eğriler bir grup oluştururken, 0'a eşdeğer ek bir kimlik vardır. Yani, 0herhangi bir noktaya eklemek sonucu değiştirmeyecektir. Bu katkı kimliği sonsuzdaki "nokta" dır. Düzlemdeki tüm çizgiler, sonsuzluktaki bu noktayı içerir, dolayısıyla eklemek hiçbir fark yaratmaz.

Diyelim ki herhangi bir çizgi eğriyi üç noktada kesiyor, ki 0bu üç noktanın toplamı 0. Bunu akılda tutarak, bu resme bir bakın.

eliptik eğri ek özel durumlar
Kaynak

Şimdi, doğal soru şudur, nedir P+Q? Peki, eğer P+Q+R = 0öyleyse P+Q = -R(alternatif olarak yazılmıştır R'). Nerede -R? Burada It R + (-R) = 0x-eksenin diğer tarafında olan, Rsadece kesen, içlerinden hattı dik olacak şekilde R, -Rve 0. Bunu, görüntünün ilk bölümünde görebilirsiniz:

eliptik eğrilerdeki çeşitli eklemelerin diyagramı Kaynak

Bu görüntülerde görebileceğiniz bir diğer şey, bir noktanın kendisinin toplamının çizginin eğriye teğet olduğu anlamına gelmesidir.

Çizgilerin ve eliptik eğrilerin kesişme noktalarında nasıl bulunur

İki ayrı nokta olması durumunda

Genellikle iki noktadan tam olarak bir çizgi vardır P=(x0,y0), Q=(x1,y1). Düşey olmadığını ve iki noktanın farklı olduğunu varsayarsak, şunu yazabiliriz y = m*x+q. Eliptik eğri ile kesişme noktalarını bulmak istediğimizde yazabiliriz.

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

bu üçüncü derece bir polinomdur. Bunlar genellikle çözülmesi o kadar kolay değildir, ancak biz zaten bu polinomun iki xsıfırını biliyoruz: x0, x1Eklemek istediğimiz iki noktanın iki koordinatı !

Bu şekilde biz doğrusal faktörlerin dışında faktörü (x-x0)ve (x-x1)ve kimin köküdür üçüncü doğrusal bir faktör kalır xnoktasının -coordinate R. ( -Rsimetri nedeniyle de. Dikkat edin o R = (x2,y2)zaman eğer -R = (x2,-y2). -Gruptan; vektörel bir eksi değil.)

PKendisine bir nokta ekleme durumunda

Bu durumda, eğrinin tanjantını hesaplamak zorundayız P=(x0,y0). Doğrudan yazabiliriz mve qaçısından A,B,x0,y0:

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

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

Denklemi elde ederiz y = m*x+qve yukarıdaki paragrafta olduğu gibi devam edebiliriz.

Tam bir vaka ağacı

Bu, tüm bu davaların nasıl ele alınacağının tam bir listesidir:

P,QEliptik eğri üzerinde puanlar olsun ("sonsuzluk" noktası dahil 0)

  • Eğer P = 0ya Q = 0, o zaman P+Q = Qya P+Q = Psırasıyla
  • Başka P ≠ 0ve Q ≠ 0, öyleyse bırak P = (x0,y0)ve Q = (x1,y1):
    • Eğer P = -Q(bu aygıtın x0 = x1ve y0 = -y1daha sonra)P+Q = 0
    • Başka P ≠ -Q
      • Eğer x0 = x1öyleyse, almak P=Qiçin teğeti hesaplar (yukarıdaki bölüme bakınız) hesaplarız R. SonraP+Q = P+P = 2P = -R
      • Başka: y = m*x+yHesaplamak için bu iki noktadan (yukarıdaki bölüme bakınız) formun bir çizgisini oluşturabiliriz R. SonraP+Q=-R

Sonlu alanlar

Bu meydan okuma için sadece büyüklükte alanlar dikkate alacaktır pnerede pasal (çünkü bazı detayların p ≠ 2, p ≠ 3). Bunun basitçe hesaplayabileceğiniz bir avantajı vardır mod p. Diğer alanlardaki aritmetik çok daha karmaşık.

Bu örnekte belirlediğimiz p = 5ve burada tüm eşitlikler uygunluktur 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

Meydan okuma

A,BBir eliptik eğrinin parametreleri göz önüne alındığında , bir asal alan karakteristiği pve P,Qeliptik eğride iki nokta varsa , bunların toplamını döndürür.

  • Parametrelerin A,Bgerçekte eliptik bir eğri tanımladığını varsayabilirsiniz , yani bu 4A^3+27B^2 ≠ 0.
  • Bunun P,Qaslında eliptik eğrideki veya noktanın üzerindeki noktalar olduğunu varsayabilirsiniz 0.
  • Bunun p ≠ 2,3asal olduğunu varsayabilirsin .

Test Kılıfları

MATLAB / Octave'da kendi test vakalarınız için kullanabileceğiniz (çok şık olmayan) bir uygulama yaptım : ideone.com Umarım doğrudur. En azından elle yaptığım birkaç hesaplamayı yaptı.

Burada düşündüğümüz tüm eğriler için işe yarayan önemsiz test durumlarına dikkat edin:

Sıfır P+0 = P ekleme: Ters ekleme:(x,y) + (x,-y) = 0


İçin p = 7, A = 0, B = 5iki nokta P = (3,2)ve Q = (6,2)eliptik bir eğri üzerinde bulunmaktadır. Sonra aşağıdaki tutar:

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

Eliptik eğrideki tüm noktalar (3,2),(5,2),(6,2),(3,5),(5,5),(6,5),0


İçin p = 13, A = 3, B = 8aldığımız

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

İçin p = 17, A = 2, B = 2ve P=(5,1) biz

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)

Eğer gerçekten hırslıysan, al

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

ve nböyle bir doğal sayı bulmaya çalışın n*(x0,y0) = (x1,y1). Daha fazla bilgi burada.

apandis

Öncelikle büyük bir taslak benim gözden geçirme ve düzenleme için @ El'endiaStarman teşekkür ederim!

Neden eliptik eğriler?

Eh, bir çeşit keyfi denklem gibi görünebilir, ama bu pek de genel değil: Genel olarak projektif düzlemde bu geometrik "şekilleri" göz önünde bulunduruyoruz ("sonsuzluğun" nereden geldiğidir). Her şeyin homojen olduğunu düşünüyoruz. 3. derece polinomlar . (Daha düşük veya daha yüksek dereceye sahip olanlar incelemek için çok zor veya sadece önemsizdir.) İstediğimiz güzel özellikleri elde etmek için bazı kısıtlamalar uyguladıktan sonra ve bu polinomları dehomojenizasyondan sonra (üç afin düzleminden birine yansıtma) ) gibi denklemlerle sonuçlanırızy^2+a*x*y+b*y = x^3+c*x^2+d*x+eBu, uzun Weierstrass formunda eliptik bir eğridir. Bunlar temelde düşündüğümüz eğrilerle aynı, ancak biraz eğri. Doğrusal bir koordinat dönüşümü ile kolayca kısa bir Weierstras denklemini bunun dışında yapabilirsiniz. Tüm ilginç özellikleri hala tutan örnek .

Neden dışladık p=2,3?

Bu, kısa Weierstrass formu 4A^3+27B^2 ≠ 0için tekilliklerden kaçınmak için kısıtlamaya ihtiyacımız olduğu gerçeğiyle ilgilidir (aşağıda daha fazlası). Sahip olduğumuz bir karakteristik 2 4 = 0alanında ve sahip olduğumuz karakteristik 3 alanında, 27 = 0bu tür alanlar için kısa ot biçimli eğrilerin olması imkansız kılmaktadır.

Tekillikler nelerdir?

Eğer denklem 4A^3+27B^2=0geçerliyse, aşağıdaki gibi tekilliklere sahibiz: Bu noktalarda gördüğünüz gibi bir türev bulamıyorsunuz ve bu nedenle işlemi "öldüren" teğet yok. Denklemlere bakabilir y^2 = x^3veyay^2 = x^3-3*x+2

Neden onlar yine de eliptik eğri olarak adlandırılıyor ?

Bunun nedeni, bu şeklin denklemlerinin eliptik integrallerde ortaya çıkmasıdır, örneğin, örneğin bir elipsin yayını tıkamak istediğinizde ne elde edersiniz. Adın kökeni hakkında kısa bir slayt gösterisi.

Kriptografiyle ne ilgisi var?

nP = P+P+...+PÇok verimli hesaplamanın yolları var . Bu, örneğin Diffie Hellman anahtar değişiminde kullanılabilir . Modüler aritmetik, burulma alt gruplarına eklenerek değiştirilebilir, bunlar sadece sonlu sıraya sahip eğrideki noktalardır. (Bu mP = 0, bazıları miçin temelde sadece hesap yapan anlamına gelir mod m).

Yanıtlar:


4

Pyth, 105 100 bayt

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

Girdi, biçimin iki noktası (p, A, P, Q), nerede Pve nerede olduğu veya özel nokta ise, olduğu gibi beklenir . Burada çevrimiçi deneyebilirsiniz . Son iki örnek özelliğin nasıl çalıştığını göstermektedir .Q(x, y)000

Birkaç baytı kurtarmak için sadece mod pson cevabı kullanıyorum. Bu, x0^pmodüler üstelleştirme yapmadan birkaç kez yaptığı gibi bir şey yaptığı anlamına gelir, bu yüzden çok yavaş olabilir.

Bu Python işlevi ile kabaca aynı mantığı izleyerek çalışır:

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)

Bu modüler çarpımsal ters gerçeğine ağır güvenen xna eşit x^(p-2) mod pise pasal olduğunu. Böylece mçizginin eğimini, paydanın modüler çarpımsal tersini bularak ve onu pay ile çarparak hesaplayabiliriz . Oldukça kullanışlı. Python işlevi kullanımı nedeniyle daha büyük problemleri biraz daha verimli hesaplamalıdır pow.

Bu konuda Wikipedia sayfasında gösterilen kısayolları da kullandım . Bu oldukça ilginç, sadece bir Akere kullanıyorum , Bhiç değil.

Ayrıca sadece eğlence için:

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_nPFonksiyon hesaplar n*Pbelirli bir tamsayı için nve nokta P. nİki bölüme ayırarak özyinelemeli bir strateji kullanır p2fve remainderböyle p2f + remainder = nve böyle p2f = 2^k. Ardından sonucu bu fonksiyona ekleyerek, bu parçalara tekrar işlev diyoruz add_ellip. Ayrıca, önceden hesaplanmış değerleri dict'e kaydederek temel dinamik programlama yaklaşımını kullandım d.

Bir sonraki işlev, aynı soruyu kullanarak bonus sorusunu teorik olarak çözer:

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

Ne yazık ki, hesaplamak için yeterince hızlı bir şekilde hiçbir yere koşmuyor. Sanırım bunu yapmanın çok daha etkili yolları olabilir, özellikle de her olası değeri gözden geçirmek zorunda kalmazsak n.


Harika, dürüst olmak gerekirse artık bir cevap beklemiyordum =) Sonsuzluk noktasını nasıl ele alıyorsunuz? (Bunun y^2 = x^3 + xgeçerli bir eliptik eğri olduğunu ve eğri (0,0) ≠ 0üzerinde bir nokta olduğunu unutmayın !)
kusurlu

Harika bir soru ... Sanırım başa çıkmadım! : P Özür dilerim, ilk resmi nerede gördüğümü B = 0ve nasıl 0çalışacağını merak ettiğimi hatırlıyorum ... sonra unutmuşum. Sanırım Bdün gece geç saatlerde 0 olamayacağını düşündüm . Girişin bunun için nasıl olması gerektiğine dair herhangi bir öneriniz var mı? Belki öyleyse B = 0, o zaman tanımlayın 0 = (-1, -1)? Kodumu işlemek için ayarladığım için mutluyum, yalnızca diğer gönderimler için de standartlaştırılmış olmasının iyi olacağını düşünüyorum ...
Rhyzomatic

Gönderilerin kendileri için uygun olanı kullanabileceği şekilde açılmasını sağladım. Fakat tabii ki, örneğin eğrideki tüm sonlu noktaların negatif olmayan koordinatlara sahip olduğunu ve diğer her şeyin Sonsuzluk noktası veya benzeri bir şey olarak kabul edildiğini söyleyebilirsiniz . Veya daha kolaysa, girişin [0](yalnızca bir koordinat) sonsuzluk noktası veya benzeri bir şey olduğunu varsayabilirsiniz !
kusur,

Bu yeterince iyi idare edemiyorsa bana haber ver. Ve teşekkürler, bu aslında 5 bayt kurtardı!
Rhyzomatic

@flawr, verimli bir şekilde hesaplama yapmak için doğru yolda olup olmadığımı söyler misiniz nP? Düşüncelerin akması için konuyla ilgili herhangi bir kaynağa yönlendirir misiniz? Etrafta Googling olan bir şey bulmakta zorlanıyorum. Teşekkürler!
Rhyzomatic

0

Python 3, 193 191 bayt

Rhyzomatic'in Pyth cevabı ve Python mantığına dayanan bir çözüm . Özellikle. Onlar bir mghorta kübik polinomun üçüncü kök nasıl bulduğunu sevdim x^3 + bx^2 + cx + dİki kökleri varken x_1ve x_2işaret ederek b == x_1 + x_2 + x_3ve buna göre çıkarılmasıyla. Bir açıklama eklemek, bunu golf oynamak ve Ruby'nin daha kısa olduğu ortaya çıkarsa belki de Ruby'ye çevirmeyi planlıyorum.

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)

Ungolfing:

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'un Pyth'in verdiği cevaptan iki kat daha az olmasına şaşırdım!
kusur,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.