{"id":1321,"date":"2026-04-19T12:33:20","date_gmt":"2026-04-19T10:33:20","guid":{"rendered":"https:\/\/trzykody.pl\/?p=1321"},"modified":"2026-04-19T12:33:22","modified_gmt":"2026-04-19T10:33:22","slug":"funkcja-mod","status":"publish","type":"post","link":"https:\/\/trzykody.pl\/index.php\/2026\/04\/19\/funkcja-mod\/","title":{"rendered":"Funkcja mod"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">W arytmetyce komputerowej bardzo cz\u0119sto nie interesuje nas pe\u0142ny wynik dzielenia, tylko sama reszta. Taki mechanizm pojawia si\u0119 przy numerowaniu cyklicznym, sprawdzaniu parzysto\u015bci, obliczeniach czasu, kryptografii, tablicach haszuj\u0105cych i algorytmach grafowych. Bez zrozumienia reszty z dzielenia trudno poprawnie pisa\u0107 wiele prostych program\u00f3w, bo nawet zwyk\u0142e sprawdzenie \u201eczy liczba jest podzielna przez 3\u201d opiera si\u0119 w\u0142a\u015bnie na tej zasadzie. Kluczowym narz\u0119dziem w takich zadaniach pozostaje <strong>Funkcja mod<\/strong>.<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Spis Tre\u015bci<\/h2><nav><ol><li><a href=\"#funkcja-mod-jako-formalny-zapis-reszty-z-dzielenia-i-jej-znaczenie-w-obliczeniach-dyskretnych\">Funkcja mod jako formalny zapis reszty z dzielenia i jej znaczenie w obliczeniach dyskretnych<\/a><\/li><li><a href=\"#dlaczego-funkcja-mod-jest-podstawa-sprawdzania-podzielnosci-cyklicznosci-i-indeksowania-danych\">Dlaczego Funkcja mod jest podstaw\u0105 sprawdzania podzielno\u015bci, cykliczno\u015bci i indeksowania danych<\/a><ol><li><a href=\"#sprawdzanie-parzystosci\">Sprawdzanie parzysto\u015bci<\/a><\/li><li><a href=\"#numerowanie-cykliczne\">Numerowanie cykliczne<\/a><\/li><li><a href=\"#indeksy-tablic-cyklicznych\">Indeksy tablic cyklicznych<\/a><\/li><\/ol><\/li><li><a href=\"#zasady-algebraiczne-wlasnosci-i-pulapki-obliczeniowe-zwiazane-z-funkcja-mod\">Zasady algebraiczne, w\u0142asno\u015bci i pu\u0142apki obliczeniowe zwi\u0105zane z Funkcja mod<\/a><ol><li><a href=\"#problem-liczb-ujemnych\">Problem liczb ujemnych<\/a><\/li><\/ol><\/li><li><a href=\"#implementacja-operatora-reszty-z-dzielenia-w-c-c-i-python-na-prostych-przykladach-praktycznych\">Implementacja operatora reszty z dzielenia w C, C++ i Python na prostych przyk\u0142adach praktycznych<\/a><ol><li><a href=\"#obracanie-indeksu-w-tablicy\">Obracanie indeksu w tablicy<\/a><\/li><li><a href=\"#sprawdzenie-ostatniej-cyfry\">Sprawdzenie ostatniej cyfry<\/a><\/li><\/ol><\/li><li><a href=\"#zastosowania-w-kryptografii-hashach-i-algorytmach-wymagajacych-ograniczenia-zakresu-wartosci\">Zastosowania w kryptografii, hashach i algorytmach wymagaj\u0105cych ograniczenia zakresu warto\u015bci<\/a><ol><li><a href=\"#tablice-haszujace\">Tablice haszuj\u0105ce<\/a><\/li><li><a href=\"#generatory-pseudolosowe\">Generatory pseudolosowe<\/a><\/li><\/ol><\/li><li><a href=\"#najczestsze-bledy-praktyczne-i-sytuacje-w-ktorych-operator-reszty-daje-zaskakujace-wyniki\">Najcz\u0119stsze b\u0142\u0119dy praktyczne i sytuacje, w kt\u00f3rych operator reszty daje zaskakuj\u0105ce wyniki<\/a><\/li><li><a href=\"#faq\">FAQ<\/a><ol><li><a href=\"#czy-operator-reszty-dziala-tylko-dla-liczb-calkowitych\">Czy operator reszty dzia\u0142a tylko dla liczb ca\u0142kowitych?<\/a><\/li><li><a href=\"#dlaczego-wynik-nie-moze-byc-rowny-dzielnikowi\">Dlaczego wynik nie mo\u017ce by\u0107 r\u00f3wny dzielnikowi?<\/a><\/li><li><a href=\"#czy-modulo-i-procent-to-to-samo\">Czy modulo i procent to to samo?<\/a><\/li><li><a href=\"#gdzie-najczesciej-uzywa-sie-tego-w-praktyce\">Gdzie najcz\u0119\u015bciej u\u017cywa si\u0119 tego w praktyce?<\/a><\/li><li><a href=\"#czy-mozna-uzywac-tego-przy-bardzo-duzych-liczbach\">Czy mo\u017cna u\u017cywa\u0107 tego przy bardzo du\u017cych liczbach?<\/a><\/li><\/ol><\/li><\/ol><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"funkcja-mod-jako-formalny-zapis-reszty-z-dzielenia-i-jej-znaczenie-w-obliczeniach-dyskretnych\">Funkcja mod jako formalny zapis reszty z dzielenia i jej znaczenie w obliczeniach dyskretnych<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dla dw\u00f3ch liczb ca\u0142kowitych:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>a<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">a<\/annotation><\/semantics><\/math>a \u2014 liczba dzielona<\/li>\n\n\n\n<li><math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>n<\/mi><\/mrow><annotation encoding=\"application\/x-tex\">n<\/annotation><\/semantics><\/math>n \u2014 dzielnik, gdzie <math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\"><semantics><mrow><mi>n<\/mi><mo mathvariant=\"normal\">\u2260<\/mo><mn>0<\/mn><\/mrow><annotation encoding=\"application\/x-tex\">n \\neq 0<\/annotation><\/semantics><\/math>n\ue020=0<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">reszta z dzielenia oznacza warto\u015b\u0107 pozostaj\u0105c\u0105 po wykonaniu dzielenia ca\u0142kowitego.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">17 \u00f7 5 daje iloraz 3 oraz reszt\u0119 2, poniewa\u017c:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">17 = 3 \u00d7 5 + 2<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W praktyce zapisuje si\u0119 to jako:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">17 mod 5 = 2<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To oznacza, \u017ce interesuje nas nie wynik dzielenia, ale to, co \u201ezostaje\u201d.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jest to szczeg\u00f3lnie wa\u017cne w informatyce, poniewa\u017c komputery bardzo cz\u0119sto operuj\u0105 na strukturach cyklicznych:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>dni tygodnia<\/li>\n\n\n\n<li>indeksy w tablicach ko\u0142owych<\/li>\n\n\n\n<li>zegary systemowe<\/li>\n\n\n\n<li>rotacje bitowe<\/li>\n\n\n\n<li>generatory liczb pseudolosowych<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Bez tego mechanizmu wiele algorytm\u00f3w by\u0142oby znacznie bardziej skomplikowanych.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Zapis matematyczny<\/th><th>Interpretacja<\/th><\/tr><\/thead><tbody><tr><td>10 mod 3 = 1<\/td><td>po podzieleniu przez 3 zostaje 1<\/td><\/tr><tr><td>24 mod 6 = 0<\/td><td>liczba jest podzielna bez reszty<\/td><\/tr><tr><td>29 mod 7 = 1<\/td><td>reszta wynosi 1<\/td><\/tr><tr><td>100 mod 9 = 1<\/td><td>suma wielokrotno\u015bci 9 daje reszt\u0119 1<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Warto pami\u0119ta\u0107, \u017ce wynik dla dodatniego dzielnika zwykle mie\u015bci si\u0119 w przedziale:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">0 \u2264 wynik &lt; n<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">czyli dla mod 5 wynik mo\u017ce by\u0107 tylko jednym z:<br>0, 1, 2, 3, 4<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nigdy 5 i nigdy 6.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dlaczego-funkcja-mod-jest-podstawa-sprawdzania-podzielnosci-cyklicznosci-i-indeksowania-danych\">Dlaczego Funkcja mod jest podstaw\u0105 sprawdzania podzielno\u015bci, cykliczno\u015bci i indeksowania danych<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Najprostsze u\u017cycie to test podzielno\u015bci.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">a mod n = 0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">to liczba jest podzielna przez n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To jest fundament ogromnej liczby program\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"sprawdzanie-parzystosci\">Sprawdzanie parzysto\u015bci<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Parzysto\u015b\u0107 opiera si\u0119 wy\u0142\u0105cznie na dzieleniu przez 2.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Warunek<\/th><th>Znaczenie<\/th><\/tr><\/thead><tbody><tr><td>x mod 2 = 0<\/td><td>liczba parzysta<\/td><\/tr><tr><td>x mod 2 = 1<\/td><td>liczba nieparzysta<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"numerowanie-cykliczne\">Numerowanie cykliczne<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad: dni tygodnia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u015bli poniedzia\u0142ek oznaczymy jako 0, a niedziel\u0119 jako 6, to po dodaniu dni u\u017cywa si\u0119 reszty z dzielenia przez 7.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Operacja<\/th><th>Wynik<\/th><\/tr><\/thead><tbody><tr><td>(5 + 3) mod 7<\/td><td>1<\/td><\/tr><tr><td>sobota + 3 dni<\/td><td>wtorek<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"indeksy-tablic-cyklicznych\">Indeksy tablic cyklicznych<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">W buforach ko\u0142owych po doj\u015bciu do ko\u0144ca tablicy wraca si\u0119 na pocz\u0105tek.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Operacja<\/th><th>Wynik<\/th><\/tr><\/thead><tbody><tr><td>(9 + 1) mod 10<\/td><td>0<\/td><\/tr><tr><td>ostatni indeks + 1<\/td><td>pierwszy indeks<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To rozwi\u0105zanie jest powszechne w systemach embedded, kolejkach komunikat\u00f3w i sterownikach urz\u0105dze\u0144.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"zasady-algebraiczne-wlasnosci-i-pulapki-obliczeniowe-zwiazane-z-funkcja-mod\">Zasady algebraiczne, w\u0142asno\u015bci i pu\u0142apki obliczeniowe zwi\u0105zane z Funkcja mod<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ten operator ma w\u0142asno\u015bci, kt\u00f3re pozwalaj\u0105 upraszcza\u0107 obliczenia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Najwa\u017cniejsze:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>W\u0142asno\u015b\u0107<\/th><th>Zapis<\/th><\/tr><\/thead><tbody><tr><td>dodawanie<\/td><td>(a + b) mod n = ((a mod n) + (b mod n)) mod n<\/td><\/tr><tr><td>odejmowanie<\/td><td>(a &#8211; b) mod n = ((a mod n) &#8211; (b mod n)) mod n<\/td><\/tr><tr><td>mno\u017cenie<\/td><td>(a \u00d7 b) mod n = ((a mod n) \u00d7 (b mod n)) mod n<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To jest krytyczne w kryptografii, szczeg\u00f3lnie przy bardzo du\u017cych liczbach.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">(123456 \u00d7 987654) mod 7<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">zamiast liczy\u0107 ogromne mno\u017cenie:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">123456 mod 7 = 4<br>987654 mod 7 = 3<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">wi\u0119c:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">(4 \u00d7 3) mod 7 = 12 mod 7 = 5<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wynik ko\u0144cowy to 5.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To znacz\u0105co zmniejsza koszt oblicze\u0144.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"problem-liczb-ujemnych\">Problem liczb ujemnych<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tu pojawia si\u0119 cz\u0119sty b\u0142\u0105d.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nie wszystkie j\u0119zyki programowania traktuj\u0105 liczby ujemne identycznie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">-7 mod 3<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">matematycznie cz\u0119sto daje:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">2<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ale w niekt\u00f3rych j\u0119zykach wynik mo\u017ce by\u0107:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">-1<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To powoduje realne b\u0142\u0119dy w systemach produkcyjnych, szczeg\u00f3lnie przy indeksowaniu tablic.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Trzeba zawsze sprawdza\u0107 definicj\u0119 operatora w danym j\u0119zyku.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"implementacja-operatora-reszty-z-dzielenia-w-c-c-i-python-na-prostych-przykladach-praktycznych\">Implementacja operatora reszty z dzielenia w C, C++ i Python na prostych przyk\u0142adach praktycznych<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Najcz\u0119stszy przypadek to test podzielno\u015bci.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>C<\/td><td><code>c\\n#include &lt;stdio.h&gt;\\n\\nint main() {\\n int x = 18;\\n\\n if (x % 3 == 0)\\n printf(\\\"Podzielna przez 3\\\\n\\\");\\n else\\n printf(\\\"Niepodzielna przez 3\\\\n\\\");\\n\\n return 0;\\n}\\n<\/code><\/td><\/tr><tr><td>C++<\/td><td><code>cpp\\n#include &lt;iostream&gt;\\nusing namespace std;\\n\\nint main() {\\n int x = 18;\\n\\n if (x % 3 == 0)\\n cout &lt;&lt; \\\"Podzielna przez 3\\\" &lt;&lt; endl;\\n else\\n cout &lt;&lt; \\\"Niepodzielna przez 3\\\" &lt;&lt; endl;\\n\\n return 0;\\n}\\n<\/code><\/td><\/tr><tr><td>Python<\/td><td><code>python\\nx = 18\\n\\nif x % 3 == 0:\\n print(\\\"Podzielna przez 3\\\")\\nelse:\\n print(\\\"Niepodzielna przez 3\\\")\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"obracanie-indeksu-w-tablicy\">Obracanie indeksu w tablicy<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>C<\/td><td><code>c\\nint index = (index + 1) % 10;\\n<\/code><\/td><\/tr><tr><td>C++<\/td><td><code>cpp\\nint index = (index + 1) % 10;\\n<\/code><\/td><\/tr><tr><td>Python<\/td><td><code>python\\nindex = (index + 1) % 10\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"sprawdzenie-ostatniej-cyfry\">Sprawdzenie ostatniej cyfry<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>C<\/td><td><code>c\\nint last = number % 10;\\n<\/code><\/td><\/tr><tr><td>C++<\/td><td><code>cpp\\nint last = number % 10;\\n<\/code><\/td><\/tr><tr><td>Python<\/td><td><code>python\\nlast = number % 10\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To jest u\u017cywane np. przy walidacji numer\u00f3w PESEL, ISBN czy kart p\u0142atniczych.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"zastosowania-w-kryptografii-hashach-i-algorytmach-wymagajacych-ograniczenia-zakresu-wartosci\">Zastosowania w kryptografii, hashach i algorytmach wymagaj\u0105cych ograniczenia zakresu warto\u015bci<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">W kryptografii modularnej ca\u0142e bezpiecze\u0144stwo opiera si\u0119 na dzia\u0142aniach wykonywanych w sko\u0144czonym zbiorze reszt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<br>RSA, Diffie-Hellman, ElGamal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tam oblicza si\u0119 pot\u0119gi typu:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Wz\u00f3r<\/th><th>Znaczenie<\/th><\/tr><\/thead><tbody><tr><td>a^b mod n<\/td><td>pot\u0119gowanie modularne<\/td><\/tr><tr><td>(x \u00d7 y) mod p<\/td><td>dzia\u0142anie w ciele sko\u0144czonym<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Bez tego liczby ros\u0142yby do absurdalnych rozmiar\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"tablice-haszujace\">Tablice haszuj\u0105ce<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Hash cz\u0119sto ko\u0144czy si\u0119 operacj\u0105:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">hash mod rozmiar_tablicy<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dzi\u0119ki temu wynik trafia do poprawnego przedzia\u0142u indeks\u00f3w.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Dane<\/th><th>Wynik<\/th><\/tr><\/thead><tbody><tr><td>hash = 24567<\/td><td>warto\u015b\u0107 skr\u00f3tu<\/td><\/tr><tr><td>rozmiar = 100<\/td><td>liczba kom\u00f3rek<\/td><\/tr><tr><td>24567 mod 100 = 67<\/td><td>indeks docelowy<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Bez tego nie da si\u0119 poprawnie mapowa\u0107 danych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"generatory-pseudolosowe\">Generatory pseudolosowe<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Klasyczny generator liniowy:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Wz\u00f3r<\/th><th>Znaczenie<\/th><\/tr><\/thead><tbody><tr><td>X(n+1) = (aXn + c) mod m<\/td><td>nast\u0119pna warto\u015b\u0107 sekwencji<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Tu reszta z dzielenia ogranicza zakres liczb i tworzy cykl.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"najczestsze-bledy-praktyczne-i-sytuacje-w-ktorych-operator-reszty-daje-zaskakujace-wyniki\">Najcz\u0119stsze b\u0142\u0119dy praktyczne i sytuacje, w kt\u00f3rych operator reszty daje zaskakuj\u0105ce wyniki<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pierwszy problem to dzielenie przez zero.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nie istnieje:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">a mod 0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Program zako\u0144czy si\u0119 b\u0142\u0119dem lub wyj\u0105tkiem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Drugi problem to liczby ujemne.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W Pythonie:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">-7 % 3 = 2<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ale w C wynik mo\u017ce zachowywa\u0107 si\u0119 inaczej zale\u017cnie od standardu i interpretacji.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Trzeci problem to mylenie dzielenia ca\u0142kowitego z reszt\u0105.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">B\u0142\u0105d:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">17 \/ 5 = 2<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">To nie jest reszta, tylko niepoprawna interpretacja.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Poprawnie:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Operacja<\/th><th>Wynik<\/th><\/tr><\/thead><tbody><tr><td>17 \/ 5<\/td><td>3.4<\/td><\/tr><tr><td>17 \/\/ 5<\/td><td>3<\/td><\/tr><tr><td>17 mod 5<\/td><td>2<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Czwarty problem to b\u0142\u0119dne indeksy tablic.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u015bli kto\u015b napisze:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">index = index + 1<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">zamiast:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">index = (index + 1) % size<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">to po czasie pojawi si\u0119 wyj\u015bcie poza zakres pami\u0119ci.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Taki b\u0142\u0105d w systemie produkcyjnym potrafi kosztowa\u0107 du\u017co wi\u0119cej ni\u017c wygl\u0105da w kodzie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-operator-reszty-dziala-tylko-dla-liczb-calkowitych\">Czy operator reszty dzia\u0142a tylko dla liczb ca\u0142kowitych?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">W klasycznej postaci tak. Wi\u0119kszo\u015b\u0107 podstawowych zastosowa\u0144 dotyczy liczb ca\u0142kowitych. Dla liczb zmiennoprzecinkowych istniej\u0105 osobne funkcje j\u0119zykowe, ale ich zachowanie trzeba sprawdza\u0107 osobno.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dlaczego-wynik-nie-moze-byc-rowny-dzielnikowi\">Dlaczego wynik nie mo\u017ce by\u0107 r\u00f3wny dzielnikowi?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Bo reszta musi by\u0107 mniejsza od dzielnika. Gdyby by\u0142a r\u00f3wna, oznacza\u0142oby to mo\u017cliwo\u015b\u0107 wykonania jeszcze jednego pe\u0142nego podzia\u0142u.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-modulo-i-procent-to-to-samo\">Czy modulo i procent to to samo?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie. Symbol <code>%<\/code> w wielu j\u0119zykach oznacza operator reszty z dzielenia, ale w matematyce znak procentu oznacza setne cz\u0119\u015bci ca\u0142o\u015bci. Ten sam symbol ma inne znaczenie zale\u017cnie od kontekstu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"gdzie-najczesciej-uzywa-sie-tego-w-praktyce\">Gdzie najcz\u0119\u015bciej u\u017cywa si\u0119 tego w praktyce?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">W walidacji danych, kryptografii, tablicach haszuj\u0105cych, buforach cyklicznych, systemach czasu, numeracji cyklicznej oraz algorytmach teorii liczb.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-mozna-uzywac-tego-przy-bardzo-duzych-liczbach\">Czy mo\u017cna u\u017cywa\u0107 tego przy bardzo du\u017cych liczbach?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tak, i w\u0142a\u015bnie wtedy jest najbardziej warto\u015bciowe. W kryptografii bez modularnych uproszcze\u0144 obliczenia by\u0142yby praktycznie niewykonalne.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Reszta z dzielenia wygl\u0105da niepozornie, ale bez niej nie dzia\u0142a poprawnie bardzo du\u017ca cz\u0119\u015b\u0107 wsp\u00f3\u0142czesnego oprogramowania. To jeden z tych mechanizm\u00f3w, kt\u00f3re na pocz\u0105tku wydaj\u0105 si\u0119 szkolnym detalem, a p\u00f3\u017aniej okazuj\u0105 si\u0119 fundamentem algorytmiki, bezpiecze\u0144stwa i wydajnego kodu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u0179r\u00f3d\u0142o Foto: Freepik<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W arytmetyce komputerowej bardzo cz\u0119sto nie interesuje nas pe\u0142ny wynik dzielenia, tylko sama reszta. Taki mechanizm pojawia si\u0119 przy numerowaniu cyklicznym, sprawdzaniu parzysto\u015bci, obliczeniach czasu, kryptografii, tablicach haszuj\u0105cych i algorytmach grafowych. Bez zrozumienia reszty z dzielenia trudno poprawnie pisa\u0107 wiele prostych program\u00f3w, bo nawet zwyk\u0142e sprawdzenie \u201eczy liczba jest podzielna przez 3\u201d opiera si\u0119 w\u0142a\u015bnie na tej zasadzie. Kluczowym narz\u0119dziem w takich zadaniach pozostaje Funkcja mod. Funkcja mod jako formalny zapis reszty z dzielenia i jej znaczenie w obliczeniach dyskretnych Dla dw\u00f3ch liczb ca\u0142kowitych: reszta z dzielenia oznacza warto\u015b\u0107 pozostaj\u0105c\u0105 po wykonaniu dzielenia ca\u0142kowitego. Przyk\u0142ad: 17 \u00f7 5 daje iloraz 3 oraz reszt\u0119 2, poniewa\u017c: 17 = 3 \u00d7 5 + 2 W praktyce zapisuje si\u0119 to jako: 17 mod 5 = 2 To oznacza, \u017ce interesuje nas nie wynik dzielenia, ale to, co \u201ezostaje\u201d. Jest to szczeg\u00f3lnie wa\u017cne w informatyce, poniewa\u017c komputery bardzo cz\u0119sto operuj\u0105 na strukturach cyklicznych: Bez tego mechanizmu wiele algorytm\u00f3w by\u0142oby znacznie bardziej skomplikowanych. Zapis matematyczny Interpretacja 10 mod 3 = 1 po podzieleniu przez 3 zostaje 1 24 mod 6 = 0 liczba jest podzielna bez reszty 29 mod 7 = 1 reszta wynosi 1 100 mod 9 = 1 suma wielokrotno\u015bci 9 daje reszt\u0119 1 Warto pami\u0119ta\u0107, \u017ce wynik dla dodatniego dzielnika zwykle mie\u015bci si\u0119 w przedziale: 0 \u2264 wynik &lt; n czyli dla mod 5 wynik mo\u017ce by\u0107 tylko jednym z:0, 1, 2, 3, 4 Nigdy 5 i nigdy 6. Dlaczego Funkcja mod jest podstaw\u0105 sprawdzania podzielno\u015bci, cykliczno\u015bci i indeksowania danych Najprostsze u\u017cycie to test podzielno\u015bci. Je\u017celi: a mod n = 0 to liczba jest podzielna przez n. To jest fundament ogromnej liczby program\u00f3w. Sprawdzanie parzysto\u015bci Parzysto\u015b\u0107 opiera si\u0119 wy\u0142\u0105cznie na dzieleniu przez 2. Warunek Znaczenie x mod 2 = 0 liczba parzysta x mod 2 = 1 liczba nieparzysta Numerowanie cykliczne Przyk\u0142ad: dni tygodnia. Je\u015bli poniedzia\u0142ek oznaczymy jako 0, a niedziel\u0119 jako 6, to po dodaniu dni u\u017cywa si\u0119 reszty z dzielenia przez 7. Operacja Wynik (5 + 3) mod 7 1 sobota + 3 dni wtorek Indeksy tablic cyklicznych W buforach ko\u0142owych po doj\u015bciu do ko\u0144ca tablicy wraca si\u0119 na pocz\u0105tek. Operacja Wynik (9 + 1) mod 10 0 ostatni indeks + 1 pierwszy indeks To rozwi\u0105zanie jest powszechne w systemach embedded, kolejkach komunikat\u00f3w i sterownikach urz\u0105dze\u0144. Zasady algebraiczne, w\u0142asno\u015bci i pu\u0142apki obliczeniowe zwi\u0105zane z Funkcja mod Ten operator ma w\u0142asno\u015bci, kt\u00f3re pozwalaj\u0105 upraszcza\u0107 obliczenia. Najwa\u017cniejsze: W\u0142asno\u015b\u0107 Zapis dodawanie (a + b) mod n = ((a mod n) + (b mod n)) mod n odejmowanie (a &#8211; b) mod n = ((a mod n) &#8211; (b mod n)) mod n mno\u017cenie (a \u00d7 b) mod n = ((a mod n) \u00d7 (b mod n)) mod n To jest krytyczne w kryptografii, szczeg\u00f3lnie przy bardzo du\u017cych liczbach. Przyk\u0142ad: (123456 \u00d7 987654) mod 7 zamiast liczy\u0107 ogromne mno\u017cenie: 123456 mod 7 = 4987654 mod 7 = 3 wi\u0119c: (4 \u00d7 3) mod 7 = 12 mod 7 = 5 Wynik ko\u0144cowy to 5. To znacz\u0105co zmniejsza koszt oblicze\u0144. Problem liczb ujemnych Tu pojawia si\u0119 cz\u0119sty b\u0142\u0105d. Nie wszystkie j\u0119zyki programowania traktuj\u0105 liczby ujemne identycznie. Przyk\u0142ad: -7 mod 3 matematycznie cz\u0119sto daje: 2 ale w niekt\u00f3rych j\u0119zykach wynik mo\u017ce by\u0107: -1 To powoduje realne b\u0142\u0119dy w systemach produkcyjnych, szczeg\u00f3lnie przy indeksowaniu tablic. Trzeba zawsze sprawdza\u0107 definicj\u0119 operatora w danym j\u0119zyku. Implementacja operatora reszty z dzielenia w C, C++ i Python na prostych przyk\u0142adach praktycznych Najcz\u0119stszy przypadek to test podzielno\u015bci. J\u0119zyk Kod C c\\n#include &lt;stdio.h&gt;\\n\\nint main() {\\n int x = 18;\\n\\n if (x % 3 == 0)\\n printf(\\&#8221;Podzielna przez 3\\\\n\\&#8221;);\\n else\\n printf(\\&#8221;Niepodzielna przez 3\\\\n\\&#8221;);\\n\\n return 0;\\n}\\n C++ cpp\\n#include &lt;iostream&gt;\\nusing namespace std;\\n\\nint main() {\\n int x = 18;\\n\\n if (x % 3 == 0)\\n cout &lt;&lt; \\&#8221;Podzielna przez 3\\&#8221; &lt;&lt; endl;\\n else\\n cout &lt;&lt; \\&#8221;Niepodzielna przez 3\\&#8221; &lt;&lt; endl;\\n\\n return 0;\\n}\\n Python python\\nx = 18\\n\\nif x % 3 == 0:\\n print(\\&#8221;Podzielna przez 3\\&#8221;)\\nelse:\\n print(\\&#8221;Niepodzielna przez 3\\&#8221;)\\n Obracanie indeksu w tablicy J\u0119zyk Kod C c\\nint index = (index + 1) % 10;\\n C++ cpp\\nint index = (index + 1) % 10;\\n Python python\\nindex = (index + 1) % 10\\n Sprawdzenie ostatniej cyfry J\u0119zyk Kod C c\\nint last = number % 10;\\n C++ cpp\\nint last = number % 10;\\n Python python\\nlast = number % 10\\n To jest u\u017cywane np. przy walidacji numer\u00f3w PESEL, ISBN czy kart p\u0142atniczych. Zastosowania w kryptografii, hashach i algorytmach wymagaj\u0105cych ograniczenia zakresu warto\u015bci W kryptografii modularnej ca\u0142e bezpiecze\u0144stwo opiera si\u0119 na dzia\u0142aniach wykonywanych w sko\u0144czonym zbiorze reszt. Przyk\u0142ad:RSA, Diffie-Hellman, ElGamal. Tam oblicza si\u0119 pot\u0119gi typu: Wz\u00f3r Znaczenie a^b mod n pot\u0119gowanie modularne (x \u00d7 y) mod p dzia\u0142anie w ciele sko\u0144czonym Bez tego liczby ros\u0142yby do absurdalnych rozmiar\u00f3w. Tablice haszuj\u0105ce Hash cz\u0119sto ko\u0144czy si\u0119 operacj\u0105: hash mod rozmiar_tablicy Dzi\u0119ki temu wynik trafia do poprawnego przedzia\u0142u indeks\u00f3w. Przyk\u0142ad: Dane Wynik hash = 24567 warto\u015b\u0107 skr\u00f3tu rozmiar = 100 liczba kom\u00f3rek 24567 mod 100 = 67 indeks docelowy Bez tego nie da si\u0119 poprawnie mapowa\u0107 danych. Generatory pseudolosowe Klasyczny generator liniowy: Wz\u00f3r Znaczenie X(n+1) = (aXn + c) mod m nast\u0119pna warto\u015b\u0107 sekwencji Tu reszta z dzielenia ogranicza zakres liczb i tworzy cykl. Najcz\u0119stsze b\u0142\u0119dy praktyczne i sytuacje, w kt\u00f3rych operator reszty daje zaskakuj\u0105ce wyniki Pierwszy problem to dzielenie przez zero. Nie istnieje: a mod 0 Program zako\u0144czy si\u0119 b\u0142\u0119dem lub wyj\u0105tkiem. Drugi problem to liczby ujemne. W Pythonie: -7 % 3 = 2 ale w C wynik mo\u017ce zachowywa\u0107 si\u0119 inaczej zale\u017cnie od standardu i interpretacji. Trzeci problem to mylenie dzielenia ca\u0142kowitego z reszt\u0105. B\u0142\u0105d: 17 \/ 5 = 2 To nie jest reszta, tylko niepoprawna interpretacja. Poprawnie: Operacja Wynik 17 \/ 5 3.4 17 \/\/ 5 3 17 mod 5 2 Czwarty problem to b\u0142\u0119dne indeksy tablic. Je\u015bli kto\u015b napisze: index = index + 1 zamiast: index = (index + 1) % size to po czasie pojawi si\u0119 wyj\u015bcie poza zakres pami\u0119ci. Taki b\u0142\u0105d w systemie produkcyjnym potrafi kosztowa\u0107 du\u017co wi\u0119cej ni\u017c wygl\u0105da w kodzie. FAQ Czy operator reszty dzia\u0142a tylko dla liczb ca\u0142kowitych? W klasycznej postaci tak. Wi\u0119kszo\u015b\u0107 podstawowych zastosowa\u0144 dotyczy liczb ca\u0142kowitych. Dla liczb zmiennoprzecinkowych istniej\u0105 osobne funkcje j\u0119zykowe, ale ich zachowanie trzeba sprawdza\u0107 osobno. Dlaczego wynik nie mo\u017ce by\u0107 r\u00f3wny dzielnikowi? Bo reszta musi by\u0107 mniejsza od dzielnika. Gdyby by\u0142a r\u00f3wna, oznacza\u0142oby to mo\u017cliwo\u015b\u0107 wykonania jeszcze jednego pe\u0142nego podzia\u0142u. Czy modulo i procent to to samo? Nie. Symbol % w wielu j\u0119zykach oznacza operator reszty z dzielenia, ale w matematyce znak procentu oznacza setne cz\u0119\u015bci ca\u0142o\u015bci. Ten sam symbol ma inne znaczenie zale\u017cnie od kontekstu. Gdzie najcz\u0119\u015bciej u\u017cywa si\u0119 tego w praktyce? W walidacji danych, kryptografii, tablicach haszuj\u0105cych, buforach cyklicznych, systemach czasu, numeracji cyklicznej oraz algorytmach teorii liczb. Czy mo\u017cna u\u017cywa\u0107 tego przy bardzo du\u017cych liczbach? Tak, i w\u0142a\u015bnie wtedy jest najbardziej warto\u015bciowe. W kryptografii bez modularnych uproszcze\u0144 obliczenia by\u0142yby praktycznie niewykonalne. Reszta z dzielenia wygl\u0105da niepozornie, ale bez niej nie dzia\u0142a poprawnie bardzo du\u017ca cz\u0119\u015b\u0107 wsp\u00f3\u0142czesnego oprogramowania. To jeden z tych mechanizm\u00f3w, kt\u00f3re na pocz\u0105tku wydaj\u0105 si\u0119 szkolnym detalem, a p\u00f3\u017aniej okazuj\u0105 si\u0119 fundamentem algorytmiki, bezpiecze\u0144stwa i wydajnego kodu. \u0179r\u00f3d\u0142o Foto: Freepik<\/p>\n","protected":false},"author":1,"featured_media":1322,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[],"class_list":["post-1321","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kodowanie"],"_links":{"self":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1321","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1321"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1321\/revisions"}],"predecessor-version":[{"id":1323,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1321\/revisions\/1323"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media\/1322"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1321"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1321"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1321"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}