मॉड्यूलर पावर टावरों का मूल्यांकन करें


13

दो संख्याओं n और m को देखते हुए, अनंत बिजली टॉवर का मूल्यांकन करें:

n ^ (n + 1) ^ (n + 2) ^ (n + 3) ^ (n + 4) ^ ... mod m

ध्यान रखें कि ^ सही-सहयोगी है। तो 2 ^ 3 ^ 4 = 2 ^ (3 ^ 4)। अब आप संभावित रूप से सही-सहयोगी ऑपरेटरों के अनंत अनुक्रम के लिए एक मूल्य कैसे निर्दिष्ट कर सकते हैं?

F (n, m, i) को परिभाषित करें क्योंकि पावर टॉवर अनंत ऊर्जा टॉवर के पहले i शब्दों से युक्त है। फिर कुछ स्थिर C ऐसा है जो हर i> C, f (n, m, i) = f (n, m, C) के लिए है। तो आप कह सकते हैं कि अनंत बिजली टॉवर एक निश्चित मूल्य पर परिवर्तित होता है। हम उस मूल्य में रुचि रखते हैं।


आपका कार्यक्रम एक उचित आधुनिक पीसी पर 10 सेकंड के अंदर n = 2017, m = 10 ^ 10 की गणना करने में सक्षम होना चाहिए। यही है, आपको एक वास्तविक एल्गोरिथ्म को लागू करना चाहिए, कोई ब्रूटफोर्मिंग नहीं।

आप मान सकते हैं कि आपकी प्रोग्रामिंग भाषा में संख्यात्मक सीमा के लिए n <2 30 और m <2 50 है , लेकिन आपके एल्गोरिथ्म को सैद्धांतिक रूप से किसी भी आकार n , m के लिए काम करना होगा । हालाँकि इन आकार सीमाओं के भीतर इनपुट के लिए आपका प्रोग्राम सही होना चाहिए, अगर इन सीमाओं के भीतर इनपुट्स हैं , तो इंटरमीडिएट वैल्यू ओवरफ्लो का उपयोग नहीं किया जाता है।

उदाहरण:

2, 10^15
566088170340352

4, 3^20
4

32, 524287
16

टिप (दावेदार के लिए): nऔर mकर रहे हैं नहीं सह रूढ़ होने की गारंटी।
लीक नून

1
10 ^ 10 (और 10 ^ 20, और संभावित 3 ^ 20 हस्ताक्षरित पूर्णांकों के लिए) कई भाषाओं के डिफ़ॉल्ट पूर्णांक प्रकारों से बड़ा है। क्या यह आवश्यक है कि इस बड़े इनपुट का समर्थन किया जाए?
दरवाज़े

1
@orlp क्या "हाँ" में 10 ^ 20 शामिल हैं? क्योंकि यह एक 64-बिट पूर्णांक में फिट नहीं होता है, इसलिए यदि आप इसकी आवश्यकता चाहते हैं, तो मैं इसे स्पष्ट रूप से इंगित करने का सुझाव दूंगा, क्योंकि अन्यथा आप लोगों द्वारा बहुत सारे अमान्य उत्तर प्राप्त करने जा रहे हैं, यह मानकर कि 64 बिट पूर्णांक सटीक होने जा रहे हैं।
मार्टिन एंडर

1
किसी भी तरह से, हमें समर्थन करने के लिए सबसे बड़ा इनपुट क्या है ?
मार्टिन एंडर

@Doorknob I ने चुनौती के लिए अधिक उदार सीमाएं जोड़ीं। हालाँकि आपके एल्गोरिथ्म को सैद्धांतिक रूप से किसी भी आकार m, n के लिए काम करना चाहिए ।
orlp

जवाबों:


7

पायथ, 23 बाइट्स

