středa 30. června 2021

O číslech, část 2: Čísla celá

V minulém článku jsme položili základy matematického univerza, přirozená čísla ℕ, která se ve své nekonečnosti tyčí jako věž uprostřed toho, co známe. Někdo by mohl říct, že to je i vše, co existuje, a z určitého hlediska by měl i pravdu – pokud je vesmír ve své podstatě konečný diskrétní (nespojitý) objekt, jediná „pravá“ čísla jsou ta přirozená. Matematikům (a zatím i běžným lidem) to ovšem nestačí, protože přirozená čísla v některých případech nejsou „hezká“ a chybí jim určité vlastnosti, díky kterým by se s nimi i v praxi lépe zacházelo.

Napřed je potřeba ale zmínit něco o ekvivalencích. Z matematického hlediska se každému vztahu (relaci) mezi nějakými objekty smí říkat ekvivalence, pokud splňuje 3 základní pravidla: vyplývá z identity (reflexivita; každý objekt je ekvivalentní sám sobě), je symetrická (můžeme prohodit porovnávané objekty bez změny výsledku) a tranzitivní (můžeme přeskakovat články v řetězci ekvivalencí). Pokud například každý objekt má jednu z konečného počtu možných barev, relace „má stejnou barvu jako“ je ekvivalence a obecně jakákoliv relace vycházející z ekvivalence nějaké vlastnosti je sama ekvivalence.

Ekvivalence je užitečná, protože nám umožňuje zahodit rozlišující vlastnosti objektů; je to nejzákladnější abstrakce. Umožní nám také definovat nové objekty, kterým říkáme třídy ekvivalence. Když použijeme stejný příklad, jednotlivé třídy ekvivalence budou všechny objekty se stejnou barvou; vlastně je seskupujeme podle nějakého klíče (ten ale není sám o sobě potřeba, když nám stačí objekty porovnávat). Dostaneme tak objekty (množiny) jako „všechny červené věci“, „všechny modré věci“, „všechny zelené věci“ atd. Aniž bychom doposud definovali, co vlastně je barva, nyní stačí použít trik: barva je totéž co její třída ekvivalence, tedy například objekt „červená“ je definován jako „všechny červené věci“.

To ve skutečnosti není ani tak divné, jak by se mohlo znát: každý člověk schopný rozpoznávat barvy se takhle učí popisovat svět. Napřed jako děti vidíme okolo sebe objekty, které něco spojuje, víme, že mají stejnou barvu, ale nevíme, co je to barva; je to pro nás zatím moc abstraktní. Pak pochopíme, že existuje barva jako individuální věc, kterou může každý objekt mít. Ani všechna znalost fyziky a biologie člověku nepomůže v definování toho, co vlastně barva je: z určitého pohledu to jsou prostě všechny stejnobarevné objekty a to je to jediné, co dokážeme rozeznat.

S tímto možná zdlouhavým úvodem se můžeme podívat na první překážku v dokonalosti: odčítání. Jak již bylo uvedeno minule, odčítání přirozených čísel není operace. Můžeme se ptát, k čemu musíme přičíst 2, abychom dostali 5 (tím jsme charakterizovali odčítání jako inverzní operaci ke sčítání), ale pro výsledek 0 nebo 1 základ nenajdeme.

A tak na pomoc musí přijít čísla celá, ℤ. Název trochu nedává smysl vzhledem k tomu, co jsme viděli doposud, protože všechna čísla zatím byla celá (nezlomková), takže by možná bylo lepší jim (zatím) říkat „znaménková“. Pro každé přirozené číslo n vytvoříme dva nové zápisy, +n a −n pro kladné a záporné číslo se stejnou velikostí. Zároveň hned můžeme definovat absolutní hodnotu |·|, která prostě odstraní znaménko a dovolí nám vrátit se k původnímu n. Když je znaménko +, dohodneme se, že ho nemusíme uvádět.

Je ovšem takováto definice matematická? Svým způsobem ano (matematika nám nebrání prostě jen tak něco definovat), ale možná by bylo hezké znaménka + a − zkonstruovat jako nějaké objekty. To sice jde, ale je to trochu těžkopádné (a co teprve +0 a −0), proto by možná bylo hezčí použít jinou konstrukci samotných celých čísel. Napřed musíme umět vytvořit uspořádané dvojice, což vypadá jednoduše, ale když máme zatím jen (neuspořádané) množiny, může to být trochu oříšek. Řešení nicméně není složité, stačí definovat (a, b) = {{a}, {a, b}}. Ať jsou a a b cokoliv, vždy je lze z této množiny vytáhnout a zjistit, na které jsou pozici.

Nyní konečně můžeme definovat celá čísla. Přibereme si na pomoc množinu všech dvojic přirozených čísel (obvykle značenou ℕ×ℕ). Poté si vymyslíme ekvivalenci, že dva takové páry jsou si ekvivalentní právě tehdy, když jsou čísla v nich stejně uspořádána a je mezi nimi stejná vzdálenost. Například pár (0, 2) je ekvivalentní s (1, 3), (2, 4) atd., ale ne s (2, 0) nebo (6, 12). Nyní stačí rozdíl mezi těmito čísly chápat jako celé číslo, respektive (a správněji) celé číslo bude třída ekvivalence nad ℕ×ℕ vzhledem k výše definované ekvivalenci. Tím se nám podařilo formalizovat intuici rozdílu i důvod, proč musíme zavádět novou číselnou množinu. Třeba původně přirozené a nám známé číslo 1 se stane množinou {(0, 1), (1, 2), (2, 3), (3, 4), ...}, zatímco −1 bude {(1, 0), (2, 1), (3, 2), (4, 3), ...}. Otočení znaménka je i v této podobě jednoduché, prostě stačí otočit každou dvojici. Sčítání je stejně lehké, prostě se každý prvek jedné množiny sečte po složkách se všemi z druhé a výsledky se sjednotí do nové množiny. Jen je potřeba dávat pozor na to, že sečtení výše zmíněných čísel (1 + (−1)) dá {(1, 1), (2, 2), (3, 3), ...}, ale (0, 0) chybí, takže je potřeba vždy výsledek ještě „zúplnit“. To už je ale věc vcelku triviální, protože vždy bude na doplnění potřeba přidat jen konečný počet prvků z kraje.

