3.4 Modularna aritmetika

U osnovi modularne aritmetike leži operacija određivanja celobrojnog količnika i ostatka. Podsetimo se, broj je \(q\) količnik, a broj \(r\) ostatak pri deljenju broja \(x\) brojem \(y\) ako i samo ako postoje brojevi \(q\) i \(r\) takvi da važi \(x = q\cdot y + r\) i \(0 \leq r < y\). Brojevi \(q\) i \(r\) su ovim uslovom jedinstveno određeni. Pisaćemo \(q = a \,\mathrm{div}\,b\) i \(r = a \,\mathrm{mod}\,b\).

Pored toga što sa \(\,\mathrm{mod}\,\) označavamo binarnu operaciju, \(\,\mathrm{mod}\,\) se koristi i kao oznaka relacije u skupu celih brojeva. Naime, pisaćemo \(a \equiv b\ (\mathrm{mod}\ m)\) i reći da su \(a\) i \(b\) kongruentni po modulu \(m\) ako \(m\vert a-b\) tj. ako je \(a \,\mathrm{mod}\,m = b \,\mathrm{mod}\,m\), odnosno ako \(a\) i \(b\) daju isti ostatak pri deljenju sa \(m\). Na primer, \(12 \equiv 2\ (\mathrm{mod}\ 5)\) jer \(5\vert (12-2)\).

Relaciju \(\mathrm{mod}\) koristimo u raznim svakodnevnim situacijama, a da toga često nismo ni svesni. Jedan od takvih primera je rad sa vremenom. Naime, za vreme koje je \(15\) časova nakon \(11\) sati reći ćemo da je \(2\) sata (što odgovara tome da je \(11+15 \equiv 2\ (\mathrm{mod}\ 24)\)). Slično važi i za dane u nedelji koje možemo obeležiti brojevima od 0 do 6 (na primer, od nedelje, do subote). Operacije vršimo po modulu \(7\). Na primer, ako je danas četvrtak (dan obeležen brojem 4), za šest dana biće sreda (dan obeležen brojem 3), jer je \(4+6 \equiv 3\ (\mathrm{mod}\ 7)\). Analogno se računa i mesec ili redni broj nedelje u godini. Modularna aritmetika ima još puno praktičnih primena, pomenimo samo neke zanimljive: koristi se za izračunavanje kontrolnih suma za međunarodne standardne identifikatore knjiga (ISBN brojeve), međunarodne brojeve bankovnih računa (IBAN), kao i jedinstvene identifikatore hemijskih jedinjenja (CAS registarski broj). Modularna aritmetika je i u osnovi nekih savremenih kriptografskih sistema.

Neoznačeni celi brojevi se u računarima predstavljaju sa \(k\) bitova, a operacije nad njima se izvode po modulu \(2^k\). Recimo, u jeziku C++ brojevi tipa unsigned int su širine \(32\) bita, pa se operacije nad njima izvode po modulu \(2^{32}\).

Primer 3.4.1. U narednom kodu kao rezultat kvadriranja broja \(123456789\) dobija se vrednost \(123456789^2 \,\mathrm{mod}\,2^{32} = 2537071545\).

unsigned int x = 123456789;
unsigned int y = x * x;
cout << y << endl;

Ako je \(a_1 \equiv b_1\ (\mathrm{mod}\ m)\) i \(a_2 \equiv b_2\ (\mathrm{mod}\ m)\), onda je \(a_1\pm a_2 \equiv b_1\pm b_2\ (\mathrm{mod}\ m)\) i \(a_1\cdot a_2 \equiv b_1\cdot b_2\ (\mathrm{mod}\ m)\); na primer,

\[\begin{array}{ccc} 12,14 & \stackrel{\,\mathrm{mod}\,5}\longrightarrow & 2,4 \\ +\downarrow & & \downarrow + \\ 26 & \stackrel{\,\mathrm{mod}\,5}\longrightarrow & 1 \end{array} \]

Drugim rečima, relacija \(\mathrm{mod}\) je saglasna (kongruentna) sa operacijama sabiranja, oduzimanja i množenja. Rezimirajmo osnovne osobine kogruencija u narednoj lemi.

Lema 3.4.1. [Osnovne osobine kongruencije] Kongruencija po modulu zadovoljava sledeće osobine:

  1. Važi \(a \equiv b\ (\mathrm{mod}\ m)\) ako i samo ako \(m \vert (a-b)\). Važi \(a \equiv 0\ (\mathrm{mod}\ m)\) ako i samo ako \(m \vert a\).
  2. Kongruencija po modulu je relacija ekvivalencije (važi \(a \equiv a\ (\mathrm{mod}\ m)\), ako važi \(a \equiv b\ (\mathrm{mod}\ m)\) tada važi i \(b \equiv a\ (\mathrm{mod}\ m)\) i ako važi \(a \equiv b\ (\mathrm{mod}\ m)\) i \(b \equiv c\ (\mathrm{mod}\ m)\) tada važi i \(a \equiv c\ (\mathrm{mod}\ m)\)).
  3. Ako važi \(a_1 \equiv b_1\ (\mathrm{mod}\ m)\) i \(a_2 \equiv b_2\ (\mathrm{mod}\ m)\) tada važi \(a_1 + a_2 \equiv b_1 + b_2\ (\mathrm{mod}\ m)\), \(a_1 - a_2 \equiv b_1 - b_2\ (\mathrm{mod}\ m)\) i \(a_1\cdot a_2 \equiv b_1\cdot b_2\ (\mathrm{mod}\ m)\).
  4. Ako važi \(a \equiv b\ (\mathrm{mod}\ m)\), onda za svaki prirodan broj \(k\) važi \(a^k \equiv b^k\ (\mathrm{mod}\ m)\).
  5. Ako su \(c\) i \(m\) uzajamno prosti (važi \(\mathrm{nzd}(c, m) = 1\)), tada iz \(c\cdot a \equiv c\cdot b\ (\mathrm{mod}\ m)\) sledi \(a \equiv b\ (\mathrm{mod}\ m)\) (kongruencija se može skratiti sa \(c\)).
  6. Ako važi \(c\cdot a \equiv c \cdot b\ (\mathrm{mod}\ c\cdot m)\) tada važi i \(a \equiv b\ (\mathrm{mod}\ m)\) (kongruencija se može skratiti sa \(c\)).

Dokaz. Dokažimo samo poslednje dve stavke koje ćemo zvati prvi i drugi zakon skraćivanja (ostale se dokazuju direktno na osnovu definicije).

Pretpostavimo da je \(\mathrm{nzd}(c, m) = 1\) i da važi \(c\cdot a \equiv c\cdot b\ (\mathrm{mod}\ m)\) tj. da važi \(m \vert (c\cdot a - c\cdot b)\). Zato postoji neki prirodan broj \(k\) takav da je \(c \cdot (a - b) = k m\). Pošto su \(c\) i \(m\) uzajmno prosti, svi prosti faktori broja \(m\) moraju biti sadržani u broju \(a-b\), pa postoji neki prirodan broj \(j\) takav da je \(a - b = jm\), odakle sledi \(m \vert (a-b)\) tj. \(a \equiv b\ (\mathrm{mod}\ m)\).

Ako važi \(c\cdot a \equiv c \cdot b\ (\mathrm{mod}\ c\cdot m)\), tada postoji prirodan broj \(k\) takav da je \((c\cdot a - c \cdot b) = k \cdot c \cdot m\). Skraćivanjem sa \(c\) dobija se \(a - b = k\cdot m\), iz čega tvrđenje sledi.

Važi i obratan smer, međutim, ovu lemu ćemo koristiti uvek za skraćivanje kongruencija, a ne za njihovo proširivanje. \(\Box\)

Primer 3.4.2. Prvi zakon skraćivanja je moguće primeniti samo kada su brojevi \(c\) i \(m\) uzajamno prosti. Iz \(4 \equiv 10\ (\mathrm{mod}\ 6)\) ne sledi \(2 \equiv 5\ (\mathrm{mod}\ 6)\), međutim, na osnovu drugog zakona skraćivanja sledi \(2 \equiv 5\ (\mathrm{mod}\ 3)\).

