पूर्णांक modulo 100000000003 के व्युत्क्रम की गणना करें


21

कार्य निम्नलिखित है। किसी पूर्णांक x(जैसे कि xमोडुलो के 100000000003बराबर नहीं है 0) को अपने कोड में प्रस्तुत करना किसी भी तरह से आपको सुविधाजनक लगता है, आउटपुट एक और पूर्णांक बनाता है y < 100000000003ताकि(x * y) mod 100000000003 = 1

आप कोड के लिए एक मानक डेस्कटॉप मशीन पर चलाने के लिए कम से कम 30 मिनट लग चाहिए किसी भी इनपुट xऐसा है कि|x| < 2^40

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

इनपुट: 400000001. आउटपुट: 65991902837

इनपुट: 4000000001. आउटपुट: 68181818185

इनपुट: 2. आउटपुट: 50000000002

इनपुट: 50000000002. आउटपुट: 2।

इनपुट: 1000000. आउटपुट: 33333300001

प्रतिबंध

आप किसी भी पुस्तकालयों या बिलिन कार्यों का उपयोग नहीं कर सकते हैं जो मोडुलो अंकगणित (या इस उलटा संचालन) करते हैं। इसका मतलब है कि आप इसे a % bलागू किए बिना भी नहीं कर सकते% खुद । आप हालांकि अन्य सभी गैर-मोडुलो अंकगणितीय अंतर्निहित कार्यों का उपयोग कर सकते हैं।

इसी तरह का सवाल

यह इस सवाल से मिलता-जुलता है, हालांकि उम्मीद है कि अभी भी काफी अलग है।


तो a- (a / b) * b ठीक है?
user253751

@ मिनीबिस जो ठीक लगे।

टैग: प्रतिबंधित कोड?
फेलिप नार्दी बतिस्ता

1
इसमें क्या खास है 100000000003? (जरा सोचकर)
NoOneIsHere

1
@ लेम्बिक उस मामले में, क्या आप उस आवश्यकता का उल्लेख कर सकते हैं जो प्रश्न में y <100000000003 है?
isaacg

जवाबों:


16

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

L-b*/bJ+3^T11Jy*uy^GT11Q

परीक्षण सूट

यह इस तथ्य का उपयोग करता है कि ए ^ (पी -2) मॉड पी = ए ^ -1 मॉड पी।

सबसे पहले, मैं मैन्युअल रूप से मापांक को फिर से लागू करता हूं, विशिष्ट 100000000003 के मामले के लिए। मैं सूत्र का उपयोग करता हूं a mod b = a - (a/b)*b, जहां /फ़्लॉइड विभाजन है। मैं 10^11 + 3कोड के साथ , मापांक का उपयोग करके उत्पन्न करता हूं +3^T11, फिर इसे सहेजता हूं J, फिर b और mod 100000000003 की गणना करने के लिए इस और उपरोक्त सूत्र का उपयोग करता हूं -b*/bJ+3^T11J। इस फ़ंक्शन को इसके yसाथ परिभाषित किया गया हैL

अगला, मैं इनपुट से शुरू करता हूं, फिर इसे दसवीं शक्ति पर ले जाता हूं और मॉड 100000000003 को कम करता हूं, और इस 11 बार दोहराता हूं। y^GTप्रत्येक चरण में निष्पादित कोड है, औरuy^GT11Q इसे इनपुट के साथ शुरू होने पर 11 बार चलाता है।

अब मेरे पास है Q^(10^11) mod 10^11 + 3, और मैं चाहता हूं Q^(10^11 + 1) mod 10^11 + 3, इसलिए मैं इनपुट के साथ गुणा करता हूं *, इसे yएक अंतिम समय, और आउटपुट के साथ 100000000003 मॉड कम करता हूं ।


वाकई बहूत बढिया!

मैं अनुमान लगा रहा हूं कि मुझे परीक्षण मामलों को कसने में बहुत देर हो चुकी है ....

1
@ लेम्बिक मैं इसे वैसे भी करूंगा, लेकिन राय अलग-अलग हो सकती है। यह आपकी चुनौती है, इसे उस तरीके से काम करें जैसा आप इसे चाहते हैं।
ईसैक

जिस तरह से प्रश्न लिखा गया है, यह संभव है कि आप अंतिम कमी को छोड़ सकते हैं, हालांकि मैंने एक स्पष्टीकरण के लिए कहा कि क्या परिणाम <100000000003 की आवश्यकता है।
अर्जन जोहान्सन

9

हास्केल , 118 113 105 101 बाइट्स

इस समाधान से प्रेरित ।

-12 अर्जन जोहान्सन से

