Faktoriál velkých čísel

Úvod do problematiky

Pro řadu kapesních kalkulátorů (a nejen staršího data výroby) platí omezení maximální hodnoty zadané funkci výpočtu faktoriálu. Příčinou je dvojciferný desítkový exponent pro semilogaritmické zobrazení výsledků. Typickou nejvyšší vstupní hodnotou je číslo 69, neboť 70! = 1.19785717E100. Novější kousky od Hewlett Packard (míněno mladší než 20 let, tedy ty z řady Pioneer HP-42s, HP-32sII, ..., nebo ještě mladší HP-33s, HP-35s) operují s exponentem třímístným, v důsledku čehož se omezeni odsouvá k hodnotě výsledku 9.9999E499. Pokud by však někoho zajímala hodnota faktoriálu pro čísla větší než 253 (toto číslo právě proto, že 253! = 5.1735E499), může použít Stirlingovu asymptotickou řadu pro faktoriál. Má tento tvar:
n!  =   2 π n  (n / e)n  (A0 n0  +  A1 n-1  +  A2 n-2  +  A3 n-3  +  ...  +  Ak n-k).
kde
A0  =   1,
A1  =   1/12,
A2  =   1/288,
A3  =   –139/51840
a evidentně platí
A2 / n²  =   (A1 / n¹)² / 2.

Aby bylo možno výsledek výpočtu n! zobrazit na "jakékoliv kalkulačce", je ho třeba rozdělit na dvě části semilogaritmické notace x = b 10q, a ty zobrazit jako dvě samostatná čísla. Výraz s asymptotickou řadou je tedy zlogaritmován a rozdělen na dílčí kroky výpočtu:
S  =   A3 / n³  +  A1 / n  +  (A1 / n)² / 2  +  1,
L  =   log √2 π n  +  n log(n / e)  +  log S,
B  =   10frac(L),
Q  =   int(L),
n!  =   B 10Q.

Nutno ještě podotknouti, že v polynomu S = ... by měl být obsažen minimálně ještě jeden člen s koeficientem A4 = -571/2488320. Jeho absencí je zaručena přesnost mantisy výsledku na pět desetinných míst. To je přesnost dostačující. Pokud se vůbec někdo bude takovým výpočtem zabývat, bude tak činit zejména proto, aby si udělal přibližnou představu o tom "kolik to asi je". Také formát výstupu (dvě samostatné hodnoty) není příznivě nakloněn dalšímu zpracování. Jinak řečeno: pravděpodobnost, že tento postup někdo použije jako podprogram nějakého vyššího celku, je prakticky nulová.


Řešení č. 1

Budiž konečně přistoupeno k obeznámení s vyhotoveným programem. Zde použitá syntaxe je pro HP-32sII. Neobsahuje však nic, co by nezvládla většina kalkulátorů obdařená RPN. Pokud bude potenciální uživatel brát v úvahu drobné odlišnosti dané různými typy, lze bez uzardění deklarovat naprostou univerzálnost tohoto postupu. Nezávislost na použitém typu kalkulátoru je dána především absencí potřeby větvení programu a také nulovými nároky na využití paměťových registrů. Co je tedy myšleno drobnými odlišnostmi? (1) Samozřejmě definice návěští se liší model od modelu. U některých (byť v minulosti dobře prodávaných typů, např. HP-12C) adresace použitím návěští zcela chybí. (2) Lze se také setkat s větší "spotřebu" programových řádků. Zdaleka ne všechny stroje (včetně skvostů z řady Voyager v čele s vlajkovou lodí HP-15C nebo klenotu konce sedmdesátých let HP-67) číselné konstanty sdružují do jednoho programového řádku, jako to dělá král všech programovatelných kalkulátorů světa HP-41C a jeho mladší příbuzní.

ADDRCODEXYZT
A01LBL An


A02


A03LASTxn

