पायथन 2 , 44 43 बाइट्स
(पार किया 44 अभी भी 44 है।) एक बाइट को बचाने के लिए Fireflame241 के लिए धन्यवाद!
P=input();i=P/3
while i*10%P-1:i-=1
print i
इसे ऑनलाइन आज़माएं!
के बीच एक संख्या होती है 0और P-1जिसका उलटा होता है 10। लेकिन अगर वह व्युत्क्रम uइससे अधिक होता है P/2, तो (u-P)एक व्युत्क्रम भी होता है, और इसकी तुलना में एक छोटा निरपेक्ष मान होता है u। तो यह पता चला है कि हम वास्तव में और के xबीच अद्वितीय संख्या की तलाश कर रहे हैं-P/2P/2 जिसका उलटा है 10।
उपरोक्त कोड ठीक वैसा ही होता है, जो (मंजिल) पर शुरू होता है P/2, और एक उलटा होने तक नीचे की ओर बढ़ता है। ऐसा तब तक होना चाहिए -P/2जब तक कि इससे अधिक संख्या Pकिसी अभाज्य संख्या से अधिक हो 10। अधिक सटीक रूप से, यह समाप्त हो जाएगा अगर और केवल अगर Pcoprime है 10।
संपादित करें: यह वास्तव में पता चला है कि xहोने के लिए बीच की गारंटी है -P/3और P/3, इसलिए पर वर्तमान संस्करण शुरू होता है P/3वहाँ से नीचे और कदम। इसके स्पष्टीकरण के लिए बेहतर बाउंड लेबल वाला अनुभाग देखें ।
गणितीय व्याख्या
यह तुरंत मेरे लिए स्पष्ट नहीं था कि विभाजन परीक्षण क्यों काम किया। यहाँ एक स्पष्टीकरण है, अगर कोई और सोच रहा था।
आज्ञा Pदेना एक प्रधानमंत्री, से अधिक है 10, जिसका अंतिम अंक है b। इस प्रकार
P = 10a + b
कहाँ a > 0, और 0 <= b < 10। वास्तव में bहै या तो 1, 3, 7, या 9, क्योंकि तुलना में एक प्रमुख अधिक से अधिक10 इन अंक में से एक में होगा अंत।
अब मान लीजिए bx + a = 0 (mod P)। फिर
a = -bx (mod P)
10a + b = 10(-bx) + b (mod P)
0 = 10(-bx) + b (mod P)
0 = b(1 - 10x) (mod P)
चूंकि Pप्रधान है, पूर्णांक mod Pएक अभिन्न डोमेन हैं । तो या तोb = 0 (mod P) , या 1 - 10x = 0 (mod P)।
हम जानते हैं 0 <= b < 10 < P, इसलिए यदि b = 0 (mod P)उसके बाद b = 0। लेकिन हम कहा bहै, या तो 1, 3, 7, या 9, तो यह असंभव है। इसलिए 1 - 10x = 0 (mod P), ऐसा है 10x = 1 (mod P)। दूसरे शब्दों xमें 10, modulo का विलोम हैP ।
अब मान लीजिए Nकि एक अप्रतिष्ठित पूर्णांक है जिसका अंतिम अंक है d, इसलिए N = 10c + d. हमारे पास समकक्ष कथनों की एक श्रृंखला है:
10c + d = 0 (mod P)
<==> 10xc + dx = 0 (mod P)
<==> c + dx = 0 (mod P)
QED।
उपयोगिता?
मैं यह भी सोच रहा था कि क्या विभाज्यता परीक्षण (दिए गए N = 10c + d, Nद्वारा प्रतिस्थापित dx + c) वास्तव में व्यवहार में उत्पादक होगा। या कम से कम, क्या यह मज़बूती Nसे N(पूर्ण मूल्य में) से छोटी संख्या से प्रतिस्थापित करता है ?
मान लीजिए N = 10c + d, जहां c >= 0और 0 <= d < 10। इसलिए 10c = N - d <= N। त्रिभुज असमानता द्वारा,
|c + dx| <= |c| + |dx| = c + d|x| <= N/10 + d|x|
< N/10 + 10|x| <= N/10 + 10P/2 = N/10 + 5P
इस प्रकार अगर 5P <= 9N/10है, तो |c + dx| < N।
विशेष रूप से, यदि N >= 6P, तब |c + dx| < N। इस प्रकार, यह देखते हुए Pहम गणना के द्वारा शुरू 2P, 3P, ..., 6P, के साथ साथ x। तब दिया N, हमने बार-बार विभाज्यता परीक्षण चलाने जब तक हम एक संख्या से कम तक पहुँचने या के बराबर 6Pहै, और जाँच परिणाम संख्या के किसी भी है कि क्या 0, P, 2P, ..., 6P।
(बेशक, जब भी हम किसी ऋणात्मक संख्या तक पहुँचते हैं, तो हम इसे इसके पूर्ण मूल्य से बदल देते हैं, जो तब से ठीक है, जब तक qकि Pकेवल और केवल यदि यह विभाज्य है(-q) है है।)
बेहतर बाउंड्री
मैंने देखा कि |x|/Pकभी भी पास नहीं लगता था 1/2। वास्तव में ऐसा लग रहा था कि यह हमेशा से कम था 1/3... या करीबी परीक्षा में, यह हमेशा 1/10या तो बहुत करीब था या 3/10। अब तक की सबसे बड़ी लग रही थी 4/13(जो तब होती है P=13और जब होती हैx=4 )। ऐसा क्यों होगा?
आज्ञा uदेना एक पूर्णांक और मान लें कि 10u = kP + 1कुछ पूर्णांक के लिए k, तो uउलटा 10, modulo है P। तब हम यह भी जानते हैं कि kयह अपेक्षाकृत प्रमुख है 10, क्योंकि k(-P)यह 1मोडुलो के बराबर है10 ।
अब, हम जानते हैं कि 10modulo के व्युत्क्रम Pसभी के गुणकों से भिन्न होते हैं P, इसलिए हम पूर्णांक ले सकते हैं uऔर या तो Pइच्छा के गुणकों को जोड़ या घटा सकते हैं, और परिणाम हमेशा अभी भी 10modulo का विलोम होगा P। हम घटाना करने के लिए चुन मान लीजिए Pसे u: हम मिल
10(u - P) = 10u - 10P = kP + 1 - 10P
10(u - P) = (k - 10)P + 1
दूसरे शब्दों में, घटाना (क्रमशः, बढ़ाना) uद्वारा Pघटती (बढ़ती) kसे मेल खाती है 10। हम जोड़ना चाहते हैं / को निकाल दिया गुणकों Pसे uजब तक बाएं ओर निरपेक्ष मूल्य में कम से कम है; लेकिन बाएं ओर बिल्कुल कम से कम है जब दाएँ हाथ की ओर कम से कम है, और इसलिए हम जोड़ना चाहते हैं / घटाना 10सेk जब तक दाएँ हाथ की ओर निरपेक्ष मूल्य में कम से कम है।
लेकिन हम जानते हैं कि यह होगा जब kके बीच है -5और 5है, और इसलिए (के बाद से kअपेक्षाकृत करने के लिए प्रधानमंत्री है 10) इस साधन kहै या तो -3, -1, 1, या 3। (यह ओपी के तहत @ नील की टिप्पणी की सामग्री है। धन्यवाद, नील! )
इस प्रकार जब |u|कम से कम है (यानी, u=x), हम होगा x/P = u/P = k/10 + 1/(10P), जहां kया तो -3, -1, 1, या 3। इसलिए |x|/P <= 3/10 + 1/(10P)। तुल्य, |x| <= (3P + 1)/10।
इसके अलावा, यह असमानता सख्त है P=11, क्योंकि P=11हमारे पास x=-1और है k=-1। सबसे छोटा Pजिसके लिए समानता है, वह P=13(जहां x=4और k=3) है।
इसलिए जो सबसे बड़ा है वह |x|/Pहै 3/10 + 1/(10*13), क्योंकि P=13पहला प्रधान है जिसके लिए हमारे पास है k=3, और उनमें से जो सबसे छोटा है k=3, वह 1/(10P)शब्द सबसे Pछोटा है (यानी, सबसे छोटा P=13)। इसलिए, सभी के लिए P, हमारे पास भी है |x|/P <= 3/10 + 1/130 = 4/13 < 1/3। यह बताता है कि क्यों उपरोक्त कोड में हम शुरू करने के i = P/3बजाय आरंभ कर सकते हैं P/2।
इसके अलावा, उपरोक्त उपयोगिता अनुभाग में सीमाओं को अब बेहतर बनाया जा सकता है।
लेम्मा : N = 10c + dजहां c > 0और 0 <= d <= 9। तब c + d|x| < N/10 + 9(3P + 1)/10। (सख्त असमानता पर ध्यान दें।)
लेम्मा का प्रमाण: मामलों द्वारा। केस I: d = 0तो N = 10c। तब c + d|x| = c = N/10 < N/10 + 9(3P + 1)/10।
केस II 0 < d <= 9:। फिर 10c = N - d < N, तो c < N/10। इसलिए c + d|x| < N/10 + d|x| <= N/10 + 9|x| <= N/10 + 9(3P + 1)/10। QED।
इस प्रकार, यदि N > 3P(और N = 10c + dपहले की तरह), तो
3P + 1 <= N
9(3P + 1)/10 <= 9N/10
N/10 + 9(3P + 1)/10 <= N
c + d|x| < N/10 + 9(3P + 1)/10 <= N
तो, अगर N > 3Pतब c + d|x| < N।
इसलिए, हम केवल खोजने के लिए P, 2Pऔर 3Pसाथ-साथ x। यह देखते हुए N > 0, जबकि N > 3P, हम बदलने के Nद्वारा |c + dx|, जो कम हो जाती है N। अंततः हम प्राप्त करेंगे N <= 3P; उस बिंदु पर हम बंद करो और जाँच करें कि क्या Nसंख्या के किसी भी के बराबर है 0, P, 2P, या 3P।
हम 3Pसामान्य से बेहतर नहीं कर सकते । उदाहरण के लिए मान लीजिए P = 13और N = 39ऐसा है x = 4। फिर जगह Nसे dx + c = 9(4) + 3पत्ते Nअपरिवर्तित।
xमूल्य की तलाश कर रहे हैं जहां10*x-1इनपुट द्वारा विभाज्य हो।