वर्गमूल एक संख्या


13

कार्य इस प्रकार है: एक धनात्मक पूर्णांक xऔर एक प्रधान को देखते हुए n > x, सबसे छोटे धनात्मक पूर्णांक को yइस तरह से आउटपुट करते हैं (y * y) mod n = x। इस सवाल का एक महत्वपूर्ण हिस्सा नीचे निर्दिष्ट समय सीमा है जिसमें क्रूर बल समाधान शामिल नहीं है।

यदि ऐसा कोई मूल्य नहीं है, yतो आपका कोड आउटपुट होना चाहिए N

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

(2, 5, N), 
(3, 5, N), 
(4, 5, 2),
(524291, 1048583, N),
(529533, 1048583, N),
(534775, 1048583, 436853),
(540017, 1048583, 73675),
(536870913, 1073741827, 375394238),
(542239622, 1073741827, 267746399),
(547608331, 1073741827, N),
(552977040, 1073741827, 104595351),
(1099511627676, 1099511627791, N),
(1099511627677, 1099511627791, 269691261521),
(1099511627678, 1099511627791, 413834069585),
(1267650600228229401496703204376, 1267650600228229401496703205653, 5312823546347991512233563776),
(1267650600228229401496703204476, 1267650600228229401496703205653, N)
(1267650600228229401496703204576, 1267650600228229401496703205653, N)
(1267650600228229401496703204676, 1267650600228229401496703205653, 79905476259539917812907012931)

इनपुट और आउटपुट

आप इनपुट ले सकते हैं और किसी भी तरह से आउटपुट दे सकते हैं जो सुविधाजनक हो। अगर आपको आउटपुट करना पसंद नहीं है Nतो कोई भी Falseyवैल्यू करेगा।

प्रतिबंध

आपके कोड को मानक डेस्कटॉप पर 1 मिनट से कम समय में सभी परीक्षण मामलों का जवाब देना चाहिए। यह समय सीमा केवल क्रूर बल उत्तरों को रोकने के लिए है और मुझे अच्छे उत्तरों की उम्मीद है कि यह लगभग तुरंत चले। आप किसी भी पुस्तकालय या बिलिन का उपयोग नहीं कर सकते हैं जो इस समस्या को हल करता है या यह जांचता है कि क्या संख्या एक द्विघात अवशेष है।


2
तो बड़े-पूर्णांक डेटा प्रकार के समर्थन के बिना भाषाओं को खारिज कर दिया जाता है। दया
लुइस मेंडू

1
@LuisMendo यदि आप 1267650600228229401496703205653स्वयं के लिए समर्थन कोड नहीं कर सकते हैं या यदि आपके पास __int128gcc जैसे 128 बिट समर्थन हैं । विभिन्न भाषाओं के लिए 256 बिट इंट लाइब्रेरियों की संख्या भी है। अंत में, बहुत सी भाषाओं में एक मनमानी परिशुद्धता int पुस्तकालय है।

जवाबों:


7

पायथ, 83 82 बाइट्स

=eAQM.^GHQKf%=/H=2;1=gftgT/Q;1HJg~gGHh/H2WtG=*J=gT^2t-K=Kfq1gG^2T1=%*G=^T2Q;hS%_BJ

परीक्षण सूट

यह कार्यक्रम टोनेली-शैंक एल्गोरिथ्म को लागू करता है । मैंने इसे विकिपीडिया पृष्ठ के निकट से लिखा है। यह इनपुट के रूप में लेता है (n, p)

एक वर्गमूल की अनुपस्थिति को निम्नलिखित त्रुटि से सूचित किया जाता है:

TypeError: pow() 3rd argument not allowed unless all arguments are integers

यह बहुत ही जटिल गोल्फ कोड है, जिसे अनिवार्य शैली में लिखा गया है, क्योंकि यह पाइथ की अधिक सामान्य कार्यात्मक शैली के विपरीत है।

पायथ का एक सूक्ष्म पहलू =जो मैं उपयोग कर रहा हूं , जो कि यदि एक चर द्वारा अनुसरण नहीं किया जाता है, तो अगले चर के लिए कार्यक्रम में आगे की खोज करता है, फिर उस चर के लिए निम्नलिखित अभिव्यक्ति का परिणाम बताता है, फिर उस परिणाम को लौटाता है। मैं विकिपीडिया पृष्ठ के लिए स्पष्टीकरण में उल्लेख करूंगा: टोनेली-शैंक एल्गोरिथ्म , जैसा कि मैं जिस एल्गोरिथ्म को लागू कर रहा हूं वह है।

स्पष्टीकरण:

=eAQ

