मॉड्यूलर गुणक व्युत्क्रम


22

आपका कार्य दो पूर्णांक संख्याओं को देना है, aऔर bयदि यह मौजूद है, तो मॉड्यूलर बी के मॉड्यूलर गुणक व्युत्क्रम की गणना करें।

की मॉड्यूलर उलटा aसापेक्ष bएक नंबर है cऐसा है कि ac ≡ 1 (mod b)। यह संख्या अद्वितीय सापेक्ष है bके किसी भी जोड़ी के लिए aऔर b। यह तभी मौजूद है जब सबसे बड़ा सामान्य विभाजक aऔर bहै 1

विकिपीडिया पृष्ठ यदि आप विषय के बारे में अधिक जानकारी की आवश्यकता मॉड्यूलर गुणक उलटा के लिए परामर्श किया जा सकता।

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

इनपुट को दो पूर्णांक या दो पूर्णांकों की सूची के रूप में दिया गया है। आपके कार्यक्रम को या तो एक ही संख्या में आउटपुट करना चाहिए, मॉड्यूलर गुणात्मक व्युत्क्रम जो अंतराल में है 0 < c < b, या कोई व्युत्क्रम नहीं होने का संकेत देने वाला मान है। मूल्य कुछ भी हो सकता है, रेंज में एक संख्या को छोड़कर (0,b), और एक अपवाद भी हो सकता है। हालाँकि मान उन मामलों के लिए समान होना चाहिए जिनमें कोई उलटा नहीं है।

0 < a < b ग्रहण किया जा सकता है

नियम

  • कार्यक्रम को कुछ बिंदु पर समाप्त करना चाहिए, और 60 सेकंड से कम समय में प्रत्येक परीक्षण मामले को हल करना चाहिए
  • मानक खामियां लागू होती हैं

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

नीचे दिए गए परीक्षण मामले प्रारूप में दिए गए हैं, a, b -> output

1, 2 -> 1
3, 6 -> Does not exist
7, 87 -> 25
25, 87 -> 7
2, 91 -> 46
13, 91 -> Does not exist
19, 1212393831 -> 701912218
31, 73714876143 -> 45180085378
3, 73714876143 -> Does not exist

स्कोरिंग

यह कोड गोल्फ है, इसलिए प्रत्येक भाषा के लिए सबसे छोटा कोड जीतता है।

यह और यह समान प्रश्न हैं, लेकिन दोनों विशिष्ट स्थितियों के लिए पूछते हैं।


6
यह Fermat के लिटिल प्रमेय से निकला है कि एक का गुणक व्युत्क्रम, यदि यह मौजूद है, तो इसे ^ (phi (b) -1) mod b के रूप में कुशलता से गणना की जा सकती है, जहां phi Euler का मुख्य कार्य है: phi (p0 ^ k0 * p1 ^) k1 * ...) = (p0-1) * p0 ^ (k0-1) * (p1-1) * p1 ^ (k1-1) * ... यह नहीं कहने से इसका कोड छोटा हो जाता है :)
ngn

1
@ जेनी_मैथी अतिरिक्त इनपुट लेना आमतौर पर अस्वीकृत है।
श्री एक्सकोडर

3
मैं छह जवाबों की गिनती करता हूं, जो क्रूरतापूर्ण लग रहे हैं, और सभी परीक्षण मामलों को 60 सेकंड में चलाने की संभावना नहीं है (उनमें से कुछ पहले एक स्टैक या मेमोरी त्रुटि देते हैं)।
अर्जन जोहान्सन

1
@ngn: आपने Euler के सुधार के साथ Fermat की छोटी प्रमेय (FLT) को जब्त कर लिया है। Fermat को यूलर फी फंक्शन के बारे में नहीं पता था। इसके अलावा, FLT और Euler का सुधार केवल तभी लागू होता है जब gcd (a, b) = 1. अंत में, आपने इसे जिस रूप में लिखा है, "a ^ (\ phi (b) -1) mod b" 1 के अनुरूप है, a नहीं ^ (- 1)। ^ (- 1) प्राप्त करने के लिए, ^ (\ phi (b) -2) mod b का उपयोग करें।
एरिक टावर्स

