Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

01. Wstęp do matematyki - zajęcia wstępne

Treści kształcenia. Podczas tych zajęć student zapoznaje się z przeglądem tematów oraz zagadnień, z którymi będzie się stykał podczas zajęć z przedmiotu.

Efekty kształcenia. Zapoznanie się z przykładowymi problemami matematycznymi, które mają związek z informatyką. Student zapoznaje się z metodą problemową pracy nad zagadnieniami matematycznymi w informatyce.

Wstęp

Niniejszy plik jest pierwszym z trzydziestu scenariuszy zajęć przygotowanych na przedmiot Wstęp do matematyki na kierunku Informatyka na studiach inżynierskich.

Celem tego przedmiotu jest przekazanie studentom fundamentalnych pojęć z zakresu matematyki, które mają swoje odzwierciedlenie w pracy informatyka. Tematy te obejmują zagadnienia takie jak

  • podstawy języka matematyki, w tym wysławianie pojęć matematycznych i ich właściwości w formie definicji oraz twierdzeń; przeprowadzanie formalnych rozumowań matematycznych (dowód)

  • podstawy teorii zbiorów, operowania funkcjami

  • arytmetyka liczb, w tym liczby całkowite, wymierne, rzeczywiste i zespolone

  • pojęcie indukcji matematycznej, rekurencji i rekursji

  • odwzorowania w matematyce - funkcje

  • podstawowe zagadnienia z geometrii analitycznej

  • ciągi liczbowe

  • wielomiany

  • metryki

Aby przybliżyć styl pracy na zajęciach i sposób wprowadzania zagadnień, poniżej został przygotowany wybór pięciu krótkich ćwiczeń do omówienia w ramach zajęć wstępnych.

  1. O pierwiastku kwadratowym

  2. Liczby Fibonacciego

  3. Zagadka Hanoi

  4. Tajemnicze obrazki

  5. Gra w monety

O pierwiastku kwadratowym

W jaki sposób wyznaczyć 10 cyfr dziesiętnych liczby 2\sqrt{2}? A 100, 1000, 10000? Czy da się to zrobić szybko, np. w ciągu 1/10 sekundy?

Algorytm I:

2,0=200/1002,0 = 200/100

142=196<200<225=15214^2 = 196<200<225=15^2

142/102<2,0<152/10214^2/10^2 < 2,0<15^2/10^2

1,4<2<1,51,4<\sqrt{2}<1,5

Jak znaleźć największy kwadrat niewiększy od 20000? Będzie to liczba niemniejsza niż 140 i niewiększa niż 150.

Zatem przeszukujemy zbiór liczb całkowitych {141,142,143,144,145,146,147,148,149}\{141,142,143,144,145,146,147,148,149\}.

Jak? Najlepiej binarnie, czyli zaczynając w połowie, w tym przypadku

1452=21025145^2=21025 (za dużo!)

Wybieramy więc element w połowie zbioru {141,142,143,144}\{141,142,143,144\}

1422=20164142^2=20164 (za dużo)

Ostatecznie

1412=19881141^2=19881

Potrzeba zatem przeszukać w każdej iteracji następujące zbiory:

  1. {11,…19}→14\{11,\ldots 19\} \rightarrow 14

  2. {141,…149}→141\{141,\ldots 149\} \rightarrow 141

  3. {1411,…1419}→1414\{1411,\ldots 1419\} \rightarrow 1414

  4. ...

Do przygotowania algorytmu potrzebujemy jeszcze procedurę, która dla zadanej liczby naturalnej nn znajduje największą liczbę kk, której kwadrat k2k^2 jest niewiększy od nn.

k←1k\leftarrow 1

sq←1sq\leftarrow 1

while (sq≤nsq\leq n)

sq←sq+2k+1sq\leftarrow sq+2k+1

k←k+1k\leftarrow k+1

return k−1k-1

Zauważmy, że w powyższej procedurze nie podnosimy żadnego elementu do kwadratu!

Graphics object consisting of 1 graphics primitive

Możemy zatem przystąpić do zapisania procedury obliczania pierwiastka kwadratowego z wybranej liczby xx. Procedura zwraca generator a=SzukPierw(x), który przy wywołaniu next(a) oblicza kolejne przybliżenie x\sqrt{x} przybliżone o kolejną cyfrę dziesiętną. Komenda zwraca liczby całkowite (cyfry liczby x\sqrt{x}).

Interesujące pierwiastki

