From Wikipedia, the free encyclopedia
V matematiki je modularna aritmetika sistem aritmetike za cela števila, kjer se števila "ponovno vrtijo okoli", ko dosežejo določeno vrednost, ki se imenuje modulo (ali modul). Moderni približek modularni aritmetiki je uveljavil Carl Friedrich Gauss v svoji knjigi Disquisitiones Arithmeticae, ki jo je izdal leta 1801.
Vsem poznana uporaba modularne aritmetike je 12-urna ura, kjer je dan razdeljen na dve 12-urni periodi. Če je sedaj ura 7:00, bo čez 8 ur enaka 3:00. Navadno seštevanje bi nam dalo rezultat 7 + 8 = 15, a to ne bo odgovor, ker se čas po uri "obrne naokoli" na vsakih 12 ur. Ker se številke na uri ponastavijo, ko pridejo do 12, ima ura aritmetični modul enak 12. Če to izrazimo s spodnjo definicijo, je 15 kongruentno 3 v modulu 12, torej je (24-urni) čas "15:00" enak času "3:00" na uri.
Modularna aritmetika se lahko obravnava matematično z vpeljavo kongruenčne relacije na celih številih, ki se da združiti z operacijami na celih številih: seštevanje, odštevanje in množenje. Za naravno število n, sta dve števili a in b kongruentni v modulu n, če je njuna razlika a − b celi večkratnik od n (torej če obstaja tako celo število k, da velja a − b = kn). Ta kongruenčna relacija se običajno šteje, ko sta a in b celi števili, označi pa se jo z:
Oklepaji pomenijo, da (mod n) velja za celo enačbo, ne samo za desno stran (v tem primeru b). Včasih se uporablja tudi = namesto ≡. Če se oklepaje izpusti, pomeni to v splošnem, da označuje "mod" operacijo modulo, ki se nanaša samo na desno stran, spremeni pa se tudi v enakost, da velja 0 ≤ a < n.
Število n se imenuje modul kongruence.
Kongruenčna relacija se lahko zapiše tudi kot
kar eksplicitno prikaže Evklidsko deljenje. Kaj pa če b ni ostanek števila a pri deljenju z n? Bolj natančno lahko relacijo a ≡ b mod n opišemo tako, da morata tako a, kot tudi b imeti enak ostanek pri deljenju z n. Torej
kjer je 0 ≤ r < n skupni delitelj. Če odštejemo ta dva izraza, pridemo do prejšnje relacije:
kjer definiramo k = p − q.
Na primer
ker je 38 − 14 = 24, kar je večkratnik od 12, ali, ekvivalentno, ker imata tako 38, kot tudi 14 enak ostanek 2 pri deljenju z 12.
Enako pravilo velja tudi za negativne vrednosti:
Ker se lahko pogosto pojavi več relacij, kjer so različni moduli naenkrat, smo v zgornji sistem vedno zapisali modulo. Kongruenčna relacija za dani modul velja za binarno relacijo.
Kongruenčna relacija zadovolji vsem pogojem za ekvivalenčno relacijo:
Če velja a1 ≡ b1 (mod n) in a2 ≡ b2 (mod n), ali če velja a ≡ b (mod n), potem:
Če je a ≡ b (mod n), potem v splošnem ni pravilno ka ≡ kb (mod n). A to velja, če velja sledeči pogoj:
Za pokrajšanje skupnih členov, poznamo sledeča pravila:
Modularni multiplikativni inverz je definiran s sledečimi pravili:
Multiplikativni inverz x ≡ a–1 (mod n) se lahko učinkovito izračuna z uporabo Bézoutove identitete za z uporabo razširjenega Evklidovega algoritma. V posebnem, če je p praštevilo, potem sta si a in p tuji za vsak a, da velja 0 < a < p; torej multiplikativni inverz obstaja za vse a, ki niso kongruentni ničelnemu modulu p.
Nekaj nekaterih bolj naprednih lastnosti kongruenčnih relacij je zbranih tukaj:
Kot katerakoli kongruenčna relacija, je kongruenčni modulo n ekvivalenčna relacija ter ekvivalenčni razred celega števila a, ki se označi z an, je množica {… , a − 2n, a − n, a, a + n, a + 2n, …}. Ta množica, ki jo sestavljajo cela števila, ki so kongruentna a po modulu n, se imenuje kongruenčni razred ali razred ostankov ali preprosto ostanek celega števila a, po modulu n. Če je modulo n razpoznaven iz besedila, se lahko ta ostanek označi z [a].
Spodaj so tri dokaj hitre funkcije v jeziku C, dve za izvajanje modularnih množenj in ena za izvajanje modularnega potenciranja na neoznačenih celih (naravnih) številih, ki niso večja od 63 bitov.
Algoritemski način za izračunanje :
uint64_t mul_mod(uint64_t a, uint64_t b, uint64_t m)
{
uint64_t d = 0, mp2 = m >> 1;
int i;
if (a >= m) a %= m;
if (b >= m) b %= m;
for (i = 0; i < 64; ++i)
{
d = (d > mp2) ? (d << 1) - m : d << 1;
if (a & 0x8000000000000000ULL)
d += b;
if (d >= m) d -= m;
a <<= 1;
}
return d;
}
Na računalnikih, kjer je mogoča tudi razširjena natančnost z najmanj 64 biti mantise (kot recimo tip long double na večini x86 C prevajalnikih), se lahko uporabi sledeča implementacija, saj po trdih komponentah množenje plavajoče vejice vodi v obdržane najbolj zanesljive bite, medtem ko množenje celih števil vodi v obdržane najmanj zanesljive bite:
uint64_t mul_mod(uint64_t a, uint64_t b, uint64_t m)
{
long double x;
uint64_t c;
int64_t r;
if (a >= m) a %= m;
if (b >= m) b %= m;
x = a;
c = x * b / m;
r = (int64_t)(a * b - c * m) % (int64_t)m;
return r < 0 ? r + m : r;
}
Spodnja je C funkcija za izvajanje modularnega potenciranja, ki uporablja funkcijo mul_mod, ki je bila implementirana zgoraj. Algoritemski način za izračunanje :
uint64_t pow_mod(uint64_t a, uint64_t b, uint64_t m)
{
uint64_t r = m==1?0:1;
while (b > 0) {
if (b & 1)
r = mul_mod(r, a, m);
b = b >> 1;
a = mul_mod(a, a, m);
}
return r;
}
A da bi vse zgornje poti delovale, ne sme m prekoračiti 63 bitov.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.