Ovo inspiriše sledeće jednakosti koje se koriste za računanje vrednosti zbira ili proizvoda brojeva po modulu \(m\).

Lema 3.4.2. [Sabiranje i množenje po modulu] \[\begin{eqnarray*} (a + b)\,\mathrm{mod}\,m &=& (a\,\mathrm{mod}\,m\ +\ b\,\mathrm{mod}\,m)\,\mathrm{mod}\,m \\ (a \cdot b)\,\mathrm{mod}\,m &=& (a\,\mathrm{mod}\,m\ \cdot\ b\,\mathrm{mod}\,m)\,\mathrm{mod}\,m \end{eqnarray*}\]

Dokaz. Dokažimo drugu jednakost (prva je jednostavnija za dokazivanje).

Pretpostavimo da je \(a = q_a\cdot m + r_a\) i \(b = q_b\cdot m + r_b\) za \(0 \leq r_a, r_b < m\). Tada je:

\[a\cdot b = (q_a \cdot m + r_a) \cdot (q_b \cdot m + r_b) = (q_a \cdot q_b \cdot m + q_a \cdot r_b + r_a\cdot q_b)m + r_a\cdot r_b.\]

Ako je \(r_a \cdot r_b = q\cdot m + r,\ 0 \leq r < m,\) tada je:

\[a\cdot b = (q_a \cdot q_b \cdot m + q_a \cdot r_b + r_a\cdot q_b + q)m + r,\ 0\leq r < m\]

pa je \((a \cdot b)\,\mathrm{mod}\,m = r.\)

Važi, takođe, da je \((a\,\mathrm{mod}\,m\ \cdot\ b \,\mathrm{mod}\,m)\,\mathrm{mod}\,m = (r_a \cdot r_b)\,\mathrm{mod}\,m = r,\) čime je tvrđenje dokazano. \(\Box\)

Računanje na osnovu prethodnih jednakosti je važno, jer često omogućava da se izbegnu greške nastale usled prekoračenja. Naime, ako su brojevi \(a\) i \(b\) relativno veliki, a \(m\) mali, tada izrazi \(a+b\) i \(a\cdot b\) mogu dovesti do prekoračenja, pa se samim tim mogu dobiti netačni rezultati prilikom izračunavanja vrednosti izraza \((a+b)\,\mathrm{mod}\,m\) i \((a\cdot b)\,\mathrm{mod}\,m\). Sa druge strane, u izrazima \((a\,\mathrm{mod}\,m + b\,\mathrm{mod}\,m)\,\mathrm{mod}\,m\) i \((a\,\mathrm{mod}\,m \cdot b\,\mathrm{mod}\,m)\,\mathrm{mod}\,m\) se računa sa manjim brojevima i oni najčešće ne dovode do prekoračenja.

Primer 3.4.3. Na primer, ako je \(a=b=3\cdot 10^9+9\), a \(m=10\), tada je \(a+b=6\cdot 10^9+18\) i ne može se ispravno predstaviti pomoću \(32\) bita. Važi da je \(a\,\mathrm{mod}\,m = b\,\mathrm{mod}\,m = 9\), pa se zbir \(a\,\mathrm{mod}\,m + b\,\mathrm{mod}\,m = 18\) može ispravno predstaviti sa \(32\) bita, pre nego što se izračuna konačan rezultat \((a\,\mathrm{mod}\,m + b\,\mathrm{mod}\,m)\,\mathrm{mod}\,m = 8\).

Ipak, treba biti obazriv, jer je moguće da se desi da su i operandi (\(a\,\mathrm{mod}\,m\) i \(b\,\mathrm{mod}\,m\)) i krajnji rezultat dovoljno mali da se mogu ispravno predstaviti određenim tipom, ali da su međurezultati (\(a\,\mathrm{mod}\,m + b\,\mathrm{mod}\,m\) i naročito \(a\,\mathrm{mod}\,m \cdot b\,\mathrm{mod}\,m\)) preveliki da bi mogli da se ispravno predstave.

Primer 3.4.4. Ako je \(a = b = 10^5+1\) i \(m=10^6\), tada je \(a\,\mathrm{mod}\,m = b\,\mathrm{mod}\,m = 10^5+1\), pa je \(a\,\mathrm{mod}\,m \cdot a\,\mathrm{mod}\,m = 10^{10} + 2\cdot 10^5+1\), što se ne može ispravno zapisati pomoću \(32\) bita. Konačan rezultat je \((a\,\mathrm{mod}\,m \cdot b\,\mathrm{mod}\,m)\,\mathrm{mod}\,m = 2\cdot 10^5+1\) i on se može ispravno zapisati pomoću \(32\) bita.

Zato je u slučaju velikih vrednosti broja \(m\) poželjno međurezultate izračunati u širem tipu (na primer, ako su \(a \,\mathrm{mod}\,m\) i \(b \,\mathrm{mod}\,m\) predstavljeni sa \(32\) bita, tada je poželjno konvertovati ih i pomnožiti kao \(64\)-bitne brojeve, pre nego što se izračunavanjem ostatka dobije konačan rezultat koji se ponovo ispravno može predstaviti pomoću \(32\) bita).

Prethodna svojstva nam omogućavaju da garantujemo da će se uz sva prekoračenja međurezultata koja dolaze tokom rada sa neoznačenim brojevima, na kraju izračunavanja dobiti rezultat koji je jednak ostatku pri deljenju brojem \(2^{32}\) (tj. \(2\) na broj bitova upotrebljenih za zapis) rezultata koji bi se dobio bez prekoračenja.

Razmotrimo sada problem određivanja razlike nenegativnih brojeva \(b\) i \(a\) po modulu \(m\). Na primer, potrebno je odrediti vrednost \((b-a)\,\mathrm{mod}\,m\) za \(a,b\geq 0\). Pretpostavimo za početak da su brojevi \(a\) i \(b\) manji od \(m\). Ponovimo da ne postoji saglasnost između različitih programskih jezika u računanju vrednosti a % m kada je vrednost broja a negativna. Naime, u jeziku C++ se za vrednost ostatka pri deljenju može dobiti negativan broj: na primer, vrednost izraza (2 - 7) % 3 je \(-2\), dok se u jeziku Python kao rezultat istog ovog izraza dobija pozitivan broj \(1\). Često želimo da kao rezultat računanja vrednosti po modulu dobijemo nenegativnu vrednost. Umesto da vršimo analizu slučajeva, rešenje je moguće dobiti izračunavanjem vrednosti izraza \((b \,\mathrm{mod}\,m - a \,\mathrm{mod}\,m + m)\,\mathrm{mod}\,m\).

Lema 3.4.3. [Oduzimanje po modulu] Za proizvoljne brojeve \(a\) i \(b\) važi:

\[(b - a)\,\mathrm{mod}\,m = (b\,\mathrm{mod}\,m - a\,\mathrm{mod}\,m + m)\,\mathrm{mod}\,m\]

Pritom je vrednost izraza \(b\,\mathrm{mod}\,m - a\,\mathrm{mod}\,m + m\) uvek nenegativna.

Dokaz. Neka je \(a = q_a\cdot m + r_a\) i \(b = q_b\cdot m + r_b\), za \(0 \leq r_a, r_b < m\). Tada je \(a\,\mathrm{mod}\,m = r_a\) i \(b\,\mathrm{mod}\,m = r_b\). Neka je: \(r_b - r_a + m = p\cdot m + r,\ 0 \leq r < m.\) Zato je: \((b\,\mathrm{mod}\,m - a\,\mathrm{mod}\,m + m)\,\mathrm{mod}\,m = (r_b - r_a + m)\,\mathrm{mod}\,m = r.\) Takođe, važi i da je: \(b-a = (q_b - q_a)\cdot m + (r_b - r_a) = (q_b - q_a - 1)\cdot m + (r_b - r_a + m) = (q_b - q_a - 1 + p)\cdot m + r,\) pa je i \((b-a)\,\mathrm{mod}\,m = r\).

