मैं दो पूर्णांकों के दोहराए जाने वाले दशमलव भाग को खोजने के लिए जावा में एक कुशल एल्गोरिदम खोजने की कोशिश कर रहा हूं a
और b
जहां a/b
।
जैसे। 5/7 = 0.714258 714258 ...।
मुझे वर्तमान में केवल लंबी विभाजन विधि का ही पता है।
मैं दो पूर्णांकों के दोहराए जाने वाले दशमलव भाग को खोजने के लिए जावा में एक कुशल एल्गोरिदम खोजने की कोशिश कर रहा हूं a
और b
जहां a/b
।
जैसे। 5/7 = 0.714258 714258 ...।
मुझे वर्तमान में केवल लंबी विभाजन विधि का ही पता है।
जवाबों:
मेरा मानना है कि यहां दो सामान्य दृष्टिकोण हैं, आप अनिवार्य रूप से "ब्रूट फोर्स" को सबसे लंबे समय तक दोहराए जाने वाले स्ट्रिंग के लिए देख सकते हैं, या आप इसे संख्या सिद्धांत की समस्या के रूप में हल कर सकते हैं।
इस समस्या को पार किए हुए मुझे एक लंबा समय हो गया है, लेकिन एक विशेष मामला (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
। एक परिमेय संख्या के दशमलव विस्तार के दोहराव वाले हिस्से में अंकों की संख्या को सीधे इसके हर के गुणक क्रम से भी पाया जा सकता है।
मेरा नंबर सिद्धांत इस समय थोड़ा कठोर है, इसलिए मैं जो सबसे अच्छा कर सकता हूं वह आपको उस दिशा में इंगित करेगा।
चलो 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
। आर को खोजने के लिए, p
1 से अनंत तक लूप , और 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
केवल एक परिमित दशमलव प्रतिनिधित्व होगा यदि उस के सभी प्रमुख कारक d
2 या 5 नहीं हैं, तो वे भी मौजूद हैं n
।
0.123123... = 123/999
0.714258714258... = 714258/999999 (=5/7)
आदि
लम्बा विभाजन? : /
परिणाम को एक स्ट्रिंग में बदल दें, और फिर इस एल्गोरिथ्म को उस पर लागू करें । यदि आपका स्ट्रिंग सामान्य प्रकारों के साथ काफी लंबा नहीं है, तो BigDecimal का उपयोग करें।