MADE IN CHINA czyli SYSTEM RESZTOWY
Transkrypt
MADE IN CHINA czyli SYSTEM RESZTOWY
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