Brojevi \(a \,\mathrm{mod}\,m = r_a\) i \(b \,\mathrm{mod}\,m = r_b\) pripadaju intervalu \([0, m)\), pa njihova razlika pripada intervalu \((-m, m)\). Dodavanjem vrednosti \(m\), dobija se nenegativna vrednost (u intervalu \((0, 2m)\)). \(\Box\)

Naravno, ako se unapred zna da su argumenti \(a\) i \(b\) već svedeni po modulu \(m\) (tj. važi \(0 \leq a < m\) i \(0 \leq b < m\)), onda je dovoljno samo koristiti izraz \((b - a + m) \,\mathrm{mod}\,m\).

Prethodno tvrđenje nam omogućava da u bilo kom programskom jeziku razliku po modulu možemo izračunati jednim izrazom, tako da se dobije nenegativan rezultat.

Važi sličan rezultat i za stepenovanje po modulu.

Lema 3.4.4. [Stepenovanje po modulu] \(a^n \,\mathrm{mod}\,m = (a\,\mathrm{mod}\,m)^n \,\mathrm{mod}\,m\)

Ova lema se jednostavno dokazuje primenom pravila za množenje brojeva po modulu. Pošto i vrednost \((a\,\mathrm{mod}\,m)^n\) veoma brzo raste i može dovesti do prekoračenja, prilikom računanja stepena, svođenje po modulu treba vršiti prilikom svakog množenja. Ovakvo modularno stepenovanje se najbolje izvodi algoritmom brzog stepenovanja (pri čemu je poželjno u prvom pozivu svesti vrednost \(a\) po modulu \(m\) tj. kao prvi parametar proslediti vrednost a % m).

int stepen(int a, int n, int m) {
    if (n == 0)
       return 1;
    if (n % 2 == 0)
        return stepen((a * a) % m, n / 2, m);
    else
        return (a * stepen(a, n-1, m)) % m;
}

Primer 3.4.5. Ilustrujmo proceduru računanja trinaestog stepena broja \(2\) po modulu \(100\):

\[\begin{eqnarray*} \mathtt{stepen}(2, 13, 100) &=& \\ (2\cdot \mathtt{stepen}(2, 12, 100)) \,\mathrm{mod}\,100 &=&\\ (2\cdot \mathtt{stepen}((2\cdot 2)\,\mathrm{mod}\,100, 6, 100)) \,\mathrm{mod}\,100 &=&\\ (2\cdot \mathtt{stepen}(4, 6, 100)) \,\mathrm{mod}\,100 &=&\\ (2\cdot \mathtt{stepen}((4 \cdot 4) \,\mathrm{mod}\,100, 3, 100)) \,\mathrm{mod}\,100 &=&\\ (2\cdot \mathtt{stepen}(16, 3, 100)) \,\mathrm{mod}\,100 &=&\\ (2\cdot ((16 \cdot \mathtt{stepen}(16, 2, 100)) \,\mathrm{mod}\,100)) \,\mathrm{mod}\,100 &=&\\ (2\cdot ((16 \cdot \mathtt{stepen}((16 \cdot 16)\,\mathrm{mod}\,100, 1, 100)) \,\mathrm{mod}\,100)) \,\mathrm{mod}\,100 &=&\\ (2\cdot ((16 \cdot \mathtt{stepen}(56, 1, 100)) \,\mathrm{mod}\,100)) \,\mathrm{mod}\,100 &=&\\ (2\cdot ((16 \cdot (56 \cdot \mathtt{stepen}(56, 0, 100)) \,\mathrm{mod}\,100) \,\mathrm{mod}\,100)) \,\mathrm{mod}\,100 &=&\\ (2\cdot ((16 \cdot (56 \cdot 1) \,\mathrm{mod}\,100) \,\mathrm{mod}\,100)) \,\mathrm{mod}\,100 &=&\\ (2\cdot ((16 \cdot 56) \,\mathrm{mod}\,100) \,\mathrm{mod}\,100) = (2\cdot 96) \,\mathrm{mod}\,100 &=&92\\ \end{eqnarray*}\]

Pošto je \(2^{13} = 8192\), rezultat je ispravno izračunat.

Aritmetičke operacije po modulu \(m\) se često koriste, pa ćemo uvesti naredne skraćene oznake: sa \(+_m\) ćemo obeležavati sabiranje po modulu tj. \(a +_m b\) je oznaka za \((a + b)\,\mathrm{mod}\,m\), sa \(\times_m\) množenje po modulu tj. \((a \cdot b)\,\mathrm{mod}\,m\) itd.

U kriptografiji se obično razmatraju jako veliki brojevi (sa po nekoliko hiljada cifara) koji se ne mogu predstaviti mašinskim tipovima podataka i za koje se ni osnovne aritmetičke operacije ne mogu izvršiti u konstantnom vremenu. Podsetimo se da je broj cifara broja \(n\) jednak \(O(\log{n})\), odakle slede naredna tvrđenja.

Dakle, sve osnovne aritmetičke operacije su dovoljno efikasne i kada se sprovode nad brojevima sa po nekoliko hiljada cifara.

Stvar se ne menja značajno ni kada se operacije izvršavaju po modulu. Određivanje ostatka zahteva dodatno deljenje, međutim, smanjuje broj cifara rezultata, pa se složeni izrazi ponekad efikasnije izračunavaju kada su operacije po modulu.

Sa druge strane, u slučaju jako velikih vrednosti modula \(n\), neke operacije koje se efikasno sprovode nad mašinskim tipovima podataka su jako neefikasne i ne mogu se praktično izvršiti. Kod ovako velikih brojeva postoji ogromna razlika između algoritama složenosti \(O(\sqrt{n})\) i \(O(\log{n})\). Ako je \(n\) reda veličine \(10^{1000}\), onda algoritam koji izvršava \(\sqrt{n}\) operacija izvršava \(10^{500}\) operacija, što je neizvodivo, dok algoritam koji izvršava \(\log{n}\) operacija izvršava samo oko 1000 operacija, što je veoma brzo. Sigurnost mnogih kriptografskih protokola zasnovana je na težini izvođenja operacija složenosti \(O(\sqrt{n})\).

3.4.1 Modularne grupe

Za svaki prirodan broj \(n\) mogući ostaci pri deljenju sa \(n\) čine skup \(Z_{n} = \{0, 1, \ldots, n-1\}\). Kada se ovi ostaci kombinuju operacijom \(+_n\) sabiranja po modulu \(n\) i operacijom \(\times_n\) množenja po modulu \(n\) ponovo se dobijaju vrednosti koje pripadaju tom skupu. Pošto su obe operacije asocijativne i pošto neutral za sabiranje \(0\) i neutral za množenje \(1\) pripadaju skupu ostataka \(Z_{n}\), strukture \((Z_n, +_n)\) i \((Z_n \setminus \{0\}, \times_n)\) su monoidi1 (za bilo koju vrednost \(n\)).

Svaki element u strukturi \((Z_n, +_n)\) ima inverzni element jer je za svako \(x \in Z_n\) i element \(n-x \in Z_n\) i važi \(x +_n (n - x) = 0\), pa je struktura \((Z_n, +_n)\) grupa2 (za bilo koju vrednost \(n\)). Ovu grupu nazivamo aditivna grupa celih brojeva po modulu \(n\) ili modularna aditivna grupa i obeležavamo sa \(\mathbb{Z}_n^+\). Inverzni element u odnosu na \(+_n\) nazivamo modularni aditivni inverz.

U narednoj tablici prikazana je tablica sabiranja modularne aditivne grupe \(\mathbb{Z}_5^+\).

\(+_5\) 0 1 2 3 4
0 0 1 2 3 4
1 1 2 3 4 0
2 2 3 4 0 1
3 3 4 0 1 2
4 4 0 1 2 3

