O makrech, která umí aritmetiku s velkými čísly Macros Which Handle Arithmetics with Big Numbers KMa PřF OU Brejlov.. 0
O makrech, která umí aritmetiku s velkými čísly Reprezentace čísel Representation of Numbers PrintForm A = Vhodné pro vstup a výstup pro uživatele Suitable for user input and output CsForm a 0 A = a n B n, B = 000, n= a 0 =, a =, a =, a =. Vhodné pro provádění operací Suitable for performing operations / BACK
Macros Which Handle Arithmetics with Big Numbers Reprezentace čísel Representation of Numbers PrintForm A = Vhodné pro vstup a výstup pro uživatele Suitable for user input and output CsForm a 0 A = a n B n, B = 000, n= a 0 =, a =, a =, a =. Vhodné pro provádění operací Suitable for performing operations / BACK
O makrech, která umí aritmetiku s velkými čísly Reprezentace v TEXu Representation in TEX \sub a[0] =, \sub a[] =, \sub a[] =, \sub a[] =. Implementace \let\ea\expandafter \def\name#{\csname#\endcsname} \def\nameedef#{\ea\edef\csname#\endcsname} \def\sub#[#]{\name{##}} \def\subedef#[#]{\nameedef{##}} Implementation \subedef a[0]{} \subedef a[]{} \subedef a[]{} \subedef a[]{} \sub a[] \name{a} \csname a\endcsname a / BACK
Macros Which Handle Arithmetics with Big Numbers Příklad sčítání Example Addition p 0 p 0 p 0 P = p n B n, Q = q n B n, P + Q =: R =: r n B n. n= n= n= Algoritmus Algorithm r n = p n + q n, n =,..., p 0 \cnta=0 \loop \ifnum\cnta<\sub p[0] \advance\cnta \cntb=\sub p[\the\cnta] \advance\cntb \sub q[\the\cnta] \subedef r[\the\cnta]{\the\cntb} \repeat V TEXu In TEX / BACK
O makrech, která umí aritmetiku s velkými čísly ArrayForm A = ;;;; A = ;;;0; Celé číslo je uloženo v jednom makru. To je nutné pro přenos hodnot mezi funkcemi. Převod z/do CsForm je rychlý. Number is entirely saved in one macro. This is necessary for carrying values between functions. Conversion from/to CsForm is fast. / BACK
Macros Which Handle Arithmetics with Big Numbers function f:integer; var A:integer; begin A:=; write(a); end; var A,B:integer; begin A:=; B:=f; write(a); end. Lokální definice Příklad v Pascalu Local Definitions Example in Pascal / BACK
O makrech, která umí aritmetiku s velkými čísly Příklad v TEXu Example in TEX \def\a{} \def\a{} \A \endgroup \A Nelokálnost v Pascalu Nonlocality in Pascal / BACK
Macros Which Handle Arithmetics with Big Numbers Příklad v TEXu Example in TEX \def\a{} \def\a{} \endgroup \A \endgroup \A Nelokálnost v Pascalu Nonlocality in Pascal / BACK
O makrech, která umí aritmetiku s velkými čísly Příklad v TEXu \def\a{} \def\a{} \ea\endgroup\ea\def\ea\a\ea{\a} \A \endgroup \A Nelokálnost v Pascalu Example in TEX Nonlocality in Pascal / BACK
Macros Which Handle Arithmetics with Big Numbers Příklad v TEXu \def\endgroupdef#{\ea\endgroup\ea\def\ea#\ea{#}} Example in TEX \def\a{} \def\a{} \EndGroupDef\A \A \endgroup \A Nelokálnost v Pascalu Nonlocality in Pascal / BACK
O makrech, která umí aritmetiku s velkými čísly Příklad v TEXu \def\endgroupdef#{\ea\endgroup\ea\def\ea#\ea{#}} Example in TEX \def\a{} \def\a{} \EndGroupDef\A \A \endgroup \A Nelokálnost v Pascalu function f(x:integer):integer; begin f:=x*x end; write(f()); Nonlocality in Pascal / BACK
Macros Which Handle Arithmetics with Big Numbers Volání funkcí Konstrukce pro volání funkcí je \SET\b\POWERMOD()[0;0;;;]<\a> Argumenty jsou makru \SET předávány v Function Calls Construction for calling functions is Arguments are passed to macro \SET in (PrintForm) [ArrayForm] <CsForm> Předchozí konstrukce se musí expandovat na \POWERMOD{;;}{0;0;;;}{;0;0;0;} \edef\b{\result} \EndGroupDef\b Vstupem každé funkce jsou argumenty v ArrayForm. Výsledek funkce je uložen v ArrayForm do makra \result. The above construction must be expanded to All arguments are passed to functions in ArrayForm. Result of a function is stored in ArrayForm to macro \result. / BACK
O makrech, která umí aritmetiku s velkými čísly \newcount\i \def\set##{ \def\res{#}\def\fun{#} \GetArity\j\fun \def\args{} \i=0 \GetArgs} \def\getargs{ \ifnum\i<\j \advance\i \ea\getarg \else \ea\call \fi} \def\call{ \ea\fun\args \ea\edef\res{\result} \ea\endgroupdef\res} Implementace Implementation / BACK
Macros Which Handle Arithmetics with Big Numbers Makro \GetArg musí zvládnout volání \GetArg() \GetArg[] \GetArg<> \def\getarg#{\name{ga#}} \namedef{ga(}#){ \edef\arg{#} \PrintToArray\arg\arg \AddArg} \namedef{ga[}#]{ \edef\arg{#} \AddArg} \namedef{ga<}#>{ \CsToArray#\arg \AddArg} \def\addarg{ \edef\args{\args{\arg}} \GetArgs} Implementace Macro \GetArg must handle calling Implementation / BACK
O makrech, která umí aritmetiku s velkými čísly Příklady Modulární násobení Examples Modular multiplication # # mod # \SetArity\MULTIPLYMOD \def\multiplymod###{ \SET\argA\MULTIPLY[#][#] \SET\argA\DIVIDE[\argA][#] \edef\result{\ea\secondoftwo\arga}} Výpis z log souboru při výpočtu Log file after computation mod Depth SET \a:=\multiplymod(;;0;)(;;;00;)(;;000;) Depth SET \arga:=\multiply[;;0;][;;;00;] Depth SET \arga:=\divide[;;;;;][;;000;] Depth SET \argd:=\multiply<;;000;>[;;] Depth SET \argd:=\multiply<;;000;>[;;] Depth SET \argd:=\multiply<;;000;>[;;] / BACK
Macros Which Handle Arithmetics with Big Numbers Ackermannova funkce Ackermann s function n + m = 0 A(m, n) = A(m, ) m > 0 n = 0 A(m, A(m, n )) m > 0 n > 0 \SetArity\ACKERMANN \def\ackermann##{\def\tmpa{0;} \def\tmpb{#} \ifx\tmpa\tmpb \SET\result\ADD[#]() \else \def\tmpb{#} \ifx\tmpa\tmpb \SET\argA\SUBTRACT[#]() \SET\result\ACKERMANN[\argA]() \else \SET\argA\SUBTRACT[#]() \SET\argB\SUBTRACT[#]() \SET\argB\ACKERMANN[#][\argB] \SET\result\ACKERMANN[\argA][\argB] \fi \fi} / BACK
\bye www.osu.cz/ ~ sustek