Možná je na místě ptát se, jestli je potřeba opravdu takový silný matematický aparát vzít na tak jednoduchou věc, tedy přinejmenším já se tak musím ptát, když vidím, kolik odstavců na to bylo potřeba. Smyslem této anabáze však není objevit celá čísla, ale naučit se určité postupy, které se dají aplikovat na mnoha místech. Těžko na cvičišti, lehko na bojišti.

Samozřejmě to neznamená, že by tento způsob byl jediný možný. Například může někdo namítnout, že 1 ≢ +1, tedy že 1 v ℕ a 1 v ℤ nejsou tytéž objekty, protože mají jinou strukturu. Taková forma matematického polymorfismu ale není nikterak nezvyklá; koneckonců u přirozených čísel jsme se taky setkali s několika definicemi, které jejich strukturu zcela měnily, ale výsledek se „choval“ stejně. Takovému vztahu se říká izomorfismus, když prvky nějakých dvou množin jsou nerozlišitelné vzhledem k operacím. Pokud by pak někdo namítal, že neví, kterou reprezentaci si vybrat, je to jedno, pokud jsou všechny ekvivalentní (nebo si potom může vybrat třídu ekvivalence pro izomorfismus). Ale pokud bych měl podat další možnou definici celých čísel, může třeba odpovídat definici ℕ pomocí S: přidáme novou operaci P (předchůdce), takže třeba −2 bude P(P(0)). Jenom nesmíme míchat S a P, to už by nám začalo vznikat něco jiného.

Ale hurá, máme celá čísla a můžeme tak odčítat, aniž bychom se museli bát, že narazíme na jednostranné omezení přirozených čísel. Tím se stává odčítání plnohodnotou inverzní operací k přičítání, ačkoliv odečíst něco znamená jen přičíst opačné číslo; v dvojicové konstrukci je to dokonce ten nejjednodušší způsob. Nakonec jsme dosáhli Pyrrhova vítězství, neboť pokus o doplnění odčítání nad přirozenými čísly, kde neexistuje číslo opačné, nás přinutil ho napřed zavést, ale odčítání je pak vlastně zbytečné chápat odděleně od sčítání. Kdyby navíc sčítání nebylo komutativní (což naštěstí zatím je), používat odečítání by bylo nebezpečné, protože bychom nedokázali rozlišit −a + b od b + (−a). To se nám ještě v budoucnosti připomene.

Kam však umístíme celá čísla v naší analogii s věží? Podle mě je není potřeba dávat nikam, protože už tam dávno byly. Kde? Inu stačí vylézt tak vysoko, že už nebudeme vědět, jak hluboko pod námi je země. Pak klidně můžou cihly nad námi být kladná čísla a cihly pod námi záporná. To docela dobře ilustruje fakt, že přirozená čísla charakterizují „pozici“ (s nějakým základním bodem, počátkem), zatímco celá charakterizují „posun“ (bez pevného počátku, aplikovatelný kdekoliv). Pokud by to však někomu nestačilo, může okolo věže vykopat příkop a zalít ho vodou, aby se věž hezky zrcadlila na hladině.


Asi je jasné, že množina celých čísel je opět nekonečná, když jsme vzali jen zrcadlový obraz přirozených čísel, ale jak moc je nekonečná? Překvapivě není o moc větší než přirozená čísla, vlastně není vůbec větší než přirozená čísla. Argument je stejný jako minule: dokážeme přirozená čísla zobrazit na celá a naopak. V podstatě pouze chceme celá čísla seřadit a očíslovat, a to je přece hračka: 0, 1, −1, 2, −2, 3, −3, 4, −4, 5, −5 a tak dále. Nejsou tam však kladná čísla jen s poloviční četností? Nu, tak tady jich je víc: 0, 1, 2, −1, 3, 4, −2, 5, 6, −3, 7, 8, −4, ... Četnost ztrácí smysl, když můžeme prvky vybírat v libovolném pořadí a v podstatě volit pořadí tak, aby se celá posloupnost blížila k nějaké četnosti (důsledek toho, že součet nekonečné řady se může změnit, pokud přeházíme prvky). Co se ovšem nezmění je fakt, že tam jsou všechna čísla, žádná nepřebývají a žádná nechybí. Obě množiny jsou tedy stejně velké.

Musíme si tím pádem dávat pozor, když říkáme, že se naše číselné univerzum zvětšilo. Svým způsobem v něm máme stále stejně „hmoty“, jen jsme se naučili ji lépe organizovat, abychom zacelili neúplnosti, na které bychom jinak mohli narazit neopatrným používáním dostupných operací. V tom budeme pokračovat i příště, kdy se podíváme na jednu docela hustou množinu, kterou budou racionální čísla.

neděle 20. června 2021

O číslech, část 1: Čísla přirozená

Podle Bible na počátku bylo slovo (podle Silmarilionu to slovo bylo eä = „buď“). Matematika v tom má jasno taky: na počátku nebylo nic. Ale i z ničeho se dá vytvořit něco, neboť to nic se dá označit jako jediné číslo: 0. A tak, ve snaze popsat nic, vzniklo něco: číslo 1. Tak vznikla nejdůležitější dvě čísla a číslo 2 muselo následovat, tak vznikla tři čísla a už to šlo dál a dál. V tomto jediném okamžiku vznikla přirozená čísla.