Da li, analogno aditivnim, možemo da razmatramo modularne multiplikativne grupe? Struktura \((Z_n \setminus \{0\}, \times_n)\) ne mora biti grupa, jer ne moraju svi elementi da imaju inverz (koji u ovom slučaju nazivamo modularni multiplikativni inverz). Na primer, razmotrimo tablicu za \(n=6\).

\(\times_6\) 1 2 3 4 5
1 1 2 3 4 5
2 2 4 0 2 4
3 3 0 3 0 3
4 4 2 0 4 2
5 5 4 3 2 1

Kada se broj \(2\) pomnoži bilo kojim elementom skupa \(Z_6 \setminus \{0\}\), dobija se paran broj i ostatak tog broja pri deljenju sa \(6\) može biti samo \(0\), \(2\) ili \(4\). Zato \(2\) nema inverzni element. Slično se dešava i sa elementima \(3\) i \(4\). Element \(1\) je sam sebi inverzan, a isto važi i za element \(5\) (jer je \(5 \cdot 5 = 25 \equiv 1\ (\mathrm{mod}\ 6)\)).

Sa druge strane, razmotrimo tablicu za \(n=5\).

\(\times_5\) 1 2 3 4
1 1 2 3 4
2 2 4 1 3
3 3 1 4 2
4 4 3 2 1

Jasno je da svaki element ima sebi inverzni (u svakoj vrsti i svakoj koloni se tačno jednom javlja vrednost \(1\)) i ova struktura je grupa. Inverz broja \(1\) je uvek \(1\) (jer je \(1 \cdot 1 = 1\)), inverz broja \(2\) je \(3\) (jer je \(2\cdot 3 = 6 \equiv 1\ (\mathrm{mod}\ 5)\)), inverz broja \(3\) je \(2\), a broj \(4\) je sam svoj inverz (jer je \(4 \cdot 4 = 16 \equiv 1\ (\mathrm{mod}\ 5)\)). Ova struktura je, dakle, grupa.

Dakle, za neke vrednosti \(n\), struktura \((Z_n \setminus \{0\}, \times_n)\) jeste grupa, a za neke nije.

Primetimo da su u slučaju \(n=6\) inverz imali brojevi \(1\) i \(5\) koji su uzajamno prosti sa \(6\), a u slučaju \(n=5\) svi brojevi \(1\), \(2\), \(3\) i \(4\), jer su svi uzajamno prosti sa \(5\). Razmotrimo sada opšti slučaj i formulišimo potreban i dovoljan uslov da element skupa \(Z_n\setminus \{0\}\) ima inverz u odnosu na operaciju \(\times_n\).

U narednom apletu možete videti tablice struktura \((Z_n\setminus \{0\}, \times_n)\) za različite vrednosti \(n\). Elementi u čijim vrstama tj. kolonama postoji vrednost 1 (obeležena sivom bojom) imaju inverzne elemente. Pokušajte da zaključite koji je potreban i dovoljan uslov da bi element imao inverz.

Teorema 3.4.1. [Postojanje modularnog multiplikativnog inverza] Ako su brojevi \(a\) i \(n\) uzajamno prosti prirodni brojevi (ako je \(\mathrm{nzd}(a, n) = 1\), tj. ako brojevi \(a\) i \(n\) nemaju zajedničkih prostih činilaca), onda postoji jedinstven multiplikativni inverz broja \(a\) po modulu \(n\), tj. jednačina \(ax \equiv 1\ (\mathrm{mod}\ n)\) ima jedinstveno rešenje u skupu \(Z_n \setminus \{0\}\). Ako brojevi \(a\) i \(n\) nisu uzajamno prosti, onda modularni multiplikativni inverz broja \(a\) ne postoji.

Dokaz. Jednačina \(ax \equiv 1\ (\mathrm{mod}\ n)\) ima rešenje ako i samo ako postoji prirodan broj \(q\) tako da je \(ax = qn + 1\), tj. ako je \(ax - qn = 1\). Zato tvrđenje direktno sledi iz teoreme 3.1.4.

Ilustracije radi, dokažimo tvrđenje i direktno.

Ako bi postojao zajednički činilac \(d>1\) brojeva \(a\) i \(n\) on bi delio levu stranu ove jednačine, pa bi morao da deli i desnu tj. broj \(1\), što je nemoguće. Dakle, ako brojevi \(a\) i \(n\) nisu uzajamno prosti, onda \(a\) nema inverz.

Pretpostavimo sada da su brojevi \(a\) i \(n\) uzajamno prosti. Razmotrimo niz od \(n\) brojeva \(a\cdot 0, a\cdot 1, a\cdot 2,\ldots, a\cdot (n-1)\). Pokazaćemo da su ostaci svih ovih vrednosti pri deljenju sa \(n\) različiti. S obzirom na to da ukupno postoji tačno \(n\) različitih vrednosti u skupu \(Z_n\), odatle sledi da je \(a\cdot x \equiv 1\ (\mathrm{mod}\ n)\) za tačno jedno \(x\) iz skupa \(Z_n\). Pošto to ne može biti \(x=0\), \(x\) pripada skupu \(Z_n \setminus \{0\}\) i on je jedinstveni modularni multiplikativni inverz broja \(a\) po modulu \(n\).

Da bismo pokazali da su ostaci različiti, pretpostavimo suprotno, tj. pretpostavimo da je \(a\cdot x_1 \equiv a\cdot x_2\ (\mathrm{mod}\ n)\) za dve različite vrednosti \(x_1\) i \(x_2\) iz skupa \(Z_n\). Pošto su \(a\) i \(n\) uzajamno prosti, na osnovu prvog zakona skraćivanja kongruencija (lema 3.4.1) važi \(x_1 \equiv x_2\ (\mathrm{mod}\ n)\), tj. \(x_1 - x_2\) mora biti neki celobrojni umnožak broja \(n\). Pošto su \(x_1\) i \(x_2\) dva različita nenegativna cela broja manja od \(n\), to je moguće samo ako je \(x_1 - x_2 = 0\), što je kontradikcija jer smo pretpostavili da važi \(x_1 \neq x_2\)

Dakle, sve vrednosti \(a\times_n 0, a\times_n 1, \ldots, a\times_n (n-1)\) su međusobno različite i za tačno jednu vrednost iz skupa \(\{1, \ldots, n-1\}\) važi da je multiplikativni inverz broja \(a\) po modulu \(n\). \(\Box\)

Broj \(x\) je inverz broja \(a\), ali je i \(a\) ujedno inverz broja \(x\), pa je i \(x\) uzajamno prost sa \(n\).

Ako je \(p\) prost broj, svi elementi skupa \(Z_p \setminus \{0\}\) su uzajamno prosti sa \(p\), pa je struktura \(\mathbb{Z}_p^\times = (Z_p \setminus \{0\}, \times_p) = (\{1, 2, \ldots, p-1\}, \times_p)\) grupa i označavamo je sa \(\mathbb{Z}_p^\times\). Još opštije, ako posmatramo samo skup \(\Phi_n\) brojeva između \(1\) i \(n-1\) koji su uzajamno prosti sa \(n\), struktura \((\Phi_n, \times_n)\) je grupa. Primetimo da za prost broj \(p\) važi da je skup \(Z_p \setminus \{0\} = \Phi_p\), pa je grupa \(\mathbb{Z}_p^\times\) samo specijalni slučaj grupe \(\mathbb{\Phi}_n^\times = (\Phi_n, \times_n)\), kada je \(n\) prost broj. Grupa \((\Phi_n, \times_n)\) naziva se multiplikativna grupa celih brojeva po modulu \(n\) ili modularna multiplikativna grupa. Ove grupe ćemo obeležavati sa \(\mathbb{\Phi}_n^\times\).

Primer 3.4.6. U nastavku je data tabela grupe \(\mathbb{\Phi}_9^\times\).

\(\times_9\) 1 2 4 5 7 8
1 \(1\) \(2\) \(4\) \(5\) \(7\) \(8\)
2 \(2\) \(4\) \(8\) \(1\) \(5\) \(7\)
4 \(4\) \(8\) \(7\) \(2\) \(1\) \(5\)
5 \(5\) \(1\) \(2\) \(7\) \(8\) \(4\)
7 \(7\) \(5\) \(1\) \(8\) \(4\) \(2\)
8 \(8\) \(7\) \(5\) \(4\) \(2\) \(1\)

