Articles

Jak się tu znaleźliśmy? Opowieść o algorytmach.

Do niedawna algorytmy były domeną informatyków. Teraz jednak wkroczyły do naszego życia i stają się wszechobecne. Algorytm nie jest już słowem obcym. Handel algorytmiczny, algorytmiczne uprzedzenia, algorytm Facebooka, a nawet algorytmiczne działania wojenne – wszystkie te terminy stały się w ostatnich latach częścią naszego słownictwa. Niektórzy posuwają się do twierdzenia, że żyjemy w nowej erze: erze algorytmów. Ale algorytmy nie są wcale takie nowe. Używamy ich, świadomie lub nie, od setek i tysięcy lat. Algorytmy to po prostu konkretne opisy działań krok po kroku, które muszą się wydarzyć, aby osiągnąć określony rezultat. Są jednym z najbardziej powszechnych instrumentów dzielenia się wiedzą.

Praktycznie każdy proces uczenia kogoś, jak coś zrobić, wykorzystuje algorytmy.

Niektóre aspekty algorytmów zmieniły się jednak w ciągu ostatnich kilku dekad. W szczególności, wprowadzenie komputerów oznacza, że wiele algorytmów dzisiaj są dramatycznie bardziej złożone niż mogliśmy sobie wyobrazić w przeszłości. W jaki sposób algorytmy ewoluowały, by być dziś o wiele bardziej wyrafinowane niż w przeszłości? Przyjrzyjmy się pokrótce ich historii.

Algorytmy kierujące ludzkimi działaniami

Stempel wydany 6 września 1983 roku w Związku Radzieckim, upamiętniający (przybliżoną) 1200. rocznicę urodzin al-Khwārizmī; via Wikimedia Commons

Termin algorytm wywodzi się od nazwiska Muhammada ibn Mūsā al’Khwārizmī, dziewięciowiecznego matematyka perskiego. Jego zlatynizowana nazwa, Algoritmi, oznaczała „dziesiętny system liczbowy” i w tym znaczeniu była używana przez wieki. Nowoczesne pojęcie algorytmu pojawiło się w języku angielskim w XIX wieku, a stało się bardziej powszechnie używane od lat 50. XX wieku, co było spowodowane pojawieniem się pierwszych komercyjnie dostępnych komputerów.

Na długo przed tym, jak algorytmy otrzymały swoją nowoczesną nazwę, były jednak powszechnie tworzone i używane.

Pierwsze algorytmy zostały utrwalone na papierze w starożytnej Grecji. Uczeni tacy jak Nikomasz z Gerasy czy Euklides tworzyli wtedy elementy składowe nowoczesnej matematyki. Aby ułatwić zrozumienie i zastosowanie swoich pomysłów, wiele z nich wyrazili jako działania krok po kroku.

Nikomasz z Gerasy wprowadził sito Eratostenesa. Sito jest używane do dziś przez studentów uczących się pisać wydajny kod komputerowy. Pomogło ono uprościć proces identyfikacji liczb pierwszych. Liczby pierwsze to liczby naturalne, większe od jeden, które nie mogą być utworzone przez pomnożenie dwóch mniejszych liczb naturalnych. Na przykład, cztery nie jest liczbą pierwszą, ponieważ może być utworzona przez pomnożenie dwóch przez dwa. Pięć, w przeciwieństwie do tego, jest liczbą pierwszą, ponieważ żadne liczby naturalne, mniejsze niż pięć, nie mogą być pomnożone, aby utworzyć pięć. Podczas gdy zidentyfikowanie kilku pierwszych liczb pierwszych nie jest zbyt trudne (na przykład 2, 3, 5, 7, 11, 13, 17, 19, 23 i 29), znalezienie dużych liczb pierwszych zajmuje dużo czasu. A duże liczby pierwsze są niezbędne w kryptografii. Sito Eratostenesa podaje krok po kroku instrukcje szybkiego usuwania wszystkich liczb niepierwszych z określonego zbioru liczb (na przykład od 1 do 10 000), aż pozostaną tylko liczby pierwsze. Obecnie dostępnych jest wiele algorytmów, które upraszczają zadanie identyfikacji takich liczb. Sito Eratostenesa zapoczątkowało całą rodzinę algorytmów, które mają ten sam cel i stają się coraz lepsze (szybsze, lub wymagające mniejszej liczby kroków) w wykrywaniu liczb pierwszych.

Sieve of Eratosthenes by SKopp at German Wikipedia