Na tomto jediném příkladu se dá ukázat jeden z nejmocnějších matematických dokazovacích aparátů: matematická indukce. Té stačí dva předpoklady (1. máme počátek a 2. vždy dokážeme udělat krok) a díky tomu víme, že dokazované tvrzení platí pro vše tímto dosažitelné. V tomto případě se jedná o existenci samotnou a tak jsme dokázali, že existují přirozená čísla a je jich nekonečně mnoho.

Proti tomuto závěru bojují matematičtí filosofové (spíše filosofové než matematici), kteří si říkají ultrafinitisti. Tato (v minulosti početnější frakce) filosofů tvrdí, že existují jen konečné objekty a celá přirozená čísla jsou jako množina moc velká, aby mohla vůbec existovat. Pokud by tomu tak ale bylo, musí existovat nějaké největší přirozené číslo. Dejme tomu, že to je třeba 10, ale pak máme 11 přirozených čísel (s nulou) a nikdo nedokáže, proč by 11 nemohlo existovat, když existuje 10.

Snad se mi tím povedlo podat přesvědčivý argument, že přirozená čísla existují a je jich opravdu nekonečně mnoho. Přesto se však může člověk ptát, jestli něco takového může existovat v reálném vesmíru. Odpověď je ano, minimálně opticky. Představte si koleje, které směřují od vás nějakým směrem, dokonale rovné. Kdybych se na ně chtěl dívat z boku, určitě se do mého zorného pole nevejdou, ale jakmile se otočím a dívám se v jejich směru, nikdy moje zorné pole v daném směru neopustí. Doposud nereálné nekonečno se najednou stane jedním bodem, do kterého směřují, úběžníkem.

Každý pražec je jedno přirozené číslo.

Přirozená čísla jsou pilířem celé matematiky, stanou se tedy nekonečně vysokou, a přesto zcela viditelnou věží, která bude uprostřed toho, co nakonec poznáme jako číselné univerzum.

Co ale vlastně přirozená čísla jsou? Už jsme je viděli vzniknout jednou, ale matematika často dokáže najít celou škálu objektů, které se na první pohled tváří odlišně, ale ve skutečnosti mají stejnou strukturu i chování (jsou izomorfní).

První takový postup je funkcionální, pokud vyjdeme z Peanových axiomů. To je způsob, jak identifikovat přirozená čísla několika základními pravidly: 1. existuje počátek (zatím mu budeme říkat o), 2. existuje operace S(n) (následovník), 3. o není následovníkem žádného jiného prvku, 4. každý jiný prvek je následovníkem právě jednoho jiného prvku a 5. každý prvek je dosažitelný z počátku konečným opakováním S(n).

Ve skutečnosti o může být cokoliv, ale je užitečné stanovit o = 0 (někteří lidé ale chápou pojem přirozená čísla bez nuly a pro ně platí o = 1). Tímto je charakterizována podstata přirozených čísel jako řetězu s jedním koncem, přičemž mezi jeho články se můžeme libovolně pohybovat. Dokonce můžeme tento pohyb mezi články chápat jako články samotné, jako opakované aplikování oprace S(n), tedy 0 je funkce f(n) = n, 1 je funkce f(n) = S(n), 2 je funkce f(n) = S(S(n)) a tak dále. Sčítání je v tomto systému jednoduché, prostě aplikujeme jedno číslo na druhé (1 + 2 = 1(2) = S( S(S(n)) )).

Druhý postup je množinový a je podobný tomu, co jsme viděli doposud. Na počátku nemáme nic; to charakterizujeme prázdnou množinou ∅ = 0. Nyní máme {∅} = 1, tedy množinu obsahující prázdnou množinu ∅. Teď už máme {0, 1} = {∅, {∅}} = 2, potom {0, 1, 2} = {∅, {∅}, {∅, {∅}}} = 3 a podobně. Podobá se to postupu z prvního odstavce, jen místo počítání toho, co máme, se to celé pokusíme uzavřít do množiny a chápat to jako další známý objekt. Tohle má jednu výhodu oproti předchozím metodám: tento postup má konec, respektive něco, k čemu směřuje. Je to množina {0, 1, 2, 3, 4, …} = ℕ, tedy celá množina všech přirozených čísel. Někdo by to možná mohl považovat za nové číslo... ale to až jindy.

Nyní nám zbývá ještě shrnout, co s přirozenými čísly můžeme určitě dělat. Základní operace je následovník, tedy zvýšení o 1. Můžeme je porovnávat podle toho, kterého ze dvou čísel dosáhneme pomocí následovníka dříve, když začneme na 0. Opakované aplikování následovníka je sčítání a opakované sčítání je násobení. 0 a 1 mají speciální místo: 0 je neutrální prvek pro sčítání (nemění výsledek) a nulový prvek pro násobení (dává vždy stejný výsledek), zatímco 1 je neutrální prvek pro násobení. Nulový prvek pro sčítání neexistuje.

Co s přirozenými čísly nemůžeme dělat? Nemůžeme je odčítat a nemůžeme je dělit; jsou to sice nám dobře známé operace, ale ne pro přirozená čísla: 0 − 1 neexistuje, protože neexistuje žádné přirozené číslo n, pro nějž by platilo n + 1 = 0 – nula přece není následovníkem! Odčítání a dělení jsou tedy „polooperace“; jsou definovány jen pro některé operandy a při každém jejich použití si musíme dávat pozor, jestli to máme dovoleno.

Na závěr ještě poznámka o velikosti množiny přirozených čísel, protože se nám bude hodit příště. Každá množina, která by byla menší než přirozená čísla, už musí být konečná; ℕ je tedy z určitého pohledu nejmenší nekonečná množina. Někoho by sice mohlo napadnout, že třeba {2, 3, 4, …} je menší než {0, 1, 2, 3, 4, …}, když do ní musíme přidat dva prvky, ale ve skutečnosti stačí od každého prvku první množiny odečíst 2 (tady to naštěstí jde) a dostaneme ℕ, aniž bychom museli něco přidávat nebo odebírat. Stejně tak ke každému prvku ℕ stačí přičíst 2 a vrátíme se na první množinu. Když se to dá udělat bez přidávání nebo odebírání, musí obě množiny nutně mít stejnou velikost. Jednou tuto velikost budeme značit ℵ₀, ale na to si ještě počkáme.

