< Return to Video

Efektywność algorytmów (Przygoda z liczbami pierwszymi, część 3)

  • 0:01 - 0:06
    Wyobraźmy sobie sytuację w której nowy łazik jest wysyłany na Marsa,
  • 0:06 - 0:09
    i my jesteśmy odpowiedzialni za jedną rzecz -
  • 0:09 - 0:13
    zaprogramowanie algorytmu wewnętrz łazika,
  • 0:13 - 0:15
    który sprawdza czy dana liczba jest liczbą pierwszą.
  • 0:15 - 0:18
    Jest to konieczne o tyle, że łazik komunikuje się używając kryptosystemu RSA.
  • 0:18 - 0:23
    Potrzebuje więc w środku algorytmu, który potrafi robić test pierwszości.
  • 0:23 - 0:26
    Gdy projektuje się łazik,
  • 0:26 - 0:28
    lub cokolwiek innego lecącego w przestrzeń kosmiczną, trzeba
  • 0:28 - 0:31
    być bardzo efektywnym w każdym calu.
  • 0:31 - 0:34
    A więc komponenty muszą być bardzo lekkie,
  • 0:34 - 0:39
    ilość energii, którą używa każdy podsystem musi być minimalna.
  • 0:39 - 0:43
    Należy oszczędzać na energii i masie,
  • 0:43 - 0:45
    w każdym momencie projektowania.
  • 0:45 - 0:48
    Mamy więc jasne zadanie w trakcie tego projektowania,
  • 0:48 - 0:51
    ponieważ nasz algorytm musi radzić sobie z liczbami,
  • 0:51 - 0:54
    aż do tej wielkości...
  • 0:54 - 0:57
    i musi to robić bardzo szybko.
  • 0:57 - 1:02
    Więc powiedzmy, że na wejściu naszego algorytmu podajemy małą liczbę, jak na przykład 90,
  • 1:02 - 1:05
    powinien on być w stanie ją przerobić prawie tak szybko,
  • 1:05 - 1:08
    jak tą całą liczbę.
  • 1:08 - 1:10
    A więc gdy rozmiar wejścia rośnie, nie chcemy,
  • 1:10 - 1:12
    aby nasz algorytm znacznie zwalniał.
  • 1:13 - 1:16
    Chciałbym teraz przeanalizować pytania użytkowników,
  • 1:16 - 1:19
    lub dobre idee, które użytkownicy mieli,
  • 1:19 - 1:20
    z matematycznego punktu widzenia.
  • 1:20 - 1:25
    Sprawdzamy czy n jest liczbą pierwszą czy złożoną,
  • 1:25 - 1:27
    A więc dla danego n myślmy,
  • 1:27 - 1:30
    o przestrzeni wszystkich możliwych n,
  • 1:30 - 1:32
    i jeśli n=100 to ta przestrzeń,
  • 1:32 - 1:34
    jest od 2 do 100.
  • 1:34 - 1:36
    I to co nasz algorytm robi,
  • 1:36 - 1:38
    to przeszukuje tę przestrzeń.
  • 1:38 - 1:41
    Ok, więc nasz algorytm przeszukuje tę przestrzeń,
  • 1:41 - 1:45
    i na każdym kroku pyta się - myślmy o tym
  • 1:45 - 1:48
    kroku jako o podstawowym kroku - zadaje pytanie.
  • 1:48 - 1:52
    Jest to właściwie pytanie testu złożoności,
  • 1:52 - 1:57
    powiedzmy, że rozważamy aktualnie liczbę a, i w zwykłym teście
  • 1:57 - 2:00
    przez próby dzielenia pytamy - czy a dzieli n?
  • 2:00 - 2:02
    Po prostu sprawdzamy to,
  • 2:02 - 2:05
    wykonując dzielenie n przez a,
  • 2:05 - 2:09
    i jeśli reszta z dzielenia jest równa 0, co oznacza że a jest dzielnikiem n,
  • 2:09 - 2:11
    możemy wtedy powiedzieć,
  • 2:11 - 2:16
    "Ah! Jesteśmy pewni na 100%, że jest to liczba złożona".
  • 2:17 - 2:21
    W przeciwnym wypadku, na każdym kroku nie jesteśmy do końca pewni,
  • 2:21 - 2:23
    może to być liczba pierwsza, ale nie musi.
  • 2:23 - 2:27
    A więc kontynuujemy sprawdzanie, aż do końca.
  • 2:27 - 2:31
    I jak pamiętamy największą wartością a, do której należy kontynuować sprawdzanie, jest pierwiastek kwadratowy z n,
  • 2:31 - 2:35
    Pesymistyczny przypadek wypada kiedy n jest liczbą pierwszą,
  • 2:35 - 2:38
    wtedy sprawdzamy wszystkie wartości a, aż do pierwiastka z n.
  • 2:38 - 2:39
    i gdy to skończymy, możemy powiedzieć,
  • 2:39 - 2:42
    "Ah! Ta liczba jest na 100% liczbą pierwszą."
  • 2:42 - 2:45
    A więc nawet w przypadku gdy n jest iloczynem dwóch liczb pierwszych,
  • 2:45 - 2:46
    powiedzmy 7,
  • 2:46 - 2:47
    na przykład 7 x 7,
  • 2:47 - 2:48
    co jest równe 49
  • 2:48 - 2:51
    Jeśli na wejściu tego algorytmu dostarczymy 49,
  • 2:51 - 2:54
    to również będzie pesymistyczny przypadek, przeszukamy wszystko,
  • 2:54 - 2:56
    aż do pierwiastka z n.
  • 2:56 - 2:59
    W pierwszym zestawie pytań,
  • 2:59 - 3:02
    użytkownik TheFourthDimension pyta,
  • 3:03 - 3:06
    "Gdy wykluczymy 2 jako niepodzielne, to
  • 3:06 - 3:09
    możemy wykluczyć wszystkie wielokrotności 2 jako podzielne,
  • 3:09 - 3:10
    to samo dla 3,
  • 3:10 - 3:10
    to samo dla 3, 4,
  • 3:10 - 3:11
    to samo dla 3, 4, 5, i tak dalej"
  • 3:12 - 3:15
    Jest to bardzo słuszna uwaga.
  • 3:15 - 3:18
    Nasz stary algorytm sprawdzał kolejne liczby co jeden,
  • 3:18 - 3:24
    a możemy przecież użyć właściwości liczb złożonych, które znamy,
  • 3:24 - 3:30
    jak na przykład to, że gdy liczba jest podzielna przez 2,
  • 3:30 - 3:31
    to wtedy jest złożona,
  • 3:31 - 3:33
    jeśli jest większa niż 2, bo 2 jest liczbą pierwszą.
  • 3:33 - 3:34
    Możemy więc od razu powiedzieć,
  • 3:34 - 3:36
    że 4 jest złożona...
  • 3:37 - 3:40
    Zgubiłem w tym miejscu 5, za co przepraszam.
  • 3:40 - 3:41
    4
  • 3:41 - 3:41
    4, 6
  • 3:41 - 3:44
    4, 6, 8
  • 3:44 - 3:45
    4, 6, 8, 10...
  • 3:45 - 3:48
    Więc zamiast tego możemy robić kolejne kroki w ten sposób:
  • 3:48 - 3:48
    3
  • 3:48 - 3:49
    3, 5
  • 3:49 - 3:50
    3, 5, 7
  • 3:50 - 3:52
    3, 5, 7, 11
  • 3:52 - 3:54
    Jedna kategoria pytań użytkowników,
  • 3:54 - 3:57
    stara się zredukować tę przestrzeń.
  • 3:57 - 4:00
    A więc gdy wykluczymy wszystkie liczby parzyste,
  • 4:00 - 4:03
    zredukujemy sprawdzaną przestrzeń z pierwiastka z n,
  • 4:03 - 4:06
    do pierwiastka z n podzielonego przez 2.
  • 4:06 - 4:09
    I możemy znaleźć więcej właściwości liczb złożonych,
  • 4:09 - 4:12
    aby zmniejszyć tę przestrzeń jeszcze bardziej.
  • 4:12 - 4:16
    Inny typ pytań rozważa przypadek,
  • 4:16 - 4:18
    gdzie staramy się znaleźć świadka złożoności,
  • 4:18 - 4:23
    czyli staramy się znaleźć takie a, które pozwoli nam stwierdzić, że n jest liczbą złożoną.
  • 4:23 - 4:24
    Użytkownik lola napisał/a,
  • 4:24 - 4:26
    "Czy opuszczanie pętli, gdy tylko znajdziemy świadka,
  • 4:26 - 4:29
    nie zaoszczędzi trochę czasu?".
  • 4:29 - 4:32
    Tak, to zdecydowanie prawda.
  • 4:32 - 4:34
    To jest coś co z pewnością chcemy zrobić.
  • 4:34 - 4:38
    Kiedy tylko na pewnym kroku,
  • 4:38 - 4:40
    zdefiniowanym przez schemat którego używamy,
  • 4:40 - 4:43
    znajdziemy świadka złożoności,
  • 4:43 - 4:47
    to możemy stwierdzić na 100%, że liczba jest złożona,
  • 4:47 - 4:49
    i od razu zatrzymać algorytm.
  • 4:49 - 4:50
    Stwierdzamy: "liczba złożona",
  • 4:50 - 4:53
    i nie kontynuujemy przeszukiwania.
  • 4:53 - 4:56
    To zatrzymywanie jest bardzo dobre,
  • 4:56 - 4:59
    jednak nie pomaga nam w pesymistycznym przypadku,
  • 4:59 - 5:02
    który występuje gdy n jest liczbą pierwszą.
  • 5:04 - 5:07
    Nie przyspieszy to w żaden sposób czasu trwania algorytmu.
  • 5:07 - 5:10
    Teraz możemy zwizualizować, jak te usprawnienia,
  • 5:10 - 5:14
    pozwalają nam zredukować przestrzeń oraz
  • 5:14 - 5:19
    zmniejszyć ilość obliczeń w środku komputera
  • 5:19 - 5:21
    (które zależą od komputera jaki posiadamy)
  • 5:21 - 5:23
    pozwalają zmniejszyć czas trwania algorytmu.
  • 5:23 - 5:27
    Teraz przedstawię wizualizację, którą przygotowałem poniżej,
  • 5:27 - 5:29
    która pozwoli nam porównać dwa algorytmy na podstawie,
  • 5:29 - 5:33
    liczby kroków, które wykonują podczas ich trwania.
  • 5:33 - 5:36
    Po lewej stronie mamy algorytm A, który jest testem przez próby dzielenia,
  • 5:36 - 5:39
    sprawdza więc wszystkie liczby od 2 do pierwiastka z n,
  • 5:39 - 5:42
    a po prawej stronie mamy algorytm B,
  • 5:42 - 5:44
    który jest lepszą wersją A,
  • 5:44 - 5:50
    w tym przypadku najpierw sprawdzamy podzielność przez 2,
  • 5:50 - 5:53
    więc wykonujemy tylko połowę liczby kroków w A,
  • 5:53 - 5:57
    oraz kończymy od razu po znalezieniu świadka pierwszości.
  • 5:57 - 6:00
    Nie jest on więc idealny, po prostu zaaplikowałem kilka zaproponowanych usprawnień,
  • 6:00 - 6:03
    więc będziemy mogli zobaczyć co się stanie,
  • 6:03 - 6:05
    i pobawić się testowaniem.
  • 6:07 - 6:10
    Możemy zobaczyć, że gdy przewijam, widzimy
  • 6:10 - 6:13
    wynik, czy liczba jest pierwsza czy złożona,
  • 6:13 - 6:16
    a na dole liczbę kroków, którą dany algorytm wykonał podczas sprawdzania.
  • 6:16 - 6:20
    Pierwszą rzeczą rzucającą się w oczy jest to, że po prawej stronie,
  • 6:20 - 6:22
    dla wielu liczb liczba kroków to 2.
  • 6:22 - 6:26
    Wiemy czemu się tak dzieje, jest to przypadek gdy n jest parzyste,
  • 6:26 - 6:28
    na przykład wynosi tyle...
  • 6:28 - 6:31
    nasz stary algorytm wykonał aż 314 kroków,
  • 6:31 - 6:34
    podczas gdy nowy tylko 1,
  • 6:34 - 6:36
    ponieważ najpierw sprawdził czy liczba jest podzielna przez 2.
  • 6:36 - 6:39
    Wygląda to więc na całkiem niezłą optymalizację.
  • 6:39 - 6:42
    Jednakże, gdy odpowiednio zbudujemy nasze wejście,
  • 6:42 - 6:47
    można zobaczyć, że liczba kroków znacznie rośnie oraz pasek
  • 6:47 - 6:52
    robi się czerwny, gdy zbliżamy się do tego regionu,
  • 6:52 - 6:54
    gdzie kroków robi się zdecydowanie za dużo.
  • 6:54 - 6:55
    Ta czerwona linia to "Limit kroków".
  • 6:55 - 6:58
    Gdy pasek jej dotknie, algorytm kończy się porażką,
  • 6:58 - 7:00
    co jest równoważne z tym, że nasz łazik się zepsuje.
  • 7:00 - 7:03
    A w tym przypadku i przeglądarka się zawiesi,
  • 7:03 - 7:04
    więc spróbuję zbliżyć się do tej linii jak najbardziej.
  • 7:04 - 7:07
    W tej chwili jestem bardzo blisko i czućjak wszystko działa bardzo wolno,
  • 7:07 - 7:10
    widać że przeglądarka jest o krok od,
  • 7:10 - 7:12
    zawieszenia się.
  • 7:13 - 7:17
    Zauważmy jednak, że nasz poprawiony algorytm wykonał teraz tylko 2 kroki,
  • 7:17 - 7:19
    jednak pamiętajmy o pesymistycznym przypadku.
  • 7:20 - 7:24
    W tym celu mam tutaj zapisanych kilka dużych liczb pierwszych.
  • 7:24 - 7:26
    Dobry algorytm powinien sobie poradzić z każdą liczbą,
  • 7:26 - 7:27
    nie wiemy czy dajemy mu liczbę pierwszą czy złożoną.
  • 7:27 - 7:31
    Zobaczmy więc co się stanie gdy damy na wejściu dużą liczbę pierwszą.
  • 7:32 - 7:34
    Algorytm B jak wiemy wykonuje tylko połowę kroków,
  • 7:34 - 7:37
    w pesymistycznym przypadku,
  • 7:37 - 7:40
    jednak to wciąż dużo.
  • 7:40 - 7:42
    Ponieważ jest to pesymistyczny przypadek, prawda?
  • 7:42 - 7:45
    Więc zbliżamy się do limitu kroków,
  • 7:45 - 7:47
    a liczba którą dałem nie jest wcale dużą liczbą pierwszą.
  • 7:47 - 7:49
    Wciąż znajdujemy się poniżej 15 cyfr.
  • 7:49 - 7:56
    A gdy podam tę 12-cyfrową liczbę pierwszą do naszego algorytmu,
  • 7:58 - 7:59
    zobaczmy co się stanie,
  • 8:00 - 8:04
    program się opóźnia, możliwe że się zawiesi.
  • 8:04 - 8:05
    Zobaczmy co się stało,
  • 8:05 - 8:07
    oba algorytmy znacznie przekroczyły limit kroków,
  • 8:07 - 8:09
    a więc zawiodły.
  • 8:09 - 8:13
    Nasze usprawnienia algorytmu nie były wystarczająco dobre niestety.
  • 8:13 - 8:15
    Jednak teraz lepiej rozumiemy co tak naprawdę,
  • 8:15 - 8:16
    staramy się poprawić,
  • 8:16 - 8:19
    i czym jest "liczba kroków w pesymistycznym przypadku".
  • 8:19 - 8:23
    Mamy dobre narzędzie, które pozwala nam
  • 8:23 - 8:25
    zwizualizować jak szybko to rośnie,
  • 8:25 - 8:29
    jak szybko liczba kroków rośnie, gdy rośnie nam rozmiar wejścia.
  • 8:29 - 8:32
    Poniżej opiszę jak to przygotowałem,
  • 8:32 - 8:35
    aby można było przygotować swój własny algorytm,
  • 8:35 - 8:37
    porównać go z podstawowym,
  • 8:37 - 8:39
    i zobaczyć jak bardzo jest lepszy.
Title:
Efektywność algorytmów (Przygoda z liczbami pierwszymi, część 3)
Description:

Jak możemy poprawić szybkość działania deterministycznego testu pierwszości?

more » « less
Video Language:
English
Duration:
08:42

Polish subtitles

Revisions