1
@ EricTowers यूलर एक परिणाम है। "जीसीडी (ए, बी) = 1" के बारे में - मैंने कहा "अगर यह [उलटा] मौजूद है"। क्या आप phi (b) -2 के बारे में निश्चित हैं?
ngn

जवाबों:


11

गणितज्ञ, 14 बाइट्स

अप्रचलित मैथमेटिका बिलिन :

ModularInverse

यह एक ऐसा फ़ंक्शन है जो दो तर्क ( aऔर b) लेता है , और यदि मौजूद है तो मॉड बी का व्युत्क्रम लौटाता है। यदि नहीं, तो यह त्रुटि देता है ModularInverse: a is not invertible modulo b.


7

जावास्क्रिप्ट (ईएस 6), 79 73 62 61 बाइट्स

falseप्रतिलोम मौजूद नहीं होने पर वापस लौटता है।

यह विस्तारित यूक्लिडियन एल्गोरिथ्म का उपयोग करता है और सभी परीक्षण मामलों को लगभग तुरंत हल करता है।

f=(a,b,c=!(n=b),d=1)=>a?f(b%a,a,d,c-(b-b%a)/a*d):b<2&&(c+n)%n

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


फ़ंक्शन f का नाम लिखना संभव नहीं है, जैसा कि f (c, a, b = 0, d = 1, n = a) => f? (A% c, c, d, b-) आ% c) / c * d, n): a <2 && (b + n)% n?
RosLuP

@RosLup f(x,y)हमेशा फ़ंक्शन कॉल के रूप में पार्स किया जाता है, सिवाय इसके कि यह functionकीवर्ड द्वारा स्पष्ट रूप से पहले हो । दूसरी ओर एक अनाम एरो फंक्शन, घोषित किया जाता है (x,y)=>somethingऔर f=(x,y)=>somethingफंक्शन को fवेरिएबल में असाइन करता है ।
अर्नुलद

4

जेली , 2 बाइट्स

æi

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

यह मॉड्यूलर उलटा के लिए एक अंतर्निहित का उपयोग करता है, और बिना किसी मॉड्यूलर व्युत्क्रम के 0 देता है।

जेली , 7 बाइट्स

R×%⁸’¬T

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

कोई मॉड्यूलर उलटा पर खाली सेट (खाली स्ट्रिंग के रूप में प्रतिनिधित्व) आउटपुट। सबसे बड़े परीक्षण-मामलों के लिए TIO पर मेमोरी से बाहर चलाता है, लेकिन पर्याप्त मेमोरी को देखते हुए काम करना चाहिए।

यह काम किस प्रकार करता है

R×%⁸’¬T  
R        Generate range of b
 ×       Multiply each by a
  %⁸     Mod each by b
    ’    Decrement (Map 1 to 0 and all else to truthy)
     ¬   Logical NOT
      T  Get the index of the truthy element.

यदि आप बड़े परीक्षण-मामलों के लिए काम करना चाहते हैं, तो इस (अपेक्षाकृत असंक्रमित) संस्करण को आज़माएं, जिसमें मेमोरी के बजाय बहुत समय की आवश्यकता होती है:

जेली, 9 बाइट्स

×⁴%³’¬ø1#

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

यह काम किस प्रकार करता है

×⁴%³’¬ø1#
        #   Get the first
      ø1      one integer
            which meets:
×⁴            When multiplied by a
  %³          And modulo-d by b
    ’         Decrement
     ¬        Is falsy

4

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

f=lambda a,b:a==1or-~b*f(-b%a,a)/a

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

पुनरावर्ती फ़ंक्शन जो देता Trueहै print f(1,2), जिसे मैं स्वीकार्य मानता हूं, और अमान्य इनपुट के लिए त्रुटियां।

हम खोजने की कोशिश कर रहे हैं एक्स में एक्स1(आधुनिक)

एक्स-1=कश्मीरकश्मीर

ले रहा आधुनिक-1कश्मीर(आधुनिक)-कश्मीर1(आधुनिक)कश्मीर

कश्मीर(-%,)

