Liczby pierwsze - wstęp

Podobne dokumenty
INFORMATYKA SORTOWANIE DANYCH.

Podstawy Informatyki. Sprawność algorytmów

Złożoność obliczeniowa algorytmu ilość zasobów komputera jakiej potrzebuje dany algorytm. Pojęcie to

Zaawansowane algorytmy i struktury danych

Porównanie czasów działania algorytmów sortowania przez wstawianie i scalanie

Zasady analizy algorytmów

Jeśli czas działania algorytmu zależy nie tylko od rozmiaru danych wejściowych i przyjmuje różne wartości dla różnych danych o tym samym rozmiarze,

Informatyka 1. Złożoność obliczeniowa

Złożoność algorytmów. Wstęp do Informatyki

Złożoność Obliczeniowa Algorytmów

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

TEORETYCZNE PODSTAWY INFORMATYKI

Matematyczne Podstawy Informatyki

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Podstawy Programowania

Podstawy Programowania. Złożoność obliczeniowa

Wprowadzenie do złożoności obliczeniowej

Podstawy Programowania. Złożoność obliczeniowa

Algorytmy i Struktury Danych

Za pierwszy niebanalny algorytm uważa się algorytm Euklidesa wyszukiwanie NWD dwóch liczb (400 a 300 rok przed narodzeniem Chrystusa).

1. Analiza algorytmów przypomnienie

TEORETYCZNE PODSTAWY INFORMATYKI

Zaawansowane algorytmy i struktury danych

Wstęp do programowania

Algorytmy i ich poprawność

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 13. Karol Tarnowski A-1 p.

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 13. Karol Tarnowski A-1 p.

Podstawy Programowania

WYŻSZA SZKOŁA INFORMATYKI STOSOWANEJ I ZARZĄDZANIA

Efektywność algorytmów

Analiza algorytmów zadania podstawowe

Algorytmy, reprezentacja algorytmów.

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Algorytm i złożoność obliczeniowa algorytmu

Algorytmy w teorii liczb

PROBLEMY NIEROZSTRZYGALNE

ANALIZA ALGORYTMÓW. Analiza algorytmów polega między innymi na odpowiedzi na pytania:

Struktury danych i złożoność obliczeniowa Wykład 5. Prof. dr hab. inż. Jan Magott

Logarytmy. Funkcje logarytmiczna i wykładnicza. Równania i nierówności wykładnicze i logarytmiczne.

Wymagania edukacyjne z matematyki klasa II technikum

Analiza algorytmów zadania podstawowe

Teoretyczne podstawy informatyki

Kompletna dokumentacja kontenera C++ vector w -

Informacja w perspektywie obliczeniowej. Informacje, liczby i obliczenia

1. LICZBY DZIAŁ Z PODRĘCZNIKA L.P. NaCoBeZu kryteria sukcesu w języku ucznia

ROZKŁAD MATERIAŁU NAUCZANIA KLASA 1, ZAKRES PODSTAWOWY

Technologie informacyjne Wykład VII-IX

Struktura danych. Sposób uporządkowania informacji w komputerze.

PLAN WYNIKOWY DLA KLASY DRUGIEJ POZIOM PODSTAWOWY I ROZSZERZONY. I. Proste na płaszczyźnie (15 godz.)

Podstawy programowania. Podstawy C# Przykłady algorytmów

Metody numeryczne. materiały do wykładu dla studentów. 1. Teoria błędów, notacja O

6. Liczby wymierne i niewymierne. Niewymierność pierwiastków i logarytmów (c.d.).

Próbny egzamin z matematyki dla uczniów klas II LO i III Technikum. w roku szkolnym 2012/2013

ANALIZA ALGORYTMÓW. Analiza algorytmów polega między innymi na odpowiedzi na pytania:

Teoria obliczeń i złożoność obliczeniowa

Katalog wymagań programowych na poszczególne stopnie szkolne. Matematyka. Poznać, zrozumieć. Kształcenie w zakresie podstawowym.

OBLICZALNOŚĆ I NIEOBLICZALNOŚĆ

Sortowanie. Tomasz Żak zak. styczeń Instytut Matematyki i Informatyki, Politechnika Wrocławska

KONSPEKT ZAJĘĆ KOŁA INFORMATYCZNEGO LUB MATEMATYCZNEGO W KLASIE III GIMNAZJUM LUB I LICEUM ( 2 GODZ.)