Euklides, inny uczony wspomniany powyżej, znacznie bardziej znany niż Nikomachus w dzisiejszych czasach, wprowadził algorytm identyfikacji największego wspólnego dzielnika dwóch liczb. Znów, nie zawsze łatwe zadanie, ale niezbędne w wielu sytuacjach. Algorytm Euklidesa ułatwił te obliczenia. Dlaczego algorytm Euklidesa jest pomocny? Wyobraź sobie, że masz pokój o dokładnych wymiarach 612 na 2006 centymetrów, który potrzebuje nowej podłogi. Algorytm Euklidesa pomoże Ci znaleźć rozmiar największych kwadratowych płytek, które idealnie pokryłyby podłogę. Odpowiedź podana przez algorytm to 34 cm na 34 cm, co daje układ 18 na 59 płytek. Oczywiście każdy glazurnik powie Ci, że odpowiedź jest błędna i że nie masz pojęcia, co robisz, ponieważ algorytm nie uwzględnia szerokości fugi i nie pozostawia na nią miejsca. Nie bój się: to też można obliczyć i zgrabnie wyrazić w postaci algorytmu.

Algorytmy kierujące działaniami maszyn

Przez kilkaset następnych lat powstało jeszcze wiele algorytmów, które zostały uwiecznione na papierze. Były one następnie wykorzystywane przez poszczególne osoby i wykonywane krok po kroku. Pierwszy algorytm przeznaczony do wykonania na maszynie został stworzony przez Adę Lovelace (z domu Byron) i opublikowany w 1843 roku.

Ada Byron, lat cztery. Wkrótce zostanie pierwszą na świecie programistką komputerową. Przez artystę: Alfred, Comte d’Orsay. Digital image; Somerville College, Oxford – Somerville College, Oxford, Public Domain, https://commons.wikimedia.org/w/index.php?curid=44246375

Ada była intrygującą postacią. Urodziła się w 1815 roku jako jedyne prawowite dziecko poety Lorda Byrona. Rozwijała wielkie talenty matematyczne. A ponieważ miłość do poezji miała wyraźnie w genach, udało jej się w jakiś sposób rozwinąć i zrównoważyć zarówno miłość do nauki, jak i do poezji. Ada sama określiła swój sposób myślenia jako „poetycką naukę”. Jako uzdolniona matematyczka, dzięki swoim wynalazkom poznała Charlesa Babbage’a, który często nazywany jest „ojcem komputerów”. Oboje nawiązali współpracę i przyjaźń. Ada była bardzo zainteresowana jednym z projektów Charlesa – silnikiem analitycznym.

Schemat silnika analitycznego. By ArnoldReinhold – Own work, CC BY 4.0, https://commons.wikimedia.org/w/index.php?curid=69497631

Silnik Analityczny był komputerem mechanicznym – maszyną, która automatyzowała obliczenia. To właśnie dla silnika analitycznego napisała pierwszy algorytm. Jej praca była formułą pokazującą, jak skonfigurować silnik, by obliczał pewien złożony ciąg liczb, zwanych liczbami Bernoulliego. Formuła ta jest obecnie powszechnie uznawana za pierwszy algorytm komputerowy w historii.

Ada nie ograniczyła się tylko do obliczeń czysto matematycznych. Biorąc pod uwagę, że żyła w XIX wieku, była prawdziwą wizjonerką.

Podczas gdy wielu jej współczesnych postrzegało pierwsze mechaniczne komputery przede wszystkim jako urządzenia do zapisywania liczb, ona pytała, co jest poza wykonywaniem obliczeń. Była ciekawa szerszego potencjału komputerów mechanicznych jako narzędzi do współpracy. Miała nadzieję zobaczyć komputery, które dadzą ludziom więcej możliwości niż tylko poprzez automatyzację obliczeń.

Schemat Lovelace’a z „notatki G”, pierwszego opublikowanego algorytmu komputerowego, autorstwa Ady Lovelace – http://www.sophiararebooks.com/pictures/3544a.jpg, Public Domain, https://commons.wikimedia.org/w/index.php?curid=37285970

Niestety, budowa silnika analitycznego nie została zakończona przed śmiercią Ady, dlatego nigdy nie było jej dane zobaczyć swojego algorytmu w działaniu. Niestety, Silnik Analityczny nie został zbudowany do dnia dzisiejszego. Inny projekt Charlesa Babbage’a, Difference Engine №2, został zbudowany przez londyńskie Muzeum Nauki dopiero w 1991 roku. Wykazano, że jest on funkcjonalny, przy użyciu materiałów i technologii dostępnych Charlesowi Babbage’owi. Wygląda na to, że Babbage miał po prostu pecha, jeśli chodzi o realizację swoich projektów. Inne częściowe implementacje pracy Charlesa istnieją gdzie indziej, ale niestety, nie możemy uruchomić algorytmu Ady Byron na prawdziwym silniku analitycznym.

Dziewiętnasty wiek stał się erą „algorytmów wbudowanych w maszyny”.

