पायथन 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/2
P/2
जिसका उलटा है 10
।
उपरोक्त कोड ठीक वैसा ही होता है, जो (मंजिल) पर शुरू होता है P/2
, और एक उलटा होने तक नीचे की ओर बढ़ता है। ऐसा तब तक होना चाहिए -P/2
जब तक कि इससे अधिक संख्या P
किसी अभाज्य संख्या से अधिक हो 10
। अधिक सटीक रूप से, यह समाप्त हो जाएगा अगर और केवल अगर P
coprime है 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
।
अब, हम जानते हैं कि 10
modulo के व्युत्क्रम P
सभी के गुणकों से भिन्न होते हैं P
, इसलिए हम पूर्णांक ले सकते हैं u
और या तो P
इच्छा के गुणकों को जोड़ या घटा सकते हैं, और परिणाम हमेशा अभी भी 10
modulo का विलोम होगा 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
इनपुट द्वारा विभाज्य हो।