दोहराव दशमलव को खोजने का एक प्रभावी तरीका क्या है


24

मैं दो पूर्णांकों के दोहराए जाने वाले दशमलव भाग को खोजने के लिए जावा में एक कुशल एल्गोरिदम खोजने की कोशिश कर रहा हूं aऔर bजहां a/b

जैसे। 5/7 = 0.714258 714258 ...।

मुझे वर्तमान में केवल लंबी विभाजन विधि का ही पता है।


2
तो आपके पास a = 5 और b = 7 है, और आप फ्लोटिंग पॉइंट में / b की गणना आसानी से कर सकते हैं, लेकिन आप जो जानना चाहते हैं वह 6 दशमलव स्थानों के बाद दोहराता है?
5

जवाबों:


10

मेरा मानना ​​है कि यहां दो सामान्य दृष्टिकोण हैं, आप अनिवार्य रूप से "ब्रूट फोर्स" को सबसे लंबे समय तक दोहराए जाने वाले स्ट्रिंग के लिए देख सकते हैं, या आप इसे संख्या सिद्धांत की समस्या के रूप में हल कर सकते हैं।

इस समस्या को पार किए हुए मुझे एक लंबा समय हो गया है, लेकिन एक विशेष मामला (1 / n) प्रोजेक्ट यूलर पर समस्या # 26 है, इसलिए आप उस विशिष्ट नाम के लिए कुशल समाधान खोजकर अधिक जानकारी प्राप्त करने में सक्षम हो सकते हैं। एक खोज हमें एली बेंडरस्की की वेबसाइट पर ले जाती है, जहां वह अपना समाधान बताता है । यहां मैथवर्ल्ड के दशमलव विस्तार पृष्ठ से कुछ सिद्धांत दिए गए हैं :

कोई भी अनियमित अंश m/nआवधिक है, और इसकी अवधि lambda(n)स्वतंत्र है m, जो अधिकांश n-1 अंकों में लंबी है। यदि nअपेक्षाकृत 10 से कम है, तो उस अवधि lambda(n)का m/nएक भाजक है phi(n)और अधिकांश phi(n)अंकों पर है, जहां phiकुल कार्य है। यह पता चला है कि 10 (mod ) (Glaisher 1878, Lehmer 1941) lambda(n)का गुणात्मक क्रम है n। एक परिमेय संख्या के दशमलव विस्तार के दोहराव वाले हिस्से में अंकों की संख्या को सीधे इसके हर के गुणक क्रम से भी पाया जा सकता है।

मेरा नंबर सिद्धांत इस समय थोड़ा कठोर है, इसलिए मैं जो सबसे अच्छा कर सकता हूं वह आपको उस दिशा में इंगित करेगा।


8

चलो n < d, और आप दोहराए गए भाग का पता लगाने की कोशिश कर रहे हैं n/d। आज्ञा देना pभाग में अंकों की संख्या हो: तब n/d = R * 10^(-p) + R * 10^(-2p) + ... = R * ((10^-p)^1 + (10^-p)^2 + ...)। ब्रैकेटेड भाग एक ज्यामितीय श्रृंखला है, जिसके बराबर है 1/(10^p - 1)

तो n / d = R / (10^p - 1)। प्राप्त करने की व्यवस्था करें R = n * (10^p - 1) / d। आर को खोजने के लिए, p1 से अनंत तक लूप , और dसमान रूप से विभाजित होते ही रुक जाएं n * (10^p - 1)

यहाँ पायथन में एक कार्यान्वयन है:

def f(n, d):
    x = n * 9
    z = x
    k = 1
    while z % d:
        z = z * 10 + x
        k += 1
    return k, z / d

( kदोहराव अनुक्रम की लंबाई का ट्रैक रखता है, इसलिए आप 1/9 और 1/99 के बीच अंतर कर सकते हैं, उदाहरण के लिए)

ध्यान दें कि यदि दशमलव विस्तार परिमित है तो यह कार्यान्वयन (विडंबना) हमेशा के लिए समाप्त हो जाता है, लेकिन यदि यह अनंत है तो समाप्त हो जाता है! आप इस मामले की जांच कर सकते हैं, हालांकि, क्योंकि n/dकेवल एक परिमित दशमलव प्रतिनिधित्व होगा यदि उस के सभी प्रमुख कारक d2 या 5 नहीं हैं, तो वे भी मौजूद हैं n


1
यह उत्तर सही लगता है। विधि "नियम" का पालन करने पर आधारित है: 0.123123... = 123/999 0.714258714258... = 714258/999999 (=5/7)आदि
आते हैं

4
यह 1/6 या 5/12: \
razpeitia

1
@razpeitia मैंने कुछ ऐसा ही बनाया है, लेकिन सभी मामलों में काम करना (पूर्णांक विभाजन सहित)। बाहर की जाँच करें: codepad.org/hKboFPd2
तिगरान सालुव

मैं एक जावास्क्रिप्ट कार्यान्वयन @ TigranSaluev के समान बनाया है github.com/Macil/cycle-division
Macil

2

लम्बा विभाजन? : /

परिणाम को एक स्ट्रिंग में बदल दें, और फिर इस एल्गोरिथ्म को उस पर लागू करें । यदि आपका स्ट्रिंग सामान्य प्रकारों के साथ काफी लंबा नहीं है, तो BigDecimal का उपयोग करें।


4
"इसे स्ट्रिंग में बदल दें" के लिए मनमाने ढंग से सटीक गणना की आवश्यकता हो सकती है और स्ट्रिंग के दोहराए गए भाग की दो प्रतियों की गणना करने के लिए एक बहुत लंबी स्ट्रिंग (और आपको कैसे पता चलता है कि गणना कब रोकनी है? 121212312121231212123 ... एक समस्या होगी)
स्पैर

@ शेपर दोहराव की लंबाई हमेशा भाजक से छोटी होती है।

@ मिचेल्ट मुझे इस बात की जानकारी नहीं थी। यदि सही है, तो सटीक "मनमाना" नहीं है, लेकिन हर के आधार पर मनमाने ढंग से उच्च हो सकता है।
स्पेर

@Sparr math.stackexchange.com/questions/298844/… हालाँकि मुझे सब कुछ मिल जाता है ।

मुझे नहीं लगता कि जिस एल्गोरिथ्म से आप लिंक करते हैं, वह संशोधन के बिना काम करेगा। इसमें पुनरावृत्तियां शामिल हैं जो ओवरलैप करते हैं और यह सभी स्ट्रिंग पर खोज करता है (न केवल लगातार मैचों के लिए)। उदाहरण के लिए, "केला" में सबसे लंबे समय तक दोहराया जाने वाला विकल्प "अना" है।
Web_Designer
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.