Algorytmy asymetryczne

Struktury danych i złożoność obliczeniowa Wykład 7. Prof. dr hab. inż. Jan Magott

Algorytmy i Struktury Danych.

V. WYMAGANIA EGZAMINACYJNE

Zadanie 3 Oblicz jeżeli wiadomo, że liczby 8 2,, 1, , tworzą ciąg arytmetyczny. Wyznacz różnicę ciągu. Rozwiązanie:

1. FUNKCJE DZIAŁ Z PODRĘCZNIKA L.P. NaCoBeZu kryteria sukcesu w języku ucznia

Rozkład materiału a wymagania podstawy programowej dla I klasy czteroletniego liceum i pięcioletniego technikum. Zakres rozszerzony

Opis efektów kształcenia dla programu kształcenia (kierunkowe efekty kształcenia) WIEDZA. rozumie cywilizacyjne znaczenie matematyki i jej zastosowań

MATEMATYKA WYKAZ UMIEJĘTNOŚCI WYMAGANYCH NA POSZCZEGÓLNE OCENY DLA KLASY DRUGIEJ

W planie dydaktycznym założono 172 godziny w ciągu roku. Treści podstawy programowej. Propozycje środków dydaktycznych. Temat (rozumiany jako lekcja)

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

Złożoność obliczeniowa zadania, zestaw 2

ROZKŁAD MATERIAŁU DLA KLASY I LICEUM I TECHNIKUM (ZAKRES PODSTAWOWY I ROZSZERZONY) A WYMAGANIA PODSTAWY PROGRAMOWEJ

Ogólne zasady projektowania algorytmów i programowania

Metody numeryczne w przykładach

Teraz bajty. Informatyka dla szkół ponadpodstawowych. Zakres rozszerzony. Część 1.

Kształcenie w zakresie podstawowym. Klasa 2

WYRAŻENIA ALGEBRAICZNE

2) R stosuje w obliczeniach wzór na logarytm potęgi oraz wzór na zamianę podstawy logarytmu.

Złożoność informacyjna Kołmogorowa. Paweł Parys

O ISTOTNYCH OGRANICZENIACH METODY

Sortowanie - wybrane algorytmy

ANALIZA ALGORYTMÓW. Analiza algorytmów polega między innymi na odpowiedzi na pytania:

Sortowanie Shella Shell Sort

Wykład na Politechnice Krakowskiej w dniu 18 stycznia 2012 r. ZADAŃ I ALGORYTMÓW W OPTYMALIZACJI DYSKRETNEJ

O LICZBACH NIEOBLICZALNYCH I ICH ZWIĄZKACH Z INFORMATYKĄ

OSTASZEWSKI Paweł (55566) PAWLICKI Piotr (55567) Algorytmy i Struktury Danych PIŁA

Przykładowe sprawozdanie. Jan Pustelnik

Plan wynikowy. Klasa III Technik pojazdów samochodowych/ Technik urządzeń i systemów energetyki odnawialnej. Kształcenie ogólne w zakresie podstawowym

PRÓBNA NOWA MATURA z WSiP. Matematyka dla klasy 2 Poziom podstawowy. Zasady oceniania zadań

Porównanie Heap Sort, Counting Sort, Shell Sort, Bubble Sort. Porównanie sortowao: HS, CS, Shs, BS

Rozkład materiału nauczania

Zadanie projektowe 1: Struktury danych i złożoność obliczeniowa

Algorytmy i struktury danych Matematyka III sem.

Metody numeryczne I. Janusz Szwabiński. Metody numeryczne I (C) 2004 Janusz Szwabiński p.1/61

Grzegorz Mazur. Zak lad Metod Obliczeniowych Chemii UJ. 14 marca 2007

1. Granice funkcji - wstępne definicje i obliczanie prostych granic

Algorytmy i Struktury Danych, 2. ćwiczenia

Klasa 1 technikum. Poniżej przedstawiony został podział wymagań na poszczególne oceny szkolne:

Wykład z równań różnicowych

Transkrypt:

