अण्डाकार घटता पर जोड़


29

अण्डाकार घटता पर जोड़

अस्वीकरण: यह अण्डाकार वक्रों के समृद्ध विषय पर कोई न्याय नहीं करता है। यह बहुत सरल है। जैसा कि अण्डाकार वक्रों ने हाल ही में एन्क्रिप्शन के संदर्भ में बहुत अधिक मीडिया का ध्यान आकर्षित किया है, मैं कुछ छोटी अंतर्दृष्टि प्रदान करना चाहता था कि एक अण्डाकार वक्र पर "गणना" वास्तव में कैसे काम करती है।

परिचय

अण्डाकार वक्र रूप (x,y)के विमान में बिंदुओं के समूह हैं y^2 = x^3+Ax+B। (इसके अतिरिक्त, 4A^3+27B^2 ≠ 0गंदा विलक्षणताओं से बचने के लिए।) आप किसी भी क्षेत्र में इन वक्रों पर विचार कर सकते हैं। यदि आप वास्तविक संख्याओं के क्षेत्र का उपयोग करते हैं, तो वक्रों की कल्पना की जा सकती है और वे इस तरह दिखते हैं:

अण्डाकार वक्र के दो उदाहरण
स्रोत

इन घटता के बारे में खास बात यह है कि वे एक है में बनाया गणित आपरेशन के अलावा के अनुरूप है। आप अंक जोड़ सकते हैं और घटा सकते हैं, और यह ऑपरेशन सहयोगी और कम्यूटेटिव (एक एबेलियन समूह) दोनों है।

कैसे काम करता है?

नोट: अण्डाकार वक्रों पर बिंदुओं को जोड़ना सहज नहीं है। इस तरह के जोड़ को इस तरह परिभाषित किया गया है क्योंकि इसमें कुछ अच्छे गुण हैं। यह अजीब है, लेकिन यह काम करता है।

जैसा कि अण्डाकार घटता एक समूह बनाता है, एक योज्य पहचान होती है जो 0. के बराबर होती है। अर्थात, 0किसी भी बिंदु पर जोड़ने से परिणाम नहीं बदलेगा। यह योगात्मक पहचान अनंत पर "बिंदु" है। विमान की सभी लाइनों में अनंतता पर यह बिंदु शामिल है, इसलिए इसे जोड़ने से कोई फर्क नहीं पड़ता है।

मान लीजिए कि कोई भी दी गई रेखा वक्र को तीन बिंदुओं पर काटती है, जो हो सकता है 0, और यह कि इन तीन बिंदुओं का योग है 0। इसे ध्यान में रखते हुए, इस छवि को देखें।

अण्डाकार वक्र विशेष मामलों को जोड़ते हैं
स्रोत