Toliko tedy k přirozeným číslům; další články bude spojovat společné téma a sice pokus o dodefinování odčítání a dělení, aby se z nich staly opravdové (bezpečné) operace. Čekají nás čísla celá.

Poznámka: Množinový způsob konstrukce přirozených čísel není zdaleka jediný možný; někoho by třeba mohlo napadnout jednodušší S(n) = {n} (namísto S(n) = n ∪ {n}). V principu to jde, ale narozdíl od hezkého důsledku klasické množinové konstrukce by se musela množina ℕ definovat separátně a posloupnost jejích prvků by se blížila k něčemu, s čím by klasické teorie množin měly docela problém.

středa 5. května 2021

O číslech, část 0: Filosofie matematického univerza

Výzkumy či obecně jakékoliv kreativní procesy ve vědních oborech se dají rozlišit tím, jestli na jejich konci stojí něco nového, tedy produkt invence, či něco starého, objev nebo podrobnější popis již existující skutečnosti. Ve všech vědních i nevědních oborech můžeme s jistotou určit, která z těchto možností nastala: biolog se bude snažit objevit nový živočišný druh pravděpodobněji než nějaký vytvořit, architekt bude naopak spíše tvořit nové plány než jezdit po světě a hledat plány existujících budov, stejně tak jakýkoliv umělec. Ve všech případech můžeme s jistotou tvrdit, jestli daná skutečnost je produktem lidskému umu, ať už dnes nebo před tisíciletím, nebo zdali se jedná o tvorbu přírody a vlastnost okolního vesmíru, dosud neznámé částice, prvky nebo molekuly, síly a jiné jevy.

Až na matematiku. Zde panují filosofické spory mezi účastníky, jestli všechny objekty, které jsou cílem matematického zkoumání, opravdu existují a jestli existovaly vždy od počátku jsoucna nebo byly zkonstruovány někdy později. Na tuto otázku se asi nedá definitivně odpovědět, ale rád si představuji, že celá matematika i logika, vše abstraktní a konceptuální, existuje nezávisle na nás a dokonce nezávisle na našem vesmíru. Ať už to znamená cokoliv, myšlenka může existovat nezávisle na mysliteli, nezávisle na čase.

Z tohoto pohledu vše, co kdy bylo i bude předmětem matematického zkoumání, jak na Zemi tak na jiných planetách, je matematické univerzum. To existuje nezávisle na čemkoliv jiném a je tedy neměnné a my, rozumem nadaní smrtelníci, do něj můžeme díky této schopnosti přistupovat. "Nepřirozené" koncepty jako nekonečna, komplexní čísla, kvaterniony apod. existovaly dávno před jejich objevením stejně jako třeba elektřina nebo gravitace, proto i jejich objevitelům a pozorovatelům též náleží veškeré pocty, ale stejně jako libovolný bod v rovině i ony tu byly ještě dříve, než je někdo pojmenoval a definoval.

Tato série článků bude sloužit jako průvodce matematickým univerzem, který všem představí, co zde lze najít. Ačkoliv nerad, musím se zde omezit jen na to, co bylo objeveno jinými, ale lidská pouť poznáním nekončí, a tak ani tato série nemůže být nikdy ukončena.

Podíváme se na entity, které se v matematickém univerzu nacházejí v každém koutu, které stojí na počátku matematického poznání každého člověka a které lze vypozorovat i okolo nás. Podíváme se na čísla.

Ačkoliv to může leckoho překvapit, matematika žádný pojem "číslo" nezná. Důvod je jechnoduchý: takový pojem je příliš obecný na to, aby se z něj dalo vyvodit něco užitečného, a zároveň by bylo nebezpečné jej používat, protože si pod ním každý představí něco jiného. Pojmy "přirozená čísla", "racionální čísla", "reálná čísla", "komplexní čísla" apod. musíme chápat neoddělitelně jako sousloví a nikoliv vyříznutí z nějakého všeobjímajícího číselného univerza.

Co jsou tedy čísla? Intuitivně (a lingvisticky) je to něco, s čím dokážeme počítat, očekáváme od nich nějaké základní operace, alespoň sčítání a násobení s tím, že se budou nějak rozumně chovat. Když už ne nic jiného, 0 a 1 by tam měly patřit.

Matematikovi by ovšem taková definice nestačila. Co je sčítání a násobení, co je 0 a 1? Symboly +, ×, 0, 1 známe a používáme, ale kdybychom místo nich psali ∧, ⊙, ⏊, ⏉ a vše ostatní fungovalo stejně, nemůžeme je přece vyřadit z naší definice. Musíme být připraveni na izomorfismus, tedy na situaci, kdy máme před sebou dvě fundamentálně stejné entity, ale pouze jinak pojmenované. Jiné jazyky, jiné civilizace mohou používat jiné symboly, ale důležité je to, co se pod nimi skrývá.

V dalších článcích z této série se už od filosofie víceméně odprostíme a budeme se věnovat konkrétním číselným oborům. První budou přirozená čísla, jež se mohou sice zdáti nudná, ale zároveň jsou nejdůležitější a představují základ všeho ostatního. Na závěr se ještě pokusím o matematicky znějící definici čísel: číslo je cokoliv, co patří do oboru, který bývá nebo bude zvykem nazývat "nějaká čísla" (v nějaké rozumné skupině lidí). Čas nám bohužel nikdy nedovolí všechny poznat.

neděle 21. března 2021

Mocninná závislost a cejní anomálie