Artykuł pobrano ze strony eioba.pl Liczby pierwsze - wstęp W latach 60 ubiegłego wieku w Afryce znaleziono kości z wyrytymi na nich karbami liczące ponad 5000 lat. Na jednej z nich (kość z Ishango) karby układają się w liczby 11, 13, 17, 19. Są to liczby pierwsze. Wymieniona kość stanowi drugie najstarsze na Ziemi znalezisko matematyczne i można ją sobie obejrzeć w muzeum brukselskim na ulicy Rue Vautier 9 - B - 1000, około 100 metrów od Parlamentu Europejskiego. Jeśli nie wybierasz się do Brukseli, to możesz przeglądnąć z tego miejsca strony internetowe muzeum. Skoro liczby pierwsze pojawiły się już tak wcześnie w naszej historii, to oczywistym jest fakt ich olbrzymiego znaczenia, które nic a nic nie zmniejszyło się do dnia dzisiejszego (można powiedzieć, że obecnie stało się jeszcze większe). Z tego powodu każdy adept sztuk informatycznych powinien doskonale znać zagadnienia związane z liczbami pierwszymi, ponieważ będzie je spotykał ciągle na swojej drodze. W naszym opracowaniu przedstawiamy podstawowe algorytmy generacji liczb pierwszych oraz różne zastosowania tych liczb. Wyjaśnimy również wiele pojęć informatycznych i matematycznych związanych z tym tematem. Prezentowane rozwiązania nie są (i nawet nie mają na celu być) optymalne. Naszym głównym celem jest maksymalna prostota i zrozumiałość. Jeśli w tej prostocie posunęliśmy się za daleko (poniżej twojego poziomu), przepraszamy. Zapraszamy Ponieważ dostaję dużo listów od nieuważnych czytelników, wyjaśniam, iż prezentowane programy są jedynie przykładami realizacji opisywanych algorytmów w wybranych językach programowania. W żadnym razie nie są one celem artykułu. Celem są ALGORYTMY. Znając algorytm można napisać dobry program w dowolnym języku

programowania. Dla uzasadnienia mojej postawy przytoczę znany cytat profesora Donalda Knutha (jednego z największych współczesnych autorytetów w dziedzinie informatyki): "Languages come and go, but algorithms stand the test of time" Donald Knuth "Języki programowania pojawiają się i odchodzą, lecz algorytmy wytrzymują próbę czasu" Donald Knuth TRUDNE! Przy analizie algorytmów jednym z kluczowych pojęć jest złożoność obliczeniowa (computational complexity). Charakteryzuje ona ilość zasobów komputera użytych do rozwiązywanego przez algorytm problemu. Wyróżniamy dwa rodzaje złożoności obliczeniowej - czasową oraz pamięciową. Pamięciowa złożoność obliczeniowa informuje nas o ilości pamięci komputera wymaganej przez dany algorytm dla n przetwarzanych danych. Jednostką jest komórka pamięci przechowująca jedną przetwarzaną daną. W obecnych czasach systemy komputerowe są wyposażane w coraz więcej taniej pamięci, zatem parametr ten stracił nieco na swoim znaczeniu - kiedyś walczono o każdy bajt, a dzisiaj nikt nie przejmuje się dziesiątkami megabajtów. Cóż, postęp... Czasowa złożoność obliczeniowa informuje nas o czasie wykonania zadania przez algorytm dla n danych wejściowych. Ponieważ wielkość ta musi być niezależna od typu maszyny, na której uruchamiamy program, za jednostkę czasowej złożoności obliczeniowej przyjęto wykonanie tzw. operacji dominującej, czyli takiej, wokół której koncentruje się przetwarzanie danych w algorytmie. Ilość wykonań operacji dominujących jest proporcjonalna do czasu wykonania algorytmu. Rozróżniamy dwa rodzaje czasowej i pamięciowej złożoności obliczeniowej: Pesymistyczna złożoność obliczeniowa W(n) dotyczy najgorszego przypadku zestawu danych, zatem określa ona największą ilość operacji dominujących (lub komórek pamięci), która może być wymagana dla najgorszego przypadku n danych wejściowych. Oczekiwana złożoność obliczeniowa A(n) dotyczy typowego zestawu danych i określa statystycznie średnią ilość operacji dominujących (komórek pamięci), które należy wykonać dla typowego zestawu danych, aby rozwiązać problem. Dla przykładu rozważmy wyszukiwanie elementu w n elementowym, nieuporządkowanym zbiorze danych. Za operację dominującą przyjmujemy sprawdzenie, czy i-ty element zbioru jest elementem poszukiwanym, i = 1,,3,...,n. W przypadku najgorszym poszukiwany element jest ostatnim, zatem znaleziony będzie po sprawdzeniu wszystkich elementów tego zbioru. Również stwierdzenie, iż elementu w zbiorze nie ma, wymaga przeglądnięcia wszystkich elementów. Stąd:

W(n) = n Jeśli prawdopodobieństwo wystąpienia poszukiwanego elementu na każdej pozycji w zbiorze jest takie samo, to dla każdego elementu wynosi ono: p i = 1 dla i = 1,,...,n n Oczekiwana złożoność obliczeniowa jest równa wartości oczekiwanej zmiennej losowej rozkładu prawdopodobieństwa p i, zatem otrzymujemy wzór: DLA GENIUSZA W teorii złożoności obliczeniowej bardzo duże znaczenie ma notacja Omikron służąca do określania rzędu funkcji złożoności obliczeniowej. Zapis: f(n) = O(g(n)) czytamy: funkcja f jest co najwyżej rzędu g, jeśli istnieje taka stała rzeczywista c i liczba naturalna n o, iż dla każdego n większego lub równego n o funkcja f(n) jest niewiększa od iloczynu c g(n). Notacja O(g(n)) pozwala nam oszacować zachowanie się złożoności obliczeniowej wraz ze wzrostem n do nieskończoności. Załóżmy, iż wyznaczyliśmy oczekiwaną złożoność obliczeniową pewnego algorytmu i otrzymaliśmy następujący wzór: A(n) = n + 3n Gdy n będzie dążyło do nieskończoności czynnik 3n stanie się coraz mniej znaczący w stosunku do czynnika n. Stąd wnioskujemy, iż jest to algorytm o złożoności O(n ). Aby to udowodnić, musimy znaleźć stałą c oraz n o, dla których zachodzi: n + 3n cn dla n n o

Wystarczy przyjąć c = 4 i n o = 1: n + 3n 4n dla n 1 co dowodzi, iż podany algorytm ma rzeczywiście rząd złożoności obliczeniowej równy O(n ). Większość algorytmów posiada klasę złożoności zgodną z jedną z podanych niżej klas: Złożoność obliczeniowa stała - O(1) Algorytm wykonuje stałą ilość operacji dominujących bez względu na rozmiar danych wejściowych. W takim algorytmie czas wykonania jest stały i nie zmienia się przy zmianie liczby przetwarzanych elementów. Złożoność obliczeniowa liniowa - O(n) Dla każdej danej algorytm wykonuje stałą ilość operacji dominujących. Czas wykonania jest proporcjonalny do liczby n danych wejściowych. Czas wykonania rośnie liniowo ze wzrostem liczby elementów. Złożoność obliczeniowa kwadratowa - O(n ) Algorytm dla każdej danej wykonuje ilość operacji dominujących proporcjonalną do liczby wszystkich przetwarzanych danych. Czas wykonania jest proporcjonalny do kwadratu liczby danych n. Inne złożoności tego typu O(n 3 ), O(n 4 )... noszą nazwę wielomianowych złożoności obliczeniowych. Złożoność obliczeniowa logarytmiczna - O(log n) W algorytmie zadanie rozmiaru n da się sprowadzić do zadania rozmiaru n /. Typowym przykładem jest wyszukiwanie binarne w zbiorze uporządkowanym. Sprawdzenie środkowego elementu pozwala określić, w której z dwóch połówek zbioru może znajdować się poszukiwany element. Ponieważ uczniowie młodszych klas liceum nie znają pojęcia logarytmu, podajemy jego skróconą definicję: Zapis log a x czytamy: logarytm przy podstawie a z liczby x. Wartością jest wykładnik potęgowy y, do którego należy podnieść podstawę logarytmu a, aby otrzymać liczbę logarytmowaną x. log a x = y wtedy i tylko wtedy, gdy a y = x W określeniu klasy złożoności obliczeniowej nie podajemy podstawy logarytmu, ponieważ logarytmy o różnych podstawach z tej samej wartości różnią się od siebie jedynie iloczynem przez stałą:

Niech log a x = y oraz log b x = cy Wtedy a y = x, oraz b cy = x Stąd a y = b cy (a) y = (b c ) y Zatem a = b c oraz log b x = c log a x Ponieważ podstawy a i b są stałe, to i c musi być stałe. Z kolei z definicji notacji Omikron wynika, iż klasa złożoności dwóch funkcji różniących się jedynie iloczynem przez stałą jest taka sama. W informatyce bardzo często stosuje się logarytmy przy podstawie. log 4 =, bo = 4 log 16 = 4, bo 4 = 16 log 56 = 8, bo 8 = 56, itd. Złożoność obliczeniowa liniowo logarytmiczna - O(n log n) Zadanie rozmiaru n daje się sprowadzić do dwóch podzadań rozmiaru n / plus pewna ilość operacji, których liczba jest proporcjonalna do ilości danych n. Tego typu złożoność obliczeniową posiadają dobre algorytmy sortujące. Złożoność obliczeniowa wykładnicza - O( n ), O(n!) Złożoność obliczeniową O( n ) posiada algorytm, w którym wykonywana jest stała liczba operacji dla każdego podzbioru n danych wejściowych. Złożoność obliczeniową O(n!) posiada algorytm, w którym wykonywana jest stała liczba operacji dla każdej permutacji n danych wejściowych. Złożoność obliczeniowa wykładnicza jest bardzo niekorzystna, ponieważ czas wykonania rośnie szybko wraz ze wzrostem liczby danych wejściowych. Dla porównania załóżmy, iż posiadamy dwa komputery. Pierwszy potrafi wykonać milion operacji dominujących w ciągu sekundy. Drugi jest superkomputerem i potrafi tych operacji wykonać milion razy więcej (bardzo optymistyczne założenie), czyli 1000 miliardów w ciągu sekundy. W poniższej tabeli zebraliśmy dane o czasie wykonania algorytmu klasy O( n ) na tych dwóch komputerach. Czasy wykonania algorytmu klasy O( n )

Rozmiar danych n 0 50 100 00 Czas wykonania dla komputera 1 Czas wykonania dla superkomputera 1,05 sekund 10-6 35,7 lat 116 sekund sekund 4016943 40,17 5 x 10 37 5 x 10 31 Z tabelki jasno wynika, iż zastosowanie superszybkiego komputera niewiele pomaga algorytmowi. Czas wyznaczenia rozwiązania może stać się niewyobrażalnie duży (już dla n = 100 w obu przypadkach raczej nie doczekamy się wyników). Dlatego algorytm o wykładniczej złożoności obliczeniowej uważa się za wewnętrznie nierealizowalny i należy go unikać. Klasa złożoności obliczeniowej Porównanie klas złożoności obliczeniowych Nazwa klasy złożoności obliczeniowej Cechy algorytmu O(1) stała działa prawie natychmiast O(log n) logarytmiczna niesamowicie szybki O(n) liniowa szybki O(n log n) liniowo-logarytmiczna dosyć szybki O(n ) kwadratowa wolny dla dużych n O(n 3 ) sześcienna wolny dla większych n O( n ), O(n!) wykładnicza nierealizowalny dla większych n Nieformalnie mówiąc klasa złożoność obliczeniowej informuje nas, iż czas t w funkcji liczby elementów n jest proporcjonalny do funkcji określonej przez klasę złożoności, a stała c jest współczynnikiem tej proporcjonalności. Spostrzeżenie to pozwala w przybliżeniu oszacować czas wykonania algorytmu dla n elementów, jeśli jest znana jego klasa złożoności obliczeniowej oraz czas wykonania dla innej liczby elementów. Załóżmy, iż dla n 1 = 100 elementów algorytm o klasie złożoności obliczeniowej O(n ) wykonywał się przez czas t 1 = 5 sekund. Ile przypuszczalnie czasu t zajmie przetworzenie w tym algorytmie n = 400 elementów? Rozwiązanie Skoro klasa złożoności obliczeniowej algorytmu jest rzędu O(n ), to czas wykonania jest proporcjonalny do kwadratu liczby przetwarzanych elementów. Zatem możemy zapisać: t cn t 1 cn 1 t t 1 cn cn 1 Stąd Z otrzymanej nierówności wyznaczamy czas t :

Do otrzymanego wzoru podstawiamy wartości liczbowe i otrzymujemy wynik: Dokument ten rozpowszechniany jest zgodnie z zasadami licencji GNU Free Documentation License. Autor: mgr Jerzy Wałaszek Przedruk ze strony: http://www.i-lo.tarnow.pl/edu/inf/alg/primes/index.html Artykuł pobrano ze strony eioba.pl