Operacija deljenja brojem \(a\) po modulu \(n\) se svodi na množenje modularnim multiplikativnim inverzom broja \(a\) po modulu \(n\). Ovo se u nekim situacijama može upotrebiti za optimizaciju deljenja. Pretpostavimo da je potrebno izvršiti deljenje većeg broja neoznačenih brojeva nekim brojem \(k\), da su ti brojevi zapisani sa \(w\) bitova i svi deljivi sa \(k\). Umesto da se svi brojevi dele sa \(k\) moguće je (jednom) izračunati modularni multiplikativni inverz broja \(k\) po modulu \(2^w\), a zatim sve brojeve pomnožiti tim inverzom. Na sistemima na kojima se množenje izvršava brže od deljenja, ovo predstavlja optimizaciju. Naravno, da bi modularni multiplikativni inverz postojao, potrebno je da su brojevi \(k\) i \(2^w\) uzajamno prosti, što je slučaj ako i samo ako je broj \(k\) neparan. Sličan postupak možemo upotrebiti i ako je \(k\) paran, tako što ćemo \(k\) zapisati u obliku \(2^p\cdot k'\) za neparan broj \(k'\), a zatim svaki broj podeliti sa \(2^p\) (pomeranjem bitova za \(p\) mesta udesno, što je veoma brza operacija), pre množenja sa modularnim multiplikativnim inverzom broja \(k'\) po modulu \(2^w\) (on sigurno postoji jer je \(k'\) neparan broj).

3.4.2 Mala Fermaova i Ojlerova teorema

Kardinalnost skupa \(\Phi_n\), tj. broj brojeva između 1 i \(n-1\) koji su uzajamno prosti sa \(n\) izračunava se Ojlerovom funkcijom \(\varphi\), čije je izračunavanje opisano u poglavlju o multiplikativnim funkcijama 3.3. Važi \(|\Phi_n| = \varphi(n)\). Ojlerova teorema nam suštinski govori o određenim stepenima elemenata modularne multiplikativne grupe, ali se uopštava i na brojeve koji su veći od \(n\).

Teorema 3.4.2. [Ojlerova teorema] Ako su brojevi \(a\) i \(n\) uzajamno prosti, tada je \(a^{\varphi(n)} \equiv 1\ (\mathrm{mod}\ n)\) tj. broj \(a^{\varphi(n)} - 1\) je deljiv sa \(n\).

Primer 3.4.7. Videli smo da je \(\Phi_9 = \{1, 2, 4, 5, 7, 8\}\), pa je \(\varphi(9) = 6\). Neka je, na primer, \(a=5\): brojevi \(a=5\) i \(n=9\) su uzajamno prosti. Tada je \(5^6 = 15625 = 1736\cdot 9 + 1\), pa je zaista \(a^{\varphi(n)} = 5^6 \equiv 1\ (\mathrm{mod}\ 9)\). Tvrđenje važi i za veće brojeve \(a\), koji ne pripadaju skupu \(\Phi_9\). Na primer, broj \(a=14\) je uzajamno prost sa \(9\) i važi da je \(a^{\varphi(n)} = 14^6 = 7529536 = 836615\cdot 9 + 1 \equiv 1\ (\mathrm{mod}\ 9)\).

U narednom apletu možete videti tablice grupa \(\mathbb{Phi}_n^\times\) za različite vrednosti \(n\), kao i stepene \(a^i \,\mathrm{mod}\,n\) za različite brojeve \(a\) uzajamno proste sa \(n\). U svakom slučaju važi \(a^{\varphi(n)} \equiv 1\ (\mathrm{mod}\ n)\). Možete videti kako uvek postoji \(k | \varphi(n)\) takvo da je \(a^k \equiv 1\ (\mathrm{mod}\ n)\). Stepeni \(a^0, \ldots, a^{k-1}\) čine podgrupu polazne grupe.

Osnovni slučaj Ojlerove teoreme se odnosi na elemente skupa \(\Phi_n\), odnosno brojeve \(1 \leq a < n\) uzajamno proste sa \(n\). Ako pretpostavimo da teorema važi za njih, lako je dokazati i da važi za sve ostale brojeve koji zadovoljavaju uslove teoreme. Recimo da je \(a > n\) i da je \(a\) uzajamno prosto sa \(n\). Tada se \(a\) može podeliti sa \(n\), tj. postoje brojevi \(q\) i \(1 \leq r < n\) takvi da je \(a = qn + r\). Ako je \(a\) uzajamno prost sa \(n\), takav mora biti i \(r\) (jer ako bi \(r\) imao neki zajednički činilac sa \(n\) desna strana bi bila deljiva njime, pa bi deljiv njime morao da bude i broj \(a\) na levoj strani jednakosti). Tada je \(a^{\varphi(n)} = (qn+r)^{\varphi(n)}\), međutim, \((qn+r)^{\varphi(n)} \equiv r^{\varphi(n)}\ (\mathrm{mod}\ n)\). Pošto je i \(1 \leq r < n\), važi da je \(r \in \Phi_n\), pa na osnovu pretpostavke da teorema važi u osnovnom slučaju, tj. da važi za sve elemente skupa \(\Phi_n\), ona važi i za \(r\). Dakle, važi \(r^{\varphi(n)} \equiv 1\ (\mathrm{mod}\ n)\), pa važi i \(a^{\varphi(n)} \equiv 1\ (\mathrm{mod}\ n)\).

Specijalni slučaj Ojlerove teoreme, kada je \(n\) prost broj, je Mala Fermaova teorema (dok Ojlerova teorema govori o grupama \(\mathbb{\Phi}_n^\times\), Mala Fermaova govori samo o grupama \(\mathbb{Z}_p^\times\)).

Teorema 3.4.3. [Mala Fermaova teorema] Ako je \(p\) prost broj i \(a\) pozitivan prirodan broj koji nije deljiv brojem \(p\), tada je \(a^{p-1} \equiv 1\ (\mathrm{mod}\ p)\).

U narednom apletu možete videti tablice grupa \(\mathbb{\Phi}_p^\times\) za različite proste brojeve \(p\), kao i stepene \(a^i \,\mathrm{mod}\,n\) za brojeve \(1 \leq a < p\). U svakom slučaju važi \(a^{p-1} \equiv 1\ (\mathrm{mod}\ p)\). Možete videti kako uvek postoji \(k | \varphi(n)\) takvo da je \(a^k \equiv 1\ (\mathrm{mod}\ n)\). Stepeni \(a^0, \ldots, a^{k-1}\) čine podgrupu polazne grupe.

Ako \(a\) i \(n\) nisu uzajamno prosti, tada jednakost \(a^{\varphi(n)} \equiv 1\ (\mathrm{mod}\ n)\) ne mora da važi. Na primer, ako je \(a\) deljivo sa \(p\) tada je \(a^0 = 1\), međutim važi \(a^1 \equiv 0\ (\mathrm{mod}\ p)\), \(a^2 \equiv 0\ (\mathrm{mod}\ p)\), pa i \(a^{p-1} \equiv 0\ (\mathrm{mod}\ p)\), jer su svi stepeni broja \(a\) deljivi sa \(p\), pa \(a^{p-1} \not\equiv 1\ (\mathrm{mod}\ n)\) i jednakost \(a^{p-1} \equiv 1\ (\mathrm{mod}\ p)\) ne mora da važi. Ipak, naredna, modifikovana, formulacija Male Fermaove teoreme ispravno obuhvata i ovaj slučaj.

Teorema 3.4.4. [Mala Fermaova teorema – opšti oblik] Ako je \(p\) prost broj i \(a\) prirodan broj, tada je \(a^p \equiv a\ (\mathrm{mod}\ p)\).