Wyznacz kilka przybliżeń pierwiastka kwadratowego z liczb

99,9999,999999,99999999,…99,9999,999999,99999999,\ldots

Czy zauważasz interesującą regularność?

Podobnie przeanalizuj przybliżenia dziesiętne pierwiastków kwadratowych z liczb

  • 1,123,12345,1234567,123456789,1234567891011,…1,123,12345,1234567,123456789,1234567891011,\ldots

  • 1,101,10001,1000001,100000001,…1,101,10001,1000001,100000001,\ldots

Zastanów się, jakie interesujące ciągi liczbowe odpowiadałyby podanym powyżej, gdybyśmy obliczali pierwiastek kwadratowy w innej bazie pozycyjnej, np. binarnej.

[14, 141, 1414, 14142, 141421, 1414213, 14142135, 141421356, 1414213562, 14142135623, 141421356237, 1414213562373, 14142135623730, 141421356237309, 1414213562373095, 14142135623730950, 141421356237309504, 1414213562373095048, 14142135623730950488, 141421356237309504880, 1414213562373095048801, 14142135623730950488016, 141421356237309504880168, 1414213562373095048801688, 14142135623730950488016887, 141421356237309504880168872, 1414213562373095048801688724, 14142135623730950488016887242, 141421356237309504880168872420, 1414213562373095048801688724209, 14142135623730950488016887242096, 141421356237309504880168872420969, 1414213562373095048801688724209698, 14142135623730950488016887242096980, 141421356237309504880168872420969807, 1414213562373095048801688724209698078, 14142135623730950488016887242096980785, 141421356237309504880168872420969807856, 1414213562373095048801688724209698078569, 14142135623730950488016887242096980785696, 141421356237309504880168872420969807856967, 1414213562373095048801688724209698078569671, 14142135623730950488016887242096980785696718, 141421356237309504880168872420969807856967187, 1414213562373095048801688724209698078569671875, 14142135623730950488016887242096980785696718753, 141421356237309504880168872420969807856967187537, 1414213562373095048801688724209698078569671875376, 14142135623730950488016887242096980785696718753769, 141421356237309504880168872420969807856967187537694]
[9999, 99999, 999999, 9999994, 99999949, 999999499, 9999994999, 99999949999, 999999499999, 9999994999998, 99999949999987, 999999499999874, 9999994999998749, 99999949999987499, 999999499999874999, 9999994999998749999, 99999949999987499993, 999999499999874999937, 9999994999998749999374, 99999949999987499993749, 999999499999874999937499, 9999994999998749999374999, 99999949999987499993749996, 999999499999874999937499960, 9999994999998749999374999609, 99999949999987499993749996093, 999999499999874999937499960937, 9999994999998749999374999609374, 99999949999987499993749996093747, 999999499999874999937499960937472, 9999994999998749999374999609374726, 99999949999987499993749996093747265, 999999499999874999937499960937472656, 9999994999998749999374999609374726562, 99999949999987499993749996093747265622, 999999499999874999937499960937472656229, 9999994999998749999374999609374726562294, 99999949999987499993749996093747265622949, 999999499999874999937499960937472656229492, 9999994999998749999374999609374726562294921, 99999949999987499993749996093747265622949217, 999999499999874999937499960937472656229492171, 9999994999998749999374999609374726562294921713, 99999949999987499993749996093747265622949217138, 999999499999874999937499960937472656229492171386, 9999994999998749999374999609374726562294921713867, 99999949999987499993749996093747265622949217138670, 999999499999874999937499960937472656229492171386705, 9999994999998749999374999609374726562294921713867056, 99999949999987499993749996093747265622949217138670565]
[1000, 10000, 100004, 1000049, 10000499, 100004999, 1000049998, 10000499987, 100004999875, 1000049998750, 10000499987500, 100004999875006, 1000049998750062, 10000499987500624, 100004999875006249, 1000049998750062496, 10000499987500624960, 100004999875006249609, 1000049998750062496094, 10000499987500624960940, 100004999875006249609402, 1000049998750062496094023, 10000499987500624960940234, 100004999875006249609402341, 1000049998750062496094023416, 10000499987500624960940234169, 100004999875006249609402341699, 1000049998750062496094023416993, 10000499987500624960940234169937, 100004999875006249609402341699379, 1000049998750062496094023416993798, 10000499987500624960940234169937986, 100004999875006249609402341699379869, 1000049998750062496094023416993798697, 10000499987500624960940234169937986972, 100004999875006249609402341699379869721, 1000049998750062496094023416993798697215, 10000499987500624960940234169937986972154, 100004999875006249609402341699379869721549, 1000049998750062496094023416993798697215498]
[9.9498743710661995473447982100120600517812656367680607911760464383494539278, 99.994999874993749609347654199057604094367888213731064901342816897727103303, 999.99949999987499993749996093747265622949217138670565794807433154677543830, 9999.9999499999998749999993749999960937499726562497949218733886718619079589, 99999.999994999999999874999999993749999999609374999972656249997949218749839]