V dnešní době se všude mluví o exponenciálním růstu, který vykazují různé systémy s iterativním vývojem, ale mezi exponenciálním a lineárním růstem je ještě jeden důležitý typ růstu a sice mocninný. Ten se zpravidla objevuje všude, kde se srovnávají běžné veličiny, jejich prostorová závislost, a v podstatě dominuje celé fyzice.

Napřed něco málo k růstu obecně. Je tím myšlena rostoucí hodnota nějaké závislé veličiny na jiné veličině. Spousta těžkých problémů v informatice má například jednoduché řešení, ale s exponenciální složitostí, což v praxi znamená, že pokud se třeba zvýší velikost nějaké struktury, kterou zpracováváme, o 1, čas, který celý proces zabere, vzroste 2×. To moc fajn není (jako tomu u exponenciálního růstu bývá), protože (z opačného pohledu) významné zlepšení našeho procesoru nám umožní zpracovat jen o trochu více dat.

Nyní hádanka. Máme-li krychli s nějakou délkou strany, jak se změní objem krychle, pokud všechny strany zvětšíme třikrát (tedy nová délka bude trojnásobek původní)?

 

Správná odpověď je 27krát. Pokud jste odpověděli něco jiného, bude lepší si občas zopakovat geometrii, ale žádné strachy, většina lidí stejně intuitivně zvládá jen závislost lineární. Ta je taky nejjednodušší: x-násobná změna vstupu odpovídá x-násobné změně výstupu. Oproti tomu v případě mocninné závislosti je výstup změněn xk-krát, kde k je konstanta konkrétní závislosti.

Pokud je k celočíselné, dostáváme speciální případ takzvané polynomiální závislosti, která třeba pro k = 2 by vypadala takto: y = ax2 + bx + c. Ve fyzice se s obecně polynomiální závislostí nesetkáme prakticky nikdy, protože každý ze členů by měl jinou jednotku a to sčítat nelze. Proto si tedy vystačíme většinou jen s mocninnou závislostí s předpisem y = axk (parametr a ovlivňuje pouze zvětšení celé křivky, nikoliv tvar). Členy s nižším exponentem mají navíc specifický efekt na tvar křivky – absolutní člen (bez x) křivku svisle posouvá, zatímco lineární člen určuje počáteční sklon a ani jedno nemá znatelný vliv na růst (tomu dominuje člen s nejvyšším stupněm).

Mnoho geometrických, fyzikálních i biologických veličin odpovídá mocninné závislosti. Obsah i objem závisí takto na délce (k = 2 a 3), kinetická energie závisí na rychlosti (k = 2) a hmotnost člověka závisí na výšce (k = 2). Poslední pozorování vychází ze vzorce pro výpočet BMI, kde onen index není nic než parametr a ze vzorce (x je výška a y je hmotnost). O parametru k můžeme navíc v určitém smyslu hovořit jako o rozměru/dimenzi jedné veličiny v závislosti na druhé (jako objem je trojrozměrný oproti délce).

Případ BMI je docela zajímavý, neboť je i vcelku neintuitivní. V homogenní látce je hmotnost závislá na objemu (přes hustotu) lineárně, takže se dá říct, že má dimenzi 3 oproti délce. V případě lidského téla má však dimenzi stejnou jako jeho povrch.

Na závěr biologická zajímavost. Celý můj zájem o mocninnou závislost způsobilo studium ryb a jejich hmotnost v závislosti na délce. Zjistil jsem (podle dat odsud) zajímavou věc: v podstatě všechny ryby mají vcelku pravidelnou mocninnou závislost (s exponentem okolo 3, což bych očekával), jako například kapr s k = 3,1469:

Všechny až na cejna. Nevím, zda se jedná o chybu v datech, ale na cejní hmotnost mocninná závislost nestačí:

Doposud jsem nezjistil, co tuto cejní anomálii způsobilo.

středa 8. dubna 2020

Procenta nefungují

I narazil jsem náhodou na jeden lehký příklad z matematiky s ekonomickým nádechem (takže by mohl být i trochu praktický). Začínal takto:

Roční míra inflace je 5 %. To znamená, že za rok bude všechno zboží stát o 5 % více a tedy si (se stejnou sumou peněz) toho budeme moci koupit o 5 % méně než nyní.

Smyslem příkladu bylo představit si, kolik bychom měli mít peněz tento rok, abychom na tom byli stejně jako s původním obnosem, ale po roce. Kladná míra inflace totiž značí, že kupní síla peněz klesá, takže i když budeme mít pořád 1000 Kč, po roce budeme chudší (proto obchody zvyšují ceny, aby nezchudly). Můžete si zkusit tento příklad zodpovědět a zjistit tedy, jak vlastně klesne kupní síla.


Správná odpověď je 952,38 Kč. Pokud vše stojí o 5 % více, stojí to vlastně 1,05× více a tedy za rok vlastně máme 1,05× méně peněz (vzhledem k jejich kupní síle). Výsledek je 1000 Kč ÷ 1,05. Jenomže v zadání je jedna zavádějící nepřesnost, která nám umožňuje je interpretovat i jiným způsobem a dojít k jinému výsledku. Ona nepřesnost bude lépe patrná, jakmile změním čísla, která se zdála býti stejná:

Roční míra inflace je 100 %. To znamená, že za rok bude všechno zboží stát o 100 % více a tedy si (se stejnou sumou peněz) toho budeme moci koupit o 100 % méně než nyní.

„O 100 % více“ je jen zbytečně komplikované vyjádření faktu, že vše bude stát dvakrát více (tedy dvakrát tolik co teď). Ale „o 100 % méně“ je zcela jiná situace – je to 0, ať byla původní hodnota jakákoliv. V původním zadání mělo být, že si budeme moci koupit o 4,76 % méně, než nyní, protože to je přesnější hodnota (ale mohla být zaokrouhlena na 5 %, takže nemůžeme vyloučit, že se jednalo o chyták, i když to by způsobilo celý interval správných hodnot, pokud i skutečná inflace mohla být zaokrouhlena).

