আমাদের পূর্ণসংখ্যা মান দেওয়া আছে a_num যা NUMERATOR সংরক্ষণ করবে এবং p_den যা DENOMINATOR সংরক্ষণ করবে যেটি একটি প্রাইম নাম্বার হওয়া উচিত। কাজটি হল a_num-এ অপারেশন করে p_den দিয়ে ভাগ করলে মিডি'র থিওরেম প্রমাণ হয় কিনা তা চেক করা।
মিডি'র থিওরেম প্রমাণ করার ধাপসমূহ:-
- নিউমেরেটর a_num এবং ডিনোমিনেটর p_den ইনপুট নিন যা সর্বদা একটি প্রাইম মান হওয়া উচিত।
- সংখ্যাগুলো ভাগ করুন। রিপিটিং ডেসিমল মান চেক করুন।
- ডেসিমল মানগুলো সংরক্ষণ করুন যতক্ষণ না সেগুলো রিপিট হয়।
- চেক করুন অঙ্কগুলো জোড় কিনা, যদি হ্যাঁ হয় তবে সেগুলো আধা ভাগ করুন।
- দুটি সংখ্যা যোগ করুন। আউটপুট যদি ৯-এর স্ট্রিং হয় তবে মিডি'র থিওরেম প্রমাণিত হয়।
বিভিন্ন ইনপুট-আউটপুট পরিস্থিতি দেখে নিই -
ইন - int a_num = 1 এবং int p_den = 19
আউট - রিপিটিং ডেসিমলগুলো: 052631578947368421 মিডি'র থিওরেম প্রমাণিত
ব্যাখ্যা - উপরে উল্লেখিত ধাপগুলো ফলো করুন মিডি'র থিওরেম চেক করার জন্য:
- ১ / ১৯ = 052631578947368421 ভাগ করুন
- রিপিটিং ডেসিমল মান: 052631578947368421।
- অঙ্কগুলো আধা ভাগ করুন: 052631578 947368421।
- দুই হাফ যোগ করুন: 052631578 + 947368421 = 999,999,999।
- যেমন দেখা যাচ্ছে, 999,999,999 হল ৯-এর স্ট্রিং যা মিডি'র থিওরেম প্রমাণ করে।
ইন - int a_num = 49, int p_den = 7
আউট - কোনো রিপিটিং ডেসিমল নেই
ব্যাখ্যা - যেনে দেখা যাচ্ছে 49/7 কোনো ডেসিমল মান জেনারেট করে না কারণ 49 সম্পূর্ণভাবে ৭ দ্বারা বিভাজ্য। তাই আউটপুট: কোনো রিপিটিং ডেসিমল নেই।
নিচের প্রোগ্রামে ব্যবহৃত পদ্ধতি
- দুটি পূর্ণসংখ্যা মান ইনপুট নিন int a_num এবং int p_den হিসেবে।
- Midy's theorem প্রমাণ করার জন্য Midys_theorem(a_num, p_den) ফাংশন কল করুন।
- check_Midys() ফাংশনের ভিতরে:
- first এবং last নামে দুটি ভেরিয়েবল ০ দিয়ে তৈরি করুন।
- চেক করুন IF check(val) ফাংশন FALSE রিটার্ন করলে "Midy's theorem not applicable" প্রিন্ট করুন।
- ELSE IF len % 2 == 0 তবে i = ০ থেকে len/2 পর্যন্ত FOR লুপ শুরু করুন এবং first = first * 10 + (str[i] - '0') এবং last = last * 10 + (str[len / 2 + i] - '0') সেট করুন এবং "Proved Midy's theorem" প্রিন্ট করুন।
- অন্যথায়, "Midy's theorem not applicable" প্রিন্ট করুন।
- Midys_theorem(int a_num, int p_den) ফাংশনের ভিতরে:
- map_val নামে integer টাইপ মান ম্যাপ করার জন্য map টাইপের একটি ভেরিয়েবল তৈরি করুন এবং मैप ক্লিয়ার করুন।
- remainder = a_num % p_den সেট করুন।
- WHILE remainder != 0 AND map_val.find(remainder) == map_val.end() পর্যন্ত: map_val[remainder] = result.length(), remainder = remainder * 10, temp = remainder / p_den, result = result + to_string(temp), remainder = remainder % p_den সেট করুন।
- চেক করুন IF remainder = 0 তবে -1 রিটার্ন করুন। ELSE, count = result.substr(map_val[remainder]) সেট করুন।
- count রিটার্ন করুন।
- bool check(int val) ফাংশনের ভিতরে:
- i = ২ থেকে val/2 পর্যন্ত FOR লুপ শুরু করুন। চেক করুন IF val % i == 0 তবে FALSE রিটার্ন করুন অন্যথায় TRUE রিটার্ন করুন।
উদাহরণ
#include <bits/stdc++.h>
using namespace std;
bool check(int val){
for(int i = 2; i <= val / 2; i++){
if(val % i == 0){
return false;
}
}
return true;
}
void check_Midys(string str, int val){
int len = str.length();
int first = 0;
int last = 0;
if(!check(val)){
cout<<"\nNot applicable for Midy's theorem";
}
else if(len % 2 == 0){
for(int i = 0; i < len / 2; i++){
first = first * 10 + (str[i] - '0');
last = last * 10 + (str[len / 2 + i] - '0');
}
cout<<"\nProved Midy's theorem";
}
else{
cout<<"\nNot applicable for Midy's theorem";
}
}
string Midys_theorem(int a_num, int p_den){
string result;
map<int, int> map_val;
map_val.clear();
int reminder = a_num % p_den;
while((reminder != 0) && (map_val.find(reminder) == map_val.end())){
map_val[reminder] = result.length();
reminder = reminder * 10;
int temp = reminder / p_den;
result += to_string(temp);
reminder = reminder % p_den;
}
if(reminder == 0){
return "-1";
}
else{
string count = result.substr(map_val[reminder]);
return count;
}
}
int main(){
int a_num = 1;
int p_den = 19;
string result = Midys_theorem(a_num, p_den);
if(result == "-1"){
cout<<"No Repeating Decimal";
}
else{
cout<<"Repeating decimals are: "<<result;
check_Midys(result, p_den);
}
return 0;
}
আউটপুট
উপরোক্ত কোডটি রান করলে নিচের আউটপুটটি জেনারেট হবে
Repeating decimals are: 052631578947368421 Proved Midy's theorem