p=10^11+3
k b=((p-2)?b)b 1
r x=x-div x p*p
(e?b)s a|e==0=a|1<2=(div e 2?b$r$s*s)$last$a:[r$a*s|odd e]

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

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

इस समाधान का पुनर्लेखन । जबकि परीक्षण वेक्टर के लिए पर्याप्त तेज़ है, यह समाधान अन्य इनपुट के लिए बहुत धीमा है।

s x=until(\t->t-t`div`x*x==0)(+(10^11+3))1`div`x

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


बहुत बढ़िया! मुझे स्क्वेरिंग अप्रोच द्वारा एक्सप्रेशन पसंद है।
isaacg

सबसे छोटा समाधान कुछ ऐसा होगा जैसे इसे ऑनलाइन आज़माएं! लेकिन मुझे नहीं लगता कि इसका प्रदर्शन स्वीकार्य है ...
बर्टवेल

(1) gऑपरेटर बनाने के लिए यह छोटा है (e?b)a s|...(2) यदि आप स्विच करते हैं aऔर sफिर आप !इसमें नॉन -ऑपरेटर और इनलाइन बना सकते हैं y। (३) डुप्लिकेट की कीमत पर, आप whereएक lastचाल से महंगे से छुटकारा पा सकते हैं zइसे ऑनलाइन आज़माएं!
अर्जन जोहान्सन

अब वे अच्छी चाल हैं!
बारटेवेल

ओह, और |e==0=a उस pesky दोहराव से छुटकारा पाता है।
अर्जन जोहान्सन

6

ब्रेकीलॉग , 22 बाइट्स

∧10^₁₁+₃;İ≜N&;.×-₁~×N∧

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

इस 1000000कोड के थोड़े अलग (और लंबे) संस्करण के साथ लगभग 10 मिनट का समय लगा, जो ठीक दो गुना तेज था (केवल सकारात्मक मूल्यों की जाँच की)İ सकारात्मक और नकारात्मक दोनों बजाय )। इसलिए इस इनपुट के पूरा होने में लगभग 20 मिनट लगने चाहिए।

व्याख्या

हम बस इसका वर्णन करते हैं Input × Output - 1 = 100000000003 × an integer, और Outputहमारे लिए बाधा अंकगणित खोजने देते हैं।

∧10^₁₁+₃                   100000000003
        ;İ≜N               N = [100000000003, an integer (0, then 1, then -1, then 2, etc.)]
            &;.×           Input × Output…
                -₁         … - 1…
                  ~×N∧     … = the product of the elements of N

हमें तकनीकी रूप से स्पष्ट लेबलिंग की आवश्यकता नहीं है , हालांकि यदि हम इसका उपयोग नहीं करते हैं, तो मामले की जांच नहीं करेंगे N = [100000000003,1](क्योंकि यह अक्सर बेकार है), जिसका अर्थ है कि यह 2उदाहरण के लिए इनपुट के लिए बहुत धीमा होगा क्योंकि इसे दूसरे सबसे छोटे पूर्णांक को खोजने की आवश्यकता होगी पहले के बजाय।


1
वाह, मैंने कभी उम्मीद नहीं की थी कि बाधा अंकगणित को खींच लेगी। बहुत बढ़िया!
isaacg

1
@isaacg की गति दुर्भाग्य से पूरी तरह से के मूल्य पर निर्भर है İ, इसलिए यह अभी भी बड़े उत्पादों के लिए बहुत धीमी है।
जूल

सवाल अपडेट किया। क्या आपका कोड हमेशा 30 मिनट से कम समय लेता है?

6

पायथन, 53 51 49 58 53 49 बाइट्स

-2 बाइट्स orlp करने के लिए धन्यवाद
-2 officialaimm करने के लिए धन्यवाद बाइट्स
-4 फेलिप Nardi Batist करने के लिए धन्यवाद बाइट्स
-3 isaacg करने के लिए धन्यवाद बाइट्स
-1 Orjan Johansen को बाइट धन्यवाद
-2 फेडरिको Poloni करने के लिए धन्यवाद बाइट्स

x=input()
t=1
while t-t/x*x:t+=3+10**11
print t/x

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

मुझे यह पता लगाने में ~ 30 मिनट का समय लगा। मेरा समाधान पहले नंबर से शुरू करना है जो 1 से 1 होगा। यह संख्या 1 है। यदि इसका x से विभाज्य है, तो y वह संख्या है जो x से विभाजित है। यदि नहीं, तो दूसरी संख्या का पता लगाने के लिए इस संख्या में 10000000003 जोड़ें, जो कि 1000000003 mod 1 और समान होगा।


पहली संख्या जो 1 से आधुनिक होगी, वह है ...
orlp

@orlp lol धन्यवाद। इसने मुझे 2 बाइट्स बचाए :)
Zachary Cotton

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

