एक परिमेय संख्या के p-adic मान की गणना करें


11

एक परिमेय संख्या के p-adic मान की गणना करें

एक फ़ंक्शन या एक प्रोग्राम लिखें, जिसमें इनपुट के रूप में 3 पूर्णांक m,n,p(जहां pएक सकारात्मक प्रधानमंत्री है), जो कि |m/n|_p(पूरी तरह से कम) अंश के रूप में पी-एडिक मानदंड (द्वारा चिह्नित ) को आउटपुट करता है । फर्मेट को केवल बहुत कम मार्जिन के लिए जाना जाता है, लेकिन जो अज्ञात है वह यह है कि उसके पास केवल एक बहुत छोटी कंप्यूटर स्क्रीन थी। इसलिए Fermat की स्क्रीन पर फिट होने के लिए कोड को जितना संभव हो उतना कम बनाने की कोशिश करें!

परिभाषा

एक प्रमुख को देखते हुए p, हर अंश m/nविशिष्ट लिखा जा सकता है के रूप में (संकेतों की अनदेखी) (a/b)* p^eऐसा है कि eएक पूर्णांक और है pविभाजित न aहै और न ही bपी-adic आदर्श की m/nहै p^-e। एक विशेष मामला है, यदि अंश 0 है |0|_p = 0

आउटपुट स्वरूप होना चाहिए x/y(उदाहरण के 1/3लिए, पूर्णांकों के लिए दोनों 10या समकक्ष 10/1अनुमति है, नकारात्मक संख्याओं के लिए एक प्रमुख शून्य से उदाहरण के लिए होना चाहिए -1/3)

विवरण

कार्यक्रम में स्टड / स्टडआउट का उपयोग करना चाहिए, या बस एक फ़ंक्शन शामिल होना चाहिए जो तर्कसंगत संख्या या स्ट्रिंग लौटाता है। आपको यह मानना ​​होगा कि इनपुट m/nपूरी तरह से कम नहीं हुआ है। आप मान सकते हैं कि pयह एक प्रमुख है। कार्यक्रम के बीच पूर्णांकों प्रोसेस करने में सक्षम हो गया है -2^28अप करने के लिए 2^28, और अधिक से अधिक 10 सेकंड नहीं लेना चाहिए।

फैक्टराइजेशन और प्राइम चेकिंग फंक्शनलिटी में निर्मित होने की अनुमति नहीं है, साथ ही बेस बातचीत अनुपात में बनाया गया है, और फ़ंक्शन में बनाया गया है जो पी-एडिक वैल्यूएशन या मान की गणना करता है।

उदाहरण ( विकिपीडिया से चोरी )

x = m/n = 63/550 = 2^-1 * 3^2 * 5^-2 * 7 * 11^-1
|x|_2 = 2
|x|_3 = 1/9
|x|_5 = 25
|x|_7 = 1/7
|x|_11 = 11
|x|_13 = 1

दिलचस्प सामान्य ज्ञान

(इस चुनौती के लिए जानने / पढ़ने के लिए आवश्यक नहीं है, लेकिन प्रेरणा के रूप में पढ़ने के लिए शायद अच्छा है।)

(कृपया मुझे सही करें अगर मैं गलत शब्दों का उपयोग करता हूं, या कुछ और गलत है, तो मुझे अंग्रेजी में इस बारे में बात करने की आदत नहीं है।)

यदि आप तर्कसंगत संख्याओं को एक क्षेत्र के रूप में मानते हैं, तो पी-एडिक मानदंड पी-एडिक मीट्रिक को प्रेरित करता है d_p(a,b) = |a-b|_p। फिर आप इस मीट्रिक के संबंध में इस क्षेत्र को पूरा कर सकते हैं , इसका मतलब है कि आप एक नए क्षेत्र का निर्माण कर सकते हैं, जहां सभी सतर्क अनुक्रम जुटते हैं, जो कि एक अच्छा सामयिक संपत्ति है। (जो उदाहरण के लिए परिमेय संख्याएँ नहीं होती हैं, लेकिन वे करते हैं।) ये p-adic संख्याएँ हैं जैसा आपने अनुमान लगाया होगा, संख्या सिद्धांत में बहुत उपयोग किया है।

एक और दिलचस्प परिणाम ओस्ट्रोव्स्की का प्रमेय है जो मूल रूप से कहता है, तर्कसंगत संख्याओं पर कोई भी निरपेक्ष मान (नीचे परिभाषित) निम्नलिखित तीन में से एक है:

  • तुच्छ: |x|=0 iff x=0, |x|=1 otherwise
  • मानक (वास्तविक): |x| = x if x>=0, |x| = -x if x<0
  • पी-एडिक (जैसा कि हमने इसे परिभाषित किया है)।

