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 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

Podobne dokumenty