Liczby Fibonacciego

Jednym z najczęściej wykorzystywanych algorytmów w obliczeniach na liczbach całkowitych jest obliczanie największego wspólnego dzielnika dwóch liczb całkowitych mm i nn, oznaczanego jako NWD(m,n)NWD(m,n) (ang. GCD(m,n)GCD(m,n)).

Największy wspólny dzielnik spełnia kilka prostych własności:

  1. NWD(0,n)=∣n∣NWD(0,n) = |n|, gdy n≠0n\neq0.

  2. NWD(m,n)=NWD(n,m)NWD(m,n)=NWD(n,m).

  3. NWD(m,n)=NWD(∣m∣,∣n∣)NWD(m,n)=NWD(|m|,|n|).

oraz kluczową własność Euklidesa NWD(m,n)=NWD(m,n−q⋅m)NWD(m,n)=NWD(m,n-q\cdot m) dla dowolnej liczby całkowitej qq.

Własności 1−31-3 oraz własność Euklidesa pozwalają obliczyć największy wspólny dzielnik bez korzystania z faktoryzacji liczb na czynniki pierwsze!

W praktyce zatem otrzymujemy prosty program.

13 = 1 (11) + 2
11 = 5 (2) + 1
2 = 2 (1) + 0
1
129 = 0 (131) + 129
131 = 1 (129) + 2
129 = 64 (2) + 1
2 = 2 (1) + 0
1

Traktując algorytm dzielenia z resztą jako jedną operację (sprawdź, że taki algorytm istotnie istnieje!), możemy obliczyć, ile kroków wymaganych jest do obliczenia NWD dwóch liczb. W szczególności interesuje nas najgorszy przypadek przebiegu tego algorytmu.

Wygenerujemy tablicę par liczb całkowitych 0<a<b0 < a < b i zaobserwujemy, dla jakich najmniejszych par liczb (a,b)(a,b) po raz pierwszy algorytm wykonuje się w kk krokach.

[[14, (542, 885)], [14, (545, 882)], [14, (545, 883)], [14, (546, 883)], [14, (547, 882)], [14, (547, 885)], [14, (555, 877)], [14, (555, 898)], [14, (610, 843)], [15, (610, 987)]]
[(1, 2), (2, 3), (3, 5), (5, 8), (8, 13), (13, 21), (21, 34), (34, 55), (55, 89), (89, 144), (144, 233), (233, 377), (377, 610)]

Zatem najmniejsza para liczb (ak,bk)(a_k,b_k), dla której wykonanie algorytmu Euklidesa zajmuje kk kroków, spełnia (hipotetycznie) pewną ciekawą własność

ak+1=bka_{k+1}=b_{k} oraz ak+bk=bk+1a_{k}+b_{k} = b_{k+1}

Łącząc obie równości, otrzymujemy relacje

ak+ak+1=ak+2a_{k}+a_{k+1} = a_{k+2}

oraz

bk−1+bk=bk+1b_{k-1}+b_{k} = b_{k+1}.

Dla pary (0,1)(0,1) algorytm wykonuje się w zero krokach (z definicji). Dla pary (1,1)(1,1) algorytm kończy się po 1 kroku. W ten sposób otrzymujemy zależność

a0=0a_{0}=0, a1=1a_{1}=1

oraz

ak+ak+1=ak+2a_{k}+a_{k+1} = a_{k+2}.

Zadanie

Sprawdź, że NWD(ak,ak+1)=1NWD(a_{k},a_{k+1}) = 1 dla dowolnego indeksu kk. Ponadto uzasadnij, że algorytm Euklidesa potrzebuje kk kroków do obliczenia NWD(ak,ak+1)NWD(a_{k},a_{k+1}).

Jak szybko rosną liczby aka_k zadane powyższym wzorem?

Graphics object consisting of 1 graphics primitive

Wykres przypomina szybko rosnącą funkcję. Czy jest to funkcja mniej więcej postaci ana^n dla pewnego a>1a>1?

