কম্পিউটার টিউটোরিয়াল

C++-এ মিডি'র থিওরেম (Midy's Theorem)

আমাদের পূর্ণসংখ্যা মান দেওয়া আছে 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
  1. C++-এ Line Reflection: ২D প্লেনে বিন্দুগুলোর Y-অক্ষ সমান্তরাল প্রতিফলন লাইন আছে কিনা যাচাই করা

  2. C++-এ ডায়াগোনাল ট্রায়ভার্স II

  3. C++ প্রোগ্রাম: ফার্মেটস লিটল থিওরেম বাস্তবায়ন

  4. C++ প্রোগ্রাম: 오일러 থিওরেম বাস্তবায়ন