Page 32 - MATINF Nr. 13-14
P. 32

32                                                                                       V. P˘aun



                3. Teorema permite ,,reconstruct , ia” unui num˘ar din resturile sale.

                Demonstrat , ie:

                Not˘am M i = M/m i . Deoarece (M i , m i ) = 1, exist˘ y i ∈ Z astfel ˆıncˆat:
                                                                   a

                                                  M i y i ≡ 1 (mod m i ).


                             P
                Definim x =      a i M i y i . Pentru un indice fixat i, avem M j ≡ 0 (mod m i ) pentru j 6= i, deci:
                                                                 a
                x ≡ a i M i y i ≡ a i (mod m i ), ceea ce demonstreaz˘ existent , a solut , iei.
                                                                                                       0
                                                                0
                            0
                Dac˘a x s , i x sunt dou˘a solut , ii, atunci x ≡ x (mod m i ) pentru orice i, deci x − x este
                                         a
            multiplu de M, ceea ce arat˘ unicitatea modulo M.
                Algoritmul general:
                1. Se calculeaz˘a M= produsul tuturor modulelor.

                2. Pentru fiecare i: M i = M/m i .

                3. Se calculeaz˘a inversul modular y i al lui M i modulo m i (algoritmul lui Euclid extins).
                                     P
                4. Se calculeaz˘a x =   a i M i y i .
                5. Se reduce x modulo M.

                Implementare ˆın C++
            #include <iostream>
            using namespace std;
            /*Algoritmul extins al lui Euclid rezolva urmatoarea problema:
               determina d=cmmdc(a,b) si doi intregi m si n astfel incat m*a+n*b=d.
            */
            long long euclidExtins(long long a, long long b, long long &m, long long &n)
            {
                if ( b== 0) { m = 1; n = 0; return a; }
                int d = euclidExtins(b,a % b, n, m);
                n=n-(a/b)*m;
                return d;
            }

            // Gaseste inversul modular al lui a modulo m
            // Returneaza 0 daca nu exista (cand cmmdc(a,m) != 1)
            long long invers(long long a, long long m)
            {
                long long x, y;
                long long d = euclidExtins(a, m, x, y);
                if (d!=1) return 0; // Nu exista invers
                return (x%m+m)%m; // Asigura rezultat pozitiv
            }


            // implementeaza algoritmul TCR
            // functia TCR returneaza 1 daca metoda este aplicabila
            // (modulele sunt prime intre ele)
            // sau 0 in caz contrar. In parametrii x si M avem solutia sistemuloi
   27   28   29   30   31   32   33   34   35   36   37