A04-139-139n
A05LASTxn-139n
A06R↑n-139n
A07×-139nn
A085184051840-139n
A09×51840 n³-139nn
A10÷w = A3 / n³nnn
A11x<>ynwnn
A121212nwn
A13×12 nwnn
A141/xu = A1 / n¹wnn
A15+u + wnnn
A16LASTxuu + wnn
A17u + wnn
A1822u + wn
A19÷v = u² / 2u + wnn
A20+u + v + wnnn
A211A0 / n0u + v + wnn
A22+Snnn
A23LOGlog S nnn
A24x<>ynlog Snn
A2511nlog Sn
A26exenlog Sn
A27÷n / elog Snn
A28LOGlog(n / e)log Snn
A29R↑nlog(n / e)log Sn
A30×n log(n / e)log Snn
A31R↓nn log(n / e)log Sn
A32R↓nnn log(n / e)log S
A33+2 nn log(n / e)log S
A34ππ2 nn log(n / e)log S
A35×2 π nn log(n / e)log S
A36SQRT2 π nn log(n / e)log S
A37LOGlog √2 π nn log(n / e)log S
A38+...log S

A39+L


A40IPQ


A41LASTxLQ

A42FPfrac LQ

A4310xLQ

A44RTN



LN=082.0, CK=85B1

Použití programu:
Stisk klávesČinnostDisplay
4 0 0kladné číslo "n" 400_
XEQ Aspuštění programu RUNNING
výsledek: 400! = 6.4035E868, mantisa...6.4035
x<>y ...a exponent 868.0000


Řešení č. 2

Ti, kteří mají s autorem těchto řádků stejnou krevní skupinu, zcela jistě trpí společensky obtížně tolerovatelnou obsesí: nesnesou pomyšlení, že by se jakýkoliv program nedal zkrátit při zachování původní funkce. Ušetřených deset procent z celkového počtu programových řádků nabízí verze pro HP-35s. Množství uspořených bajtů paměti je evidentně zanedbatelné, ale o to tu přeci nejde, že? Šetřit se musí, ať to stojí co chce!
Pozn.: Filuta, který by celý vzorec pro výpočet vměstnal do jediného programového řádku v podobě rovnice (viz EQN), by se na medailových pozicích případného Mistrovství světa v šetření programových řádků neumístil. Jeho řešení nemá nic do činění s RPN a tudíž by to pro pravověrné neznamenalo žádnou výzvu!

ADDRCODEXYZT
A001LBL An


A002


A003LASTxn

A004-0 139/51840A3n
A005LASTxnA3n
A006R↑nA3n
A007×A3nn
A008÷w = A3 / n³nnn
A0090 1/12A1wnn
A010R↑nA1wn
A011÷u = A1 / n¹wnn
A012+u + wnnn
A013LASTxuu + wnn
A014u + wnn
A01522u + wn
A016÷v = u² / 2u + wnn
A017+u + v + wnnn
A0181A0 / n0u + v + wnn
A019+Snnn
A020LOGlog S nnn
A021x<>ynlog Snn
A022eenlog Sn
A023÷n / elog Snn
A024LOGlog(n / e)log Snn
A025R↑nlog(n / e)log Sn
A026×n log(n / e)log Snn
A027R↓nn log(n / e)log Sn
A028R↓nnn log(n / e)log S
A029+2 nn log(n / e)log S
A030ππ2 nn log(n / e)log S
A031×2 π nn log(n / e)log S
A032x2 π nn log(n / e)log S
A033LOGlog √2 π nn log(n / e)log S
A034+...log S

A035+L


A036IPQ


A037LASTxLQ

A038FPfrac LQ

A03910xBQ

A040RTN



LN=143, CK=EA1B

Použití programu:
Stisk klávesČinnostDisplay
4 0 0 kladné číslo "n" 0.0000
400_
XEQ A ENTERspuštění programu
RUNNING
výsledek: 400! = 6.4035E868, exponent v Y-registru...
...mantisa v X-registru
868.0000
6.4035


Vyhodnocení výsledků branného cvičení

Dychtivcům, které problematika zaujala, je určen odkaz na příslušnou stránku v rámci www.hpmuseum.org. Tam se nachází inspirace pro toto cvičení. Na hodnotitelích rekrutujících se z řad dychtivců pak zůstává ocenit efektivitu sestaveného programu.

Závěrem ještě malé zamyšlení určené těm, kterým přes masivní útok předchozích řádků zůstalo všech pět pohromadě: má praktický význam zabývat se výpočty s čísly, jejichž desítkový exponent je mimo rozsah ±20? No, nevím, milé děti, opravdu nevím...