Dokaz. Ako \(a\) nije deljivo sa \(p\), tvrđenje je ekvivalentno polaznoj formulaciji (kada se obe strane pomnože sa \(a\)), a ako \(a\) jeste deljivo sa \(p\), onda je \(a \equiv 0\ (\mathrm{mod}\ p)\) i \(a^{p} \equiv 0\ (\mathrm{mod}\ p)\), pa je \(a^{p} \equiv a\ (\mathrm{mod}\ p)\). \(\Box\)

Pokazali smo da je dovoljno da se Ojlerova teorema dokaže za svaki broj \(a \in \Phi_n\). Iz toga sledi i opšti slučaj Ojlerove teoreme i Mala Fermaova teorema. Dokažimo3 da za ovakve brojeve važi \(a^{\varphi(n)} \equiv 1\ (\mathrm{mod}\ n)\). To je neposredna posledica Lagranževe teoreme iz teorije grupa koja tvrdi da red (broj elemenata) podgrupe uvek deli red grupe iz čega rezultat direktno sledi posmatrajući grupu \(\Phi_n\) i njenu cikličku podrgrupu generisanu sa \(a\) (nju čine elementi \(1\), \(a\), \(a^2\), , \(a^{k-1}\), za neko \(k \vert \varphi(n)\) takvo da je \(a^k=1\)), međutim, daćemo direktan dokaz, bez pozivanja na rezultate teorije grupe.

Dokaz. Osnovu ovog dokaza čini činjenica da se prilikom množenja po modulu \(n\) elemenata uređenog skupa \(\Phi_n = \{r_1, \ldots, r_{\varphi(n)}\}\) nekim brojem \(a\) koji je uzajamno prost sa \(n\) dobija neka permutacija tog skupa (što smo i dokazali prilikom dokazivanja kriterijuma za postojanje inverza u teoremi 3.4.1). Zaista, na osnovu prvog zakona skraćivanja (lema 3.4.1), \(ar_i \equiv ar_j\ (\mathrm{mod}\ n)\) važi ako i samo ako je \(r_i = r_j\) tj. \(i=j\). Zato se množenjem različitih ostataka iz \(\Phi_n\) brojem \(a\) dobijaju različiti ostaci, pa slika skupa \(\Phi_n\) pri preslikavanju \(r \mapsto ar\) mora biti skup \(\Phi_n\). Zato je

\[\prod_{i=1}^{\varphi(n)} r_i \equiv \prod_{i=1}^{\varphi(n)} ar_i = a^{\varphi(n)}\cdot \prod_{i=1}^{\varphi(n)} r_i\ (\mathrm{mod}\ n).\]

Traženo tvrđenje se dobija na osnovu prvog zakona skraćivanja (lema 3.4.1), skraćivanjem faktora \(\prod_{i=1}^{\varphi(n)} r_i\), koji je uzajamno prost sa \(n\). \(\Box\)

Dokaz.

Jedan veoma lep, a krajnje elementaran način da se dokaže Mala Fermaova teorema je da se razmotre sve niske dužine \(p\) u kojima se javljaju slova iz azbuke koja ima \(a\) simbola. Takvih niski ima \(a^p\). Na primer, ako je \(p=3\) i \(a=2\), i ako azbuka sadrži slova X i Y, to su niske XXX, XXY, XYX, XYY, YXX, YXY, YYX i YYY. Zamislimo sada da su slova svake niske napisana na krugu. Time sve date niske delimo u određene grupe tako da dve niske pripadaju istoj grupi ako i samo ako se dobijaju čitanjem slova sa istog kruga. U jednoj grupi je samo XXX, u drugoj su XXY, XYX i YXX, u trećoj grupi su XYY, YYX i YXY, dok je u poslednjoj, četvrtoj grupi samo YYY.

XXX XXY XYY YYY XYX YXY YXX YYX

U opštem slučaju, postojaće \(a\) grupa koje sadrže samo jedan element i u njima će biti niske koje sadrže \(p\) ponavljanja jednog istog simbola iz azbuke. Sve ostale grupe imaće po \(p\) elemenata. Naime, ako bi se zapis dat na nekom krugu mogao pročitati na dva ista načina krenuvši od dva različita slova, tada bi taj zapis morao biti periodičan i period bi morao da deli dužinu niske. Međutim, pošto je \(p\) prost broj, njegovi jedini delioci su \(1\) i \(p\), tako da svaka grupa ima ili \(1\) ili \(p\) različitih elemenata. Dakle, važi da je \(a^p = x\cdot p + a\), gde je \(x\) broj grupa sa po \(p\) elemenata, da je \(a^p-a = x \cdot p\), tj. da je \(a(a^{p-1}-1) = x \cdot p\). Dakle, \(a^p - a\) je deljivo sa \(p\), što je tvrđenje najopštijeg oblika Fermaove teoreme. Dodatno, ako \(a\) nije deljivo sa \(p\), tada \(a\) ne može da ima zajedničkih prostih faktora sa \(p\) (jer je \(p\) prost), pa sledi da \(a^{p-1}-1\) mora da bude deljivo sa \(p\), što je tvrđenje nedegenerisanog slučaja Male Fermaove teoreme. \(\Box\)

Malu Fermaovu teoremu je jednostavno dokazati i indukcijom (Ojler je prvi objavio dokaz ove teoreme i taj je dokaz bio indukcijom).

Na osnovu male Fermaove teoreme, za svako \(1 \leq a < p\) važi da je \(a^{p-1} \equiv 1\ (\mathrm{mod}\ p)\). Prirodno se postavlja pitanje šta se dešava sa stepenima broja \(a\) kada je izložilac manji od \(p\) tj. kakav je skup \(\{a^0 \,\mathrm{mod}\,p, a^1 \,\mathrm{mod}\,p, \ldots, a^{p-2} \,\mathrm{mod}\,p\}\). Može se dokazati sledeća lema.

Lema 3.4.5. [Modularne multiplikativne grupe su cikličke] Grupe \((\mathbb{Z}_{p}, \times_p)\) su cikličke, tj. za svaki prost broj \(p\) postoji broj \(a \in \mathbb{Z}_p \setminus \{0\}\) takav da je \(\{a^0 \,\mathrm{mod}\,p, a^1 \,\mathrm{mod}\,p, \ldots, a^{p-2} \,\mathrm{mod}\,p\} = \{1, 2, \ldots, p-1\} = \mathbb{Z}_{p}\setminus\{0\}\).

Dakle u grupi \((\mathbb{Z}_{p}, \times_p)\) uvek postoji element \(a\) takav da se svi elementi grupe mogu izraziti kao njegovi stepeni. Takav element se naziva generator grupe ili primitivni koren po modulu p. Pokazuje sa da u grupi \((\mathbb{Z}_{p}, \times_p)\) postoji \(\varphi(p-1)\) generatora. Pronalaženje generatora je netrivijalan problem i razmotrićemo ga u poglavlju 3.7.4.

Primer 3.4.8. Razmotrimo stepene elemenata u grupi \((\mathbb{Z}_7, \times_7)\).

\(a\) \(a^0\) \(a^1\) \(a^2\) \(a^3\) \(a^4\) \(a^5\) \(a^6\)
1 \(1\) \(1\) \(1\) \(1\) \(1\) \(1\) \(1\)
2 \(1\) \(2\) \(4\) \(1\) \(2\) \(4\) \(1\)
3 \(1\) \(3\) \(2\) \(6\) \(4\) \(5\) \(1\)
4 \(1\) \(4\) \(2\) \(1\) \(4\) \(2\) \(1\)
5 \(1\) \(5\) \(4\) \(6\) \(2\) \(3\) \(1\)
6 \(1\) \(6\) \(1\) \(6\) \(1\) \(6\) \(1\)

Vidimo da su generatori grupe \(a=3\) i \(a=5\) i njih je \(\varphi(7-1) = \varphi(6) = 2\).

Grupe \((\mathbb{\Phi}_{n}, \times_n)\) ne moraju biti cikličke.