Było ich mnóstwo, automatyzujących wszelkiego rodzaju ludzkie działania. Jeśli potrzebowałeś skomplikowanego wzoru na kawałku tkaniny, Joseph Marie Jacquard, francuski tkacz i kupiec, miał dla Ciebie rozwiązanie: krosno żakardowe. Umożliwiło ono producentom tkanin wytwarzanie skomplikowanych wzorów za pomocą serii perforowanych kart, które instruowały krosno, jak ma tkać. W podobny sposób wczesne centrale telefoniczne wykorzystywały skomplikowane urządzenia mechaniczne do łączenia rozmów telefonicznych. Automatycznie wykonywały one krok po kroku instrukcje, aby ostatecznie doprowadzić do tego, że dwie osoby będą mogły ze sobą rozmawiać. Maszyny te, czy to krosna, czy centrale, były przełomowe w swoich czasach i do dziś robią wrażenie. Trudno nie podziwiać poziomu skomplikowania niektórych z tych maszyn. Jednak wszystkie te urządzenia były nadal czysto mechaniczne. Zbudowane były z dźwigni, przełączników, wałków. Robiły dużo hałasu. I były bardzo dalekie od tego, co dziś nazywamy komputerami.

Algorytmy na komputerach ogólnego przeznaczenia

Dopiero w latach trzydziestych XX wieku pojawiły się pierwsze wzmianki o algorytmach w komputerach elektronicznych (niemechanicznych). Alan Turing był jednym z pierwszych naukowców, którzy formalnie uchwycili jak jednostki wykonują obliczenia. Celem Turinga było uchwycenie ogólnego procesu, a nie specyficznego dla konkretnego zadania, takiego jak identyfikowanie liczb pierwszych lub obliczanie największego wspólnego dzielnika. Ogólny proces mógł być następnie wykorzystany do wykonywania konkretnych zadań. Praca koncepcyjna Turinga doprowadziła do rozwoju tego, co obecnie znane jest jako maszyna Turinga. Maszyna Turinga, z kolei, doprowadziła do powstania komputerów ogólnego przeznaczenia. Przedrostek „ogólnego przeznaczenia” jest tu kluczowy. W przeciwieństwie do poprzednich maszyn, nowe komputery wykonywałyby dowolne zestawy instrukcji. Mogły być wykorzystywane do celów, których nie przewidzieli nawet ich twórcy. Innymi słowy: Praca Turinga doprowadziła do powstania komputerów, na których możemy instalować i uruchamiać aplikacje.

Nie ma Flappy Bird na Twoim smartfonie bez koncepcji maszyny Turinga.

Dziesiątki lat później algorytmy stały się niezwykle wyrafinowane. Tak wyrafinowane, że często nie potrafimy wyjaśnić, jak działają. W dwudziestym wieku wielu wolało myśleć o algorytmach komputerowych jak o czarnych skrzynkach. Nie trzeba było rozumieć, jak dokładnie działają. Liczyły się tylko dane wejściowe – to, co wchodziło do czarnej skrzynki – i dane wyjściowe – to, co z niej wychodziło. To uproszczenie było wyborem. W XXI wieku w przypadku niektórych algorytmów nie jest to już wybór: ludzie nie potrafią dokładnie wyjaśnić, jak algorytmy osiągają określone wyniki, więc jesteśmy zmuszeni myśleć o tych algorytmach jak o czarnych, a może magicznych, skrzynkach. Jedną z grup takich algorytmów są niektóre algorytmy sztucznej inteligencji. Potrafimy wyjaśnić ich zasady działania. Na przykład, możemy powiedzieć, że dany algorytm wykorzystuje sztuczną sieć neuronową. Możemy też wyjaśnić, jak ta sieć została stworzona i w jaki sposób dane wejściowe dały określone wyjście. Nie potrafimy jednak wyjaśnić, dlaczego ten konkretny wynik był wyjściem algorytmu, poza czysto mechanicznym wyjaśnieniem. Eric L. Loomis, którego długość pobytu w więzieniu zależała od algorytmu, próbował zrozumieć, dlaczego algorytm COMPAS ocenił go jako przestępcę wysokiego ryzyka. Było to po prostu niemożliwe. Zaawansowanie algorytmów jest często przytłaczające. A to dopiero początek.

Żyjemy w świecie, w którym algorytmy są wszędzie – nie tylko na papierze czy w naszych umysłach, ale sterują maszynami, komputerami i robotami.

Są małe, wszechobecne i – przynajmniej w niektórych przypadkach – niewytłumaczalne.

Bardziej formalna definicja algorytmu to „jednoznaczna specyfikacja sposobu rozwiązania pewnej klasy problemów” lub „samoistny zestaw operacji do wykonania krok po kroku”

www.oed.com/view/Entry/4959

Według stanu na październik 2018 roku największą znaną liczbą pierwszą jest 277 232 917- 1, liczba o 23 249 425 cyfrach. Samo sprawdzenie, czy ta pojedyncza liczba jest pierwsza, zajęło sześć dni obliczeń non-stop na współczesnym komputerze domowym. (https://www.mersenne.org/primes/press/M77232917.html)