M&tG.^HsgBu-G/GH{PGGhHG

एक फंक्शन को परिभाषित करता है g, उस क्रम में m और n लेता है ।

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

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

M&tG.^HsgBu-G/GH{PGGhHG
M                         def g(G, H):
 &tG                        0 if G == 1, else …
                 PG         prime factors of G
                {           deduplicate that
          u-G/GH   G        reduce that on lambda G,H:G-G/H, starting at G
                              (this gives the Euler totient φ(G))
        gB          hH      bifurcate: two-element list [that, g(that, H + 1)]
       s                    sum
    .^H               G     H^that mod G

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

import sympy
def g(n,m):j=sympy.totient(m);return m-1and pow(n,j+g(n+1,j),m)

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

यह काम क्यों करता है

हम यूलर प्रमेय के निम्नलिखित सामान्यीकरण का उपयोग करते हैं ।

लेम्मा। n 2φ ( मीटर )एन φ ( मीटर ) (आधुनिक मीटर ) सभी के लिए n (या नहीं, n करने के लिए coprime है मीटर )।

सबूत: सभी प्रमुख शक्तियों के लिए पी कश्मीर विभाजन मीटर ,

  • अगर पी विभाजित n , तो क्योंकि φ ( मीटर ) ≥ φ ( पी कश्मीर ) = पी कश्मीर - 1 ( पी - 1) ≥ 2 कश्मीर - 1कश्मीर , हम n 2φ ( मीटर ) ≡ 0 ≡ एन φ ( मीटर ) (mod p k )।
  • अन्यथा, क्योंकि φ ( पी कश्मीर ) विभाजित φ ( मीटर ), यूलर प्रमेय देता n 2φ ( मीटर ) ≡ 1 ≡ एन φ ( मीटर ) (आधुनिक पी कश्मीर )।

इसलिए, एन 2φ ( मीटर )एन φ ( मीटर ) (आधुनिक मीटर )।

परिणाम। यदि k ≡ φ ( m ), तो n k φ n m ( m ) + ( k mod φ ( m )) (mod m )।

सबूत: अगर कश्मीर ≥ 2φ ( मीटर ), लेम्मा देता n कश्मीर = n 2φ ( मीटर ) n कश्मीर - 2φ ( मीटर )एन φ ( मीटर ) n कश्मीर - 2φ ( मीटर ) = n कश्मीर - φ ( मीटर ) ( mod m ) और हम तब तक दोहराते हैं जब तक घातांक 2 m ( m ) से कम न हो जाए ।


यह उस मामले को कैसे संभालता है जहां आधार और मोडुलो कोप्राइम नहीं है? पीएस सिम्पी का कुल कार्य है।
orlp

@orlp मैंने एक प्रमाण जोड़ा है। निश्चित नहीं कि मैं कैसे चूक गया sympy.totient
एंडर्स कासोर्ग

मुझे अब दिख गया। अच्छी विधि!
orlp

5

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

(?)दो लेता Integerहै और रिटर्न एक Integer, के रूप में उपयोग (10^10)?2017(ओ पी की तुलना में उलट आदेश।)

1?n=0
m?n=n&m$m#2+m#2?(n+1)
1#_=1
n#p|m<-until((<2).gcd p)(`div`p)n=m#(p+1)*1`max`div(n*p-n)(p*m)
(_&_)0=1
(x&m)y|(a,b)<-divMod y 2=mod(x^b*(mod(x*x)m&m)a)m

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

उत्सुकता से सबसे धीमा परीक्षण मामला गति सीमा के साथ एक नहीं है (जो लगभग तुरंत है), लेकिन 524287 ? 32एक, क्योंकि 524287अन्य परीक्षण मामलों के कारकों में प्रकट होने की तुलना में बहुत बड़ा अभाज्य है।

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

  • (x&m)yहै x^y `mod` m, या सत्ता आधुनिक, बराबरी से घातांक का उपयोग कर।
  • n#pयूलर का मुख्य कार्य है n, यह मानने nसे कोई छोटा कारक नहीं है p
    • mहै nके साथ सभी pकारकों बाहर विभाजित।
    • यदि kऐसे कारक हैं, तो कुलदेवता को एक संगत कारक मिलना चाहिए (p-1)*p^(k-1), जिसकी गणना इस प्रकार की जाती है div(n*p-n)(p*m)
    • 1`max`...उस मामले को संभालता है जहां nवास्तव में विभाज्य नहीं था p, जो इसके maxबराबर के अन्य तर्क देता है 0
  • मुख्य फ़ंक्शन m?nका उपयोग करता है कि जब yपर्याप्त बड़ा होता n^y `mod` mहै n^(t+(y`mod`t)) `mod` m, तब tजैसा होता है , जब का कुल योग होता है m। ( t+उन प्रमुख कारकों के लिए आवश्यक है nऔर mआम में हैं, जो सभी अधिकतम हो जाते हैं।)
  • एल्गोरिथ्म बंद हो जाता है क्योंकि पुनरावृत्त कुलीन कार्य 1 अंततः हिट हो जाते हैं।

1

मैथेमेटिका, 55 बाइट्स

n_~f~1=0;n_~f~m_:=PowerMod[n,(t=EulerPhi@m)+f[n+1,t],m]

उदाहरण:

In[1]:= n_~f~1=0;n_~f~m_:=PowerMod[n,(t=EulerPhi@m)+f[n+1,t],m]

In[2]:= f[2, 10^15]

Out[2]= 566088170340352

In[3]:= f[4, 3^20]

Out[3]= 4

In[4]:= f[32, 524287]

Out[4]= 16

In[5]:= f[2017, 10^10]

Out[5]= 7395978241

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