ALGORYTMY I STRUKTURY DANYCH Paulina Wojtalewicz i Aleksandra Milczarek
TEMATY, KTÓRYMI SIĘ ZAJMIEMY, TO : Wyszukiwanie palindromów Szyfr Cezara Szyfry przestawieniowe Dodawanie dużych liczb Mnożenie dużych liczb, Ciekawi?- (założymy się, że tak ), wszystkie te tematy przybliżymy Wam za chwilę
Wyszukiwanie palindromów
WYSZUKIWANIE PALINDROMÓW Problem W łańcuchu s znaleźć wszystkie palindromy o długości większej od 1. Przez palindrom (ang. palindrome) rozumiemy łańcuch znakowy s, który czyta się tak samo w obu kierunkach. Przykład: ABBCBBA jest palindromem ABBCABA nie jest palindromem Palindromy pojawiają się w genetyce (łańcuchy DNA, RNA), w tekstach, muzyce, matematyce, geometrii, fizyce itd. Stąd duże zainteresowanie informatyków w efektywnych algorytmach ich znajdowania. W badaniach genetycznych często szuka się tzw. przybliżonych palindromów (ang. aproximate palindromes), tzn. palindromów, w których do k-znaków może być błędnych, czyli nie pasujących do dokładnego palindromu (ang. exact palindrome). Takie palindromy występują w łańcuchach DNA, w których wystąpiły różnego rodzaju błędy genetyczne. Problemem palindromów przybliżonych nie zajmujemy się w tym opracowaniu.
WYSZUKIWANIE PALINDROMÓW Wprowadźmy symbol s R, który oznacza łańcuch znakowy o odwróconej kolejności znaków w stosunku do łańcucha s. Przykład: s = ABCD s R = DCBA Łańcuch s jest palindromem, jeśli da się rozłożyć na dwa podłańcuchy w i w R wg poniższego schematu: s = ww R palindrom parzysty (ang. even palindrome), lub s = wxw R palindrom nieparzysty (ang. odd palindrome), gdzie X jest dowolnym symbolem alfabetu.
WYSZUKIWANIE PALIDROMÓW Rozwiązanie nr 1 Pierwszy algorytm wyszukiwania palindromów jest algorytmem naiwnym. Rozkłada on dany łańcuch znakowy s na wszystkie możliwe podłańcuchy p o długości nie mniejszej niż 2 znaki i sprawdza następnie, czy dadzą się przedstawić w postaci ww R lub wxw R. Sprawdzenie polega na porównywaniu znaków od początku i od końca podłańcucha. W tym celu wykorzystuje się dwa indeksy. Jeden z nich ustawia się na pierwszym znaku podłańcucha p, a drugi na ostatnim. Następnie porównujemy wskazywane przez te indeksy znaki podłańcucha p. Jeśli znaki są różne, to podłańcuch p nie jest palindromem. Jeśli porównywane znaki są równe, to indeksy przesuwamy lewy w prawo, a prawy w lewo. Jeśli indeksy się miną, to zachodzi jedna z dwóch równości:
WYSZUKIWANIE PALIDROMÓW p = ww R, lub p = wxw R W takim przypadku p jest palindromem. Wyszukanie wszystkich palindromów zawartych w łańcuchu s proponowaną metodą posiada sześcienną klasę złożoności obliczeniowej O(n 3 ), gdzie n jest długością łańcucha s.
WYSZUKIWANIE PALIDROMÓW Algorytm naiwny wyszukiwania palindromów Wejście: s łańcuch tekstowy.wyjście: Wszystkie palindromy zawarte w łańcuchu s. Elementy pomocnicze: i,j indeksy znaków w łańcuchu s, i,j N Nn długość łańcucha s, n N Ni P prawy indeks, i P N Ni L lewy indeks, i L N
WYSZUKIWANIE PALINDROMÓW Lista kroków
Szyfr Cezara
SZYFR CEZARA Problem Opracować algorytm szyfrujący i deszyfrujący dla szyfru Cezara Szyfrowanie tekstów (ang. text encryption) ma na celu ukrycie ważnych informacji przed dostępem do nich osób niepowołanych. Historia kodów szyfrujących sięga czasów starożytnych. Już tysiące lat temu egipscy kapłani stosowali specjalny system hieroglifów do szyfrowania różnych tajnych wiadomości. Szyfr Cezara (ang. Ceasar's Code lub Ceasar's Cipher) jest bardzo prostym szyfrem podstawieniowym (ang. substitution cipher). Szyfry podstawieniowe polegają na zastępowaniu znaków tekstu jawnego (ang. plaintext) innymi znakami przez co zawarta w tekście informacja staje się nieczytelna dla osób niewtajemniczonych. Współcześnie szyfrowanie stanowi jedną z najważniejszych dziedzin informatyki to dzięki niej stał się możliwy handel w Internecie, funkcjonują banki ze zdalnym dostępem do kont, powstał podpis elektroniczny oraz bezpieczne łącza transmisji danych. Przykładów zastosowania jest bez liku i dokładne omówienie tej dziedziny wiedzy leży daleko poza możliwościami tego artykułu.
SZYFR CEZARA Szyfr Cezara został nazwany na cześć rzymskiego imperatora Juliusza Cezara, który stosował ten sposób szyfrowania do przekazywania informacji o znaczeniu wojskowym. Szyfr polega na zastępowaniu liter alfabetu A...Z literami leżącymi o trzy pozycje dalej w alfabecie: Ostatnie trzy znaki X, Y i Z nie posiadają następników w alfabecie przesuniętych o trzy pozycje. Dlatego umawiamy się, iż alfabet "zawija się" i za literką Z następuje znów litera A. Teraz bez problemu znajdziemy następniki X A, Y B i Z C.
SZYFR CEZARA Przykład: Zaszyfrować zdanie: NIEPRZYJACIEL JEST BARDZO BLISKO. Poszczególne literki tekstu jawnego zastępujemy literkami szyfru Cezara zgodnie z powyższą tabelką kodu. Spacje oraz inne znaki nie będące literami pozostawiamy bez zmian: NIEPRZYJACIEL JEST BARDZO BLISKO QLHSUCBMDFLHO MHVW EDUGCR EOLVNR Deszyfrowanie tekstu zaszyfrowanego kodem Cezara polega na wykonywaniu operacji odwrotnych. Każdą literę kodu zamieniamy na literę leżącą o trzy pozycje wcześniej w alfabecie.
SZYFR CEZARA Podobnie jak poprzednio trzy pierwsze znaki szyfru Cezara nie posiadają bezpośrednich odpowiedników liter leżących o trzy pozycje wcześniej, ponieważ alfabet rozpoczyna się dopiera od pozycji literki D. Rozwiązaniem jest ponowne "zawinięcie" alfabetu tak, aby przed literą A znalazły się trzy ostatnie literki X, Y i Z. Do wyznaczania kodu literek przy szyfrowaniu i deszyfrowaniu posłużymy się operacjami modulo. Operacja modulo jest resztą z dzielenia danej liczby przez moduł. Wynik jest zawsze mniejszy od modułu. U nas moduł będzie równy 26, ponieważ tyle mamy liter alfabetu. Jeśli c jest kodem ASCII dużej litery alfabetu (rozważamy tylko teksty zbudowane z dużych liter), to szyfrowanie kodem Cezara polega na wykonaniu następującej operacji arytmetycznej: c = 65 + (c - 62) mod 26 Deszyfrowanie polega na zamianie kodu wg wzoru: c = 65 + (c - 42) mod 26
SZYFR CEZARA Algorytm szyfrowania tekstu kodem Cezara Wejście Łańcuch tekstowy swyjście: Łańcuch tekstowy s zaszyfrowany kodem Cezara Elementy pomocnicze: i indeks, i N kod(x) zwraca kod litery x znak(x) zamienia kod x na odpowiadający mu znak ASCII
SZYFR CEZARA Lista kroków
Szyfry przestawieniowe
SZYFRY PRZESTAWIENIOWE Problem Opracować algorytm szyfrujący i deszyfrujący za pomocą szyfru przestawieniowego Szyfr przestawieniowy (ang. transposition cifer) polega na zamianie położenia znaków tworzących tekst, przez co wiadomość staje się nieczytelna dla niewtajemniczonego odbiorcy. W zaszyfrowanym tekście znajdują się wszystkie znaki tekstu jawnego. Zaczniemy od najprostszych szyfrów przestawieniowych.
SZYFRY PRZESTAWIENIOWE Przestawianie dwóch sąsiednich liter W tym rodzaju szyfru tekst dzielimy na pary znaków. Następnie w każdej parze zamieniamy ze sobą litery, Przykład:
SZYFRY PRZESTAWIENIOWE Tekst da się podzielić na pary, jeśli zawiera parzystą liczbę znaków. W przeciwnym razie ostatnia para jest niepełna. W takiej niepełnej parze liter oczywiście nie zamieniamy miejscami. Zwróć uwagę, iż ten szyfr jest symetryczny. Jeśli poddamy szyfrowaniu tekst poprzednio zaszyfrowany, to otrzymamy z powrotem tekst jawny.
SZYFRY PRZESTAWIENIOWE Algorytm szyfrowania przestawieniowego ze zamianą liter w parach Wejście Łańcuch tekstowy s, który zawiera tekst poddawany szyfrowaniu lub deszyfrowaniu Wyjście: Zaszyfrowany łańcuch s Elementy pomocnicze: i indeks, i N
SZYFRY PRZESTAWIONE Lista kroków:
Dodawanie dużych liczb
DODAWANIE DUŻYCH LICZB Problem Dodać do siebie dwie dowolnie duże, dodatnie liczby całkowite, przedstawione w postaci łańcucha cyfr. Problem rozwiążemy w sposób szkolny (profesjonalne algorytmy wymagają innego podejścia). Dodawane liczby musimy wyrównać do ostatnich cyfr: 21638626396236623668969866232198 95832808595775579737342988203408934789797363
DODAWANIE DUŻYCH LICZB Dodawanie rozpoczniemy od ostatnich cyfr łańcuchów. Stosujemy przy tym poznane w szkole podstawowej zasady dodawania dwóch liczb. Dodajemy ostatnie cyfry. W łańcuchu wynikowym umieszczamy ostatnią cyfrę wyniku. Natomiast pierwsza cyfra wyniku staje się przeniesieniem do następnej pozycji:
DODAWANIE DUŻYCH LICZB W następnym kroku dodajemy do siebie dwie kolejne cyfry oraz przeniesienie. Do łańcucha wynikowego wpisujemy na przedostatniej pozycji ostatnią cyfrę wyniku, a pierwsza cyfra wyniku staje się przeniesieniem na dalszą pozycję.
DODAWANIE DUŻYCH LICZB Jeśli w jednym z łańcuchów skończą się zbyt wcześnie cyfry, to przyjmujemy, że posiada on resztę cyfr równych 0. Sprowadza się to wtedy do dodawania przeniesień do pozostałych cyfr drugiego łańcucha. Gdy wszystkie cyfry zostaną przetworzone, a przeniesienie ma wartość większą od 0, to umieszczamy je na początku łańcucha wynikowego jako pierwszą cyfrę wyniku. Przy dodawaniu cyfr musimy pamiętać, że są one przechowywane w łańcuchach w postaci kodów ASCII: Dlatego w celu otrzymania wartości cyfry należy od jej kodu odjąć 48, a przy otrzymywaniu kodu znaku z wartości cyfry należy do niej dodać 48
DODAWANIE DUŻYCH LICZB
DODAWANIE DUŻYCH LICZB
Mnożenie dużych liczb
MNOŻENIE DUŻYCH LICZB Problem 1 Pomnożyć dowolnie dużą nieujemną liczbę całkowitą przez nieujemną liczbę całkowitą względnie małą, np. 32 bitową. Naszym zadaniem jest znalezienie iloczynu: W=a*b gdzie: a liczba duża, b liczba mała Liczba mała b rozkłada się na sumę potęg liczby 2 mnożonych przez kolejne bity b i liczby b:
MNOŻENIE DUŻYCH LICZB
MNOŻENIE DUŻYCH LICZB W powyższym wzorze b i to i-ty bit mniejszej liczby. Natomiast kolejne iloczyny 2 i a bardzo łatwo oblicza się dynamicznie za pomocą dodawania, ponieważ, co łatwo zauważyć, każdy kolejny iloczyn jest dwa razy większy od poprzedniego.: Iloczyny dodajemy do wyniku W, jeśli odpowiedni bit b i jest równy 1. W całym tym postępowaniu wykonywane są tylko dodawania dużych liczb. Bity z liczby b możemy łatwo wydzielać za pomocą operacji koniunkcji i przesuwów
MNOŻENIE DUŻYCH LICZB
MNOŻENIE DUŻYCH LICZB
Dziękujemy za uwagę