[1.00000000000000, 2.00000000000000, 1.50000000000000, 1.66666666666667, 1.60000000000000, 1.62500000000000, 1.61538461538462, 1.61904761904762, 1.61764705882353, 1.61818181818182, 1.61797752808989, 1.61805555555556, 1.61802575107296, 1.61803713527851, 1.61803278688525, 1.61803444782168, 1.61803381340013, 1.61803405572755, 1.61803396316671, 1.61803399852180, 1.61803398501736, 1.61803399017560, 1.61803398820532, 1.61803398895790, 1.61803398867044, 1.61803398878024, 1.61803398873830, 1.61803398875432, 1.61803398874820, 1.61803398875054, 1.61803398874965, 1.61803398874999, 1.61803398874986, 1.61803398874991, 1.61803398874989, 1.61803398874990, 1.61803398874989, 1.61803398874990, 1.61803398874989, 1.61803398874989, 1.61803398874989, 1.61803398874989, 1.61803398874989, 1.61803398874989, 1.61803398874989, 1.61803398874989, 1.61803398874989, 1.61803398874989, 1.61803398874989]

Ilorazy kolejnych wyrazów ciągu aka_k zdają się stabilizować na liczbie mniej więcej 1,6180339...1,6180339....

[0.618033988768953, 0.381966011273662, 0.472135955043257, 0.437694101304935, 0.450849718816885, 0.445824720089216, 0.447744098828878, 0.447010961406647, 0.447290995002582, 0.447184031705981, 0.447224888068793, 0.447209282345913, 0.447215243220693, 0.447212966388188, 0.447213836079876, 0.447213503906269, 0.447213630804355, 0.447213582352658, 0.447213600878617, 0.447213593821389, 0.447213596536068, 0.447213595518211, 0.447213595926056, 0.447213595789331, 0.447213595860614, 0.447213595852444, 0.447213595874623, 0.447213595885210, 0.447213595900224, 0.447213595913547, 0.447213595927516, 0.447213595941239, 0.447213595955055, 0.447213595968836, 0.447213595982631, 0.447213595996420, 0.447213596010211, 0.447213596024001, 0.447213596037792, 0.447213596051583, 0.447213596065373, 0.447213596079164, 0.447213596092954, 0.447213596106745, 0.447213596120536, 0.447213596134326, 0.447213596148117, 0.447213596161908, 0.447213596175698, 0.447213596189489, 0.447213596203279, 0.447213596217070, 0.447213596230861, 0.447213596244651, 0.447213596258442, 0.447213596272233, 0.447213596286023, 0.447213596299814, 0.447213596313604, 0.447213596327395, 0.447213596341186, 0.447213596354976, 0.447213596368767, 0.447213596382557, 0.447213596396348, 0.447213596410139, 0.447213596423929, 0.447213596437720, 0.447213596451511, 0.447213596465301, 0.447213596479092, 0.447213596492882, 0.447213596506673, 0.447213596520464, 0.447213596534254, 0.447213596548045, 0.447213596561835, 0.447213596575626, 0.447213596589417, 0.447213596603207, 0.447213596616998, 0.447213596630789, 0.447213596644579, 0.447213596658370, 0.447213596672160, 0.447213596685951, 0.447213596699742, 0.447213596713532, 0.447213596727323, 0.447213596741113, 0.447213596754904, 0.447213596768695, 0.447213596782485, 0.447213596796276, 0.447213596810067, 0.447213596823857, 0.447213596837648, 0.447213596851438, 0.447213596865229]

Ryzykowna hipoteza

Zatem ciąg liczb aka_k jest bardzo bliski ciągowi 0,447214⋅(1,618034)k0,447214\cdot (1,618034)^k.

Co to znaczy bliski?

Hipoteza robocza:

Jeśli element aka_k byłby postaci A⋅bkA\cdot b^k, to wówczas, aby spełniać równanie ak+2=ak+1+aka_{k+2} = a_{k+1}+a_{k}, potrzebowalibyśmy

A⋅bk+2=A⋅bk+1+A⋅bk.A\cdot b^{k+2} = A\cdot b^{k+1}+A\cdot b^{k}.

Zakładając, że A≠0A\neq 0 oraz b≠0b\neq 0, otrzymujemy

b2=b+1.b^2=b+1.

Jakie są rozwiązania równania kwadratowego b2=b+1b^2=b+1?