कश्मीरएक्स-1=कश्मीरएक्सकश्मीर+1


3

आर + संख्या , 15 बाइट्स

numbers::modinv

मॉड के बिना NAउन लोगों के लिए रिटर्न ।ab

आर-फिडल इसे आज़माने के लिए!

आर , 33 बाइट्स (गैर-प्रतिस्पर्धात्मक)

यह बहुत बड़े पैमाने पर विफल होगा bक्योंकि यह वास्तव में आकार 32*bबिट्स का एक वेक्टर बनाता है ।

function(a,b)which((1:b*a)%%b==1)

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

integer(0)उन लोगों के लिए रिटर्न (एक खाली सूची)aबिना प्रतिरूप वाले मॉड केb


3

गणितज्ञ, 18 बाइट्स

PowerMod[#,-1,#2]&

इनपुट

[३१, 7३ 31१४66६१४३]


3

अजगर 2 , 51 49 54 53 51 49 बाइट्स

आधिकारिक
बाइट के लिए -1 बाइट धन्यवाद - झबरा के लिए बाइट धन्यवाद

a,b=input()
i=a<2
while(a*i%b-1)*b%a:i+=1
print+i

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

0जब कोई समाधान नहीं होता है तो प्रिंट करता है।


1
आउटपुट 0के लिए a=1और b=2; परीक्षण मामलों से, यह आउटपुट होना चाहिए 1
झबरा


1
जैसा कि शैगी ने बताया, के लिए विफल रहता है2, 1
श्री एक्सकोडर

@ शैगी को अब काम करना चाहिए
रॉड

यह इनपुट के लिए 60 सेकंड (TIO पर) में एक उत्तर देने में विफल रहता है 31,73714876143
इल्मरी करोनन

3

जाप , by बाइट्स

रिवर्स ऑर्डर में इनपुट लेता है। -1बिना किसी मैच के आउटपुट । बड़े पूर्णांक के रूप में क्रेप्स बड़े हो जाते हैं।

Ç*V%UÃb1

झसे आज़माओ

  • ईटीएच को एक गलत, और बहुत स्पष्ट, स्थान की ओर इशारा करते हुए 1 बाइट का धन्यवाद।

परीक्षण इनपुट 73714876143,31फ़ायरफ़ॉक्स पर एक आउट-ऑफ-मेमोरी त्रुटि (और क्रोमियम को क्रैश करने के लिए) लगता है। मुझे नहीं लगता कि यह एक मान्य उत्तर है।
इल्मरी करोनें

@ इल्मारिकारोन: मैंने अपने समाधान में स्पष्ट रूप से उस तथ्य को बताया। हम कोड गोल्फ के प्रयोजनों के लिए अनंत स्मृति ग्रहण कर सकते हैं ताकि मेमोरी समस्याएँ और क्रैश इस समाधान को अमान्य न करें।
झबरा

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


2

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

lambda a,b:[c for c in range(b)if-~c*a%b==1][0]+1

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

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

lambda a,b:[c for c in range(1,b+1)if c*a%b==1][0]

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

यह IndexError: list index out of rangeनियम के अनुसार अनुमत होने की स्थिति में कोई थ्रेशर गुणक व्युत्क्रम नहीं है, यह फेंकता है।


यह 31,7371487614360 सेकंड (TIO पर) इनपुट के लिए एक परिणाम वापस करने में विफल रहता है ।
इल्मरी करोनन

@ImariariKaronen मेरी मशीन पर 56 सेकंड में खत्म होती है (मैकबुक प्रो '15)
श्री एक्सकोडर

2

8 वें , 6 बाइट्स

कोड

invmod

व्याख्या

invmodएक 8 वीं शब्द है जो की प्रतिलोम का मूल्यांकन है a, सापेक्ष b। यह nullअतिप्रवाह या अन्य त्रुटियों पर लौटता है ।

उपयोग और परीक्षण के मामले

ok> 1 2 invmod .
1
ok> 3 6 invmod .
null
ok> 7 87 invmod .
25
ok> 25 87 invmod .
7
ok> 2 91 invmod .
46
ok> 13 91 invmod .
null
ok> 19 1212393831 invmod .
701912218
ok> 31 73714876143 invmod .
45180085378
ok> 3 73714876143 invmod .
null


2

जे , 28 बाइट्स

4 :'(1=x+.y)*x y&|@^<:5 p:y'

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

यूलर के प्रमेय का उपयोग करता है । प्रतिलोम 0 मौजूद नहीं होने पर वापस लौटाता है।

व्याख्या

4 :'(1=x+.y)*x y&|@^<:5 p:y'  Input: a (LHS), b (RHS)
4 :'                       '  Define an explicit dyad - this is to use the special
                              form `m&|@^` to perform modular exponentiation
                          y   Get b
                      5 p:    Euler totient
                    <:        Decrement
             x                Get a
                   ^          Exponentiate
               y&|@             Modulo b
       x+.y                   GCD of a and b
     1=                       Equals 1
            *                 Multiply

2

अजगर , 10 बाइट्स

3 बाइट्स @Jakube की बदौलत बच गए

xm%*szdQQ1

यहाँ कोशिश करो!

-1कोई गुणात्मक व्युत्क्रम के लिए रिटर्न ।

कोड ब्रेकडाउन

xm%*szdQQ1      Let Q be the first input.
 m      Q       This maps over [0 ... Q) with a variable d.
   *szd         Now d is multiplied by the evaluated second input.
  %    Q        Now the remained modulo Q is retrieved.
x        1      Then, the first index of 1 is retrieved from that mapping.

पायथ , 15 13 बाइट्स

KEhfq1%*QTKSK

यदि कोई गुणात्मक प्रतिलोम मौजूद नहीं है तो अपवाद छोड़ देता है।

यहाँ कोशिश करो!

अजगर , 15 बाइट्स

Iq1iQKEfq1%*QTK

यह मामले को संभालने के लिए बहुत सारे बाइट्स जोड़ता है जहां ऐसी कोई संख्या मौजूद नहीं है। यदि उस मामले को संभालने की आवश्यकता नहीं होगी तो कार्यक्रम को काफी छोटा किया जा सकता है:

fq1%*QTK

यहाँ कोशिश करो!


2 बाइट्स के साथ बचायाKExm%*QdKK1
जेक्यूब

या 3 बाइट्स यदि आप आदानों के क्रम को स्वैप करते हैं:xm%*szdQQ1
जक्यूब

@Jakube बहुत बहुत धन्यवाद, संपादन!
श्री Xcoder

यह कैसे काम करता है?
क्रिति लिथोस

@Cowsquack मैंने एक पूरी तरह से आदिम कोड टूटने को जोड़ा है, लेकिन rn मेरे पास पूर्ण विवरण शामिल करने का समय नहीं है। उम्मीद है कि यह अभी के लिए पर्याप्त है, लेकिन मैं जल्द ही एक और पूर्ण विवरण जोड़ने की कोशिश करूंगा।
श्री एक्सकोडर

1

सी (जीसीसी) , 115 बाइट्स

#define L long long
L g(L a,L b,L c,L d){return a?g(b%a,a,d-b/a*c,c):b-1?0:d;}L f(L a,L b){return(g(a,b,1,0)+b)%b;}

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

विस्तारित यूक्लिडियन एल्गोरिथ्म, पुनरावर्ती संस्करण

सी (जीसीसी) , 119 बाइट्स

long long f(a,b,c,d,t,n)long long a,b,c,d,t,n;{for(c=1,d=0,n=b;a;a=t)t=d-b/a*c,d=c,c=t,t=b%a,b=a;return b-1?0:(d+n)%n;}

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

विस्तारित यूक्लिडियन एल्गोरिथ्म, पुनरावृत्त संस्करण


1

सी (जीसीसी) , 48 110 104 बाइट्स

#define f(a,b)g(a,b,!b,1,b)
long g(a,b,c,d,n)long a,b,c,d,n;{a=a?g(b%a,a,d,c-(b-b%a)/a*d):!--b*(c+n)%n;}

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

यह 60 सेकंड के भीतर सभी इनपुट के साथ काम करना चाहिए (जो लंबे समय के भीतर फिट हो)।

संपादित करें। मैं पहले से ही nवैरिएबल का दुरुपयोग कर रहा हूं, इसलिए मैं यह मान सकता हूं कि जीसीसी पहला काम करता है %rax


1
काश, यह लूप के अंदर पूर्णांक अतिप्रवाह के कारण काफी छोटे इनपुट के लिए भी गलत परिणाम देता है। उदाहरण के लिए, f(3,1000001)717 लौटाता है, जो स्पष्ट रूप से बकवास है (सही उत्तर 333334 है)। इसके अलावा, भले ही यह बग एक व्यापक पूर्णांक प्रकार का उपयोग करके तय किया गया था, लेकिन इस क्रूर बल दृष्टिकोण को चुनौती में दिए गए कुछ बड़े परीक्षण मामलों के लिए निश्चित रूप से समय दिया जाएगा।
इल्मरी करोनन


0

Axiom, 45 बाइट्स

f(x:PI,y:PI):NNI==(gcd(x,y)=1=>invmod(x,y);0)

0 त्रुटि के लिए x * z मॉड y = 1 के साथ z वापस करें


0

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

-3 बाइट्स मिस्टर एक्सकोडर की बदौलत।

f=lambda a,b,i=1:i*a%b==1and i or i<b and f(a,b,i+1)

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

Falseबिना हल के आउटपुट और त्रुटियां bबड़ी हो जाती हैं।

एंबेडेड TIO

मैं स्टैक स्निपेट्स में आईफ्रेम का परीक्षण कर रहा हूं और वे बिल्कुल शानदार हैं।


मुझे यकीन नहीं है कि यह काम करता है, नहीं i*a%bहो सकता है 0?
गेहूं जादूगर

इनपुट के लिए "अधिकतम पुनरावर्तन गहराई पार हो गई" त्रुटि के साथ विफल (31,73714876143)
इल्मरी करोनन

0

जावास्क्रिप्ट (ईएस 6), 42 41 39 38 बाइट्स

falseबिना किसी मैच के आउटपुट । एक अतिप्रवाह त्रुटि को फेंक देगा क्योंकि दूसरी संख्या बहुत बड़ी हो जाती है।

x=>y=>(g=z=>x*z%y==1?z:z<y&&g(++z))(1)

0

जेली , 27 बाइट्स

²%³
⁴Ç⁹Сx⁸
ÆṪ’BṚçL$P%³×gỊ¥

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

मॉड्यूलर घातांक के साथ यूलर के प्रमेय का उपयोग करता है। चूँकि जैली के पास मॉड्यूलर एक्सपेंनेशन करने के लिए एक बिलिन नहीं है, इसलिए इसे लागू करना पड़ा, और इसने अधिकांश बाइट्स ले लिए।


0

Axiom, 99 बाइट्स

w(a,b,x,u)==(a=0=>(b*b=1=>b*x;0);w(b rem a,a,u,x-u*(b quo a)));h(a,b)==(b=0=>0;(b+w(a,b,0,1))rem b)

यह फ़ंक्शन h () का उपयोग करता है; एच (ए, बी) वापसी 0 अगर त्रुटि [उलटा मौजूद नहीं है] अन्यथा यह जेड को ऐसे लौटाता है कि * z mod b = 1 यह ठीक होगा भले ही तर्क नकारात्मक हो ...

यह सामान्य egcd () फ़ंक्शन होगा जो इंट की सूची को फिर से लिखता है (इसलिए वे नकारात्मक भी हो सकते हैं)

egcd(aa:INT,bb:INT):List INT==
   x:=u:=-1   -- because the type is INT
   (a,b,x,u):=(aa,bb,0,1)
   repeat
      a=0=>break
      (q,r):=(b quo a, b rem a)
      (b,a,x,u):=(a,r,u,x-u*q)
   [b,x, (b-x*aa)quo bb]

इसका उपयोग यह है

(7) -> h(31,73714876143)
   (7)  45180085378
                                                    Type: PositiveInteger

मैं इंटरनेट से आधार को https://pastebin.com/A13ybryc से ढूँढता हूँ

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