You are on page 1of 2

Wykad 8

Liczby pierwsze
Liczb pierwszych jest nieskoczenie wiele. (Euklides) Liczb pierwszych mniejszych od N jest okoo N/ln(N). Wrd liczb 100 cyfrowych jedna na 300 jest pierwsza. Sprawdzi czy dua liczba jest pierwsza jest atwo! Rozoy du liczb na czynniki jest bardzo trudno! Najszybszy znany algorytm wymaga czasu: T = exp(sqrt(ln(n)*(ln(ln(n))))) Dla n10200 czas wynosi T 1023 krokw Jeeli 1 krok = 1 mikrosekunda to czas wynosi 3 mld lat.
2

Algorytmy teorioliczbowe Szyfrowanie metod RSA Kod Huffmana

Arytmetyka modularna
Kad liczb zastpuje si reszt dzielenia przez modu. x (mod N) 9 (mod 7) = 2 Dwie liczby a,b przystaj do siebie wzgldem moduu N gdy: a (mod N) = b (mod N) ab (mod N) Multiplikatywny element odwrotny a*b (mod N) = 1 3*7 (mod 10) = 1 Jeeli a<N i NWD(a,N)=1 to istnieje element odwrotny do a. 3

Najwiekszy wsplny dzielnik

# oblicza nwd(a,b) procedure gdc(a,b) repeat { if a>=b then a:=a%b if a=0 then return b if a<=b then b:=b%a if b=0 then return a } end

Potga liczby
# oblicza az mod n procedure fastexp(a,z,n) x:=1 while z~=0 do { while z%2=0 do { z:=z/2 a:=(a*a)%n } z:=z-1 x:=(x*a)%n } return x end
5

Test pierwszoci liczby


# prawdopodobiestwo bdu (1/2)n procedure prima(b,n) if b%2=0 then return 0 man:=b-1 cec:=0 while man%2=0 do { cec:=cec+1; man:=man/2 } every i:=1 to n do { a:=random(b-1)+1 if fastexp(a,b-1,b)~=1 then return 0 every l:=0 to cec-1 do { pom:=fastexp(a,man*2^l,b)-1 if (pom~=0) & (gdc(pom,b)~=1) then return 0 } } end

Multiplikatywny element odwrotny


# (a*x) mod n = 1, np. 3,7 mod 10 procedure inv(a,n) g0:=n; g1:=a v0:=0; v1:=1 while (g1~=0) do { g2:=g0%g1 v2:=v0%v1 g0:=g1; g1:=g2 v0:=v1; v1:=v2 } x:=v0 if x>=0 then return x else return (x+n) end
7

Szyfr RSA
Twrcy algorytmu (1977): R.L.Rivest, A.Shamir, L.Adleman 1) Wybierz dwie liczby pierwsze p,q n = p*q m = (p-1)*(q-1) 2) Wybierz d [max(p,q)+1, n-1] wzgldnie pierwsze z m 3) Oblicz e = inv(d,m) Klucz prywatny: d, n Klucz publiczny: e, n

Szyfr RSA
M - tekst jawny C - kryptogram Szyfrowanie C = Me mod n Deszyfrowanie M = Cd mod n Przykad p=53 q=61 n=3233 m=3120 wybieramy d=791 i obliczamy e=71 170471 mod 3233 = 3106 3106791 mod 3233 = 1704
9

Kod Huffmana
Najpierw zbudujemy tzw. drzewo Huffmana: Policz czstoci wystpowania poszczeglnych liter (elementw mi); U elementy w porzdku wystpowania od czstoci najmniejszej do najwikszej; Powtarzaj dopki w cigu nie pozostanie jeden element Elementowi na pozycji 1 (lewe poddrzewo) przypisz kod 0, elementowi na pozycji 2 (prawe poddrzewo) przypisz kod 1; Usu dwa pierwsze elementy z cigu wstawiajc w odpowiednie miejsce (tak aby nie naruszy porzdku) element bdcy sum czstoci usunitych; zapamitaj, z ktrych elementw powsta nowy wze (lewy, prawy)

Kod Huffmana elementu mi uzyskamy dochodzc do niego rozpoczynajc w korzeniu (elemencie ktry pozosta) i skadajc po kolei wszystkie kody 0 i 1 jaki po drodze do niego napotkamy.
10

Kod Huffmana - przykad


Mamy symbole A,B,C,D o prawdopodobiestwach wystpienia odpowiednio [0.1, 0.2, 0.3, 0.4]. czymy wzy odpowiadajce symbolom (A) i (B). Teraz mamy (A + B) = 0.3, (C) = 0.3, (D) = 0.4 czymy wzy odpowiadajce drzewku (A + B) oraz (C). Teraz mamy ((A + B) + C)=0.6 i (D) = 0.4 czymy wzy odpowiadajce drzewku ((A + B) + C) oraz (D). Teraz mamy tylko jeden wolny wze - drzewko (((A + B) + C) + D) = 1.0 Obliczamy kody znakw: A = lewo, lewo, lewo = 000 B = lewo, lewo, prawo = 001 C = lewo, prawo = 01 D = prawo = 1
11

Kod Huffmana - przykad


Kody znakw: A = 000 B = 001 C = 01 D=1 Jak atwo sprawdzi statystyczny znak zajmie w naszym kodzie: p[A]*3 + p[B]*3 + p[C]*2 + p[D]*1 = 0.3 + 0.6 + 0.6 + 0.4 = 1.9 bitw. Jest to mniej ni 2 bity potrzebne w trywialnym kodowaniu o staej dugoci znaku. Entropia znaku wynosi: E = -0.1*log2(0.1) - 0.2*log2(0.2) - 0.3 * log2(0.3) - 0.4 * log2(0.4) = 1.8464
12

You might also like