एक निरपेक्ष मूल्य / एक मीट्रिक सिर्फ एक सामान्यीकरण है जिसे हम दूरी मानते हैं । एक पूर्ण मूल्य |.|निम्नलिखित स्थितियों को संतुष्ट करता है:

  • |x| >= 0 and |x|=0 if x=0
  • |xy| = |x| |y|
  • |x+y| <= |x|+|y|

ध्यान दें कि आप आसानी से निरपेक्ष मूल्यों से मैट्रिक्स का निर्माण कर सकते हैं और इसके विपरीत: |x| := d(0,x)या d(x,y) := |x-y|, इसलिए वे लगभग समान हैं यदि आप जोड़ / घटा / गुणा कर सकते हैं (जो अभिन्न डोमेन में है)। आप निश्चित रूप से इस संरचना के बिना, अधिक सामान्य सेटों पर एक मीट्रिक को परिभाषित कर सकते हैं।


मुझे लगता है कि गणितज्ञ का PadicNormकार्य भी समाप्त हो गया है? : पी
एलेक्स ए।

आप सही / लाइक करते हैं। (यहाँ कौन सा प्रयोग किया जाता है?)
दोष

जब तक दिलचस्प गुण खंड चुनौती को पूरा करने के लिए उपयोगी नहीं है, मैं कहूंगा कि यह इच्छुक पार्टियों के लिए सिर्फ उस जानकारी से लिंक करना बेहतर है। अन्यथा यह अनावश्यक रूप से पोस्ट को काटता है।
एलेक्स ए।

बस स्पष्ट होने के लिए, आउटपुट कुछ होना चाहिए |x|_11 = 11, सही? या 11ठीक है? और क्या इसे x=0मामले को संभालना है ?
ग्लेन ओ

@GlenO सही है, इसे संभाल करने के लिए है x=0मामला है और इस उदाहरण के लिए आप उत्पादन कर सकते हैं 11और साथ ही के रूप में 11/1है, लेकिन आप मुद्रित करने के लिए की जरूरत नहीं है |x|_11
दोष

जवाबों:


3

जूलिया, 94 80 75 बाइट्स

f(m,n,p)=(k=gcd(m,n)
g(m)=m%p>0?g(m÷p)p:1
m!=0?print(g(n÷k),/,g(m÷k)):0)

नोट: पठनीयता के लिए अर्धविराम के स्थान पर लाइनफीड का उपयोग करना - दोनों ही तरह से काम करेगा।

यह काफी सरल है - g(m,n)फ़ंक्शन इनपुट से फैक्टर %को निकालने के लिए रिकर्सन और शेष ( ) का उपयोग करता p^nहै m, n=1डिफ़ॉल्ट के साथ और फिर pरिकर्सन के प्रत्येक चरण पर गुणा किया जाता है , ताकि आउटपुट हो p^n। कोड उपयुक्त अभिव्यक्ति प्राप्त n/gcd(m,n)करने के m/gcd(m,n)लिए , और फिर उस पर लागू होता है । पात्रों को बचाने के लिए, दो बार k=gcd(m,n)गणना करने से बचने के लिए उपयोग किया जाता है gcd(m,n)m!=0जहां मामले को संभालने के लिए एक परीक्षण है x=0

आउटपुट फॉर्म का है N/1या 1/Nजहां उपयुक्त है, जहां Nहै p^e


1

जे, 35 34 बाइट्स

(,'/'&,)&":/@(%+./)@(]<.^+.|.@])x:

यह एक द्विआधारी क्रिया है जो प्राइम pको अपने बाएं तर्क के रूप में लेती है, और सरणी m nको अपने सही तर्क के रूप में। यह हमेशा स्लैश को प्रिंट करता है /, और 0/1अगर वापस आता है m = 0। इसे इस तरह उपयोग करें:

  f =: (,'/'&,)&":/@(%+./)@(]<.^+.|.@])x:
  5 f 63 550
25/1

व्याख्या

x:विस्तारित परिशुद्धता पर बदल जाता है, क्योंकि हम बहुत बड़ी संख्या संभाल रहे हैं। शेष कोड निम्नानुसार काम करता है:

(,'/'&,)&":/@(%+./)@(]<.^+.|.@])
                        ^         Power: this gives the array p^n p^m
                         +.       Take element-wise GCD with
                           |.@]   the rotated array n m; this gives
                                  the largest powers of p that divide n and m
                      <.          Take element-wise minimum with
                     [            The array m n to handle the m=0 case correctly
              %+./                Divide this array by its GCD to get it to lowest terms
        &":/                      Convert both elements to strings
 ,'/'&,                           Insert the slash '/' between them

0

सीजेएम, 42 बाइट्स

q~)\_:*g_sW<o@*28#f{{{_@\%}h;}:G~}_~Gf/'/*

यह इनपुट के लिए एक त्रुटि (0 के बाद मुद्रण) के साथ समाप्त होता है । CJam दुभाषिया में इसे ऑनलाइन आज़माएं ।


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