Mohli bychom vinit autory zadání z neznalosti matematiky a správného chování procent a postesknout si nad upadající kvalitou školství (nebo si zanadávat, že dávají chytáky na taková pitomá místa, a nad upadající kvalitou školství si postesknout jen z principu), ale nebylo by spíše lepší najít něco, co by mohlo fungovat lépe? Procenta totiž nefungují. Násobení procenty je ještě v pořádku (5 % ze 100 Kč = 5 % × 100 Kč = 0,05 × 100 Kč = 5 Kč) a vykazuje normální chování násobení, ale co sčítání?

100 + 5 % = 100 × 1,05 = 105
100 + 10 % = 100 × 1,10 = 110
100 + 5 % + 5 % = 100 × 1,05 × 1,05 =  110,25
100 + 5 % − 5 % = 100 × 1,05 × 0,95 = 99,75
 100 + 200 + 5 % = 100 + 200 × 1,05 = 315
100 + 5 % + 200 = 100 × 1,05 + 200 = 305

Sčítání procent není ani komutativní, ani asociativní a odčítání není opačná operace k přičítání. Dá se říct, že „+“ a „−“ si ani nezasluhují, aby se jim v tomto případě říkalo sčítání a odčítání. A pokud byste si říkali, že takhle divně se to chová jen v situacích, kdy přičítáme procenta k hodnotě s jinou nebo žádnou „jednotkou“, stačí si vzpomenout, jaké zmatky panují při sčítání procent samotných:

50 % + 50 % = 50 % × 1,50 = 75 %
50 % + 50 % = 100 %

Z tohoto důvodu se musely zavést procentní body, na které ale stejně všichni raději zapomínají, takže zmatek trvá.

Existuje tedy nějaký lepší způsob či nějaká lepší „jednotka“, která by se dala použít k vyjádření změny velikosti, měla by stále stejný přičítací a odčítací charakter, ale chovala by se aspoň trochu konzistentněji?

Ano, třeba decibel. Přestože vznikl původně pro použití při měření intenzity zvuku a jiných signálů, jeho definice je platná kdekoliv, kde se vyskytuje nějaký poměr hodnot, neboť je to prostě desetinásobek logaritmu (při základu 10) takového poměru. Máme-li nějakou kladnou hodnotu, kterou můžeme použít pro upevnění stupnice (třeba hranice slyšitelnosti u zvuku), pak můžeme v decibelech vyjádřit jakoukoliv jinou kladnou hodnotu z téhož rozměru pomocí poměru ku danému základu.

Základní hodnota (odpovídající 0 dB) není ani potřeba, pokud chceme jen vyjádřit změnu oproti původní hodnotě, stejně jako u procent. Výhodou decibelů je však narozdíl od procent fakt, že se pohybujeme v logaritmické škále, takže sčítání a odčítání v této škále je ekvivalentní násobení a dělení v lineární škále:

100 + 10 dB = 100 × 101 = 1000
100 + 20 dB = 100 × 102 = 10000
100 + 1 dB = 100 × 100,1 = 125,89
100 − 10 dB = 100 × 10−1 = 100 × 0,1 = 10
100 + 10 dB − 10 dB = 100 × 10 × 0,1 = 100
100 + 5 dB + 5 dB = 100 × 100,5 × 100,5 = 1000

Decibely se prostě chovají mnohem ukázněněji, když dojde na vlastnosti operací. Zároveň už také nikoho nenapadne vyjádřit změnu růstu v decibelech pomocí decibelů, takže i tomuto zmatku lze předejít. Kromě toho nám logaritmická stupnice umožňí vyjádřit i velmi vysoké (či nízké) řády pomocí rozumných hodnot. A pokud bychom snad potřebovali větší přesnost, můžeme použít centibely (zvýšení o 5 % by bylo zhruba o 2 centibely). Jediná jejich nevýhoda pak je už jen v tom, že z hlavy lze vypočítat poměr jen pro celé bely (jako celé mocniny 10), ale dnes má přeci u sebe kalkulačku každý.

Logaritmická stupnice má přesně ty výhody, které jsou potřeba, aby práce s těmito jednotkami byla intuitivní a konzistentní, ale základ 10 má jednu nevýhodu – přestože jsme schopni vyjádřit desetinásobné, stonásobné, tisícinásobné atd. zvětšení, možná by to chtělo základ, který by vytvořil jednotku podobnější procentům, aby třeba zvýšení či snížení o 1 až 5 % bylo nějak analogicky vyjádřitelné, pokud to vůbec jde.

První nápad je vzít místo základu 10 základ 1,01, tedy tolik, kolik dostaneme přičtením 1 % k 1. Sice nedostaneme zcela stejné hodnoty, ale 1,015 je pořád ještě dost blízko 1,05 pro běžné zaokrouhlování. Problémem tohoto přístupu ovšem je to, že jsme příliš vázáni na ono jedno procento, a navíc ještě pouze na zvyšování – 1,0110 je blízko 1,1, ale 1,01−10 už se na 0,9 nezaokrouhlí (taky bychom jako základ mohli vzít 0,99, pak by to šlo, ale zase 0,99−10 není blízko 1,1).

Chce to něco mezi 1,01 a 0,99−1, aby byla jistá rovnováha mezi kladným a záporným rozdílem. Ono ideální číslo najdeme, když si uvědomíme, že chceme pro hodnoty blízké nule, aby se funkce ax chovala stejně jako 1 + x %. Jenom jedné exponenciální funkci je 1 + x tečnou v nule, a to je ex. Je to tedy Eulerovo číslo (méně známý kamarád Ludolfova čísla), které představuje onen ideální základ, respektive v tomto případě jeho stá odmocnina (která je překvapivě blízko průměru 1,01 a 0,99−1).