Aइनपुट के रूप में एक 2-ट्यूपल लेता है, Gऔर Hक्रमशः और उसके मानों को निर्दिष्ट करता है, और उसका इनपुट लौटाता है। Qप्रारंभिक इनपुट है। eकिसी अनुक्रम का अंतिम तत्व देता है। इसके बाद स्निपेट, Gहै n, Hऔर Qहैं p

M.^GHQ

Mएक 2 इनपुट फ़ंक्शन को परिभाषित करता है g, जहां इनपुट होते हैं Gऔर H.^पाइथ का तेज मॉड्यूलर एक्सपेंनेशन फंक्शन है। इस स्निपेट gका अर्थ है प्रतिपादक मॉड Q

Kf%=/H=2;1

fझूठे लूप तक एक दोहराने को परिभाषित करता है, और 1इसके इनपुट के रूप में दिए गए पुनरावृत्तियों की संख्या देता है । लूप के प्रत्येक पुनरावृत्ति के दौरान, हम H2 से विभाजित करते हैं , Hउस मान पर सेट करते हैं, और जांचते हैं कि परिणाम विषम है या नहीं। एक बार यह हो जाए तो हम रुक जाते हैं। Kस्टोर किए गए पुनरावृत्तियों की संख्या।

एक बहुत मुश्किल बात है =2;बिट। =अगले चर के लिए आगे की खोज, जो है T, इसलिए T2 पर सेट है। हालांकि, Tएक fलूप के अंदर पुनरावृत्ति काउंटर है, इसलिए हम वैश्विक वातावरण से ;मूल्य प्राप्त करने के लिए उपयोग करते हैं T। यह व्हाट्सएप के कुछ बाइट्स को बचाने के लिए किया जाता है जिन्हें अन्यथा संख्याओं को अलग करने की आवश्यकता होगी।

इस स्निपेट के बाद, Kहै Sविकिपीडिया लेख (विकी) से, और Hहै Qविकी है, और Tहै 2

=gftgT/Q;1H

अब, हमें एक द्विघात गैर-मापक मॉड खोजने की आवश्यकता है p। हम यूलर मानदंड का उपयोग करके इसे बाध्य करेंगे। /Q2है (p-1)/2के बाद से, /फर्श विभाजन है, इसलिए ftgT/Q;1पहले पूर्णांक पाता है Tजहां T ^ ((p-1)/2) != 1, के रूप में वांछित। याद है कि ;फिर Tसे वैश्विक वातावरण से खींचता है, जो अभी भी 2 है। यह परिणाम zविकि से है।

अगला, cविकी से बनाने के लिए, हमें आवश्यकता है z^Q, इसलिए हम उपरोक्त को लपेटते g ... Hहैं और परिणाम को असाइन करते हैं T। अब Tहै cविकी है।

Jg~gGHh/H2

आइए इसे अलग करें ~gGH:। ~जैसा है =, लेकिन वैरिएबल का मूल मान लौटाता है, इसका नया मूल्य नहीं। इस प्रकार, यह लौटता है G, जो nविकि से है।

यह Jमान प्रदान करता है n^((Q+1)/2), जो Rविकि से है।

अब, निम्नलिखित प्रभावी होता है:

~gGH

यह Gमान असाइन करता है n^Q, जो tविकि से है।

अब, हमारे पास हमारे लूप चर सेट अप हैं। M, c, t, Rविकी से हैं K, T, G, J

लूप का शरीर जटिल है, इसलिए मैं इसे व्हाट्सएप के साथ प्रस्तुत करने जा रहा हूं, जिस तरह से मैंने इसे लिखा है:

WtG
  =*J
    =
      gT^2
        t-
          K
          =Kfq1gG^2T1
  =%*G=^T2Q;

सबसे पहले, हम जांचते हैं कि क्या G1. यदि ऐसा है, तो हम लूप से बाहर निकलते हैं।

अगला कोड जो चलता है वह है:

=Kfq1gG^2T1

यहां, हम iइस तरह के पहले मूल्य की खोज करते हैं G^(2^i) mod Q = 1, जो कि 1 से शुरू होता है। परिणाम में सहेजा गया है K

=gT^2t-K=Kfq1gG^2T1

यहां, हम पुराने मान को लेते हैं K, के नए मान को Kघटाते हैं, 1 को घटाते हैं, उस शक्ति को 2 बढ़ाते हैं, और फिर Tउस पावर मॉड को बढ़ाते हैं Qऔर फिर परिणाम को असाइन करते हैं T। यह विकी से Tसमान बनाता है b