@ .RrrJohansen अच्छी नींद आती है।

1
यदि आपको bकेवल एक बार की आवश्यकता है , तो इसे हार्डकोड क्यों नहीं किया जाता है?
फेडरिको पोलोनी

5

जावास्क्रिप्ट (ईएस 6), 153 143 141 बाइट्स

से प्रेरित होकर math.stackexchange.com से इस सवाल का जवाब

यूक्लिडियन एल्गोरिथ्म पर आधारित एक पुनरावर्ती कार्य।

f=(n,d=(F=Math.floor,m=1e11+3,a=1,c=n,b=F(m/n),k=m-b*n,n>1))=>k>1&d?(e=F(c/k),a+=e*b,c-=e*k,f(n,c>1&&(e=F(k/c),k-=e*c,b+=e*a,1))):a+d*(m-a-b)

मोडुलो को कंप्यूटिंग द्वारा कार्यान्वित किया जाता है:

quotient = Math.floor(a / b);
remainder = a - b * quotient;

क्योंकि भागफल की भी आवश्यकता होती है, इस तरह से करने से वास्तव में कुछ समझ में आता है।

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


आपको केवल अंतिम घटना में 64 बिट फ़्लोरिंग की आवश्यकता होती है ताकि आप दूसरे को 0 | x / y से बदल सकें और घोषणा को हटा सकें
Oki

5

C ++ 11 (GCC / Clang, Linux), 104 102 बाइट्स

using T=__int128_t;T m=1e11+3;T f(T a,T r=1,T n=m-2){return n?f(a*a-a*a/m*m,n&1?r*a-r*a/m*m:r,n/2):r;}

https://ideone.com/gp41rW

यूलर की प्रमेय और द्विआधारी घातांक के आधार पर अनगुल्ड।

using T=__int128_t;
T m=1e11+3;
T f(T a,T r=1,T n=m-2){
    if(n){
        if(n & 1){
            return f(a * a - a * a / m * m, r * a - r * a / m * m, n / 2);
        }
        return f(a * a - a * a / m * m, r, n / 2);
    }
    return r;
}

ISO C ++ में केवल longकम से कम 32-बिट होना आवश्यक है, इसलिए यह आवश्यक नहीं है 1e11 + 3। यह x86-64 विंडोज पर 32-बिट है। longयद्यपि x86-64 लिनक्स (और SystemV ABI का उपयोग करने वाले अन्य OS) पर 64-बिट प्रकार है। तो पूरी तरह से पोर्टेबल होने के लिए, आपको उपयोग करने की आवश्यकता होगी long long, जो कि C ++ 11 के बाद से कम से कम 64-बिट होने की गारंटी है
पीटर कॉर्ड्स

__int128_tयह मानक C ++ प्रतीत नहीं होता है, यह एक जीसीसी एक्सटेंशन लगता है, यह अच्छा होगा यदि आप इसे भाषा के रूप में बताएंगे (C ++ 11 + gcc)।
फेलिक्स डॉम्बेक

3
यह C ++ विशेषज्ञों की साइट नहीं है, मुझे उम्मीद है कि कोई भी नोटिस नहीं करेगा।
स्टीलरवेन

@PeterCordes कोड गोल्फ को पोर्टेबल या यहां तक ​​कि अच्छी तरह से बनने की आवश्यकता नहीं है, इसे बस एक कार्यान्वयन पर काम करने की आवश्यकता है।
aschepler

1
@aschepler: मुझे पता है, जिसके कारण मैंने कहा "क्या आप चाहते हैं की जरूरत है"। मैंने सोचा कि यह उपयोगी होगा कि यह किस प्लेटफॉर्म पर काम करेगा / नहीं करेगा, अगर कोई इसे करने की कोशिश करता है और मुसीबत में भाग जाता है।
पीटर कॉर्डेस

4

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

x/.FindInstance[x#==k(10^11+3)+1,{x,k},Integers]&

इसे चलाने में कितना समय लगता है?

मेरे कंप्यूटर पर 0.001 से कम (केस 2 ^ 40-1 के लिए)
कीउ गण


1

रूबी , 58 बाइट्स

उपयोग करता है isaacg के अनुप्रयोग के लिए Fermat के थोड़े से प्रमेय के लिए अब जबकि मैं समय को समाप्त करता हूं brute-force समाधान।

->n,x=10**11+3{i=n;11.times{i**=10;i-=i/x*x};i*=n;i-i/x*x}

वर्तमान जानवर बल संस्करण, जो 47 बाइट्स है, लेकिन बहुत धीमा हो सकता है :

->n,x=10**11+3{(1..x).find{|i|i*=n;i-i/x*x==1}}

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

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