Primene Ojlerove i Male Fermaove teoreme su razne: ispitivanje da li je broj prost, izračunavanje modularnog multiplikativnog inverza, RSA kriptografija i slično. Prikažimo sada primenu Male Fermaove teoreme na ispitivanje da li je broj prost, a ostale primene ovih teorema će biti prikazane u narednim poglavljima (na primer, u poglavlju 3.5 biće prikazana primena Ojlerove teoreme u oblasti kriptografije).

Fermaov test da li je broj prost

Jedna primena Male Fermaove teoreme je za testiranje da li je dati broj \(n\) prost ili ne (engl. Fermat primality test). Mala Fermaova teorema daje potreban uslov da bi broj bio prost. Naime, za dati broj \(n\) možemo izabrati proizvoljan broj \(a\) koji nije deljiv sa \(n\) i izračunati vrednost \(a^{n-1} \,\mathrm{mod}\,n\). Ukoliko je rezultat različit od \(1\), broj \(n\) je sigurno složen. Ipak, teorema ne daje i dovoljan uslov da bi broj bio prost, jer postoje i složeni brojevi \(n\) takvi da za neke vrednosti \(a\) koje su uzajamno proste sa \(n\) važi da je \(a^{n-1} \,\mathrm{mod}\,n\) jednako \(1\). Ipak, ako je \(a^{n-1} \,\mathrm{mod}\,n = 1\), pokazuje se da je malo verovatno da broj \(n\) nije prost. Posebno, ako se za veliki broj različitih vrednosti za \(a\) koje su uzajamno proste sa \(n\) pokaže da je vrednost izraza \(a^{n-1} \,\mathrm{mod}\,n\) jednaka \(1\), prilično je verovatno da je broj \(n\) prost. Nažalost, ni ispitivanje svih vrednosti \(a\) koje su uzajamno proste sa \(n\) nam ne daje garanciju, jer postoje složeni brojevi \(n\) takvi da za sve brojeve \(a\) koji su uzajamno prosti sa \(n\) važi \(a^{n-1} \equiv 1 (\mathrm{mod}\ n)\). Takvi brojevi se zovu Karmajklovi brojevi (engl. Carmichael numbers) i relativno su retki. Najmanji takav broj je 561.

3.4.3 Izračunavanje modularnog multiplikativnog inverza

U poglavlju 3.4.1 o modularnim grupama smo videli da je multiplikativni inverz broja \(a\) po modulu \(n\) (engl. modular multiplicative inverse) broj \(x\) za koji važi \(a\cdot x \equiv 1\ (\mathrm{mod}\ n).\)

Primer 3.4.9. Multiplikativni inverz broja \(5\) po modulu \(8\) je \(5\) jer važi \(5\cdot 5 \equiv 1\ (\mathrm{mod}\ 8)\).

Najčešće se kao multiplikativni inverz broja \(a\) po modulu \(n\) razmatra vrednost iz skupa \(Z_n = \{1,2,\ldots,n-1\}\).

U teoremi 3.4.1 je dokazano da inverz po modulu \(n\) broja \(a\) postoji ako i samo ako su \(a\) i \(n\) uzajamno prosti i da je u tom slučaju jedinstven po modulu \(n\). Razmotrimo sada kako ga je moguće izračunati.

Problem. Ako su data dva uzajamno prosta pozitivna cela broja \(a\) i \(n\), odrediti multiplikativni inverz broja \(a\) po modulu \(n\), tj. broj \(x\) takav da je \(ax \equiv 1\ (\mathrm{mod}\ n)\).

Algoritam grube sile

Pri naivnom pristupu rešavanju ovog problema se za \(x\) razmatraju redom svi brojevi \(x\) od \(1\) do \(n-1\) (elementi skupa \(Z_n\)) i proverava se da li je ostatak pri deljenju broja \(a\cdot x\) sa \(n\) jednak \(1\).

// direktno racunanje multiplikativnog inverza broja a po modulu n
int modInverz(int a, int n) {
  a = a % n;
  // proveravamo redom kandidate od 1 do n-1
  for (int x = 1; x < n; x++) 
     if ((a*x) % n == 1) 
       return x; 
} 

Složenost ovog algoritma je \(O(n)\).

Algoritam zasnovan na proširenom Euklidovom algoritmu

Na osnovu teoreme 3.4.1 modularni inverz broja \(a\) po modulu \(n\) postoji ako i samo ako su \(a\) i \(n\) uzajamno prosti. Dokaz naredne teoreme nam govori da se, kada postoji, on može odrediti proširenim Euklidovim algoritmom.

Lema 3.4.6. Ako su \(a\) i \(n\) uzajamno prosti, tada postoji jedinstven broj \(x\) iz skupa \(Z_n = \{1, \ldots, n-1\}\) takav da je \(a\cdot x \equiv 1\ (\mathrm{mod}\ n)\).

Dokaz. Da bi broj \(x\) bio inverz broja \(a\), treba da važi \(a\cdot x \equiv 1\ (\mathrm{mod}\ n)\) tj. \(n | (a\cdot x - 1)\). Zato mora da postoji broj \(y\) takav da je \(a\cdot x - 1 = y\cdot n\) tj.

\[x\cdot a - y\cdot n = 1.\]

Mi rešavamo ovu Diofantovu jednačinu po nepoznatim celobrojnim koeficijentima \(x\) i \(y\) i tražimo ono rešenje za koje je \(1 \leq x < n\). Pošto su \(a\) i \(n\) uzajamno prosti, na osnovu Bezuove teoreme 3.1.3, postoji broj \(x\) koji ovo zadovoljava. Na osnovu leme 3.1.1, postoje tačno dva rešenja za koje važi \(|x| < |n/d|\) i \(|y| < |a/d|\) (jedno u kom je \(x\) pozitivno i jedno u kom je \(x\) negativno), pa, pošto je \(d=1\), postoji tačno jedno rešenje \(x \in Z_n\). \(\Box\)

Dakle, pronalaženje modularnog inverza se može svesti na rešavanje jednačine \(ax = yn + 1\) tj. \(ax - ny = 1\), a na osnovu teoreme 3.1.4, znamo da jednačina \(ax+by=c\) ima celobrojna rešenja ako i samo ako \(d=\mathrm{nzd}(a, b)\) deli broj \(c\). Dakle, za \(c=1\) jednačina \(ax - ny = 1\) ima celobrojna rešenja \((x, y)\) ako i samo ako su \(a\) i \(n\) uzajmno prosti.

Za efikasno izračunavanje modularnog inverza možemo iskoristiti prošireni Euklidov algoritam. Potrebno je da pronađemo koeficijente \(x\) i \(y\) takve da je \(x\cdot a - y\cdot n = 1\), što možemo uraditi primenom proširenog Euklidovog algoritma na dva data, uzajamno prosta broja \(a\) i \(n\) (on će nam, doduše, vratiti i vrednost \(-y\), ali taj koeficijent nas ionako ne zanima). S obzirom na to da dobijena vrednost koeficijenta \(x\) može biti i negativna i veća od \(n\), ako želimo da \(x\) pripada \(Z_n\), tj. da zadovoljava uslov \(0\le x<n\), onda umesto \(x\) kao modularni multiplikativni inverz u programu vraćamo vrednost \((x \,\mathrm{mod}\,n + n)\,\mathrm{mod}\,n\).

Dakle, određivanje modularnog multiplikativnog inverza broja možemo svesti na prošireni Euklidov algoritam.

// racunanje multiplikativnog inverza broja a po modulu m
// koriscenjem prosirenog Euklidovog algoritma
int modInverz(int a, int n) {
  int x, y;
  // određujemo x i y tako da vazi a*x + n*y = d
  int d = nzdProsireni(a, n, x, y);

  // ako a i n nisu uzajamno prosti, onda ne postoji inverz
  if (d != 1)
    cout << "Modularni multiplikativni inverz ne postoji" << endl;
  else{
    // obezbedjujemo da je inverz iz skupa [0, n)
    int inverz = (x % n + n) % n;
    return inverz;
   }
}