यह वह रेखा भी है जो लूप को समाप्त कर देती है और यदि कोई समाधान नहीं है तो विफल हो जाता है, क्योंकि उस स्थिति में नए मूल्य का Kमान पुराने मूल्य के बराबर होगा K, 2 को उठाया जाएगा -1, और मॉड्यूलर घातांक एक त्रुटि उठाएगा।

=*J

अगला, हम Jउपरोक्त परिणाम से गुणा करते हैं और इसे अपडेट करते Jहुए वापस स्टोर करते हैं R

=^T2

फिर हम Tपरिणाम को वापस स्क्वायर में स्टोर करते हैं T, विकी से Tवापस सेट cकरते हैं।

=%*G=^T2Q

फिर हम Gउस परिणाम से गुणा करते हैं , इसे मॉड लेते हैं Qऔर परिणाम को वापस स्टोर करते हैं G

;

और हम लूप को समाप्त करते हैं।

लूप के खत्म होने के बाद, मॉड Jका एक वर्गमूल है । सबसे छोटा खोजने के लिए, हम निम्नलिखित कोड का उपयोग करते हैं:np

hS%_BJ

_BJकी सूची बनाता है Jऔर इसकी उपेक्षा, %स्पष्ट Qरूप से इसके दूसरे तर्क के रूप में लेता है, और % ... Qअनुक्रम के प्रत्येक सदस्य पर लागू करने के लिए पायथ के डिफ़ॉल्ट व्यवहार का उपयोग करता है । फिर Sसूची को क्रमबद्ध करता है और hइसके पहले सदस्य को न्यूनतम लेता है।


11

पायथन 2, 166 बाइट्स

def Q(x,n,a=0):
 e=n/2
 while pow(a*a-x,e,n)<2:a+=1
 w=a*a-x;b=r=a;c=s=1
 while e:
    if e%2:r,s=(r*b+s*c*w)%n,r*c+s*b
    b,c=(b*b+c*c*w)%n,2*b*c;e/=2
 return min(r,-r%n)

%timeit Q(1267650600228229401496703204676,1267650600228229401496703205653) 100 loops, best of 3: 2.83 ms per loop :)

3
क्या शानदार जवाब है! आपने पीपीसीजी में मेरा विश्वास बहाल किया है।

5
नौसिखिया सवाल का बहाना, लेकिन क्या पीपीसीजी? पोलिश पायथन कोडर्स समूह?
उल्टा इंजीनियर

@DaveBoltman प्रोग्रामिंग पहेलियाँ और कोड गोल्फ।
orlp

6

सेजमैथ , 93 बाइट्स

बहुत कठिन समस्या को कम करने के लिए जिसके लिए सेजमैथ में तेजी से पर्याप्त बिल्डिंग्स होते हैं।

def f(x,n):g=primitive_root(n);k=Zmod(n)(x).log(g);y=pow(g,k//2,n);return k%2<1and min(y,n-y)

इसे SageMathCell पर आज़माएं


2
यह कमी काफी मज़ेदार है :)

3

हास्केल , 326 बाइट्स

आमतौर पर मैं जानवर बल के जवाब पसंद करता हूं .. चूँकि यह समय सीमा द्वारा दृढ़ता से हतोत्साहित किया जाता है, यहाँ सबसे कुशल तरीका मुझे पता है:

r p=((\r->min(mod(-r)p)r)$).f p
f p x|p==2=x|q x=f 0 0|mod p 4==3=x&div(p+1)4|let(r,s)=foldl i(p-1,0)[1..t 1o]=m$x&(d$r+1)*(b&d s)where q a=1/=a&o;m=(`mod`p);a&0=1;a&e|even e=m$a&d e^2|0<1=m$(a&(e-1))*a;b=[n|n<-[2..],q n]!!0;i(a,b)_|m(x&d a*b&d b)==p-1=(d a,d b+o)|0<1=(d a,d b);o=d p;t y x|even x=t(y+1)(d x)|0<1=y;d=(`div`2)

इसे ऑनलाइन आज़माएं!

मुझे यकीन है कि इसे और नीचे ले जाया जा सकता है, लेकिन अभी के लिए यह करना चाहिए।


क्या आप TIO कोड को संशोधित कर सकते हैं ताकि यह आउटपुट के रूप में उत्तर दे सके? मुझे फिलहाल "सच्चा" मिलता है।


@ लेम्बिक आपको testCasesउन मूल TIO से बदलने की आवश्यकता है , यह उनके बिना भी एक टिप्पणी में मुश्किल से फिट होते हैं।
अर्जन जोहान्सन

@ !RjanJohansen बहुत बहुत धन्यवाद! मैंने अपना उत्तर आपके कोड के साथ समायोजित किया और प्रतिस्थापित किया testCases
ბიმო

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