﻿<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xml" href="/cjs/examples.screen.xsl" media="screen"?>
<examples chapter="Procvičování – hrátky s čísly" directory="procvicovani">

    <note>
        Inspirace pro úlohy 2 a 3: <em>Radek Pelánek: „Programátorská cvičebnice“ (ComputerPress, Brno 2012)</em>
    </note>

<!--
    <example>
        <text>
        </text>
        <hint>
        </hint>
        <solution src="procvicovani/cisla/.py" lang="python" />
    </example>
-->


    <example>
        <text>
            Hrátky s (celými) čísly – zkuste vyřešit následující úlohy:
            <ol type="a">
                <li> Sečtěte zadanou posloupnost celých čísel. </li>
                <li> Zapište zadané číslo pozpátku. </li>
                <li> Zjistěte ciferný součet zadaného čísla. </li>
                <li> Spočítejte faktoriál zadaného čísla. </li>
                <li> Spočtěte prvních <em>n</em> členů Fibonacciho posloupnosti. </li>
            </ol>
        </text>
        <hint>
            <em>range()</em>, výřezová notace <em>[:]</em>, dělení deseti, převod na řetězec…
        </hint>
    </example>
    
    <example>
        <text>
            <em>„3n+1 problém“</em>: Vezměte libovolné přirozené číslo <em>n</em> a aplikujte na něj následující algoritmus:
            <ul>
                <li> Je-li <em>n</em> sudé, pak nové <code>n = n // 2</code>. </li>
                <li> Je-li <em>n</em> liché, pak nové <code>n = 3 * n + 1</code>. </li>
            </ul>
            Během výpočtu vypisujte čísla, která nacházíte, a počítejte, jak dlouho trvá, než se dostanete do jedničky.
        </text>
        <hint>
            Dosud nevyřešený problém známý též pod jmény <em>Collatzův</em>, <em>Ulamův</em>, <em>Syrakuský</em>…
        </hint>
    </example>
    
    <example>
        <text>
            Pokračujte v analýze <em>„3n+1 problému“</em> za pomoci seznamů a n-tic:
            <ul>
                <li> Pro každé číslo zaznamenejte kroky, kterými výpočet prošel. </li>
                <li> Seřaďte prozkoumaná čísla podle počtu těchto kroků. </li>
                <li> Pro každé číslo zaznamenejte nejvyšší číslo, ke kterému algoritmus došel. </li>
                <li> Pro které vstupní číslo je toto číslo největší? Prozkoumejte vstupní čísla postupně do 10^3, 10^4, 10^5… </li>
                <li> Zjistěte posloupnost tzv. „rekordmanů“, tedy čísel, pro něž je počet potřebných kroků větší než pro všechna čísla předchozí. Posloupnost začíná čísly 1, 2, 3, 6, 7, 9, 18, 25, 27, 54… </li>
            </ul>
        </text>
        <hint>
            Zaznamenávejte řešení například v podobě: <code>[ (číslo-1, [řešení]), (číslo-2, [řešení]), … ]</code>
        </hint>
    </example>
    
    <example>
        <text>
            Zkuste naimplementovat vyhledávání prvočísel pomocí <em>Eratosthenova síta</em>:
            <ol>
                <li> připravte seznam <code>[2, 3, 4, …, MAX]</code>; </li>
                <li> odstraňte ze seznamu první prvek zleva – je to prvočíslo; </li>
                <li> odstraňte ze seznamu všechny násobky prvku odstraněného v předchozím kroku; </li>
                <li> opakujte kroky 2+3 tak dlouho, dokud je ze seznamu co odstraňovat nebo dokud není prvočíslo z kroku 2 větší než √MAX. </li>
            </ol>
        </text>
        <hint>
            <em>range()</em>, <em>list.append()</em>
        </hint>
    </example>
    
    <example>
        <text>
            S prvočísly souvisí mnoho krásných a zhusta nevyřešených problémů. Jedním z nich je tzv. <a href="http://cs.wikipedia.org/wiki/Ulamova_spir%C3%A1la" class="external">Ulamova spirála</a> – vypíšete-li přirozená čísla do spirály, mají prvočísla výraznou tendenci shromažďovat se na některých úhlopříčkách (a i jiných příčkách). Matematicky – ze zatím neznámého důvodu generují některé vzorce <code>an<sup>2</sup>+bn+c</code> prvočísla výrazně „častěji“ než jiné. Historicky objevil tuto závislost již Klauber v roce 1932 v podobě trojúhelníku a jako spirálu ji poprvé popsal A. C. Clark (v románu!), nicméně skutečně ji vytvořit zkusil až Ulam v roce 1963:
            <br/>
            <img src="_files/Ulam_spiral_howto.png" width="200" height="189" style="padding-left: 3em;"/>
            <br/>
            Její ještě zajímavější varianta pochází od Roberta Sackse z roku 1994 – místo Ulamovy čtvercové spirály použil spirálu Archimédovu, přičemž na jednu otočku vychází právě jedno <em>čtvercové číslo</em> (druhá mocnina celého čísla). V této projekci se některé dříve zdánlivě nesouvisející části přímek stávají křivkou jedinou:
            <br/>
            <img src="_files/Sacks_spiral.png" width="200" height="200" style="padding-left: 3em;" title="by Claudio Rocchini" _align="middle"/> (obrázek Claudia Rocchiniho)
            <br/>
            Zkuste postupně splnit následující úkoly:
            <ul>
                <li> vypište vybraný počet přirozených čísel, přičemž prvočísla nějak zvýrazněte (barvou, podkladem…); </li>
                <li> zopakujte si předchozí krok, ale vypište čísla do trojúhelníku (postupně jedno, dvě, tři a tak dále); </li>
                <li> znovu, ale tentokrát vypište čísla do čtvercové spirály jako Ulam; </li>
                <li> nyní zkuste napodobit Sackse; </li>
                <li> najděte ještě vtipnější projekci, která odhalí něco o přirozených číslech, a proslavte se! </li>
            </ul>
        </text>
        <hint>
            Vzpomeňte si na <a href="http://en.wikipedia.org/wiki/Contact_%281997_US_film%29" class="external">Contact</a> ^_~<br/>
            Jinak bohužel vycentrování pro vykreslení trojúhelníku není tak jednoduché, jak by mohlo – při použití <em>ANSI escape codes</em> sice <em>len()</em> hlásí očekávanou délku řetězce bez nich, ale <em>center()</em> to vidí jinak…
        </hint>
    </example>


</examples>
