मैं देख रहा हूं कि बहुत से लोगों ने अतिप्रवाह के बारे में सवाल का जवाब दिया, लेकिन मैं उनकी मूल समस्या का समाधान करना चाहता था। उन्होंने कहा कि समस्या एक बी = सी ऐसी थी जिसे दोहराए बिना सभी अंकों का उपयोग किया जाता है। ठीक है, यही वह नहीं है जो उसने इस पोस्ट में पूछा है, लेकिन मुझे अभी भी लगता है कि समस्या के ऊपरी हिस्से का अध्ययन करना आवश्यक था और निष्कर्ष निकाला कि उसे कभी भी अतिप्रवाह की गणना या पता लगाने की आवश्यकता नहीं होगी (ध्यान दें: मैं कुशल नहीं हूं गणित में तो मैंने यह कदम दर चरण किया, लेकिन अंतिम परिणाम इतना सरल था कि इसका एक सरल सूत्र हो सकता है)।
मुख्य बिंदु यह है कि ऊपरी बाउंड जिसे समस्या के लिए ए, बी या सी की आवश्यकता होती है वह 98.765.432 है। वैसे भी, तुच्छ और गैर तुच्छ भागों में समस्या को विभाजित करके शुरू करना:
- x 0 == 1 (9, 8, 7, 6, 5, 4, 3, 2 के सभी क्रमबद्ध समाधान हैं)
- x 1 == x (कोई समाधान संभव नहीं)
- 0 बी == 0 (कोई समाधान संभव नहीं)
- 1 बी == 1 (कोई समाधान संभव नहीं)
- एक ख , एक> 1, b> 1 (गैर तुच्छ)
अब हमें केवल यह दिखाने की आवश्यकता है कि कोई अन्य समाधान संभव नहीं है और केवल क्रमपरिवर्तन वैध हैं (और फिर उन्हें प्रिंट करने का कोड तुच्छ है)। हम ऊपरी सीमा पर वापस जाते हैं। वास्तव में ऊपरी सीमा c 98.765.432 है। यह ऊपरी सीमा है क्योंकि यह 8 अंकों (प्रत्येक और बी के लिए 10 अंक कुल शून्य 1) के साथ सबसे बड़ी संख्या है। यह ऊपरी बाउंड केवल c के लिए है क्योंकि ए और बी के लिए सीमा घातीय वृद्धि के कारण बहुत कम होनी चाहिए, क्योंकि हम गणना कर सकते हैं, बी से 2 से ऊपरी सीमा तक भिन्न हो सकते हैं:
9938.08^2 == 98765432
462.241^3 == 98765432
99.6899^4 == 98765432
39.7119^5 == 98765432
21.4998^6 == 98765432
13.8703^7 == 98765432
9.98448^8 == 98765432
7.73196^9 == 98765432
6.30174^10 == 98765432
5.33068^11 == 98765432
4.63679^12 == 98765432
4.12069^13 == 98765432
3.72429^14 == 98765432
3.41172^15 == 98765432
3.15982^16 == 98765432
2.95305^17 == 98765432
2.78064^18 == 98765432
2.63493^19 == 98765432
2.51033^20 == 98765432
2.40268^21 == 98765432
2.30883^22 == 98765432
2.22634^23 == 98765432
2.15332^24 == 98765432
2.08826^25 == 98765432
2.02995^26 == 98765432
1.97741^27 == 98765432
नोटिस, उदाहरण के लिए अंतिम पंक्ति: यह कहता है कि 1.97 ^ 27 ~ 98M। इसलिए, उदाहरण के लिए, 1 ^ 27 == 1 और 2 ^ 27 == 134.217.728 और इसका कोई हल नहीं है क्योंकि इसमें 9 अंक (2> 1.97 है) इसलिए यह वास्तव में परीक्षण किए जाने वाले से बड़ा है)। जैसा कि देखा जा सकता है, ए और बी के परीक्षण के लिए उपलब्ध संयोजन वास्तव में छोटे हैं। B == 14 के लिए, हमें 2 और 3 प्रयास करने की आवश्यकता है। b == 3 के लिए, हम 2 से शुरू करते हैं और 462 पर रुकते हैं। सभी परिणाम ~ 98M से कम होने की अनुमति है।
अब बस उपरोक्त सभी संयोजनों का परीक्षण करें और उन लोगों की तलाश करें जो किसी भी अंक को नहीं दोहराते हैं:
['0', '2', '4', '5', '6', '7', '8'] 84^2 = 7056
['1', '2', '3', '4', '5', '8', '9'] 59^2 = 3481
['0', '1', '2', '3', '4', '5', '8', '9'] 59^2 = 3481 (+leading zero)
['1', '2', '3', '5', '8'] 8^3 = 512
['0', '1', '2', '3', '5', '8'] 8^3 = 512 (+leading zero)
['1', '2', '4', '6'] 4^2 = 16
['0', '1', '2', '4', '6'] 4^2 = 16 (+leading zero)
['1', '2', '4', '6'] 2^4 = 16
['0', '1', '2', '4', '6'] 2^4 = 16 (+leading zero)
['1', '2', '8', '9'] 9^2 = 81
['0', '1', '2', '8', '9'] 9^2 = 81 (+leading zero)
['1', '3', '4', '8'] 3^4 = 81
['0', '1', '3', '4', '8'] 3^4 = 81 (+leading zero)
['2', '3', '6', '7', '9'] 3^6 = 729
['0', '2', '3', '6', '7', '9'] 3^6 = 729 (+leading zero)
['2', '3', '8'] 2^3 = 8
['0', '2', '3', '8'] 2^3 = 8 (+leading zero)
['2', '3', '9'] 3^2 = 9
['0', '2', '3', '9'] 3^2 = 9 (+leading zero)
['2', '4', '6', '8'] 8^2 = 64
['0', '2', '4', '6', '8'] 8^2 = 64 (+leading zero)
['2', '4', '7', '9'] 7^2 = 49
['0', '2', '4', '7', '9'] 7^2 = 49 (+leading zero)
उनमें से कोई भी समस्या से मेल नहीं खाता (जिसे '0', '1', ..., '9') की अनुपस्थिति से भी देखा जा सकता है।
उदाहरण कोड जो इसे हल करता है। यह भी ध्यान दें कि पायथन में लिखा गया है, इसलिए नहीं कि इसे मनमाने ढंग से सटीक पूर्णांक की आवश्यकता है (कोड 98 मिलियन से अधिक कुछ भी गणना नहीं करता है), लेकिन क्योंकि हमें पता चला है कि परीक्षणों की मात्रा इतनी कम है कि हमें उच्च स्तर की भाषा का उपयोग करना चाहिए इसके अंतर्निर्मित कंटेनरों और पुस्तकालयों का उपयोग करें (यह भी ध्यान दें: कोड में 28 लाइनें हैं)।
import math
m = 98765432
l = []
for i in xrange(2, 98765432):
inv = 1.0/i
r = m**inv
if (r < 2.0): break
top = int(math.floor(r))
assert(top <= m)
for j in xrange(2, top+1):
s = str(i) + str(j) + str(j**i)
l.append((sorted(s), i, j, j**i))
assert(j**i <= m)
l.sort()
for s, i, j, ji in l:
assert(ji <= m)
ss = sorted(set(s))
if s == ss:
print '%s %d^%d = %d' % (s, i, j, ji)
# Try with non significant zero somewhere
s = ['0'] + s
ss = sorted(set(s))
if s == ss:
print '%s %d^%d = %d (+leading zero)' % (s, i, j, ji)