MADE IN CHINA czyli SYSTEM RESZTOWY System ten oznaczmy skrótem RNS (residue number system czyli po prostu resztowy system liczbowy). Wartość liczby w tym systemie reprezentuje wektor (zbiór) reszt z dzielenia tej liczby przez pewne ustalone liczby naturalne. W systemie RNS (na szczęście) nie ma liczb ujemnych :) Parę rzeczy, które trzeba wiedzieć: – Liczby względnie pierwsze to takie, których największy wspólny dzielnik (NWD) jest równy 1, – żeby reprezentacja danej liczby w systemie RNS była jednoznaczna, moduły muszą być wzajemnie względnie pierwsze, – liczba w RNS składa się ze zbioru argumentów (modułów) i zbioru reszt z dzielenia wartości tej liczby przez moduły, np: X (2,3,5) = <1,2,4> moduły – reszty z dzielenia X mod Y oznacza resztę z dzielenia X przez Y. ARYTMETYKA RESZTOWA Tych kilka “chwytów” znacząco ułatwia liczenie reszty z dzielenia dużej liczby więc warto je zrozumieć: X⋅Y mod Z = X mod Z ⋅ Y mod Z mod Z X Y mod Z = X mod Z Y mod Z mod Z X − Y mod Z = X mod Z − Y mod Z mod Z Należy również pamiętać, że reszta może zawsze być dodatnia lub ujemna, więc: 13 mod 4 = 1 (3*4 + 1) i 13 mod 4 = -3 (4*4 – 3) Różnicą pomiędzy dodatnią resztą i ujemną jest zawsze liczba przez którą dzielimy (w tym przypadku |-3-1|=4). SZYBKIE OBLICZANIE RESZT To, czy algorytm przedstawiony poniżej zadziała uzależnione jest od liczby, przez którą dzielimy modulo. Musi ona być potęgą podstawy do której dodano 1 lub odjęto 1. Jeśli tak jest, musimy określić wspomnianą potęgę i “podzielić” liczbę dzieloną modulo na części składające się z tylu cyfr, jaka jest potęga podstawy. Kila przykładów dla lepszego zrozumienia: – jeśli dzielimy modulo przez 10110 (10110=102+1) to liczbę “podzielimy” na części po dwie cyfry, – jeśli dzielimy modulo przez 9910 (9910=102-1) to zrobimy tak samo, – jeśli dzielimy modulo przez 1000110 (1000110=105+1) to liczbę “podzielimy” na części po 5 cyfr, – jeśli dzielimy modulo przez 889 (889=92-1) to liczbę “podzielimy” na części po 2 cyfry. Teraz musimy stwierdzić czy jedynkę dodano czy odjęto: – jeśli jedynkę ODJĘTO, należy DODAWAĆ kolejne części liczby dzielonej, – jeśli jedynkę DODANO, należy NA PRZEMIAN ODEJMOWAĆ I DODAWAĆ dzielonej, zaczynając od PRAWEJ, kolejne części liczby Liczba otrzymana po dodawaniu/odejmowaniu będzie znacznie mniejsza niż początkowa więc o wiele łatwiej będzie wykonać dzielenie modulo. Przykład 0.1: 1234567890 mod 9910 99=102-1 (więc rozdzielamy po 2 cyfry) 12|34|56|78|90 mod 9910 = (90 + 78 + 56 + 34 + 12) mod 99 = 270 mod 99 = 72 Przykład 0.2: 1234567890 mod 10110 101=102+1 (więc rozdzielamy po 2 cyfry) 12|34|56|78|90 mod 10110 = (90 - 78 + 56 - 34 + 12) mod 101 = 46 mod 101 = 46 Przykład 0.3: 1011 0011 0111 11012 mod 11112 11112= 24-1 Krzysztof Adamski :: http://mr-k.namyslow.eu.org 1 1011|0011|0111|1101 mod 1111 = ( 1101 + 0111 + 0011 + 1011 ) mod 1111 = ( 1310 + 710 + 310 + 1110 ) mod 15 = = 3410 mod 1510 = 410 = 01002 Przykład 0.4: 1011 0011 0111 11012 mod 100012 11112= 24+1 1011|0011|0111|1101 mod 10001 = ( 1101 - 0111 + 0011 - 1011 ) mod 10001 = (1310 – 710 + 310 – 1110) mod 1710 = -210 mod 1710 = 1510 = 11112 KONWERSJA Z SYSTEMU NATURALNEGO NA RNS Tyle teorii na wstęp, teraz praktyka. Najważniejsze co trzeba wiedzieć to jak wykonać konwersję liczb RNS na liczby naturalne i odwrotnie. Pierwsza z tych czynności jest prostsza więc od niej zaczniemy. Oczywiście najprościej wyjaśnić to na przykładach: Przykład 1.1: X=123410 RNS(15,16,17) - liczba w systemie stałobazowym - wektor (zbiór) modułów Aby otrzymać liczbę w systemie RNS(15,16,17) musimy dzielić ją modulo (wyciągać reszty z dzielenia) przez 15, 16, 17 (czyli moduły): 1234 mod 15 = 4 1234 mod 16 = 2 1234 mod 17 = 10 Wynika z tego, że: 123410=<4,2,10>(15,16,17) Przykład 1.2: X=432110 RNS(5, 7, 9) - liczba w systemie stałobazowym - wektor (zbiór) modułów 4321 mod 5 = 1 4321 mod 7 = 2 4321 mod 9 = 1 432110=<1,2,1>(5,7,9) Przykład 1.3: X=1910 RNS(3,7,8) 1910 = <19 mod 3, 19 mod 7, 19 mod 8>(3,7,8) = <1, 5, 3>(3,7,8) KONWERSJA Z SYSTEMU RNS NA NATURALNY Bardziej skomplikowany jest algorytm zamiany liczby w odwrotną stronę – z systemu RNS na system naturalny. m i (m z daszkiem :)) jest iloczynem wszystkich modułów, poza mi Rozważmy to na najpierw na symbolach ogólnych: RNS(m1, m2, m3) X=<x1, x2, x3> m 1 =m2 ⋅m3 m 2 =m1⋅m3 Krzysztof Adamski :: http://mr-k.namyslow.eu.org 2 m 3 = m1 ⋅m2 Naszym zadaniem jest teraz znalezienie takich liczb k1, k2 i k3, NATURALNE że: k 1 ⋅ m1 mod m1 =1 , czyli z powyższego k 1 ⋅ m2⋅ m3 mod m1 =1 k 2⋅ m 2 mod m2 =1 , czyli z powyższego k 2⋅ m1⋅ m3 mod m 2 =1 k 3 ⋅ m3 mod m3 =1 , czyli z powyższego k 3 ⋅ m1⋅ m2 mod m3 =1 Jeśli znajdziemy liczby k1, k2 i k3, wartość liczby X w systemie naturalnym otrzymamy po wyliczeniu: X ={k 1⋅x1⋅ m1 k 2⋅x 2⋅ m2 k 3⋅x 3⋅ m3 } mod m1⋅m2⋅m3 Przykład 2.1: RNS=(15,16,17) X=<2,2,3> m1 = 15 m2 = 16 m3 = 17 m 1 = m2⋅m3 =16 ⋅17 = 272 m 2 =m1⋅m3 =15 ⋅17 = 255 m 3 = m1 ⋅m2 =15 ⋅16 = 240 musimy znaleźć k1, k2 i k3: k 1 ⋅ m1 mod m1 =1 , czyli k 1 ⋅16⋅17 mod 15 = 1 korzystając z praw arytmetyki reszt możemy to zapisać: k 1 ⋅ 16 mod 15 ⋅ 17 mod 15 mod 15 = 1 k 1 ⋅ 1 ⋅ 2 mod 15 = 1 2⋅k 1 mod 15 = 1 k 1=8 k 2⋅ m 2 mod m2=1 , czyli k 2⋅15⋅17 mod 16 = 1 k 2 ⋅ 15 mod 16 ⋅ 17 mod 16 mod 16 = 1 k 2 ⋅ − 1 ⋅ 1 mod 16 = 1 − 1⋅k 2 mod 16 = 1 k 2=− 1 k 3 ⋅ m3 mod m3=1 , czyli k 3 ⋅15⋅16 mod 17 = 1 k 3 ⋅ 15 mod 17 ⋅ 16 mod 17 mod 17 = 1 k 3 ⋅ − 2 ⋅ − 1 mod 17 = 1 2⋅k 3 mod 17 = 1 k 3=9 X ={ 8⋅2⋅272 − 1⋅2⋅255 9⋅3⋅240 } mod 15⋅16⋅17 = { 4352 − 510 6480 } mod 4080 = = 10322 mod 4080 = 2162 Wartością <2,2,3> w RNS=(15,16,17) jest 2162 w systemie naturalnym. Przykład 2.2 RNS(3,4,5) X=<1,2,3> m 1 = m2⋅m3 = 4 ⋅5 =20 m 2 =m1⋅m3 =3 ⋅5 =15 m 3 = m1 ⋅m2 =3 ⋅4 =12 musimy znaleźć k1, k2 i k3: k 1 ⋅ m1 mod m1 =1 , czyli k 1 ⋅4⋅5 mod 3 = 1 Krzysztof Adamski :: http://mr-k.namyslow.eu.org 3 korzystając z praw arytmetyki reszt możemy to zapisać: k 1 ⋅ 4 mod 3 ⋅ 5 mod 3 mod 3 = 1 k 1 ⋅ 1 ⋅ 2 mod 3 = 1 2⋅k 1 mod 3 = 1 k 1=2 k 2⋅ m 2 mod m2=1 , czyli k 2⋅3⋅5 mod 4 = 1 k 2 ⋅ 3 mod 4 ⋅ 5 mod 4 mod 4 = 1 k 2 ⋅ − 1 ⋅ 1 mod 4 = 1 − 1⋅k 2 mod 4 = 1 k 2=− 1 k 3 ⋅ m3 mod m3=1 , czyli k 3 ⋅3⋅4 mod 5 = 1 k 3 ⋅ 3 mod 5 ⋅ 4 mod 5 mod 5 = 1 k 3 ⋅ − 2 ⋅ − 1 mod 5 = 1 2⋅k 3 mod 5 = 1 k 3=3 X ={ 2⋅1⋅20 − 1⋅2⋅15 3⋅3⋅12 } mod 3⋅4⋅5 = { 40 − 30 108 } mod 60 = = 118 mod 60 = 58 Wartością <1,2,3> w RNS=(3,4,5) jest 58 w systemie naturalnym. Krzysztof Adamski :: http://mr-k.namyslow.eu.org 4 OBLICZANIE RESZT Z DZIELENIA LICZB W DUŻYCH POTĘGACH Najpierw trochę teorii... MAŁE TWIERDZENIE FERMATA Niech p będzie liczbą pierwszą. Jeśli p jest względnie pierwsze z a to zachodzi równość: p− 1 a mod p = 1 FUNKCJA EULERA φ(N) Jeśli podzielnikami liczby N są liczby pierwsze p1, p2... pm to liczb naturalnych mniejszych od N i względnie pierwszych z N jest: m N = ∏ p i− 1 pi ei − 1 i =1 Krótko - φ(N) oznacza ilość liczb mniejszych od N względnie pierwszych z N. Do obliczania φ(N) przydatne są poniższe fakty: 1. Jeśli a i b są względnie pierwsze to φ(a b)=φ(a) φ(b) 2. Jeśli p jest liczbą pierwszą to φ(pk)=pk - pk-1 TWIERDZENIE EULERA Jest jakby rozszerzeniem małego twierdzenia fermata. Mówi ono, że jeśli m i a są względnie pierwsze to zachodzi równość: m a mod m=1 Ważny fakt wynikający z twierdzenia Eulera oraz własności kongruencji: a b mod c = a mod cb mod c mod c No i teraz ulubione przykłady.... Przykład 3.1 Obliczyć 172167 mod 19 φ(19)=18 172167 mod 19 = 172167 mod 18 mod 19 = 177 mod 19 = (-2)7 mod 19 = -128 mod 19 = -14 = 5 Przykład 3.2 Obliczyć 64124 mod 33 33 = 3⋅11 = 2⋅10 = 20 64124 mod 33 = (64 mod 33)124 mod 20 mod 33 = (-2)4 mod 33 = 16 Przykład 3.3 Obliczyć 45122 mod 11 φ(11)=10 45122 mod 11 = (45 mod 11)122 mod 10 mod 11 = 12 mod 11 = 1 Krzysztof Adamski :: http://mr-k.namyslow.eu.org 5