Extended Midy’s theorem

According to Midy’s theorem, if the period of a repeating decimal for , where p is prime and is a reduced fraction, has an even number of digits, then dividing the repeating portion into halves and adding gives a string of 9s. For example 1/7 = 0.14285714285.. is a repeating decimal with 142857 being repeated. Now, according to the theorem, it has even number of repeating digits i.e. 142857. Further if we divide this into two halves, we get 142 and 857. Thus, on adding these two, we get 999 which is string of 9s and matches our theorem.

In Extended Midy’s theorem if we divide the repeating portion of a/p into m digits, then their sum is a multiple of 10m -1.

Suppose a = 1 and p = 17,
a/p = 1/17 = 0.0588235294117647…
So, 0588235294117647 is the repeating portion of the decimal expansion of 1/17. Its repeating portion has 16 digits and it can be divided into m digits where m can be 2, 4, 8.
If we consider m = 4 then 0588235294117647 can be divided into 16/4 = 4 numbers and if we add these 4 numbers then result should be a multiple of 104 – 1 = 9999 i.e,
0588 + 2352 + 9411 + 7647 = 19998 = 2*9999

 // C++ program to demonstrate extended  // Midy's theorem #include using namespace std;    // Returns repeating sequence of a fraction. // If repeating sequence doesn't exits, // then returns -1 string fractionToDecimal(int numerator,                           int denominator) {     string res;        /* Create a map to store already seen remainders     remainder is used as key and its position in     result is stored as value. Note that we need     position for cases like 1/6. In this case,     the recurring sequence doesn't start from first     remainder. */     unordered_map mp;        // Find first remainder     int rem = numerator % denominator;        // Keep finding remainder until either remainder     // becomes 0 or repeats     while ((rem != 0) && (mp.find(rem) == mp.end())) {            // Store this remainder         mp[rem] = res.length();            // Multiply remainder with 10         rem = rem * 10;            // Append rem / denr to result         int res_part = rem / denominator;         res += to_string(res_part);            // Update remainder         rem = rem % denominator;     }        return (rem == 0) ? "-1" : res.substr(mp[rem]); }    // Checks whether a number is prime or not bool isPrime(int n) {     for (int i = 2; i <= n / 2; i++)         if (n % i == 0)             return false;     return true; }    // If all conditions are met, // it proves Extended Midy's theorem void ExtendedMidys(string str, int n, int m) {     if (!isPrime(n)) {         cout << "Denominator is not prime, "              << "thus Extended Midy's "              << "theorem is not applicable";         return;         }        int l = str.length();     int part1 = 0, part2 = 0;     if (l % 2 == 0 && l % m == 0) {            // Dividing repeated part into m parts         int part[m] = { 0 }, sum = 0, res = 0;         for (int i = 0; i < l; i++) {             int var = i / m;             part[var] = part[var] * 10 + (str[i] - '0');         }            // Computing sum of parts.         for (int i = 0; i < m; i++) {             sum = sum + part[i];             cout << part[i] << " ";         }                    // Checking for Extended Midy         cout << endl;         res = pow(10, m) - 1;         if (sum % res == 0)              cout << "Extended Midy's theorem holds!";                 else              cout << "Extended Midy's theorem"                  << " doesn't hold!";             }     else if (l % 2 != 0) {         cout << "The repeating decimal is"              << " of odd length thus Extended "             << "Midy's theorem is not applicable";     }     else if (l % m != 0) {         cout << "The repeating decimal can "              << "not be divided into m digits";     } }    // Driver code int main() {     int numr = 1, denr = 17, m = 4;     string res = fractionToDecimal(numr, denr);     if (res == "-1")         cout << "The fraction does not"              << " have repeating decimal";     else {         cout << "Repeating decimal = " << res << endl;         ExtendedMidys(res, denr, m);     }     return 0; }

Output:

Repeating decimal = 0588235294117647
588 2352 9411 7647
Extended Midy's theorem holds!

My Personal Notes arrow_drop_up Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Article Tags :
Practice Tags :

Be the First to upvote.

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.