[b == -1/2*sqrt(5) + 1/2, b == 1/2*sqrt(5) + 1/2]
-0.618033988749895

Liczba 1/25+1/21/2\sqrt{5}+1/2 to mniej więcej 1,618033...1,618033.... Z kolei liczba −1/25+1/2-1/2\sqrt{5}+1/2 to około −0,61803...-0,61803.... Wygląda na to, że nasza hipoteza nie jest pozbawiona sensu. Ale ile wynosi stała AA?

Zauważ, że liczby aka_k są całkowite. Czy istnieje stała AA spełniająca dokładnie równość A(1/25+1/2)k=akA(1/2\sqrt{5} + 1/2)^k = a_k? (odpowiedź: sprawdź, że nie może tak być!)

Zatem pozostaje inna opcja. Istnieją dwie stałe A1,A2A_1, A_2 takie, że

ak=A1(1/25+1/2)k+A2(−1/25+1/2)ka_k = A_1 (1/2\sqrt{5} + 1/2)^k+A_2(-1/2\sqrt{5} + 1/2)^k.

Zadanie:

Uzasadnij, że stała A1=−A2=1/5A_1=-A_2=1/\sqrt{5} i równość powyżej zachodzi wówczas dla dowolnego k≥0k\geq 0.

Komentarz

Ciąg liczbowy (ak)(a_k) określony wzorem powyżej nosi nazwę ciągu Fibonacciego od nazwiska Leonarda z Pizy zwanego Fibonaccim, który jako pierwszy omawiał własności tego ciągu w księdze Liber abaci w 1202 roku.

Formuła

ak=15((1+52)k−(1−52)k)a_k = \frac{1}{\sqrt{5}}\left( \left(\frac{1+\sqrt{5}}{2}\right)^k- \left(\frac{1-\sqrt{5}}{2}\right)^k \right)

nosi nazwę formuły Bineta od nazwiska Jacques’a Bineta, który podał ją w 1843 roku. Najwcześniejsza wzmianka tej formuły pochodzi z pracy Abrahama de Moivre’a z 1722 roku i była wielokrotnie odkrywana przez innych autorów.

Literatura:

  • Binet, J. P. (1843). Mémoire sur l’intégration des équations linéaires aux différences finies, d’un ordre quelconque, à coefficients variables. Comptes Rendus hebdomadaires des séances de l’Académie des Sciences (Paris), 17, 559-567.

  • Bernoulli, D. (1728). Comment. Acad. Sci. Petrop., 3, 85-100.

  • Euler, L. (1765). Observationes analyticae. Novi commentarii academiae scientiarum imperialis Petropolitanae, 11, 124-143.

  • de Moivre, A. (1730). Miscellanea analytica de seriebus et quadraturis. London.

  • de Moivre, A. (1722). Philos. Trans., 32, 162-178.

Link do ciekawej dyskusji na ten temat.


Zagadka Hanoi

Matematyka to nauka o rozkładaniu skomplikowanych problemów na trywialne kroki. Tak mógłby wyglądać wstęp do każdego podręcznika matematycznego. Dla laika wydaje się to niemożliwym, patrząc na skomplikowane gmachy wiedzy abstrakcyjnej zbudowane przez matematyków. Z drugiej strony budowa katedry polega tak jak budowa wieży z kart na konsekwentnym łączeniu prostych elementów, aż do powstania finalnego dzieła.

W informatyce podejście do problemów polegające na ich rozłożeniu na prostsze podproblemy nosi nazwę ,,dziel i rządź’’ (ang. divide and conquer). Podejście to zaowocowało budową wspaniałych algorytmów takich jak algorytm Strassena do mnożenia macierzy czy algorytm Karacuby do mnożenia dowolnie dużych liczb całkowitych na komputerze, algorytmów sortowania, np. quicksort lub mergesort czy wreszcie rozwiązywania skomplikowanych łamigłówek matematycznych, np. problem wież Hanoi. Każdy z tych algorytmów ma pewien związek z zasadą indukcji matematycznej, o której będziemy się uczyli na jednych z kolejnych zajęć. W tym przykładzie przyjrzymy się w uproszczony sposób problemowi wież Hanoi i jak go rozwiązać metodą dziel i rządź.

Problem wież Hanoi

Wyobraźmy sobie, że mamy do dyspozycji trzy drewniane paliki. Na każdy z nich możemy nałożyć jeden z nn dostępnych klocków (o nn różnych szerokościach). Klocki możemy przekładać między palikami, ale tylko w ten sposób, aby klocek węższy był nakładany na klocek szerszy. Zakładamy, że na pusty palik można nałożyć klocek dowolnej szerokości.

