Proste_rachunki_wyko..

advertisement
PROSTE RACHUNKI WYKONYWANE
ZA POMOCĄ KOMPUTERA
WPROWADZENIE DO ALGORYTMIKI
Maciej M. Sysło
Uniwersytet Wrocławski
Uniwersytet UMK w Toruniu
[email protected]
informatyka +
2
Algorytm, algorytmika
Algorytm – opis rozwiązania krok po kroku postawionego
problemu lub sposobu osiągnięcia jakiegoś celu
Pierwszy algorytm – algorytm Euklidesa
300 p.n.e
algorytm od Muhammad
ibn Musa al-Chorezmi IX w.
Algorytmika – dziedzina zajmująca się algorytmami i ich
własnościami
informatyka +
3
Algorytmy a informatyka
Informatyka – jedna z definicji: dziedzina wiedzy i działalności
zajmująca się algorytmami
Czy zajmuje się też algorytmami kulinarnymi?
Donald E. Knuth:
Mówi się często, że człowiek dotąd nie zrozumie czegoś,
zanim nie nauczy tego – kogoś innego.
Będziemy uczyć
W rzeczywistości,
komputery, czyli
programować je ! człowiek nie zrozumie czegoś (algorytmu) naprawdę,
zanim nie zdoła nauczyć tego – komputera.
Ralf Gomory (IBM):
Najlepszym sposobem przyspieszania komputerów
jest obarczanie ich mniejszą liczbą działań (szybszymi algorytmami)
informatyka +
4
Algorytmiczne rozwiązywanie problemu
Dla problemu – chcemy otrzymać rozwiązanie
komputerowe, które jest:
• zrozumiałe dla każdego, kto zna problemu
• poprawne, czyli spełnia specyfikację (opis) problemu
• efektywne, czyli nie marnuje czasu i pamięci komputera
Metoda rozwiązywania:
• analiza sytuacji problemowej
• sporządzenie specyfikacji: wykaz danych, wyników i relacji
• projekt rozwiązania
• komputerowa realizacja rozwiązania – implementacja
• testowanie poprawności rozwiązania
• dokumentacja i prezentacja rozwiązania
informatyka +
5
Rozwiązywanie problemów z pomocą komputerów
Objaśnienie dwóch terminów:
Problem:
• problem, gdy nie podano nam, jak należy go rozwiązać, ale wiemy
wystarczająco, by poradzić sobie z nim
• a więc, problem jest dla każdego nie tylko dla orłów
Programowanie:
• komputery wykonują tylko programy
• cokolwiek uruchamiamy na komputerze: Google, dokument w Word,
arkusz w Excel, naciśnięcie klawisza – jest programem
• każdy widoczny i niewidoczny efekt działania komputera to wynik
działania jakiegoś programu
Konkluzja: powinniśmy lepiej poznać programowanie komputerów
informatyka +
6
Myślenie algorytmiczne
Myślenie komputacyjne
(ang. computational thinking)
Reklama firmy IBM z
1924 roku
Komputer to maszyna do
myślenia !!!
informatyka +
7
Problemy, algorytmy
i ich komputerowe realizacje (implementacje)
Plan:
• Obliczenia w komputerze – czy komputer może
wszystko policzyć?
– trasę dla Premiera
– kryptogram RSA
• Liczby dziesiętne, binarne, … – system pozycyjny,
zamiana liczb między systemami
• Obliczanie wartości wielomianu – Schemat Hornera
• Podnoszenie do potęgi – szybko!
• Algorytm Euklidesa – rekurencja, jako przedsmak
informatyki
informatyka +
8
Czy komputer może wszystko obliczyć , 1
Problem: Znajdź najkrótszą trasę dla Premiera przez wszystkie
miasta wojewódzkie.
Rozwiązanie: Premier zaczyna w Stolicy a inne miasta może
odwiedzać w dowolnej kolejności. Tych możliwości jest:
15*14*13*12*11*…*2*1 = 15! (15 silnia)
W 1990 roku było: 48*47*46*…*2*1 = 48! (48 silnia)
Jak szybko można obliczyć 15!, a 48! Mając komputer, który
wykonuje 1015 (1 petaflops) operacji na sekundę (superkomputer)?
15! = 1307674368000/1015 sek. = ok. 0.01 sek.
48! = 1,2413915592536072670862289047373*1061/1015 = Ile to jest lat?
25! = 15511210043330985984000000/1015 sek. = 15511210043 sek. =
= 179528 dni = 491 lat
informatyka +
9
Czy komputer może wszystko obliczyć, 2
Kryptografia: Szyfr RSA, jeden z najpopularniejszych obecnie,
bazuje na podnoszeniu do dużej potęgi dużych liczb, np.
123456789098765432123456789098765432112345678998765
43211234567890123456789098765432112345678909876543211234567890987654321
Jak można szybko obliczać takie potęgi? Demo:
informatyka +
10
System dziesiętny, system pozycyjny
Liczba dziesiętna: 357 ma wartość (dziesiętną):
357 = 3*100 + 5*10 + 7*1 = 3*102 + 5*101 + 7*100
a zatem liczba:
dn-1 dn-2 … d1 d0
która ma n cyfr
ma wartość:
dn-1*10n-1 + dn-2*10n-2 + … + d1*101 + d0*100
10 – podstawa systemu
{0, 1, 2, 3, …, 8, 9} – cyfry
2, 8, 16 – podstawy systemów używanych w komputerach
podstawa
cyfry
2
0, 1
system binarny
8
0, 1, 2, 3, 4, 5, 6, 7
16
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
60
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, G, …
informatyka +
11
System binarny
Liczba binarna: 10101 = (10101)2 ma wartość (dziesiętną):
1*24 + 0*23 + 1*22 + 0*21 + 1*20 = 24 + 22 + 1 = 16 + 4 + 1 = 21
a zatem liczba binarna:
ma wartość:
Binarne
rozwinięcie
liczby a
(bn-1 bn-2 … b1 b0)2
która ma n cyfr
Najbardziej
znaczący bit
Najmniej
znaczący bit
a = bn-1*2n-1 + bn-2*2n-2 + … + b1*21 + b0*20
(*)
Jak szybko obliczać wartość dziesiętną binarnego rozwinięcia?
We wzorze (*) zastępujemy 2 przez x i otrzymujemy:
a = bn-1*xn-1 + bn-2*xn-2 + … + b1*x1 + b0*x0
Jest to wielomian zmiennej x o współczynnikach 0 lub 1, czyli:
Pytanie: Jak szybko obliczać wartość wielomianu?
informatyka +
12
Obliczanie wartości wielomianu
Obliczanie wartości wielomianu jest bardzo ważną operacją w
komputerze, bo wartość każdej funkcji jest liczona jako wartość
wielomianu, np.
cos x = 1 – 0.49670x2 + 0.03705x4.
Wielomian stopnia 2:
w(x) = ax2 + bx + c = a*x*x + b*x + c
3 mnożenia 2 dodawania
w(x) = ax2 + bx + c = (a*x + b)*x + c
2 mnożenia 2 dodawania
Wielomian stopnia 3:
w(x) = ax3 + bx2 + cx + d = ((a*x + b)*x + c)*x + d
3 mnoż. 3 dod.
Wielomian stopnia n:
wn(x) = a0*xn + a1*xn-1 + … + an-1*x + an =
= (a0*xn-1 + a1*xn-2 + … + an-1)*x + an = … =
= ((…((a0*x + a1)*x + a2)*x + … + an-2)*x + an-1)*x + an
informatyka +
13
Obliczanie wartości wielomianu
specyfikacja, algorytm
Specyfikacja problemu –
dokładny opis problemu
Problem Wielomian – Obliczanie wartości wielomianu
Dane: n – nieujemna liczba całkowita
a0, a1, a2, ..., an – n + 1 współczynników wielomianu
z – wartość argumentu – obliczamy wn(z).
Wynik: wn(z) – czyli wartość wielomianu wn(x) w punkcie x = z
Algorytm do obliczania wartości wielomianu:
wn(z) = ((…((a0*z + a1)*z + a2)*z + … + an-2)*z + an-1)*z + an
Schemat Hornera:
y := a0
y := y*z + a1
y := y*z + a2
n mnożeń i n dodawań
y := a0
…..
Nie ma szybszego
y := y*z + ai dla i = 1, 2, …, n
algorytmu!!!
y := y*z + an-1
y := y*z + an
informatyka +
14
Schemat blokowy algorytmu Hornera
Instrukcja warunkowa:
rozgałęzienia algorytmu
i := 0; y := a0
Początkowe wartości
Czy i = n
Czyli, czy wyczerpano
wszystkie współczynniki
Tak
Wyprowadź wartość y
Koniec algorytmu
Nie
i := i + 1
y := y*z + ai
Instrukcja iteracyjna
Ada Augusta, córka Byrona, uznawana
powszechnie za pierwszą programistkę
komputerów, przełomowe znaczenie
maszyny analitycznej Ch. Babbage’a,
pierwowzoru dzisiejszych komputerów,
upatrywała właśnie „w możliwości
wielokrotnego wykonywania przez nią
danego ciągu instrukcji, z liczbą powtórzeń
z góry zadaną lub zależną od wyników
obliczeń”, a więc w iteracji.
informatyka +
15
Pełny
schemat
blokowy
algorytmu
Hornera
informatyka +
16
Algorytm Hornera w postaci programu (Pascal)
program Horner;
var i,n :integer;
a,y,z :real;
begin
read(n); read(z);
read(a);
y:=a;
for i:=1 to n do begin
read(a);
y:=y*z+a
end;
write(y)
end.
informatyka +
nazwa programu
deklaracje, typy zmiennych
blok programu – początek
czytaj n, czytaj z
czytaj pierwszy współczynnik
początkowa wartość wyniku
pętla od 1 do n
czytaj kolejny współczynnik
powiększenie wyniku
iteracja – koniec
pisz wynik
blok programu – koniec
17
Warsztaty
Algorytm, język programowania, komputer
Proces komputerowej realizacji
algorytmu:
• Opis algorytmu
• Zapis w języku programowania
(Pascal, C++)
• Przetłumaczenie na język
zrozumiały przez komputer
• Wykonanie
• Testowanie
informatyka +
18
Algorytm Hornera – współczynniki w tablicy (Pascal)
Deklaracja tablicy
Program Horner_tablica;
var i,n :integer;
y,z:real;
a:array[0..100] of real {Co najwyzej 100 wspolczynnikow}
begin
Czytanie
read(n);
współczynników
for i:=0 to n do read(a[i]);
writeln(' z
y');
read(z);
while z <> 0 do begin
Instrukcja iteracyjna z warunkiem:
y:=a[0];
Obliczanie wartości tego samego
for i:=1 to n do y:=y*z+a[i];
wielomianu tak długo, jak długo
write('
',y:2:5); writeln;
argument jest różny od zera, czyli
read(z)
z <> 0.
end
end.
informatyka +
19
Zastosowania Algorytmu Hornera
1. Obliczanie wartości wielomianów.
2. Obliczanie wartości dziesiętnej liczb danych w systemie o
podstawie różnej od 10, np. liczb binarnych.
Uwaga: jest to bardzo prosta metoda, np. dla obliczeń na
kalkulatorze bez pamięci.
3. Szybkie potęgowanie (w dalszej części)
informatyka +
20
Otrzymywanie postaci binarnej liczb
Szkolna metoda: dzielimy przez dwa tak
długo, jak długo iloraz jest większy od
zera – słupki:
Bardzo prosty program
dzielenie
iloraz
reszta
187|2
93
1
Program Rozwiniecie_binarne;
93|2
46
1
var a:integer;
begin
46|2
23
0
read(a);
23|2
11
1
while a <> 0 do begin
11|2
5
1
write(a mod 2,' ');
a:=a div 2
5|2
2
1
end
2|2
1
0
end.
1|2
0
1
Ciekawe pytanie: jaka jest długość
Reprezentacja od końca reszt:
rozwinięcia binarnego liczby n?
187 = (10111011)2
informatyka +
21
Podnoszenie do potęgi, 1
Dane: m – liczba naturalna,
x – liczba rzeczywista
Wynik: y = xm
Algorytmy: korzystają ze spostrzeżenia:
 jeśli m jest parzyste, to xm = (xm/2)2
 jeśli m jest nieparzyste, to xm = (xm –1)x
(m – 1 staje się parzyste).
Faktycznie, korzysta się z postaci binarnej wykładnika m.
Przykład: m = 22
Sposób 1.
 Rozłóż m na sumę potęg liczby 2
mamy: 22 = 2 + 4 + 16
 A stąd: x22 = x2+4+16 = x2 *x4 *x16
 Kolejne mnożenia: x2, x4 = (x2)2, x8 = (x4)2, x16 = (x8)2, y = x2 *x4 = x6,
y = y*x16 6 mnożeń (kwadrat to jedno mnożenie)
informatyka +
22
Podnoszenie do potęgi, 2
 Znajdź rozwinięcie binarne liczby m; mamy: 22 = (10110)2
 Przedstaw wykładnik w postaci schematu Hornera; mamy:
22 = 1*24 + 0*23 + 1*22 + 1*21 + 0*20 = (((2 + 0)2 + 1)2 + 1)2 +0
 Z postaci wykładnika określ kolejność mnożeń:
x(((2+0)2+1)2+1)2+0 = x(((2+0)2+1)2+1)2 = (x(((2+0)2+1)2+1)2 = (x(((2+0)2+1)2 x)2 =
= (x(((2+0)2+1)2 x)2 = (x(((2+0)2x)2 x)2 = (x(((2+0)2x)2x)2 = (((x2)2x)2x)2 = x22
 Kolejne mnożenia:
x2, x4 = (x2)2, x5 = (x4)x, x10 = (x5)2, x10x = x11, (x11)2 = x22
Ten algorytm również wykonał 6 mnożeń, ale liczy inne iloczyny.
Obie metody są bardzo efektywne i praktyczne – wykonują co
najwyżej dwa razy więcej mnożeń niż wynosi długość liczby w
postaci binarnej
informatyka +
23
Algorytm Euklidesa, 1
 Uważany za pierwszy algorytm – powstał 300 p.n.e.
 Chociaż Chińczycy i Hindusi wcześniej tworzyli przepisy
obliczeniowe.
 Przez długie lata był synonimem algorytmu i od niego zaczynały
wszystkie książki akademicki.
 Ma bardzo wiele zastosowań praktycznych i teoretycznych:
 arytmetyka, czyli obliczenia na liczbach całkowitych
 kryptografia – RSA
 łamigłówki
 Przykład: Czy za pomocą naczyń 6 i 10 litrowych można napełnić
pojemnik 15 litrami wody – wodę można dolewać lub pobierać z
pojemnika tylko całymi naczyniami.
informatyka +
24
Algorytm Euklidesa, 2
Problem NWD(m,n) – Największy Wspólny Dzielnik
Dane: m, n – liczby naturalne (można przyjąć, że m ≤ n)
Wynik: NWD(m,n) – Największy wspólny dzielnik liczb m i n.
Przykłady:
NWD(42,14) = 14
NWD(24,16) = 8
NWD(13,21) = 1
NWD(0,31) = 31
13 i 21 są względnie pierwsze
0 jest podzielne przez każdą liczbę
Zasada, wykorzystana w algorytmie – Twierdzenie o ilorazie i reszcie
n = q*m + r, gdzie 0 ≤ r < m
q – iloraz, r – reszta.
informatyka +
25
Algorytm Euklidesa, 3
Wnioski:
1. Jeśli r = 0, to m dzieli n, czyli NWD(m,n) = m
2. Jeśli r ≠ 0, to mamy r = n – qm, czyli każda liczba, która dzieli n oraz
m dzieli również r, w szczególności największa taka liczba.
Stąd mamy:
NWD(m,n) = NWD(r,m)
Przykład: NWD(25,70) = NWD(20,25) = NWD(5,20) = NWD(0,5) = 5
NWD(25,70):
70 = 2*25 + 20
NWD(20,25)
25 = 1*20 + 5
NWD(5,20)
20 = 4*5 + 0
r = 0, więc NWD( , ) = 5
Generowane liczby maleją: 70, 25, 20, 5, 0 więc algorytm jest skończony
informatyka +
26
Algorytm Euklidesa, 4 – dwie realizacje
Realizacja z funkcją:
program Euklides;
var m,n,r:integer;
begin
read(m,n);
while m>0 do begin
r:=n mod m;
n:=m;
m:=r
end;
write(n)
end.
program Euklides_funkcja;
var m,n:integer;
function NWD(m,n:integer):integer;
var r:integer;
begin
while m>0 do begin
r:=n mod m; n:=m; m:=r
Funkcja
end;
NWD:=n
end;
Wywołanie
funkcja
begin
read(m,n);
writeln(NWD(m,n))
end.
informatyka +
27
Algorytm Euklidesa, 5 – realizacja rekurencyjna
program Euklides_rekurencja;
Funkcja
rekurencyjna
var m,n:integer;
function NWD_rek(m,n:integer):integer;
begin
if m>n then NWD_rek:=NWD_rek(n,m)
else if m = 0 then NWD_rek:=n
else NWD_rek:=NWD_rek(n mod m,m)
end;
Wywołania
rekurencyjne
begin
read(m,n);
writeln(NWD_rek(m,n))
End.
informatyka +
28
Algorytm Euklidesa, 6 – zagadki
Przykład 1. Czy za pomocą naczyń 6 i 10 litrowych można napełnić
pojemnik 15 litrami wody – wodę można dolewać lub pobierać z
pojemnika tylko całymi naczyniami.
Jeśli istnieje rozwiązanie, to istnieją takie x i y, że
6x + 10y = 15
Czy istnieją? Uzasadnij odpowiedź.
Rozwiązanie 1. W tym przypadku nie istnieje rozwiązanie. Istnieje, gdy
prawa strona jest wielokrotnością NWD(6,10).
Przykład 2. W jednym pojemniku są klocki o wysokości p, a w drugim – o
wysokości q. Czy zawsze można zbudować wieże z każdego rodzaju
klocków, które mają tę samą wysokość? Jeśli jest to możliwe, to jaka jest
najmniejsza wysokość takich wież?
Rozwiązanie 2. Zawsze możliwe. Najmniejsza wysokość NWW(p,q).
Pytanie 3. Jaki zachodzi związek między NWD(m,n) i NWW(m,n)?
Mamy NWW(m,n) = (m*n)/NWD(m,n)
informatyka +
29
Pokrewne zajęcia w Projekcie Informatyka +
Wykład+Warsztaty (Wszechnica Poranna):
• Wprowadzenie do algorytmiki i programowania – wyszukiwanie i
porządkowanie informacji
• Proste rachunki wykonywane za pomocą komputera.
• Techniki algorytmiczne – przybliżone (heurystyczne) i dokładne.
Wykłady (Wszechnica Popołudniowa):
• Czy wszystko można policzyć na komputerze?
• Porządek wśród informacji kluczem do szybkiego wyszukiwania.
• Dlaczego możemy się czuć bezpieczni w sieci, czyli o szyfrowaniu
informacji.
• Znajdowanie najkrótszych dróg, najniższych drzew, najlepszych
małżeństw
informatyka +
30
Pokrewne zajęcia w Projekcie Informatyka +
Kursy (24 godz.) – Wszechnica na Kołach:
• Algorytmy poszukiwania i porządkowania. Elementy języka
programowania
• Różnorodne algorytmy obliczeń i ich komputerowe realizacje
• Grafy, algorytmy grafowe i ich komputerowe realizacje
Kursy (24 godz.) – Kuźnia Informatycznych Talentów – KIT dla Orłów:
• Przegląd podstawowych algorytmów
• Struktury danych i ich wykorzystanie
• Zaawansowane algorytmy
Tendencje – Wykłady
• Algorytmy w Internecie, K. Diks
• Czy P = NP, czyli jak wygrać milion dolarów w Sudoku, J. Grytczuk
• Między przeszłością a przyszłość informatyki, M.M Sysło
informatyka +
31
Download