Primetimo da za računanje modularnog multiplikativnog inverza broja vrednost koeficijenta \(y\) nije od interesa, te se može konstruisati algoritam koji ne poziva eksplicitno prošireni Euklidov algoritam, već na isti način kao kod proširenog Euklidovog algoritma iterativno računa samo vrednost koeficijenta \(x\).

// funkcija racuna x -- multiplikativni inverz broja a po modulu n,
// koriscenjem prosirenog Euklidovog algoritma
// funkcija vraca da li je uspela da izracuna broj x
bool modInverz(int a, int n, int& x) {
  // pocetne vrednosti za r su n i a
  int r_preth = n;
  int r_tek = a;
  // pocetne vrednosti za x su 0 i 1
  int x_preth = 0;
  int x_tek = 1;
  
  while (r_tek > 0) {
    int q = r_preth / r_tek;
    int pom;

    // azuriramo tekucu i prethodnu vrednost niza r
    pom = r_preth;
    r_preth = r_tek;
    r_tek = pom - q * r_tek;

    // azuriramo tekucu i prethodnu vrednost niza x
    pom = x_preth;
    x_preth = x_tek;
    x_tek = pom - q * x_tek;
  }

  // obezbedjujemo da je inverz iz skupa [0,m)
  x = (x_preth % n + n) % n;

  // vracamo true ako je nzd(a, n) = 1, inace false
  return r == 1;
}

Složenost prethodnog algoritma za izračunavanje multiplikativnog inverza broja \(a\) po modulu \(n\) jednaka je složenosti proširenog Euklidovog algoritma za brojeve \(a\) i \(n\) i iznosi \(O(\log(a+n))\), odnosno kada je \(a\) reda \(O(n)\) jednaka je \(O(\log n)\) (što je veoma efikasno).

Algoritam zasnovan na Ojlerovoj i Maloj Fermaovoj teoremi

Još jedan efikasan način za računanje modularnog multiplikativnog inverza broja je korišćenjem Ojlerove teoreme. Podsetimo se njenog tvrđenja: ako su \(a\) i \(n\) uzajamno prosti brojevi onda važi: \(a^{\varphi(n)} \equiv 1\ (\mathrm{mod}\ n)\). Primetimo da je uslov da su brojevi \(a\) i \(n\) uzajamno prosti takođe uslov i da bi postojao multiplikativni inverz broja \(a\) po modulu \(n\). Iz prethodne jednačine sledi:

\[a\cdot a^{\varphi(n)-1} \equiv 1\ (\mathrm{mod}\ n).\](1)

Primetimo da za proizvoljnu vrednost \(n\) važi \(\varphi(n)\geq 1\), odnosno \(\varphi(n)-1\geq 0\), te je \(a^{\varphi(n)-1}\) pozitivna celobrojna vrednost. Dakle, za \(x=a^{\varphi(n)-1} \,\mathrm{mod}\,n\) važi \(a\cdot x \equiv 1\ (\mathrm{mod}\ n)\), pa je \(a^{\varphi(n)-1}\) multiplikativni inverz broja \(a\) po modulu \(n\). Dodatno, \(a^{\varphi(n)-1}\) može biti veće od \(n\) te je kao rezultat potrebno vratiti vrednost \(x \,\mathrm{mod}\,n\) (što je unapred osigurano ako se tokom stepenovanja svođenje vrši nakon svakog množenja).

Na ovaj način smo problem računanja modularnog multiplikativnog inverza broja \(a\) sveli na računanje Ojlerove funkcije broja \(n\) što se dalje svodi na faktorizaciju broja \(n\), koja se osnovnim algoritmom opisanim u poglavlju 3.2 vrši u složenosti \(O(\sqrt{n})\), što je neprihvatljivo za brojeve od recimo \(100\) cifara.

Primer 3.4.10. Vratimo se na primer sa početka ovog poglavlja i pronađimo inverz broja \(a=5\) po modulu \(n=8\). Važi \(\varphi(n)=\varphi(8)=4\) i stoga važi \(5^4 \equiv 1\ (\mathrm{mod}\ 8)\). Odatle dobijamo \(5\cdot 5^3 \equiv 1\ (\mathrm{mod}\ 8)\), tj. broj \(5^3\,\mathrm{mod}\,8 = 125\,\mathrm{mod}\,8=5\) je multiplikativni inverz broja \(5\) po modulu \(8\). Zaista, \(5 \cdot 5 = 25 \equiv 1\ (\mathrm{mod}\ 8)\).

Ukoliko je pak broj \(n\) prost, tvrđenje Ojlerove teoreme se svodi na malu Fermaovu teoremu: \(a^{n-1} \equiv 1\ (\mathrm{mod}\ n)\), odakle sledi:

\[a\cdot a^{n-2} \equiv 1\ (\mathrm{mod}\ n).\](2)

Pošto je broj \(n\) prost, važi \(n\geq 2\), odnosno \(n-2\geq 0\), te je vrednost \(a^{n-2}\) celobrojna i pozitivna. Stoga važi da je \(x=a^{n-2}\,\mathrm{mod}\,n\) multiplikativni inverz broja \(a\) po modulu \(n\). Primetimo da je ovde stvar jednostavnija, jer je vrednost Ojlerove funkcije broja \(n\) unapred poznata (i jednaka \(n-1\)).

Primer 3.4.11. Ako je \(n=7\) i \(a=3\), pošto je broj \(m\) prost, multiplikativni inverz broja \(3\) po modulu \(7\) možemo naći po formuli \(a^{n-2}\,\mathrm{mod}\,n=3^5\,\mathrm{mod}\,7=243 \,\mathrm{mod}\,7=5\) i zaista važi \(3\cdot 5 \equiv 1\ (\mathrm{mod}\ 7)\).

Iz kongruencija (1) i (2) možemo jednostavno odrediti multiplikativni inverz broja \(a\) po modulu \(n\). Jedino što preostaje jeste što efikasnije izračunati odgovarajući stepen broja \(a\), što se može izvesti korišćenjem efikasnog algoritma za modularno stepenovanje broja, koji je složenosti \(O(\log k)\), gde je \(k\) vrednost eksponenta.

Napomenimo da je u situaciji kada \(n\) nije prost broj, potrebno izračunati vrednost Ojlerove funkcije broja \(n\) što uključuje faktorizaciju broja \(n\) i može biti težak problem. Međutim, u situaciji kada je broj \(n\) prost, ali takođe i kada broj \(n\) nije prost ali je poznata njegova faktorizacija, složenost ovog algoritma je \(O(\log n)\).

U nastavku je dat algoritam za računanje multiplikativnog inverza broja \(a\) po modulu \(n\) za prost broj \(n\).

// funkcija za mnozenje po modulu n
int puta_mod(int a, int b, int n) {
  return ((a % n) * (b % n)) % n;
}

// funkcija za brzo stepenovanje po modulu n
int stepen_mod(int a, int b, int n) {
    // a^0 = 1
    if (b == 0)
        return 1;
    // racunamo a^(b/2) mod n
    int rez = stepen_mod(a, b / 2, n);
    // racunamo rez*rez mod n
    rez = puta_mod(rez, rez, n);
    if (b % 2)
      // racunamo rez*a mod n
      return puta_mod(rez, a, n);
    else
        return rez;
}

// racunanje multiplikativnog inverza broja a po modulu n
// koriscenjem Male Fermaove teoreme
int modInverz(int a, int n) {
  return stepen_mod(a, n - 2, n);
}

  1. Monoid je algebarska struktura koju čine skup i binarna operacija koja je zatvorena na tom skupu, asocijativna i ima neutral.↩︎

  2. Grupa je algebarska struktura koju čine skup i binarna operacija koja je zatvorena na tom skupu, asocijativna, ima neutral i svaki element ima inverzni element.↩︎

  3. Korektnost se obezbeđuje bilo kojim ispravnim dokazom osnovnog slučaja Ojlerove teoreme, međutim, alternativni dokazi koje prikazujemo imaju cilj da pored opravdanja daju i dublje objašnjenje obe teoreme.↩︎