Jakmile víme, že stačí základ e (nebo jeho mocnina), můžeme sáhnout po už používané jednotce zvané neper (a opravdu nemyslím prací prášek). Ta funguje stejně jako bel, akorát místo dekadického logaritmu je použit přirozený logaritmus, tedy o základu e. Setina této jednotky je tedy centineper (cNp) a je to právě ta jednotka, kterou je ideální použít v případě, kdy chceme hovořit o malých rozdílech (jinak řečeno x + y Np = x × ey ≈ x + y pro malé y).

Tím jsme tedy našli jednotku, která je dokonalou opravou procent. Protože název centineper je trochu těžkopádný, navrhuji ho zkracovat na centil. Na závěr ještě přikládám tabulku, jaké procentuální změně přibližně odpovídá změna v centilech.

cNp %
−15 −13,9292
−14 −13,0642
−13 −12,1905
−12 −11,3080
−11 −10,4166
−10 −9,5163
−9 −8,6069
−8 −7,6884
−7 −6,7606
−6 −5,8235
−5 −4,8771
−4 −3,9211
−3 −2,9554
−2 −1,9801
−1 −0,9950
+1 +1,0050
+2 +2,0201
+3 +3,0455
+4 +4,0811
+5 +5,1271
+6 +6,1837
+7 +7,2508
+8 +8,3287
+9 +9,4174
+10 +10,5171
+11 +11,6278
+12 +12,7497
+13 +13,8828
+14 +15,0274
+15 +16,1834

Od −10 cNp do 9 cNp je alespoň zaokrouhlená změna v procentech stejná, a navíc čím víc se rozdíl blíží k 0, tím se obě hodnoty přibližují. Díky tomu můžeme bez obtížní nahradit i promile (‰) za milinepery (mNp) a klidně i promyrie (‱) za myrionepery (moNp). No není to pěkné?

středa 16. října 2019

Zajímavost: nadace

V češtině, jak tomu již u neizolovaných jazyků bývá dobrým zvykem, je nezanedbatelné množství cizích slov. Velká část těchto slov má latinský původ; jsou to slova jako operace, pozice, gravitace, exekuce, populace, fixace apod. (a samozřejmě i jinak zakončená slova, ale přípona -ce je pro tento článek momentálně relevantní).

Přípona spojující všechna tato slova měla v latině podobu -tio a používala se pro vytvoření podstatného jména představujícího nějakou činnost či její výsledek. Etymologie jí dokonce přisuzuje příbuznost s českou slovesnou koncovkou -t/-ti a její ekvivalenty se dají najít i v jiných indoevropských jazycích, byť pouze ve slovanských a románských jazycích je stále produktivní (pokud není přejatá).

Jak již název tohoto článku napovídá, zaujalo mě slovo nadace. Díky latinské příponě zní velmi vznešeně, ba skoro odborně, ale přesto, když se nad ním zamyslím, něco mi na něm nesedí. Výše uvedený seznam cizích slov má totiž svoje (zpravidla téměř doslovné) ekvivalenty i v jiných jazycích, kam se dostaly podobně jako do češtiny (např. anglické operation, position, gravitation atd.), ale nadace je anglicky foundation (tomu by byl český ekvivalent fundace) a neznám ani jiná příbuzná slova např. ve vztahu podobném jako operace – operovat. K jakému spiknutí zde dochází?

Inu, ukradneme-li slovu nadace jeho latinskou příponu, odhalíme za ní skryté zcela obyčejné české sloveso nadáti (z nějž známe dnes nadávat nebo nadání), které bylo pouze účinně zamaskováno (Rejzek uvádí, že tak vzniklo nejspíš kontaminací se slovem donace). Všem puristům natruc tak v češtině máme slovo s domácím kořenem, ale cizí koncovkou a nikomu to nevadí. Koneckonců to není jediný příklad, houslista je na tom stejně („správně“ by to byl houslař nebo violinista), patrně opět kontaminací se slovy pianista, basista či podobnými.

I napadlo mě zjistit, jestli se někdo náhodou nedopustil toho překladatelského hříchu, že omámen iluzí mezinárodního slova nepoznal český původ slova nadace a jal se ho překládat doslovně. Nu... dopustil a nejen jednou. Trochu mně z toho krvácejí oči, byť to je hezký pokus o export českého slova, ale pramení z ignorance a lenosti a to nemůže ospravedlnit. Dokonce jsem našel i zmínky o die Nadation v němčině, ale ani celkově toho moc není (a všechno samozřejmě na cizojazyčných verzích českých stránek).

sobota 17. srpna 2019

Programovací a skriptovací jazyky

Počítačových jazyků dnes existuje nepřeberné množství, proto bývá užitečné je seskupovat do různých kategorií podle míry abstrakce, využití, způsobu běhu apod. Jedním z nich je i rozdělení jazyků na programovací a skriptovací (pojem "programovací jazyky" může být brán obecně jako všechny jazyky i konkrétně jako opak skriptovacích).

Jak už to tak bývá, i toto rozdělení je vcelku vágní. Už jsem viděl situace, kdy byl třeba jazyk C (drtivě programovací) použit pro psaní skriptů nebo kdy v JavaScriptu (převážně skriptovacím jazyce) byly napsány velké programy. Obecně se dá říct, že jazyky programovací jsou určené pro psaní programů, zatímco skriptovací jsou určené pro psaní skriptů, ale některé lze použít i pro druhý účel.

Jenomže jsme si tím moc nepomohli, neboť už ani samotné pojmy program a skript nejsou dobře definované. Program bývá tradičně izolovaný kus kódu, který může běžet samostatně, zatímco skript běží v rámci nějakého prostředí. Problém ale nastane, když si uvědomíme, že i programy vlastně běží pod operačním systémem, se kterým musejí komunikovat (pomocí API), takže i v jejich případě existuje nějaké prostředí. Můžeme z možných prostředí odstranit operační systém, ale co virtuální běhové prostředí .NET a JRE pro C# a Javu? Je kód v Lue, PHP či Haskellu, spuštěný v korespondujícím interpretru, stále program, či už skript? A co kus JavaScriptu spuštěný prohlížečem na webové stránce?

