আমি দুটি পূর্ণসংখ্যার পুনরাবৃত্তি দশমিক অংশ 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
totient ফাংশন। দেখা যাচ্ছে যে 10 (মোড ) (গ্লিশার 1878, লেহমার 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)
ইত্যাদি
দীর্ঘ বিভাগ? : /
ফলাফলটিকে স্ট্রিংয়ে পরিণত করুন এবং তারপরে এটিতে এই অ্যালগরিদম প্রয়োগ করুন । আপনার স্ট্রিং সাধারণ ধরণের সাথে যথেষ্ট দীর্ঘ না হলে বিগডিসিমাল ব্যবহার করুন।