Zadanie polega na zgodnym z regułami przełożeniu wszystkich nn klocków ułożonych od najszerszego do najwęższego z palika pierwszego na palik trzeci. Numerujemy paliki: 1 - palik lewy, 2 - palik środkowy oraz 3 - palik prawy.

Pytanie: w ilu krokach i czy w ogóle można rozwiązać to zadanie?

Idea dziel i rządź dla tego zadania polega na tym, aby zastanowić się, czy problem można rozwiązać, odwołując się do jego mniejszej wersji.

W przypadku, gdy mamy n=1n=1 klocek, wówczas przełożenie go z pierwszego palika na trzeci odbywa się jednym legalnym ruchem.

Gdy liczba klocków wzrasta do n=2n=2, wówczas najprostszy sposób rozwiązania polega na przełożeniu klocka z góry na palik środkowy, klocka z dołu na palik prawy, w końcu przekładamy klocek mniejszy z palika 2 na palik 3. I gotowe, w trzech krokach osiągnęliśmy cel.

Co dzieje się, gdy mamy n=3n=3 klocki? Zastosujemy podejście abstrakcyjne. Wyobrażamy sobie, że klocek środkowy i górny stanowią całość, jeden superklocek, nazwijmy go α\alpha. Klocek dolny oznaczmy β\beta. Sprowadzamy zatem, zgodnie z zasadą dziel i rządź, zadanie do problemu dwóch klocków, α\alpha i β\beta. Taki algorytm już znamy z poprzedniego kroku! Zatem odpowiednio:

  1. Przekładamy α\alpha na palik 2.

  2. Przekładamy β\beta na palik 3.

  3. Przekładamy α\alpha na palik 3.

W jaki sposób przekładamy α\alpha na inny palik? Wykonujemy ciąg operacji podobny do algorytmu dla dwóch rzeczywistych klocków, traktując klocek β\beta, jakby był elementem podłoża. I gotowe!

W ten sposób rozwiązujemy nasze zadanie dla n=3n=3 w 7 krokach. Ile kroków zajmie nam rozwiązanie zadania dla n=4n=4? A ile w ogólności?

1. Przełóż klocek z palika 1 na palik 3.
2. Przełóż klocek z palika 1 na palik 2.
3. Przełóż klocek z palika 3 na palik 2.
4. Przełóż klocek z palika 1 na palik 3.
5. Przełóż klocek z palika 2 na palik 1.
6. Przełóż klocek z palika 2 na palik 3.
7. Przełóż klocek z palika 1 na palik 3.
8. Przełóż klocek z palika 1 na palik 3.
9. Przełóż klocek z palika 1 na palik 3.
10. Przełóż klocek z palika 1 na palik 2.
11. Przełóż klocek z palika 3 na palik 2.
12. Przełóż klocek z palika 1 na palik 3.
13. Przełóż klocek z palika 2 na palik 1.
14. Przełóż klocek z palika 2 na palik 3.
15. Przełóż klocek z palika 1 na palik 3.

Zobaczmy efekty wykonywania instrukcji przekładania klocków wież Hanoi na przykładzie wieży złożonej z czterech krążków.

Graphics Array of size 4 x 4

Aplet graficzny - sprawdź samodzielnie, czy dobrze rozumiesz algorytm

Tajemnicze obrazki

Wyobraźmy sobie grę, w której podajemy dwie liczby, np. {0,1}\{0,1\} i następnie generujemy dla tych liczb przekształcenie, np. x↦x/2x\mapsto x/2, którym działamy na każdy element ze zbioru.

Następnie łączymy oryginalny zbiór z nowym zbiorem, w tym przypadku {0,1/2,1}\{0,1/2,1\}.

W kolejnym kroku powtarzamy operację, ale już na nowym zbiorze. W efekcie w kolejnych krokach otrzymamy zbiory

{0,1}\{0,1\}

{0,1/2,1}\{0,1/2,1\}

{0,1/4,1/2,1}\{0,1/4,1/2,1\}

…\ldots

Czy istnieje ,,koniec’’ takiej gry? Jeśli tak, to jakie własności ma taki zbiór?

Przypadek powyżej sugeruje następującą odpowiedź:

{0,1,1/2,1/4,1/8,1/16,…}\{0,1,1/2,1/4,1/8,1/16,\ldots\}