Napadlo mě, že bych tyto pojmy definoval přesněji, což by možná pomohlo při klasifikaci některých jazyků. Podle mé nové definice je program kód, jehož části mohou být vykonávány jen současně s jeho tělem. Tělo je pak hlavní procedura celého programu, s jejímž začátkem program vzniká a s jejímž koncem program zaniká. Když skončí tělo programu, už z něj nic nezbyde.

Oproti tomu skript po sobě často něco zanechává. Obsluha webové stránky v JavaScriptu či herní kód v Lue často reaguje na určité podněty generované prostředím, jejichž kód bývá vyvolán i poté, kdy skončí tělo skriptu.

Kupříkladu aplikace, která při spuštění vytvoří okno kalkulačky, reaguje na stisknutí tlačítek a počítá výsledky operací, je program, pokud součástí kódu je nějaká hlavní procedura, na jejímž začátku okno ještě neexistuje a na jejímž konci je už okno definitivně zavřené. Pokud hlavní procedura chybí (uživatelský kód jej neinicializuje), musí logicky existovat nějaké řídící prostředí, které se postará o jeho vytvoření. To zní trochu ezotericky, ale webová kalkulačka je perfektní příklad takového případu: webový prohlížeč (zde program) vytvoří reprezentaci stránky (pomocí deklarativního HTML) a poté spouští různé kusy kódu v JavaScriptu v závislosti na tom, co uživatel na stránce udělal. Pokud by existovalo nějaké newebové prostředí, které by fungovalo stejně (např. WPF neumožňující metodu Main), nebyl by v tom žádný rozdíl.

Pokud bych do své kalkulačky přidal podporu pluginů/zásuvných modulů, které bych informoval o všem, co se v kalkulačce děje (pomocí událostí), stává se moje aplikace prostředím pro skripty, ať jsou psané v C++ nebo Lue. Pokud by ale nějaký plugin převzal řízení nad aplikací (např. vytvořil modální okno), kde by kupříkladu kreslil grafy, stane se z něj program. Řízení klidně může předávat aplikaci zpět (koneckonců to samé dělá multitasking v OS), ale jeho průběh musí být jasně určen tělem.

Toto rozlišení nám umožní definovat jazyky ryze programovací (musí obsahovat tělo, které podmiňuje běh kódu programu) a ryze skriptovací (nemohou obsahovat tělo; vše je řízeno obsluhou událostí). Pokud bych vynutil v jazyce C funkci main, bude to jazyk ryze programovací, neboť vše v něm definované musí na jejím konci zaniknout. Naopak pokud bych v Lue zabránil vykonávat příkazy mimo funkci (např. tím, že globální prostředí poskytnu až po skončení těla skriptu) kromě inicializace se nebude moci takový skript nijak navenek projevovat, a tedy takový jazyk bude ryze skriptovací.

Jak je patrné z příkladů, reálné jazyky zapadají někam mezi tyto dvě kategorie. I programovací jazyk C++ mohu použít jako skriptovací v jiném programu tak, že spustím kompilátor, za běhu dynamicky načtu výsledek a zavolám v něm exportované funkce, a stejně tak interpretr JavaScriptu můžu spustit na kódu tak, že zanikne, jakmile skončí jeho tělo.

Skutečnost se má tak, že mnohdy to, zdali je nějaký jazyk programovací či skriptovací, závisí na konfiguraci prostředí. Operační systém či interpretr Luy jsou programy určené ke spouštění jiných programů a tak s nimi zacházejí, zatímco webový prohlížeč či hra je prostředí určené ke spouštění skriptů.

Příklad jazyka, který by se dal označit za hybridní, je Pawn. Ačkoliv je staticky typovaný, kompilovaný a má funkci main (tedy obsahuje rysy programovacích jazyků), je primárně určen pro psaní vnořeného kódu pro existující systémy, tedy pro psaní skriptů. Vstupní body v Pawnu jsou všechny veřejné (exportované) funkce a funkce main, přičemž má-li kód pouze veřejné funkce (a nikoliv main), jeho běh je zcela řízen prostředím a tudíž se jedná o skript, zatímco pokud kód má pouze funkci main, má jen jediný možný průběh a jedinou možnost, jak se projevit, a tudíž se jedná o program.

Tato definice není nikterak absolutní a jako podobné definice těchto termínů nemusí být ani tak užitečná, ale podle mého názoru je rozhodně zajímavé přemýšlet o návrzích jazyků z různých úhlů pohledu, zvláště když to určuje, na co se jazyky dají použít a na co nikoliv.

Na závěr je ještě nutno dodat, kam patří jazyky jako HTML či XML. Nikam, protože to nejsou aktivní jazyky, tedy jazyky umožňující zápis kódu, který něco vykonává. Pokud by programy byly na jedné straně škály a skripty na druhé, kód v HTML by přečníval dál za skripty, protože v takovém případě má prostředí absolutní moc nad tím, jak jej interpretovat.
 
Dodatek: Mluvit o webových stránkách v rámci tohoto srovnání je možná trochu nešikovné, protože každá stránka se skládá z mnoha komponent, kde ty aktivní nemají zdaleka tak velkou váhu, jako tomu bývá u klasických programů. Kód v HTML, CSS i JS existuje v rámci jednoho celkového programu, který vzniká otevřením stránky a zaniká jejím zavřením, ale ačkoliv zde prohlížeč figuruje podobně jako OS spuštěním tohoto programu, zároveň ho i (narozdíl od OS) také vytváří z poskytnutých součástí.

Druhý dodatek: Mimo toto rozdělení stojí i některé kódy, které se též tradičně nazývají programy, například lineární programy. Ty stojí na stejném místě jako XML, protože pouze popisují proměnné a jejich vztahy a slouží jen k vybudování nějakého objektu.