এলিপটিক কার্ভগুলিতে যোগ করা


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যাই যার মূলটি বিন্দুর সহ-সমন্বয় R। ( -R। খুব প্রতিসাম্য কারণ মনে রাখবেন যদি R = (x2,y2)তারপর -R = (x2,-y2)-গ্রুপ থেকে নয়; এটি একটি ভেক্টর বিয়োগ নয়।)

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। অন্যান্য ক্ষেত্রে পাটিগণিত অনেক জটিল much

এটি এই উদাহরণটিতে আমরা সেট করে 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এটি প্রধান।

পরীক্ষার মামলা

আমি ম্যাটল্যাব / অক্টাভেতে একটি (খুব মার্জিত নয়) বাস্তবায়ন করেছি, যা আপনি নিজের পরীক্ষার ক্ষেত্রে ব্যবহার করতে পারেন: আদর্শ one.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)এখানে আরও তথ্য।

উপাঙ্গ

আমার খসড়াটি পর্যালোচনা ও সম্পাদনা করার জন্য আপনাকে প্রথমে আপনাকে @ এল'এন্ডিয়াস্টারম্যানকে ধন্যবাদ জানাই!

উপবৃত্তাকার বক্ররেখা কেন?

ভাল এটি একরকম স্বেচ্ছাচারী সমীকরণের মতো উপস্থিত হতে পারে তবে এটি সাধারণ নয়: সাধারণত আমরা ভবিষ্যদ্বাণী বিমানে সেই জ্যামিতিক "আকারগুলি" বিবেচনা করি (এটিই "অনন্ত" এসেছে। সেখানে আমরা সমস্ত সমজাতীয় বিবেচনা করি There তৃতীয় ডিগ্রির বহুবর্ষ । (নিম্ন বা উচ্চতর ডিগ্রি প্রাপ্তরা পরীক্ষা করা খুব কঠিন বা কেবল তুচ্ছ হবে।) আমরা চাই এমন দুর্দান্ত বৈশিষ্ট্য পাওয়ার জন্য কিছুটা বিধিনিষেধ প্রয়োগ করার পরে এবং সেই বহুবর্ষগুলি ডিহমোজেনাইজ করার পরে (তিনটি অ্যাফাইন প্লেনের মধ্যে একটিতে প্রবর্তন করা) ) আমরা সমীকরণ মত শেষ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, এই ধরণের ক্ষেত্রগুলির জন্য সংক্ষিপ্ত weierstrass আকারে বক্ররেখা রাখা অসম্ভব করে তোলে।

এককথায় কী কী?

যদি সমীকরণটি 4A^3+27B^2=0ধারণ করে, আমাদের নীচের মতো একাগ্রতা রয়েছে: আপনি যখন এই পয়েন্টগুলিতে দেখেন যে আপনি একটি অনুভূত এবং কোনও স্পর্শক খুঁজে পেতে পারেন না, যা অপারেশনটিকে "হত্যা করে"। আপনি সমীকরণ তাকান y^2 = x^3বা হতে পারেy^2 = x^3-3*x+2

কেন তাদের উপবৃত্তাকার বক্ররেখা বলা হয়?

কারণটি হ'ল এই আকারের সমীকরণগুলি উপবৃত্তাকার ইন্টিগ্রালগুলিতে পপ আপ হয়, উদাহরণস্বরূপ, যখন আপনি একটি ক্যালকুলেট করতে চান তখন আপনি যা পাবেন যেমন একটি উপবৃত্তের ধনু দৈর্ঘ্য। নামের উত্স সম্পর্কে একটি সংক্ষিপ্ত স্লাইডশো।

ক্রিপ্টোগ্রাফি দিয়ে তাদের কী করার আছে?

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রেখার theাল গণ্য করতে সক্ষম হ'ল , ডিনোমিনেটরের মডিউলার গুণিত বিপরীতটি আবিষ্কার করে এবং এটির সাথে অঙ্ক করে lying খুব সহজ। পাইথন ফাংশনটি ব্যবহারের কারণে আরও বেশি দক্ষতার সাথে বড় সমস্যাগুলি গণনা করা উচিত 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


দুর্দান্ত, আমি সত্যিই আর কোনও নতুন উত্থাপনের আশা করিনি =) আপনি কীভাবে অসীম বিন্দুটিকে পরিচালনা করবেন? (দ্রষ্টব্য যে y^2 = x^3 + xএটি একটি বৈধ উপবৃত্তাকার বক্ররেখা এবং বক্ররেখার (0,0) ≠ 0একটি বিন্দু!)
flawr

দুর্দান্ত প্রশ্ন ... আমি মনে করি আমি এটি পরিচালনা করি নি! : পি আমার ক্ষমা, আমার মনে আছে প্রথম ছবিটি কোথায় দেখলাম B = 0এবং ভাবছিলাম কীভাবে 0কাজ করবে ... এবং তারপরে আমি এটি সম্পর্কে ভুলে গেছি। আমি মনে করি Bশেষ রাতে গভীরভাবে আমি 0 হতে পারব না। এর জন্য ইনপুটটি কী পছন্দ করতে পারে সে সম্পর্কে আপনার কোনও পরামর্শ আছে? সম্ভবত যদি B = 0, তারপর সংজ্ঞা 0 = (-1, -1)? আমি আমার কোডটি এটি পরিচালনা করতে সামঞ্জস্য করতে পেরে খুশি, আমি কেবল ভাবছি এটি যদি অন্য
সাবমিশনের জন্যও মানিক করা

ওয়েল আমি যে পন্টটি এমনভাবে খোলা রেখেছি যাতে জমাগুলি তাদের জন্য যা উপযুক্ত তা ব্যবহার করতে পারে। তবে অবশ্যই আপনি বলতে পারেন যে, যেমন বক্ররেখাতে সমস্ত সীমাবদ্ধ বিন্দুর ননজেগেটিক স্থানাঙ্ক থাকে এবং অন্য সমস্ত কিছুই ইনফিনিটি পয়েন্ট বা এর মতোই কিছু হিসাবে বিবেচিত হয়। অথবা যদি এটি আরও সহজ হয় তবে আপনিও ধরে নিতে পারেন যে ইনপুটটি [0](কেবলমাত্র একটি সমন্বিত) হল ইনফিনিটি পয়েন্ট, বা এর অনুরূপ কিছু!
flawr

যদি এটি যথেষ্ট পরিমাণে পরিচালনা করে না তবে আমাকে জানান। এবং ধন্যবাদ, এটি আসলে আমাকে 5 বাইট সংরক্ষণ করেছে!
রাইজোম্যাটিক

@ ফ্লোয়ার, দক্ষতার সাথে কম্পিউটিংয়ের জন্য যদি আমি সঠিক পথে আছি তবে আপনি কি আমাকে বলতে পারবেন nP? চিন্তাভাবনা প্রবাহিত করতে আপনি কি আমাকে বিষয়টির কোনও সংস্থানকে নির্দেশ করতে পারেন? গুগলিংয়ের আশেপাশে কিছু খুঁজে পেতে আমার খুব কষ্ট হচ্ছে। ধন্যবাদ!
রাইজোম্যাটিক

0

পাইথন 3, 193 191 বাইট

রাইজোম্যাটিকের পাইথ উত্তর এবং তাদের পাইথন যুক্তির ভিত্তিতে একটি সমাধান । নির্দিষ্টভাবে. আমি পছন্দ কিভাবে তারা একটি 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)

আমি আশ্চর্য যে পাইথন উত্তর পাইথার চেয়ে দ্বিগুণেরও কম লম্বা!
flawr
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.