czyli 0 wraz z kolejnymi potęgami liczby 1/21/2. Operacja, którą wykonywaliśmy na zbiorach, może być opisana następująco

W(A)=A∪f(A)W(A) = A\cup f(A)

gdzie f(A)f(A) oznacza zbiór elementów z AA pomnożonych przez 1/21/2. Symbol ∪\cup to połączenie (suma) dwóch zbiorów.

Jeśli przez A0A_0 oznaczymy zbiór {0,1}\{0,1\} oraz Ai=W(Ai−1)A_i = W(A_{i-1}), to zbiór, który otrzymujemy ``na końcu’', możemy oznaczyć A∞={0,1,1/2,1/4,…}A_\infty = \{0,1,1/2,1/4,\ldots\}. Jego własnością jest A∞=W(A∞)A_\infty = W(A_\infty).

UWAGA: w pewnym ścisłym sensie (związanym np. z metryką Hausdorffa, czyli miarą odległości zbiorów) odwzorowanie WW ma punkt stały A∞A_\infty, do którego nasz proces zbiega. Własności zbiorów podobnych do A∞A_\infty są tematem bardzo ciekawych badań, a odwzorowania podobne do WW (tzw. operatory Hutchinsona) są tematem badań w zakresie tzw. iterowanych systemów funkcji. Zbiór A∞A_\infty jest samopodobny (tutaj: przeskalowanie zbioru A∞A_\infty o połowę daje ten sam zbiór bez punktu 1 - f(A∞)=A∞∖{1}f(A_\infty) = A_\infty\setminus\{1\} ).

W niektórych zastosowaniach zbiory podobne do A∞A_\infty nazywamy fraktalami. W poniżej podanych kilku prostych przykładach zapoznasz się z przykładami fraktali, które powstają w wyniku zastosowania bardzo prostych operacji na płaszczyźnie.

Najpierw przygotujemy sobie kod do generowania naszych zbiorów punktów. Elementem startowym dla każdego przykładu będzie punkt (0,0)(0,0) na płaszczyźnie R2\mathbb{R}^{2}. Ten punkt stanowi zbiór A0A_{0}. Następnie podana będzie lista odwzorowań fi:R2→R2f_i:\mathbb{R}^{2}\rightarrow\mathbb{R}^2, które będą połączeniem obrotów ze skalowaniem i translacjami (patrz: operacje afiniczne ). Ważnym warunkiem jest, aby odwzorowania fif_i były kontrakcjami (co to znaczy - zobacz do wykładów o metrykach!). Nasza gra opierać się będzie na rysowaniu zbiorów

W(A)=f1(A)∪…fi(A)∪…W(A) = f_1(A)\cup \ldots f_i(A)\cup\ldots

i odpowiednio A1=W(A0),A2=W(A1),…A_1=W(A_0), A_2=W(A_1),\ldots

Zobaczymy na kilku przykładach, że kształt zbiorów AiA_i ma interesujące własności, m.in. zobaczymy słynny trójkąt Sierpińskiego czy paproć Barnsley’a.

Literatura:

  • Peitgen, Jurgens, Saupe, Chaos and Fractals. New Frontiers of Science, Second Edition, Springer 2004: Rozdział 5: ‘‘Encoding Images by Simple Transformations’’

  • Barnsley, M. F. Fractals Everywhere, Academic Press, 1988

  • Hutchinson, J. Fractals and self-similarity, Indiana University Mathematics Journal 30 (1981) 713-747

Hasła:

  1. IFS = Iterated Function System (Barnsley); some nice examples here

  2. MRCM = Multiple Reduction Copy Machine

Przykład 1: Trójkąt Sierpińskiego

Przykład bazuje na trzech odwzorowaniach. Jedno to podzielenie obu współrzędnych na pół, odwzorowanie f1(x,y)=(x/2,y/2)f_1(x,y) = (x/2,y/2) i dwóch pozostałych, które przesuwają punkt f1(x,y)f_1(x,y) o (1/2,0)(1/2,0) (operacja f2f_2) lub (0,1/2)(0,1/2) (operacja f3f_3).

Graphics object consisting of 1 graphics primitive

Przykład 2: zmodyfikowany trójkąt Sierpińskiego

W tym przykładzie zmieniamy skalowanie do 1/31/3. Efekt daje zbiór podobny do poprzedniego, ale pojawiają się łuki, których do tej pory nie było.

Graphics object consisting of 1 graphics primitive

Przykład 3: liść klonowy