अब, स्वाभाविक प्रश्न है, क्या है P+Q? ठीक है, अगर P+Q+R = 0, तो P+Q = -R(वैकल्पिक रूप से लिखा गया है R')। कहाँ है -R? वह कहाँ है R + (-R) = 0, जिसमें से x- अक्ष के दूसरे पक्ष पर है R, ताकि उन के माध्यम से लाइन खड़ी है अन्तर्विभाजक केवल R, -R, और 0। आप इसे इस छवि के पहले भाग में देख सकते हैं:

अण्डाकार वक्रों पर विभिन्न परिवर्धन के आरेख स्रोत

इन छवियों में आप देख सकते हैं एक और बात यह है कि एक बिंदु का योग का मतलब है कि रेखा वक्र के स्पर्शरेखा है।

कैसे लाइनों और अण्डाकार घटता के चौराहों को खोजने के लिए

दो अलग-अलग बिंदुओं के मामले में

आम तौर पर दो बिंदुओं के माध्यम से एक पंक्ति होती है P=(x0,y0), Q=(x1,y1)। यह मानते हुए कि यह लंबवत नहीं है और दो बिंदु अलग हैं, हम इसे लिख सकते हैं y = m*x+q। जब हम अण्डाकार वक्र के साथ प्रतिच्छेदन के बिंदुओं को खोजना चाहते हैं तो हम लिख सकते हैं

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

जो एक तीसरी डिग्री बहुपद है। ये आम तौर पर हल करने के लिए उतना आसान नहीं हैं, लेकिन हम पहले से ही इस बहुपद के दो शून्य जानते हैं: हम जिन दो बिंदुओं को जोड़ना चाहते हैं उनके दो- xनिर्देशांक x0, x1!

इस तरह से हम रैखिक कारकों को बाहर निकालते हैं (x-x0)और (x-x1)एक तीसरे रैखिक कारक के साथ छोड़ दिया जाता है जिसका मूल बिंदु के x-coordinate है R। ( -R। भी समरूपता की वजह से ध्यान दें कि यदि R = (x2,y2)उसके बाद -R = (x2,-y2)-समूह से है, यह एक vectorial शून्य से नहीं है।)

Pअपने आप में एक बिंदु जोड़ने के मामले में

इस मामले में हमें वक्र की स्पर्शरेखा की गणना करनी होगी P=(x0,y0)। हम सीधे mऔर qइसके संदर्भ में लिख सकते हैं 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 ≠ 0, इसलिए P = (x0,y0)और Q = (x1,y1):
    • अगर P = -Q(मतलब ) x0 = x1और y0 = -y1तबP+Q = 0
    • अन्य P ≠ -Q
      • यदि x0 = x1हमारे पास है P=Qऔर हम प्राप्त करने के लिए स्पर्शरेखा (ऊपर अनुभाग देखें) की गणना करते हैं R। फिरP+Q = P+P = 2P = -R
      • y = m*x+yगणना : हम गणना करने के लिए उन दो बिंदुओं (ऊपर अनुभाग देखें) के माध्यम से प्रपत्र की एक पंक्ति का निर्माण कर सकते हैं 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अण्डाकार वक्र पर दो बिंदु , उनकी राशि लौटाते हैं।

  • आप मान सकते हैं कि पैरामीटर A,Bवास्तव में एक अण्डाकार वक्र का वर्णन करते हैं, इसका मतलब है कि 4A^3+27B^2 ≠ 0
  • आप मान सकते हैं कि P,Qवास्तव में दीर्घवृत्त वक्र या बिंदु पर बिंदु हैं 0
  • आप मान सकते हैं कि p ≠ 2,3यह प्रमुख है।

परीक्षण के मामलों

मैंने MATLAB / ऑक्टेव में एक (बहुत सुरुचिपूर्ण नहीं) कार्यान्वयन किया, जिसे आप अपने स्वयं के परीक्षण मामलों के लिए उपयोग कर सकते हैं: 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 = 2और P=(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 पर धन्यवाद!

अण्डाकार वक्र क्यों?

अच्छी तरह से यह किसी प्रकार के मनमाने समीकरण की तरह दिखाई दे सकता है, लेकिन यह नहीं है, यह काफी सामान्य है: आम तौर पर हम अनुमानी विमान में उन ज्यामितीय "आकृतियों" पर विचार करते हैं (यहीं से "अनन्तता" आ रही है। वहां हम सभी सजातीय मानते हैं। तीसरी डिग्री के बहुपद । (निम्न या उच्च डिग्री वालों के लिए परीक्षा करना बहुत कठिन या तुच्छ होगा।) हम चाहते हैं कि अच्छे गुण प्राप्त करने के लिए कुछ प्रतिबंधों को लागू करने के बाद, और उन बहुपद के dehomogenizing के बाद (तीन चक्कर विमानों में से एक में पेश करना)। ) हम जैसे समीकरणों के साथ समाप्त होते हैंy^2+a*x*y+b*y = x^3+c*x^2+d*x+eयह लंबे वीयरस्ट्रैस रूप में एक अण्डाकार वक्र है। ये मूल रूप से वही वक्र हैं जो हमने माना था, लेकिन बस कुछ हद तक तिरछा। एक रेखीय समन्वय परिवर्तन के साथ, आप आसानी से उस से बाहर एक छोटा Weierstras समीकरण बना सकते हैं। उदाहरण , जो अभी भी सभी दिलचस्प गुणों को धारण करते हैं।

हमने बाहर क्यों किया 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

उन्हें वैसे भी अण्डाकार वक्र क्यों कहा जाता है?

इसका कारण यह है कि इस आकार के समीकरण अण्डाकार इंटीग्रल्स में पॉप अप करते हैं, उदाहरण के लिए, जो कि आपको तब मिलते हैं जब आप उदाहरण के लिए एक दीर्घवृत्त के आरेख को caclulate करना चाहते हैं। नाम की उत्पत्ति के बारे में एक छोटा स्लाइड शो।

क्रिप्टोग्राफी के साथ उन्हें क्या करना है?

nP = P+P+...+Pबहुत कुशलता से गणना करने के तरीके हैं । इसका उपयोग डिफी हेलमैन कुंजी विनिमय में उदाहरण के लिए किया जा सकता है । मॉड्यूलर अंकगणित को मरोड़ उपसमूहों पर जोड़कर बदला जा सकता है, ये केवल वक्र पर बिंदु हैं जिनके पास परिमित आदेश है। (इसका मतलब है कि mP = 0कुछ के लिए m, जो मूल रूप से सिर्फ गणना कर रहा है mod m)।

जवाबों:


4

पायथ, 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हैं (x, y)या, यदि वे विशेष 0बिंदु हैं, जैसे कि 0। आप इसे यहाँ ऑनलाइन आज़मा सकते हैं । पिछले दो उदाहरण बताते हैं कि विशेष कैसे 0काम करता है।

कुछ बाइट्स को बचाने के लिए, मैं केवल mod pअंतिम उत्तर पर उपयोग करता हूं । इसका मतलब यह है कि यह x0^pमॉड्यूलर एक्सपोजर किए बिना कुछ समय जैसी चीजें करता है , इसलिए यह बहुत धीमा हो सकता है।

यह पायथन फ़ंक्शन के समान तर्क का अनुसरण करके काम करता है:

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, रेखा के ढलान, हर के मॉड्यूलर गुणक व्युत्क्रम का पता लगाकर और इसे अंश द्वारा गुणा करते हैं। बहुत आसान है। पायथन फ़ंक्शन के उपयोग की वजह से बड़ी समस्याओं की थोड़ी अधिक कुशलता से गणना करनी चाहिए 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। यह nदो भागों p2fऔर remainderइस तरह p2f + remainder = nऔर उस में विभाजित करके एक पुनरावर्ती रणनीति का उपयोग करता है p2f = 2^k। फिर हम उन भागों पर फिर से फ़ंक्शन को कहते हैं, जिसके साथ परिणाम जोड़ते हैं add_ellip। मैंने पहले से ही कम्प्यूटेड मानों को डिक्टेट में सहेज कर बेसिक डायनामिक प्रोग्रामिंग अप्रोच का उपयोग किया 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


महान, मैं ईमानदारी से अब किसी भी aSHers की उम्मीद नहीं की थी =) आप अनंत पर बिंदु को कैसे संभालते हैं? (ध्यान दें कि y^2 = x^3 + xएक वैध दीर्घवृत्तीय वक्र है और वक्र (0,0) ≠ 0पर एक बिंदु है!)
दोष

महान सवाल ... मुझे लगता है कि मैं इसे संभाल नहीं पाया! : मेरी क्षमायाचना, मुझे याद है कि पहली तस्वीर कहाँ B = 0और सोच रही थी कि कैसे 0काम करेगा ... और फिर मैं इसके बारे में भूल गया। मुझे लगता है कि मैंने मान लिया था कि Bकल देर रात कुछ बिंदु पर 0 नहीं हो सकता। क्या आपके पास इस बारे में कोई सुझाव है कि इसके लिए क्या इनपुट चाहिए? शायद अगर B = 0, तो परिभाषित करें 0 = (-1, -1)? मुझे इसे संभालने के लिए अपने कोड को समायोजित करने में खुशी हो रही है, मैं सिर्फ यह सोच रहा हूं कि यह अच्छा होगा यदि इसे अन्य सबमिशन के लिए भी मानकीकृत किया जाए ...
Rhyzomatic

वैसे मैंने उस पॉट को ऐसे खुला छोड़ दिया कि सबमिशन का उपयोग कर सकें जो उनके लिए सुविधाजनक है। लेकिन निश्चित रूप से आप कह सकते हैं कि उदाहरण के लिए वक्र पर सभी परिमित बिंदुओं में गैर-निर्देशांक होते हैं, और बाकी सब को इन्फिनिटी बिंदु या कुछ समान माना जाता है। या अगर यह आसान है तो आप यह भी मान सकते हैं कि इनपुट [0](केवल एक समन्वय) अनंत बिंदु है, या कुछ भी समान है!
निर्दोष

मुझे पता है कि अगर यह काफी अच्छी तरह से संभाल नहीं करता है। और धन्यवाद, कि वास्तव में मुझे 5 बाइट्स बचाए!
ऋजोमैटिक

@flawr, क्या आप मुझे बता पाएंगे कि क्या मैं कुशलता से कंप्यूटिंग के लिए सही रास्ते पर हूँ nP? विचारों को प्रवाहित करने के लिए क्या आप मुझे इस विषय पर किसी संसाधन की ओर संकेत कर सकते हैं? मैं एक कठिन समय के आसपास कुछ भी ढूँढने Googling कर रहा हूँ। धन्यवाद!
रिहाजोमैटिक

0

पायथन 3, 193 191 बाइट्स

Rhyzomatic's Pyth उत्तर और उनके Python तर्क पर आधारित एक समाधान । विशेष रूप से। मैं इसे पसंद किया है कि वे कैसे एक monic घन बहुपदीय के तीसरे जड़ पाया x^3 + bx^2 + cx + dआप दो जड़ें जब x_1और x_2है कि ध्यान देने योग्य बात से b == x_1 + x_2 + x_3है और उसके अनुसार घटाकर। अगर रूबी छोटी हो जाती है, तो मैं एक स्पष्टीकरण जोड़ने की कोशिश करता हूं, इस गोल्फ को, और शायद इसे रूबी में स्थानांतरित कर दूंगा।

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)

मुझे आश्चर्य है कि पायथन जवाब के रूप में पायथन दो बार से कम है!
21
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.