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 X Y X Y mod Z = X mod Z Y mod Z mod Z mod Z = X mod Z Y mod Z mod Z 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 101 10 (101 10=10 2 +1) to liczbę podzielimy na części po dwie cyfry, jeśli dzielimy modulo przez 99 10 (99 10=10 2-1) to zrobimy tak samo, jeśli dzielimy modulo przez 10001 10 (10001 10=10 5 +1) to liczbę podzielimy na części po 5 cyfr, jeśli dzielimy modulo przez 88 9 (88 9=9 2-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Ć kolejne części liczby dzielonej, zaczynając od PRAWEJ, 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 99 10 99=10 2-1 (więc rozdzielamy po 2 cyfry) 12 34 56 78 90 mod 99 10 = (90 + 78 + 56 + 34 + 12) mod 99 = 270 mod 99 = 72 Przykład 0.2: 1234567890 mod 101 10 101=10 2 +1 (więc rozdzielamy po 2 cyfry) 12 34 56 78 90 mod 101 10 = (90-78 + 56-34 + 12) mod 101 = 46 mod 101 = 46 Przykład 0.3: 1011 0011 0111 1101 2 mod 1111 2 1111 2= 2 4-1 1
1011 0011 0111 1101 mod 1111 = ( 1101 + 0111 + 0011 + 1011 ) mod 1111 = ( 13 10 + 7 10 + 3 10 + 11 10 ) mod 15 = = 34 10 mod 15 10 = 4 10 = 0100 2 Przykład 0.4: 1011 0011 0111 1101 2 mod 10001 2 1111 2= 2 4 +1 1011 0011 0111 1101 mod 10001 = ( 1101-0111 + 0011-1011 ) mod 10001 = (13 10 7 10 + 3 10 11 10) mod 17 10 = -2 10 mod 17 10 = 15 10 = 1111 2 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=1234 10 - liczba w systemie stałobazowym RNS(15,16,17) - 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: 1234 10=<4,2,10> (15,16,17) Przykład 1.2: X=4321 10 - liczba w systemie stałobazowym RNS(5, 7, 9) - wektor (zbiór) modułów 4321 mod 5 = 1 4321 mod 7 = 2 4321 mod 9 = 1 4321 10=<1,2,1> (5,7,9) Przykład 1.3: X=19 10 RNS(3,7,8) 19 10 = <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 m i Rozważmy to na najpierw na symbolach ogólnych: RNS(m 1, m 2, m 3) X=<x 1, x 2, x 3> m 1 =m 2 m 3 m 2 =m 1 m 3 2
m 3 =m 1 m 2 Naszym zadaniem jest teraz znalezienie takich liczb k 1, k 2 i k 3, NATURALNE że: k 1 m 1 mod m 1 =1, czyli z powyższego k 1 m 2 m 3 mod m 1 =1 k 2 m 2 mod m 2 =1, czyli z powyższego k 2 m 1 m 3 mod m 2 =1 k 3 m 3 mod m 3 =1, czyli z powyższego k 3 m 1 m 2 mod m 3 =1 Jeśli znajdziemy liczby k 1, k 2 i k 3, wartość liczby X w systemie naturalnym otrzymamy po wyliczeniu: X ={k 1 x 1 m 1 k 2 x 2 m 2 k 3 x 3 m 3 } mod m 1 m 2 m 3 Przykład 2.1: RNS=(15,16,17) X=<2,2,3> m 1 = 15 m 1 =m 2 m 3 =16 17 =272 m 2 = 16 m 2 =m 1 m 3 =15 17 =255 m 3 = 17 m 3 =m 1 m 2 =15 16 =240 musimy znaleźć k 1, k 2 i k 3: k 1 m 1 mod m 1 =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 m 2 =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 m 3 mod m 3 =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 =m 2 m 3 =4 5 =20 m 2 =m 1 m 3 =3 5 =15 m 3 =m 1 m 2 =3 4 =12 musimy znaleźć k 1, k 2 i k 3: k 1 m 1 mod m 1 =1, czyli k 1 4 5 mod 3 = 1 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 m 2 =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 m 3 mod m 3 =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. 4
Najpierw trochę teorii... MAŁE TWIERDZENIE FERMATA OBLICZANIE RESZT Z DZIELENIA LICZB W DUŻYCH POTĘGACH Niech p będzie liczbą pierwszą. Jeśli p jest względnie pierwsze z a to zachodzi równość: a p 1 mod p = 1 FUNKCJA EULERA φ(n) Jeśli podzielnikami liczby N są liczby pierwsze p 1, p 2... p m to liczb naturalnych mniejszych od N i względnie pierwszych z N jest: m e N = p i 1 p i 1 i 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 φ (p k )=p k - p k-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ść: a m mod m=1 Ważny fakt wynikający z twierdzenia Eulera oraz własności kongruencji: a b mod c = a mod c b mod c mod c No i teraz ulubione przykłady... Przykład 3.1 Obliczyć 17 2167 mod 19 φ(19)=18 17 2167 mod 19 = 17 2167 mod 18 mod 19 = 17 7 mod 19 = (-2) 7 mod 19 = -128 mod 19 = -14 = 5 Przykład 3.2 Obliczyć 64 124 mod 33 33 = 3 11 = 2 10 = 20 64 124 mod 33 = (64 mod 33) 124 mod 20 mod 33 = (-2) 4 mod 33 = 16 Przykład 3.3 Obliczyć 45 122 mod 11 φ(11)=10 45 122 mod 11 = (45 mod 11) 122 mod 10 mod 11 = 1 2 mod 11 = 1 5