Kolejny przykład opiera się na czterech odwzorowaniach. Dla uwidocznienia skomplikowanej dynamicznej natury obrazka dodana została zmiana kolorów dla kolejnych narostów oraz zmiana wielkości punktów (najstarsze punkty są największe).

Graphics object consisting of 8 graphics primitives
Graphics object consisting of 1 graphics primitive

Przykład 4: paproć Barnsley’a

W ostatnim przykładzie zobaczymy obraz, który do złudzenia przypomina liść rośliny, np. paproci.

Graphics object consisting of 8 graphics primitives
Graphics object consisting of 1 graphics primitive

Gra w monety

Mamy grę: pierwszy gracz układa w rzędzie 5 monet 1 zł i 2 zł (wzorzec xx) tak, aby drugi gracz nie widział tego wzorca. Drugi układa swój wzorzec (nazwijmy go yy) 5 takich monet. Jeśli są takie same łańcuchy monet, to gracz drugi wygrywa, jeśli nie, to gracz pierwszy przekazuje informację o liczbie miejsc w obu łańcuchach, które się różnią d(x,y)d(x,y) (liczymy w tym samym kierunku). Oczywiście liczba zero oznacza takie same łańcuchy.

  • Czy zamiana ról graczy jest możliwa, tzn. d(x,y) = d(y,x)?

W pojedynczym ruchu gracz drugi może wymienić w swoim wzorcu dowolną monetę 1 zł na 2 zł lub odwrotnie. Ma więc 5 możliwości! Jeśli wymieni różniącą się monetę we wzorcach na poprawną, to liczba zmaleje o 1, a jeśli nie trafi i wprowadzi kolejną różnicę, to wzrośnie o 1.

  1. Określić, ile maksymalnie ruchów powinno wystarczyć do wyrównania różnic pomiędzy wzorcami dla każdej z liczby k różnic pozycji (dla k ∈ {1,2,3,4, 5}).

  2. Zaproponuj taką zmianę reguły podawania wartości d(x,y) (ale to nadal ma być liczba) tak, aby zwiększyć ilość przekazywanych informacji i przyspieszyć grę!

Komentarz:

Metryka Hamminga stosowana przy porównywaniu łańcuchów binarnych w informatyce. Proponowane ulepszenie polega na uwzględnieniu w liczbie pozycji, na której łańcuchy się różnią. Np. zamiast 1 przy różnicy na dowolnej pozycji liczyć 1/2n1/2^n, gdzie nn jest numerem pozycji. Rozkładając wynik na potęgi dwójki, uzyskamy numery pozycji, w których są różnice (oczywiście inne propozycje też są możliwe...). Wymiana jest więc ograniczona do kk ruchów, gdzie kk jest liczbą różniących się pozycji.

Gdzie znajdzie zastosowanie? Np. porównywanie grafik bitowych, detekcja błędów itp.

Wykrywanie pozycji pięciu monet

W trakcie gry masz za zadanie odkrycie układu pięciu monet (nominały 1 i 2). Monety ułożone są w kolejności od lewej do prawej i mogą występować w dowolnej liczbie.

Program w każdym kroku podaje odległość Hamminga do sekretnego układu. W ilu krokach na pewno możesz zakończyć rozgrywkę?

 11111  22211 odległość = 2
odległość = 3
 21211 odległość = 1
odległość = 0
Zwycięstwo!
Sekret = 21221
Liczba rund: 5

Modyfikacja gry

W tym wariancie gry otrzymujesz w każdym kroku listę ustawień, które są w zadanej odległości od tajnego układu. Czy podpowiedzi skracają Twoją rozgrywkę?

 21221  22111odległość = 4
Podpowiedzi
['11122', '11212', '11221', '12222', '21222']
 11221odległość = 2
Podpowiedzi
['11111', '11122', '11212', '12121', '12211', '12222', '21121', '21211', '21222', '22221']
 11111  22221  12221odległość = 0
Zwycięstwo!
Sekret = 12222
Liczba rund: 6

Wariant z ważoną metryką Hamminga

W tej rozgrywce uzyskujesz informację o odległości od tajnego układu, która jest zadana ważoną metryką. Wagi rozróżniają pozycje. Jak szybko możesz zakończyć rozgrywkę, mając daną tak dokładną informację? Jak zmieni się sytuacja, gdy niektóre wagi będą równe?

 12121odległość = 3/16
 12112odległość = 0
Zwycięstwo!
Sekret = 12112
Liczba rund: 2