MADE IN CHINA czyli SYSTEM RESZTOWY

advertisement
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 cb
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
Download