/[dtapublic]/pubs/books/ucbka/trunk/c_xtn0/c_xtn0.tex
ViewVC logotype

Contents of /pubs/books/ucbka/trunk/c_xtn0/c_xtn0.tex

Parent Directory Parent Directory | Revision Log Revision Log


Revision 140 - (show annotations) (download) (as text)
Mon Jul 3 01:59:16 2017 UTC (7 years, 3 months ago) by dashley
File MIME type: application/x-tex
File size: 72668 byte(s)
Change SVN properties for EOL and keyword expansion.
1 %$Header$
2
3 \chapter[\cxtnzeroshorttitle{}]{\cxtnzerolongtitle{}}
4
5 \label{cxtn0}
6
7 \beginchapterquote{``One way to prevent progress is by arguing that any first
8 step is unfair to somebody.''}
9 {Unknown}
10
11 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
13 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
14 \section{Introduction}
15 %Section Tag: INT0
16 \label{cxtn0:sint0}
17
18 The Tcl scripting language provides for \emph{extensions}, which are
19 compiled-in commands added to the language. These extensions have advantages
20 for performance, because they allow the high-frequency interactions to occur
21 in compiled code, and the lower-frequency interactions to occur in
22 a Tcl script.
23
24 This chapter describes the extensions that have been added to the Tcl
25 interpreters which are part of \emph{The Iju Tool Set}.
26
27 Many of the parameter formats are common between the Tcl extensions
28 (described in this chapter) and the DOS command-line
29 utilities (described in Chapter
30 \cdcmzeroxrefhyphen{}\ref{cdcm0}). For this reason, to avoid
31 redundancy of documentation, the parameter formats described
32 in Section \ctinzeroxrefhyphen{}\ref{ctin0:sccl0} apply both to the
33 Tcl extensions
34 and the DOS command-line utilities.
35
36
37
38 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
39 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
40 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
41 \section{Version Control Extensions}
42
43
44 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
45 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
46 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47 \subsection{vcinfo}
48
49 \index{vcinfo@\emph{vcinfo}}
50 \begin{tclcommandname}{vcinfo}%
51 retrieves embedded static version and version control information for
52 IjuScripter or IjuConsole.
53 This allows a script to determine which version of script interpreter it is
54 running under.
55 \end{tclcommandname}
56
57 \begin{tclcommandsynopsis}
58 \tclcommandsynopsisline{vcinfo}{-ijutoolsversion}
59 \tclcommandsynopsisline{vcinfo}{?-crconly? -fileversion filename}
60 \tclcommandsynopsisline{vcinfo}{?-crconly? -extensionversion extensionname}
61 \tclcommandsynopsisline{vcinfo}{-buildmanifest}
62 \end{tclcommandsynopsis}
63
64 \begin{tclcommanddescription}
65 The \emph{vcinfo} command returns information about the version of the
66 IjuScripter or IjuConsole executable program, about the version of
67 a specific source file, or [collectively] about the version of all files
68 which [directly] contribute to the behavior of an embedded Tcl/Tk extension.
69 This command can be used to
70 inquire about the version of the executable program or certain of its
71 components.
72
73 Most commonly, this command is used to help assure reproducibility
74 of a script's behavior by coding a script so that it will
75 run only under a specific version(s) of executable.
76
77 \tclcommanddescsynopsisline{vcinfo}{-ijutoolsversion}
78 \begin{tclcommandinternaldescription}
79 Returns a string identifying the version number of the IjuScripter or IjuConsole
80 executable. The string will be of the form ``vm.nx'', where \emph{v} is the letter
81 ``v'', \emph{m} is the major version number, \emph{n} is the minor version number, and
82 \emph{x} is an optional lower-case letter identifying a service release which fixes defects
83 but adds no new functionality.
84
85 For example, a return value of ``v1.03'' would identify version 1.03. A return
86 value of ``v1.03c'' would identify the third service release to version 1.03; with
87 the service release designed to correct defects present in version 1.03b, but adding
88 no new functionality.
89 \end{tclcommandinternaldescription}
90
91 \tclcommanddescsynopsisline{vcinfo}{-fileversion filename}
92 \begin{tclcommandinternaldescription}
93 (Not yet implemented.) Returns a string with version control information for the file
94 \emph{filename}, which must be part of the IjuScripter or IjuConsole build.
95 An error is generated if a \emph{filename} which is not part of the build
96 is supplied. This form of the \emph{vcinfo} command is not normally used from a script.
97 \end{tclcommandinternaldescription}
98
99 \tclcommanddescsynopsisline{vcinfo}{-crconly -fileversion filename}
100 \begin{tclcommandinternaldescription}
101 (Not yet implemented.) Returns the CRC32 of the the string result of the command above.
102 Note that the value returned is the CRC of the version control information embedded in the file
103 rather than the CRC of the file.
104 \emph{filename} must be part of the IjuScripter or IjuConsole build, and
105 an error is generated if a \emph{filename} which is not part of the build is supplied.
106 This form is
107 useful because it supplies a terse result of eight hexadecimal digits which can easily
108 establish with a probability of about $1-2^{-32}$ that two versions of IjuScripter or IjuConsole
109 have the same file component; or establish with unity probability that they do not.
110 \end{tclcommandinternaldescription}
111
112 \tclcommanddescsynopsisline{vcinfo}{-extensionversion extensionname}
113 \begin{tclcommandinternaldescription}
114 (Not yet implemented.) Returns a string with version control information for all
115 files which contribute directly to the behavior of the Tcl extension \emph{extensionname},
116 which must be part of the IjuScripter or IjuConsole static build.
117 An error is generated if an \emph{extensionname} which is not part of the build
118 is supplied.
119 \end{tclcommandinternaldescription}
120
121 \tclcommanddescsynopsisline{vcinfo}{-crconly -extensionversion extensionname}
122 \begin{tclcommandinternaldescription}
123 (Not yet implemented.) Returns the CRC32 of the the string result of the command above.
124 Note that the value returned is the CRC of the version control information embedded in the file(s)
125 rather than the CRC(s) of the file(s).
126 \emph{extensionname} must be part of the IjuScripter or IjuConsole build, and
127 an error is generated if an \emph{extensionname} which is not part of the build is supplied.
128 This form is
129 useful because it supplies a terse result of eight hexadecimal digits which can easily
130 establish with a probability of about $1-2^{-32}$ that two versions of IjuScripter or IjuConsole
131 have the same extension component(s); or establish with unity probability that they do not.
132 \end{tclcommandinternaldescription}
133
134 \tclcommanddescsynopsisline{vcinfo}{-crconly -buildmanifest}
135 \begin{tclcommandinternaldescription}
136 (Not yet implemented.) Returns the full combined build manifest of IjuScripter and IjuConsole.
137 This includes size and CRC information for every file involved in the build. This form
138 of \emph{vcinfo} is provided for assistance in defect diagnosis.
139 \end{tclcommandinternaldescription}
140
141 \end{tclcommanddescription}
142
143
144 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
145 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
146 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
147 \section{File Transformation Extensions}
148
149
150 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
151 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
152 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
153 \section{CRC, Checksum, And Hash Extensions}
154 %Section Tag: CRC0
155
156
157 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
158 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
159 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
160 \subsection{crc32}
161 %Subsection Tag: CRC0
162 \label{cxtn0:scrc0:scrc0}
163
164
165 \index{crc32@\emph{crc32}}
166 \begin{tclcommandname}{crc32}%
167 generates the CRC-32 of a file or string. This CRC can be reliably used to obtain
168 digital signatures of files or data.
169 \end{tclcommandname}
170
171 \begin{tclcommandsynopsis}
172 \tclcommandsynopsisline{crc32}{filename}
173 \tclcommandsynopsisline{crc32}{-string binarystringval}
174
175 Note: as of 01/01/01, the ``stateful'' forms below are not yet implemented.
176
177 \tclcommandsynopsisline{crc32}{-initialstate}
178 \tclcommandsynopsisline{crc32}{-advancestate state filename}
179 \tclcommandsynopsisline{crc32}{-advancestate -string state binarystringval}
180 \tclcommandsynopsisline{crc32}{-crcfromstate state}
181 \end{tclcommandsynopsis}
182
183 \begin{tclcommanddescription}
184 The \emph{crc32} command forms the CRC-32 of the binary contents of a file
185 or of the binary contents of a string. The CRC-32 is useful as a digital
186 signature, and can be used with unity probability to determine that two
187 files are different, or with a probability of about $1-2^{-32}$ to determine
188 that two files are almost certainly identical.
189
190 In the invocations below, the CRC-32 is always returned as a 10-character ASCII string
191 of the form \emph{``0xDDDDDDDD''}, where \emph{``DDDDDDDD''} is the hexadecimal representation
192 of the 32-bit CRC-32, and \emph{``0x''} is a constant 2-character prefix
193 (the ``zero'' digit followed by ``x'') which is included for
194 aesthetics. It is guaranteed that:
195
196 \begin{itemize}
197 \item The string returned will be exclusively ASCII.
198 \item The string will have a length of exactly 10 characters.
199 \item The first two characters of the string will be \emph{``0x''}.
200 \item The hexadecimal representation
201 will be exactly 8 characters, and any letters
202 in the hexadecimal representation will be upper-case.
203 \end{itemize}
204
205 \tclcommanddescsynopsisline{crc32}{filename}
206 \begin{tclcommandinternaldescription}
207 Returns the CRC-32 of \emph{filename}, treated as an ordered collection of bytes (i.e.
208 newline characters and file termination characters are not processed---the file is
209 treated as a binary file). \emph{filename} must be specified in the form accepted by
210 the Tcl internals (forward slashes only).
211 \end{tclcommandinternaldescription}
212
213 \tclcommanddescsynopsisline{crc32}{-string binarystringval}
214 \begin{tclcommandinternaldescription}
215 Returns the CRC-32 of \emph{binarystringval}, treated as an ordered collection of bytes (i.e.
216 newline characters and string termination characters are not honored---the string is
217 treated as a binary string).\footnote{For an ASCII string, the \emph{crc32} extension will
218 behave as expected, and will process all characters up to but not including the zero
219 terminator. However, the \emph{crc32} extension will also correctly process non-ASCII strings.}
220 \end{tclcommandinternaldescription}
221
222 \tclcommanddescsynopsisline{crc32}{-initialstate}
223 \tclcommanddescsynopsisline{crc32}{-advancestate state filename}
224 \tclcommanddescsynopsisline{crc32}{-advancestate -string state filename}
225 \tclcommanddescsynopsisline{crc32}{-crcfromstate state}
226 \begin{tclcommandinternaldescription}
227 The four forms above are designed to allow ``running CRCs'' to be calculated; in which
228 the CRC is calculated piecemeal. These forms allow the caller to retain the internal
229 state vector of the CRC calculation algorithm.
230
231 The first form, \emph{crc32 -initialstate}, returns an ASCII representation of the
232 correct initial state vector of the CRC-32 state machine. The client is required
233 to obtain this initial state before beginning a piecemeal CRC calculation. Although the
234 returned string is a constant (it will always be the same), representational details
235 may change in future versions of the \emph{crc32} extension, and so a caller should never
236 make assumptions about what this invocation will return, as these assumptions may
237 render a script incompatible with future versions of \emph{crc32}.
238
239 The second and third forms, \emph{crc32 -advancestate state filename}
240 and \emph{crc32 -advancestate -string state filename}, apply a file or a binary string
241 to \emph{state} to produce a new \emph{state}, which is returned. This new \emph{state}
242 must be retained by the caller and used in subsequent calls.
243
244 The final form, \emph{crc32 -crcfromstate state}, maps from the state vector to the
245 calculated CRC, and will return a 10-character ASCII string as described above.
246 \end{tclcommandinternaldescription}
247 \end{tclcommanddescription}
248
249 \begin{tclcommandusagenotes}
250 (1) The ``piecemeal'' forms are as efficient as the file and string forms---there is no difference
251 in the internal algorithms. The primary cost of the piecemeal forms is in importing and
252 exporting the algorithm state vector to/from an ASCII string.
253 Thus, the piecemeal forms become less efficient when
254 small files or strings are processed, as there are more exports and imports
255 of the state vector. When using the piecemeal forms, processing the data in
256 larger chunks will give better performance.
257
258 (2) If the \emph{crc32} command is used to signature files, it is recommended that
259 the \texttt{file size} command also be used to lower the probability of falsely
260 assuming two non-identical files are identical yet further. Two files might be
261 assumed identical if they have the same size and the same CRC-32.
262 \end{tclcommandusagenotes}
263
264 \begin{tclcommandacknowledgements}
265 The \emph{crc32} command was implemented using ideas and C-language
266 code from a website (\cite{bibref:w:ellingsoncrc32pages})
267 provided by Richard A. Ellingson\index{Ellingson, Richard A.}
268 \cite{bibref:i:richardaellingson}. I am especially
269 grateful to Mr. Ellingson for providing these materials publicly
270 and free of charge.
271 \end{tclcommandacknowledgements}
272
273 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
274 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
275 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
276 \section{Random Number Generation Extensions}
277
278
279 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
280 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
281 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
282 \subsection{rngPwrResRndA}
283
284 \index{rngPwrResRndA@\emph{rngPwrResRndA}}
285 \begin{tclcommandname}{rngPwrResRndA}%
286 generates pseudo-random integers using the power residue
287 method with $\alpha = 7^5 = 16,807$ and
288 $M = 2^{31}-1 = 2,147,483,647$, providing a period of $M - 1 = 2^{31}-2 = 2,147,483,646$
289 (\cite{bibref:b:LeonGarciaProb}, pp. 69-71).
290 \end{tclcommandname}
291
292 \begin{tclcommandsynopsis}
293 \tclcommandsynopsisline{rngPwrResRndA}{}
294 \tclcommandsynopsisline{rngPwrResRndA}{$N$}
295 \end{tclcommandsynopsis}
296
297 \begin{tclcommanddescription}
298 The \emph{rngPwrResRndA} command generates pseudo-random positive integers
299 using the [power residue] recursive formula
300
301 \begin{equation}
302 \label{cxtn0:rngPwrResRndA:eq00}
303 Z_i = \alpha Z_{i-1} mod M,
304 \end{equation}
305
306 with $(\alpha, M)$ chosen as $(\alpha = 7^5=16,807, M = 2^{31}-1 = 2,147,483,647)$, as
307 indicated above. With these choices of $(\alpha, M)$, the sequence has a period
308 of $M - 1 = 2^{31}-2 = 2,147,483,646$ and good statistical properties.
309
310 The basis for choosing $(\alpha, M)$ has its origins in number theory, and won't
311 be discussed here. We refer the reader to \cite{bibref:b:LeonGarciaProb}
312 and to mathematical papers on the power residue method.
313
314 This extension maintains one internal seed value, which is initialized to
315 1,578,127,215 at Tcl/Tk startup.\footnote{There is no scientific
316 reason for the choice of the integer 1,578,127,215 as the
317 startup value. It was chosen arbitrarily with no rationale.}
318 It is not possible to set the internal
319 seed to an arbitrary desired value. The single internal seed value is adequate
320 for most applications which simply require random numbers. If an
321 application requires control over the seed or requires multiple seeds, the ability
322 of this extension to generate the successor of an integer using
323 (\ref{cxtn0:rngPwrResRndA:eq00}) can be used to achieve this functionality in a
324 script.
325
326
327 \tclcommanddescsynopsisline{rngPwrResRndA}{}
328 \begin{tclcommandinternaldescription}
329 Buffers the current seed for a return value, then advances this seed using
330 (\ref{cxtn0:rngPwrResRndA:eq00}). Note that the ``old'' value is the value
331 returned, so that after Tcl/Tk startup the first value
332 returned will be 1,578,127,215.
333 \end{tclcommandinternaldescription}
334
335 \tclcommanddescsynopsisline{rngPwrResRndA}{$N$}
336 \begin{tclcommandinternaldescription}
337 Forms the successor of $N$ using (\ref{cxtn0:rngPwrResRndA:eq00}) and
338 returns this successor. The single internal seed value is not affected.
339 \end{tclcommandinternaldescription}
340
341 \end{tclcommanddescription}
342
343
344 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
345 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
346 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
347 \section{Arbitrary-Length Integer Extensions}
348 %Section Tag: SARB0
349 \label{cxtn0:sarb0}
350
351 Starting with Version 1.05 of \emph{The Iju Tool Set}, \emph{IjuScripter} and
352 \emph{IjuConsole} contain a limited\footnote{By \emph{limited} we mean that
353 the library was consolidated and simplified. The GNU MP library has as its
354 explicit design goal speed over clarity, and uses many advanced algorithms,
355 such as Karatsuba multiplication and special algorithms for the
356 greatest common divisor of integers. The library was simplified to regain
357 clarity at the expense of efficiency before its incorporation into
358 \emph{The Iju Tool Set}.} version of the
359 \index{GNU!Multiple Precision Arithmetic Library (GMP)}\emph{GNU Multiple Precision
360 Library} \cite{bibref:s:gnumultipleprecisionarithmeticlibrary}.
361 The version of the library incorporated into the tools has been
362 modified not to process integers larger than about 100,000 decimal digits.
363 We feel that this limit is sufficiently high for any practical applications,
364 and also that the computational speed will become unbearable long before the
365 data size limit is approached.
366
367
368 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
369 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
370 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
371 \subsection{Error And Overflow Behavior Of Arbitrary-Length Integer Extensions}
372 %Subsection Tag: EAB0
373 \label{cxtn0:sarb0:seab0}
374
375 The underlying data structure of arbitrary-length integers includes flags
376 to indicate that an arithmetic error has occured. Essentially, these flags are
377 ``NAN'', or ``not-a-number'' flags. They indicate that the result is not
378 an integer. These error flags propagate. Combining a NAN value with a
379 valid integer through a binary operation always results in a NAN value. Naturally,
380 the result of a unary operation on a NAN value is also a NAN value.
381 The nature of NAN propagation is that the first arithmetic operation that
382 creates an error using valid integers as input will generate an overflow error (one of
383 the first two flags listed below).
384 Subsequent operations that use these original errors as input will generate
385 outputs which are ``taint'' errors (the second set of two flags listed below).
386
387 At the lowest level (in the innards of the `C' code), these flags are
388 bits within an integer. However, for use within Tcl (where all data is string data), these
389 error flags are assigned symbolic strings to indicate the nature of the error. Note that the
390 error flags are only approximate---they don't \emph{precisely} indicate the
391 nature of the error. However, combined with propagation mechanisms,
392 they are adequate to prevent the interpretation
393 of invalid data as valid data. Any result that is predicated on an invalid
394 result will itself be invalid.
395
396 The four possible error strings are enumerated below. If any Tcl long integer
397 function creates an erroneous result, the result will be assigned one of these
398 four symbolic error strings rather than a string of digits.
399
400 \begin{itemize}
401 \item \index{GMP\_INTS\_EF\_INTOVF\_POS@\texttt{GMP\_INTS\_EF\_INTOVF\_POS}}
402 \texttt{GMP\_INTS\_EF\_INTOVF\_POS}---the result is too positive (i.e. too
403 large in a positive direction). This error flag is also produced
404 by an attempted division by zero, regardless of the sign of the
405 dividend.
406 \item \index{GMP\_INTS\_EF\_INTOVF\_NEG@\texttt{GMP\_INTS\_EF\_INTOVF\_NEG}}
407 \texttt{GMP\_INTS\_EF\_INTOVF\_NEG}---the result is too negative (i.e. too
408 large in a negative direction).
409 \item \index{GMP\_INTS\_EF\_INTOVF\_TAINT\_POS@\texttt{GMP\_INTS\_EF\_INTOVF\_TAINT\_POS}}
410 \texttt{GMP\_INTS\_EF\_INTOVF\_TAINT\_POS}---the result has been ``tainted''
411 by combination with an integer which has the
412 \texttt{GMP\_INTS\_EF\_INTOVF\_POS} flag set.
413 \item \index{GMP\_INTS\_EF\_INTOVF\_TAINT\_NEG@\texttt{GMP\_INTS\_EF\_INTOVF\_TAINT\_NEG}}
414 \texttt{GMP\_INTS\_EF\_INTOVF\_TAINT\_NEG}---the result has been
415 ``tainted'' by combination with an integer which has the
416 \texttt{GMP\_INTS\_EF\_INTOVF\_NEG} flag set.
417 \end{itemize}
418
419 Note that the functions which operate on arbitrary length integers will
420 never produce an exception or a fatal error. Instead, they will mark
421 results as NAN, and these NAN results will propagate.
422 This mechanism provides for graceful failures, and also allows complex
423 calculations to be performed without the necessity of checking for
424 errors after every calculation step.
425
426 Note also that each of the separate arbitrary-length integer extensions described
427 in this section are a ``sub-extension'' to the \texttt{arbint} extension. It
428 should also be noted
429 that many of these extensions perform the same function as a DOS
430 utility with the same name (see Chapter \cdcmzeroxrefhyphen{}\ref{cdcm0}).
431
432
433 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
434 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
435 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
436 \subsection{The \texttt{arbint iseflag} Extension}
437
438 \index{arbint iseflag@\emph{arbint iseflag}}
439 \index{iseflag@\emph{iseflag}}
440 \begin{tclcommandname}{arbint iseflag}%
441 identifies a string as an arbitrary integer error flag (or not) and
442 returns an integer value categorizing the string.
443 \end{tclcommandname}
444
445 \begin{tclcommandsynopsis}
446 \tclcommandsynopsisline{arbint iseflag }{stringarg}
447 \end{tclcommandsynopsis}
448
449 \begin{tclcommanddescription}
450 This extension returns:
451 \begin{itemize}
452 \item ``0'' if the string argument supplied is not a recognized
453 error flag.
454 \item ``1'' if the string argument supplied is recognized as the\\
455 \texttt{GMP\_INTS\_EF\_INTOVF\_POS}
456 error flag.
457 \item ``2'' if the string argument supplied is recognized as the\\
458 \texttt{GMP\_INTS\_EF\_INTOVF\_NEG}
459 error flag.
460 \item ``3'' if the string argument supplied is recognized as the\\
461 \texttt{GMP\_INTS\_EF\_INTOVF\_TAINT\_POS}
462 error flag.
463 \item ``4'' if the string argument supplied is recognized as the\\
464 \texttt{GMP\_INTS\_EF\_INTOVF\_TAINT\_NEG}
465 error flag.
466 \end{itemize}
467
468 This extension is most often used to classify the output of an
469 arbitrary-length integer operation. All valid integers will create
470 a value of zero if passed to this extension as an argument.
471 \end{tclcommanddescription}
472
473 \begin{tclcommandsampleinvocations}
474 \begin{scriptsize}
475 \begin{verbatim}
476 % arbint iseflag GMP_INTS_EF_INTOVF_NEG
477 2
478 % arbint iseflag 249,422
479 0
480 \end{verbatim}
481 \end{scriptsize}
482 \end{tclcommandsampleinvocations}
483
484 \begin{tclcommandseealso}
485 See also Section \ref{cxtn0:sarb0:seab0}.
486 \end{tclcommandseealso}
487
488
489 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
490 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
491 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
492 \subsection{The \texttt{arbint commanate} Extension}
493 %Subsection Tag: COM0
494 \label{cxtn0:sarb0:scom0}
495
496 \index{arbint commanate@\emph{arbint commanate}}
497 \index{commanate@\emph{commanate}}
498 \begin{tclcommandname}{arbint commanate}%
499 inserts comma characters (`,') into a string as necessary to
500 make it a properly formatted integer with commas.
501 \end{tclcommandname}
502
503 \begin{tclcommandsynopsis}
504 \tclcommandsynopsisline{arbint commanate}{sint}
505 \end{tclcommandsynopsis}
506
507 \begin{tclcommanddescription}
508 This extension adds commas to an integer to make it a properly
509 formatted integer with commas. This extension is normally used to
510 format a string for more ``human-friendly'' output. The input to this extension
511 must be either:
512
513 \begin{itemize}
514 \item A integer with no commas, as a string of digits (i.e.
515 scientific notation is not allowed). The only valid representation
516 for zero is ``0''.
517 \item An integer with all commas properly placed (i.e. it is
518 allowed to ``recommanate'' an integer that is already
519 ``commanated'').
520 \item One of the four symbolic NAN strings described in
521 Section \ref{cxtn0:sarb0:seab0}. (Such a string
522 will not be modified and will be returned unmodified from
523 this extension.)
524 \end{itemize}
525
526 Any string that cannot be parsed as described above will result in
527 an error.
528 \end{tclcommanddescription}
529
530 \begin{tclcommandsampleinvocations}
531 \begin{scriptsize}
532 \begin{verbatim}
533 % arbint intfac 129
534 4974504222477287440390234150412680963965661113713884314596886402265216893219635
535 5119328515747917449637889876686464600208839390308261862352651828829226610077151
536 044469167497022952331930501120000000000000000000000000000000
537 % arbint commanate [arbint intfac 129]
538 49,745,042,224,772,874,403,902,341,504,126,809,639,656,611,137,138,843,145,968,
539 864,022,652,168,932,196,355,119,328,515,747,917,449,637,889,876,686,464,600,208
540 ,839,390,308,261,862,352,651,828,829,226,610,077,151,044,469,167,497,022,952,33
541 1,930,501,120,000,000,000,000,000,000,000,000,000,000
542 % arbint commanate GMP_INTS_EF_INTOVF_POS
543 GMP_INTS_EF_INTOVF_POS
544 \end{verbatim}
545 \end{scriptsize}
546 \end{tclcommandsampleinvocations}
547
548
549 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
550 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
551 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
552 \subsection{The \texttt{arbint decommanate} Extension}
553 %Subsection Tag: dco0
554 \label{cxtn0:sarb0:sdco0}
555
556 \index{arbint decommanate@\emph{arbint decommanate}}
557 \index{decommanate@\emph{decommanate}}
558 \begin{tclcommandname}{arbint decommanate}%
559 removes comma characters (`,') from a properly
560 formatted integer.
561 \end{tclcommandname}
562
563 \begin{tclcommandsynopsis}
564 \tclcommandsynopsisline{arbint decommanate}{sint}
565 \end{tclcommandsynopsis}
566
567 \begin{tclcommanddescription}
568 This extension removes commas from a properly formatted integer.
569 The input to this extension
570 must be either:
571
572 \begin{itemize}
573 \item A integer with no commas, as a string of digits (i.e.
574 scientific notation is not allowed). The only valid representation
575 for zero is ``0''. (Note that it is allowed to ``decommanate''
576 an integer that contains no commas.)
577 \item An integer with all commas properly placed.
578 \item One of the four symbolic NAN strings described in
579 Section \ref{cxtn0:sarb0:seab0}. (Such a string
580 will not be modified and will be returned unmodified from
581 this extension.)
582 \end{itemize}
583
584 Any string that cannot be parsed as described above will result in
585 an error.
586 \end{tclcommanddescription}
587
588 \begin{tclcommandsampleinvocations}
589 \begin{scriptsize}
590 \begin{verbatim}
591 % arbint intfac 129
592 4974504222477287440390234150412680963965661113713884314596886402265216893219635
593 5119328515747917449637889876686464600208839390308261862352651828829226610077151
594 044469167497022952331930501120000000000000000000000000000000
595 % arbint commanate [arbint intfac 129]
596 49,745,042,224,772,874,403,902,341,504,126,809,639,656,611,137,138,843,145,968,
597 864,022,652,168,932,196,355,119,328,515,747,917,449,637,889,876,686,464,600,208
598 ,839,390,308,261,862,352,651,828,829,226,610,077,151,044,469,167,497,022,952,33
599 1,930,501,120,000,000,000,000,000,000,000,000,000,000
600 % set number [arbint commanate [arbint intfac 129]]
601 49,745,042,224,772,874,403,902,341,504,126,809,639,656,611,137,138,843,145,968,
602 864,022,652,168,932,196,355,119,328,515,747,917,449,637,889,876,686,464,600,208
603 ,839,390,308,261,862,352,651,828,829,226,610,077,151,044,469,167,497,022,952,33
604 1,930,501,120,000,000,000,000,000,000,000,000,000,000
605 % arbint decommanate $number
606 4974504222477287440390234150412680963965661113713884314596886402265216893219635
607 5119328515747917449637889876686464600208839390308261862352651828829226610077151
608 044469167497022952331930501120000000000000000000000000000000
609 % arbint decommanate GMP_INTS_EF_INTOVF_POS
610 GMP_INTS_EF_INTOVF_POS
611 \end{verbatim}
612 \end{scriptsize}
613 \end{tclcommandsampleinvocations}
614
615 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
616 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
617 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
618 \subsection{The \texttt{arbint intcmp} Extension}
619 %Subsection Tag: add0
620 \label{cxtn0:sarb0:scmp0}
621
622 \index{arbint intcmp@\emph{arbint intcmp}}
623 \index{intcmp@\emph{intcmp}}
624 \begin{tclcommandname}{arbint intcmp}%
625 compares two arbitrary integers and returns a result indicating their relative
626 ordering.
627 \end{tclcommandname}
628
629 \begin{tclcommandsynopsis}
630 \tclcommandsynopsisline{arbint intcmp}{sint\_a sint\_b}
631 \end{tclcommandsynopsis}
632
633 \begin{tclcommanddescription}
634 This extension compares \emph{sint\_a} and \emph{sint\_b} and
635 returns $\{-1, 0, 1\}$ if
636 \emph{sint\_a} $\{ <, =, > \}$ \emph{sint\_b}. This extension
637 is used to compare arbitrarily large integers in Tcl scripts.
638 Because NAN tags (see Section \ref{cxtn0:sarb0:seab0})
639 cannot be logically compared,
640 this extension will signal an error if either parameter is
641 a NAN tag.
642 \end{tclcommanddescription}
643
644 \begin{tclcommandsampleinvocations}
645 \begin{scriptsize}
646 \begin{verbatim}
647 % arbint intcmp -5 -3
648 -1
649 % arbint intcmp -5 -5
650 0
651 % arbint intcmp 7 5
652 1
653 \end{verbatim}
654 \end{scriptsize}
655 \end{tclcommandsampleinvocations}
656
657 \begin{tclcommandseealso}
658 See also the \emph{arbint rncmp} Tcl extension,
659 Section \ref{cxtn0:srne0:srcm0}, which performs a similar
660 function for arbitrary rational numbers.
661 \end{tclcommandseealso}
662
663
664 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
665 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
666 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
667 \subsection{The \texttt{arbint intadd} Extension}
668 %Subsection Tag: add0
669 \label{cxtn0:sarb0:sadd0}
670
671 \index{arbint intadd@\emph{arbint intadd}}
672 \index{intadd@\emph{intadd}}
673 \begin{tclcommandname}{arbint intadd}%
674 calculates and returns as a string the sum of two integers.
675 \end{tclcommandname}
676
677 \begin{tclcommandsynopsis}
678 \tclcommandsynopsisline{arbint intadd}{sint sint}
679 \end{tclcommandsynopsis}
680
681 \begin{tclcommanddescription}
682 This extension returns the sum of two integer
683 arguments, or one of the NAN tags described in
684 Section \ref{cxtn0:sarb0:seab0} if an overflow occurs.
685 \end{tclcommanddescription}
686
687 \begin{tclcommandsampleinvocations}
688 \begin{scriptsize}
689 \begin{verbatim}
690 % arbint intadd 1e20 21643215482123164
691 100021643215482123164
692 \end{verbatim}
693 \end{scriptsize}
694 \end{tclcommandsampleinvocations}
695
696 \begin{tclcommandseealso}
697 See also the \emph{intadd} DOS command-line utility,
698 Section \cdcmzeroxrefhyphen{}\ref{cdcm0:sali0:sadd0}.
699 \end{tclcommandseealso}
700
701 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
702 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
703 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
704 \subsection{The \texttt{arbint intsub} Extension}
705 %Subsection Tag: mod0
706 \label{cxtn0:sarb0:ssub0}
707
708 \index{arbint intsub@\emph{arbint intsub}}
709 \index{intsub@\emph{intsub}}
710 \begin{tclcommandname}{arbint intsub}%
711 calculates and returns as a string the difference of two integers.
712 \end{tclcommandname}
713
714 \begin{tclcommandsynopsis}
715 \tclcommandsynopsisline{arbint intsub}{sint sint}
716 \end{tclcommandsynopsis}
717
718 \begin{tclcommanddescription}
719 This extension returns the difference of two integer
720 arguments, or one of the NAN tags described in
721 Section \ref{cxtn0:sarb0:seab0} if an overflow occurs.
722 \end{tclcommanddescription}
723
724 \begin{tclcommandsampleinvocations}
725 \begin{scriptsize}
726 \begin{verbatim}
727 % arbint intsub 123846129436219 1e25
728 -9999999999876153870563781
729 \end{verbatim}
730 \end{scriptsize}
731 \end{tclcommandsampleinvocations}
732
733 \begin{tclcommandseealso}
734 See also the \emph{intsub} DOS command-line utility,
735 Section \cdcmzeroxrefhyphen{}\ref{cdcm0:sali0:ssub0}.
736 \end{tclcommandseealso}
737
738
739 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
740 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
741 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
742 \subsection{The \texttt{arbint intmul} Extension}
743 %Subsection Tag: mul0
744 \label{cxtn0:sarb0:smul0}
745
746 \index{arbint intmul@\emph{arbint intmul}}
747 \index{intmul@\emph{intmul}}
748 \begin{tclcommandname}{arbint intmul}%
749 calculates and returns as a string the product of two integers.
750 \end{tclcommandname}
751
752 \begin{tclcommandsynopsis}
753 \tclcommandsynopsisline{arbint intmul}{sint sint}
754 \end{tclcommandsynopsis}
755
756 \begin{tclcommanddescription}
757 This extension returns the product of two integer arguments.
758 The result of this
759 extension will always be either a NAN tag
760 (see Section \ref{cxtn0:sarb0:seab0})
761 or an integer.
762 \end{tclcommanddescription}
763
764 \begin{tclcommandsampleinvocations}
765 \begin{scriptsize}
766 \begin{verbatim}
767 % arbint intmul -329749813264962165493214963541976325 4.36463214521843123e38
768 -143923663485602892702423181098245942606484617030062975000000000000000000000
769 \end{verbatim}
770 \end{scriptsize}
771 \end{tclcommandsampleinvocations}
772
773 \begin{tclcommandseealso}
774 See also the \emph{intmul} DOS command-line utility,
775 Section \cdcmzeroxrefhyphen{}\ref{cdcm0:sali0:smul0}.
776 \end{tclcommandseealso}
777
778
779 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
780 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
781 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
782 \subsection{The \texttt{arbint intdiv} Extension}
783 %Subsection Tag: div0
784 \label{cxtn0:sarb0:sdiv0}
785
786 \index{arbint intdiv@\emph{arbint intdiv}}
787 \index{intdiv@\emph{intdiv}}
788 \begin{tclcommandname}{arbint intdiv}%
789 calculates and returns as a string the quotient of two integers.
790 \end{tclcommandname}
791
792 \begin{tclcommandsynopsis}
793 \tclcommandsynopsisline{arbint intdiv}{sint\_dividend sint\_divisor}
794 \end{tclcommandsynopsis}
795
796 \begin{tclcommanddescription}
797 This extension returns the quotient of two integer arguments.
798 The first integer argument is interpreted to be the dividend,
799 and the second the divisor. The quotient is without remainder,
800 i.e. what is actually returned is
801
802 \begin{equation}
803 sgn(dividend \cdot divisor)
804 \left\lfloor{\frac{|dividend|}{|divisor|}}\right\rfloor ,
805 \end{equation}
806
807 or one of the NAN tags described in
808 Section \ref{cxtn0:sarb0:seab0}
809 if division by zero is attempted. Note that division
810 by zero is not an error (as far as a Tcl script is concerned):
811 the only outcome is that the result will be assigned a symbolic
812 NAN tag rather than a string of digits representing an integer.
813 \end{tclcommanddescription}
814
815 \begin{tclcommandsampleinvocations}
816 \begin{scriptsize}
817 \begin{verbatim}
818 % arbint intdiv 2364832165653218648321543215848236458124 2854871354812543821
819 828349817467869034672
820 % arbint intdiv 2364832165653218648321543215848236458124 0
821 GMP_INTS_EF_INTOVF_POS
822 \end{verbatim}
823 \end{scriptsize}
824 \end{tclcommandsampleinvocations}
825
826 \begin{tclcommandseealso}
827 See also the \emph{intdiv} DOS command-line utility,
828 Section \cdcmzeroxrefhyphen{}\ref{cdcm0:sali0:sdiv0}.
829 \end{tclcommandseealso}
830
831
832 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
833 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
834 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
835 \subsection{The \texttt{arbint intmod} Extension}
836 %Subsection Tag: mod0
837 \label{cxtn0:sarb0:smod0}
838
839 \index{arbint intmod@\emph{arbint intmod}}
840 \index{intmod@\emph{intmod}}
841 \begin{tclcommandname}{arbint intmod}%
842 calculates and returns as a string the modulo of two integers.
843 \end{tclcommandname}
844
845 \begin{tclcommandsynopsis}
846 \tclcommandsynopsisline{arbint intmod}{sint\_dividend sint\_divisor}
847 \end{tclcommandsynopsis}
848
849 \begin{tclcommanddescription}
850 This extension returns the remainder resulting from the
851 division of two integer arguments.
852 The first integer argument is interpreted to be the dividend,
853 and the second the divisor. The sign of the remainder is always
854 chosen so that the following relationship holds:
855
856 \begin{equation}
857 dividend \; div \; divisor + \frac{dividend \; mod \; divisor}{divisor}
858 = \frac{dividend}{divisor},
859 \end{equation}
860
861 where the \emph{div} operator is as explained in Section
862 \ref{cxtn0:sarb0:sdiv0} for the \emph{arbint intdiv} extension.
863 If division by zero is attempted, this extension
864 returns one of the NAN tags described in
865 Section \ref{cxtn0:sarb0:seab0}. Note that division
866 by zero is not an error (as far as a Tcl script is concerned):
867 the only outcome is that the result will be assigned a symbolic
868 NAN tag rather than a string of digits representing an integer.
869 \end{tclcommanddescription}
870
871 \begin{tclcommandsampleinvocations}
872 \begin{scriptsize}
873 \begin{verbatim}
874 % arbint intmod 264321654632432421 2175438321654
875 1547674828113
876 % arbint intmod 264321654632432421 0
877 GMP_INTS_EF_INTOVF_POS
878 \end{verbatim}
879 \end{scriptsize}
880 \end{tclcommandsampleinvocations}
881
882 \begin{tclcommandseealso}
883 See also the \emph{intmod} DOS command-line utility,
884 Section \cdcmzeroxrefhyphen{}\ref{cdcm0:sali0:smod0}.
885 \end{tclcommandseealso}
886
887
888 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
889 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
890 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
891 \subsection{The \texttt{arbint intexp} Extension}
892 %Subsection Tag: exp0
893 \label{cxtn0:sarb0:sixp0}
894
895 \index{arbint intexp@\emph{arbint intexp}}
896 \index{intexp@\emph{intexp}}
897 \begin{tclcommandname}{arbint intexp}%
898 computes and returns as a string one integer
899 exponentiated to the power of another,
900 $base^{exponent}$.
901
902 \end{tclcommandname}
903
904 \begin{tclcommandsynopsis}
905 \tclcommandsynopsisline{arbint intexp}{sint\_base uint32\_exponent}
906 \end{tclcommandsynopsis}
907
908 \begin{tclcommanddescription}
909 This extension exponentiates an integer to a non-negative
910 power. For
911 simplicity and convenience, $0^0$ will return 1, although
912 this is inconsistent with the mathematical definition.
913 All other exponentiations are as expected.
914
915 The method used to exponentiate is simple squaring and multiplying
916 based on the bit pattern of the exponent, as discussed
917 in \cite{bibref:b:knuthclassic2ndedvol2}, pp. 461-462.
918 \end{tclcommanddescription}
919
920 \begin{tclcommandsampleinvocations}
921 \begin{scriptsize}
922 \begin{verbatim}
923 % arbint intexp 47 69
924 2370021018513446695324337468306899241173950476009917473665218657220346081293500
925 4143894985892600403244809901800125167
926 % arbint intexp 1 0
927 1
928 % arbint intexp 0 0
929 1
930 % arbint intexp 0 1
931 0
932 % arbint intexp 0 19237498
933 0
934 % arbint intexp -47 69
935 -237002101851344669532433746830689924117395047600991747366521865722034608129350
936 04143894985892600403244809901800125167
937 % arbint intexp -47 -69
938 arbint intexp: "-69" is not a recognized unsigned 32-bit integer.
939 % arbint intexp 193461926436214 99999999
940 GMP_INTS_EF_INTOVF_TAINT_POS
941 \end{verbatim}
942 \end{scriptsize}
943 \end{tclcommandsampleinvocations}
944
945 \begin{tclcommandseealso}
946 See also the \emph{intexp} DOS command-line utility,
947 Section \cdcmzeroxrefhyphen{}\ref{cdcm0:sali0:sixp0}.
948 \end{tclcommandseealso}
949
950
951 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
952 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
953 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
954 \subsection{The \texttt{arbint intfac} Extension}
955 %Subsection Tag: fac0
956 \label{cxtn0:sarb0:sfac0}
957
958 \index{arbint intfac@\emph{arbint intfac}}
959 \index{intfac@\emph{intfac}}
960 \begin{tclcommandname}{arbint intfac}%
961 computes and returns as a string the factorial ($!$) of
962 the integer argument supplied.
963 \end{tclcommandname}
964
965 \begin{tclcommandsynopsis}
966 \tclcommandsynopsisline{arbint intfac}{uint32}
967 \end{tclcommandsynopsis}
968
969 \begin{tclcommanddescription}
970 This extension returns the factorial of an integer argument.
971 Any of the symbolic NAN strings described in
972 Section \ref{cxtn0:sarb0:seab0} will cause a return
973 value of an appropriate symbolic NAN string.
974 Strings that cannot be parsed as integers or
975 NAN strings, strings
976 that represent negative integers, and strings that represent
977 non-negative integers that will not fit in 32 bits will generate
978 an error.
979
980 As of this writing, 200! requires about 1 second to compute on a
981 600MHz PC. Although this function will calculate factorials of any size
982 up to 100,000 digits, it is not recommended to use this function above
983 about 200! as the increase in computation time appears to be exponential
984 with respect to the argument. This may improve in the future as algorithmic
985 enhancements are made.
986 \end{tclcommanddescription}
987
988 \begin{tclcommandsampleinvocations}
989 \begin{scriptsize}
990 \begin{verbatim}
991 % arbint intfac 129
992 4974504222477287440390234150412680963965661113713884314596886402265216893219635
993 5119328515747917449637889876686464600208839390308261862352651828829226610077151
994 044469167497022952331930501120000000000000000000000000000000
995 \end{verbatim}
996 \end{scriptsize}
997 \end{tclcommandsampleinvocations}
998
999 \begin{tclcommandseealso}
1000 See also the \emph{intfac} DOS command-line utility,
1001 Section \cdcmzeroxrefhyphen{}\ref{cdcm0:sali0:sifc0}.
1002 \end{tclcommandseealso}
1003
1004
1005 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1006 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1007 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1008 \subsection{The \texttt{arbint intgcd} Extension}
1009 %Subsection Tag: gcd0
1010 \label{cxtn0:sarb0:sgcd0}
1011
1012 \index{arbint intgcd@\emph{arbint intgcd}}
1013 \index{intgcd@\emph{intgcd}}
1014 \begin{tclcommandname}{arbint intgcd}%
1015 calculates and returns as a string the g.c.d.
1016 (greatest common divisor) of two integers.
1017 \end{tclcommandname}
1018
1019 \begin{tclcommandsynopsis}
1020 \tclcommandsynopsisline{arbint intgcd}{sint sint}
1021 \end{tclcommandsynopsis}
1022
1023 \begin{tclcommanddescription}
1024 This extension returns the g.c.d. of two integer arguments.
1025 If either argument is 0, the result will be 1. If either
1026 argument is negative, the absolute value of the argument
1027 will be used in its place. The result of this
1028 extension will always be either a NAN tag
1029 (see Section \ref{cxtn0:sarb0:seab0})
1030 or an integer greater than or equal to 1.
1031
1032 The algorithm employed is the
1033 \emph{Modern Euclidian Algorithm} as
1034 described in \cite{bibref:b:knuthclassic2ndedvol2}, p. 337.
1035 Although faster algorithms for computer
1036 implementation do exist, this is the simplest
1037 and most direct algorithm.
1038 \end{tclcommanddescription}
1039
1040 \begin{tclcommandsampleinvocations}
1041 \begin{scriptsize}
1042 \begin{verbatim}
1043 % arbint intgcd 263130836933693530167218012160000000 503580
1044 4620
1045 \end{verbatim}
1046 \end{scriptsize}
1047 \end{tclcommandsampleinvocations}
1048
1049 \begin{tclcommandseealso}
1050 See also the \emph{intgcd} DOS command-line utility,
1051 Section \cdcmzeroxrefhyphen{}\ref{cdcm0:sali0:sgcd0}.
1052 \end{tclcommandseealso}
1053
1054
1055 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1056 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1057 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1058 \subsection{The \texttt{arbint intlcm} Extension}
1059 %Subsection Tag: lcm0
1060 \label{cxtn0:sarb0:slcm0}
1061
1062 \index{arbint intgcd@\emph{arbint intlcm}}
1063 \index{intlcm@\emph{intlcm}}
1064 \begin{tclcommandname}{arbint intlcm}%
1065 calculates and returns as a string the l.c.m.
1066 (least common multiple) of two integers.
1067 \end{tclcommandname}
1068
1069 \begin{tclcommandsynopsis}
1070 \tclcommandsynopsisline{arbint intlcm}{sint sint}
1071 \end{tclcommandsynopsis}
1072
1073 \begin{tclcommanddescription}
1074 This extension returns the l.c.m. of two integer arguments.
1075 If either argument is 0, the argument will be treated as if it
1076 were 1. If either
1077 argument is negative, the absolute value of the argument
1078 will be used in its place. The result of this
1079 extension will always be either a NAN tag
1080 (see Section \ref{cxtn0:sarb0:seab0})
1081 or an integer greater than or equal to 1.
1082
1083 The algorithm employed is to calculate
1084 the g.c.d. of the arguments using the
1085 \emph{Modern Euclidian Algorithm} as
1086 described in \cite{bibref:b:knuthclassic2ndedvol2}, p. 337;
1087 then to divide the product of the arguments by their
1088 g.c.d., as implied by \cite{bibref:b:knuthclassic2ndedvol2},
1089 p. 334, Equation 10. Both sides of this equation can be
1090 divided by $\gcd(u,v)$ to yield
1091
1092 \begin{equation}
1093 lcm(u,v) = \frac{uv}{\gcd(u,v)},
1094 \end{equation}
1095
1096 and this is the relationship used to calculated the l.c.m.
1097 \end{tclcommanddescription}
1098
1099 \begin{tclcommandsampleinvocations}
1100 \begin{scriptsize}
1101 \begin{verbatim}
1102 % arbint intlcm 64 100
1103 1600
1104 \end{verbatim}
1105 \end{scriptsize}
1106 \end{tclcommandsampleinvocations}
1107
1108 \begin{tclcommandseealso}
1109 See also the \emph{intlcm} DOS command-line utility,
1110 Section \cdcmzeroxrefhyphen{}\ref{cdcm0:sali0:slcm0}.
1111 \end{tclcommandseealso}
1112
1113
1114 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1115 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1116 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1117 \section{Rational Number Extensions}
1118 %Section Tag: RNE0
1119
1120 This section describes extensions that implement
1121 rational number arithmetic.
1122
1123 In most cases, the rational number extensions described in
1124 this section are liberal in the representations of rational numbers
1125 they accept, but always produce results as integer components
1126 separated by the forward slash character. This means that the
1127 rational number extensions described in this section can exchange data
1128 freely---the output of any of the extensions is suitable as input
1129 for another extension.
1130
1131
1132 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1133 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1134 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1135 \subsection{The \texttt{arbint rnred} Extension}
1136 %Subsection Tag: RNR0
1137 \label{cxtn0:srne0:srnr0}
1138
1139 \index{arbint rnred@\emph{arbint rnred}}
1140 \index{rnred@\emph{rnred}}
1141 \begin{tclcommandname}{arbint rnred}%
1142 reduces a rational number to lowest terms and normalizes it.
1143 \end{tclcommandname}
1144
1145 \begin{tclcommandsynopsis}
1146 \tclcommandsynopsisline{arbint rnred}{srn}
1147 \end{tclcommandsynopsis}
1148
1149 \begin{tclcommanddescription}
1150 The \emph{arbint rnred} extension reduces a rational number to its lowest terms
1151 and normalizes it. By \emph{reducing} a rational number and
1152 normalizing it, we mean the application of the following rules.
1153
1154 \begin{enumerate}
1155 \item Any number with a numerator of zero is given the
1156 representation 0/1, i.e. 0/1 is the canonical
1157 representation of zero.
1158 \item Any number with a denominator of zero is given
1159 the representation 1/0, i.e. 1/0 is the canonical
1160 representation of ``division by zero''.
1161 \item Rational numbers which are effectively positive
1162 are normalized to have a positve numerator and positive
1163 denominator.
1164 \item Rational numbers which are effectively negative are
1165 normalized to have a negative numerator and positive
1166 denominator.
1167 \item Any common factors are removed from the numerator and
1168 denominator, i.e. the numerator and denominator are
1169 made coprime.
1170 \end{enumerate}
1171
1172 Note that one behavior above may be unexpected---the
1173 \emph{arbint rnred} extension \emph{will} accept a rational number
1174 specified with a denominator of zero, and will normalize it to
1175 1/0.
1176 \end{tclcommanddescription}
1177
1178 \begin{tclcommandsampleinvocations}
1179 \begin{scriptsize}
1180 \begin{verbatim}
1181 % arbint rnred 422.414
1182 211207/500
1183 \end{verbatim}
1184 \end{scriptsize}
1185 \end{tclcommandsampleinvocations}
1186
1187 \begin{tclcommandseealso}
1188 See also the \emph{rnred} DOS command-line utility,
1189 Section \cdcmzeroxrefhyphen{}\ref{cdcm0:srnu0:srnr0}.
1190 \end{tclcommandseealso}
1191
1192 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1193 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1194 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1195 \subsection{The \texttt{arbint rnadd} Extension}
1196 %Subsection Tag: RAD0
1197 \label{cxtn0:srne0:srad0}
1198
1199 \index{arbint rnadd@\emph{arbint rnadd}}
1200 \index{rnadd@\emph{rnadd}}
1201 \begin{tclcommandname}{arbint rnadd}%
1202 adds two rational numbers to produce a normalized rational result.
1203 \end{tclcommandname}
1204
1205 \begin{tclcommandsynopsis}
1206 \tclcommandsynopsisline{arbint rnadd}{srn srn}
1207 \end{tclcommandsynopsis}
1208
1209 \begin{tclcommanddescription}
1210 The \emph{arbint rnadd} extension adds two rational numbers to produce a
1211 normalized rational result.
1212
1213 If either of the two rational input arguments has a denominator of zero,
1214 the string ``NAN'' will be returned.
1215 \end{tclcommanddescription}
1216
1217 \begin{tclcommandsampleinvocations}
1218 \begin{scriptsize}
1219 \begin{verbatim}
1220 % arbint rnadd 3.1415 64/259
1221 1755297/518000
1222 \end{verbatim}
1223 \end{scriptsize}
1224 \end{tclcommandsampleinvocations}
1225
1226 \begin{tclcommandseealso}
1227 See also the \emph{rnadd} DOS command-line utility,
1228 Section \cdcmzeroxrefhyphen{}\ref{cdcm0:srnu0:srna0}.
1229 \end{tclcommandseealso}
1230
1231
1232 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1233 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1234 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1235 \subsection{The \texttt{arbint rnsub} Extension}
1236 %Subsection Tag: RSB0
1237 \label{cxtn0:srne0:srsb0}
1238
1239 \index{arbint rnsub@\emph{arbint rnsub}}
1240 \index{rnsub@\emph{rnsub}}
1241 \begin{tclcommandname}{arbint rnsub}%
1242 subtracts two rational numbers to produce a normalized rational result.
1243 \end{tclcommandname}
1244
1245 \begin{tclcommandsynopsis}
1246 \tclcommandsynopsisline{arbint rnsub}{srn\_arg1 srn\_arg2}
1247 \end{tclcommandsynopsis}
1248
1249 \begin{tclcommanddescription}
1250 The \emph{arbint rnsub} extension subtracts two rational numbers to produce a
1251 normalized rational result. The second argument is subtracted from the first, i.e.
1252 the result $arg_2 - arg_1$ is formed.
1253
1254 If either of the two rational input arguments has a denominator of zero,
1255 the string ``NAN'' will be returned.
1256 \end{tclcommanddescription}
1257
1258 \begin{tclcommandsampleinvocations}
1259 \begin{scriptsize}
1260 \begin{verbatim}
1261 % arbint rnsub 3.129 122/451
1262 1289179/451000
1263 \end{verbatim}
1264 \end{scriptsize}
1265 \end{tclcommandsampleinvocations}
1266
1267 \begin{tclcommandseealso}
1268 See also the \emph{rnsub} DOS command-line utility,
1269 Section \cdcmzeroxrefhyphen{}\ref{cdcm0:srnu0:srsb0}.
1270 \end{tclcommandseealso}
1271
1272 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1273 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1274 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1275 \subsection{The \texttt{arbint rnmul} Extension}
1276 %Subsection Tag: RMU0
1277 \label{cxtn0:srne0:srmu0}
1278
1279 \index{arbint rnmul@\emph{arbint rnmul}}
1280 \index{rnmul@\emph{rnmul}}
1281 \begin{tclcommandname}{arbint rnmul}%
1282 multiplies two rational numbers to produce a normalized rational result.
1283 \end{tclcommandname}
1284
1285 \begin{tclcommandsynopsis}
1286 \tclcommandsynopsisline{arbint rnmul}{srn srn}
1287 \end{tclcommandsynopsis}
1288
1289 \begin{tclcommanddescription}
1290 The \emph{arbint rnmul} extension multiplies two rational numbers to produce a
1291 normalized rational result.
1292
1293 If either of the two rational input arguments has a denominator of zero,
1294 the string ``NAN'' will be returned.
1295 \end{tclcommanddescription}
1296
1297 \begin{tclcommandsampleinvocations}
1298 \begin{scriptsize}
1299 \begin{verbatim}
1300 % arbint rnmul 3.14 32/491
1301 2512/12275
1302 \end{verbatim}
1303 \end{scriptsize}
1304 \end{tclcommandsampleinvocations}
1305
1306 \begin{tclcommandseealso}
1307 See also the \emph{rnmul} DOS command-line utility,
1308 Section \cdcmzeroxrefhyphen{}\ref{cdcm0:srnu0:srmu0}.
1309 \end{tclcommandseealso}
1310
1311
1312 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1313 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1314 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1315 \subsection{The \texttt{arbint rndiv} Extension}
1316 %Subsection Tag: RDV0
1317 \label{cxtn0:srne0:srdv0}
1318
1319 \index{arbint rndiv@\emph{arbint rndiv}}
1320 \index{rndiv@\emph{rndiv}}
1321 \begin{tclcommandname}{arbint rndiv}%
1322 divides two rational numbers to produce a normalized rational result.
1323 \end{tclcommandname}
1324
1325 \begin{tclcommandsynopsis}
1326 \tclcommandsynopsisline{arbint rndiv}{srn srn}
1327 \end{tclcommandsynopsis}
1328
1329 \begin{tclcommanddescription}
1330 The \emph{arbint rndiv} extension divides two rational numbers to produce a
1331 normalized rational result.
1332
1333 If either of the two rational input arguments has a denominator of zero, or
1334 if the divisor is zero,
1335 the string ``NAN'' will be returned.
1336 \end{tclcommanddescription}
1337
1338 \begin{tclcommandsampleinvocations}
1339 \begin{scriptsize}
1340 \begin{verbatim}
1341 % arbint rndiv 3.14 32/491
1342 77087/1600
1343 \end{verbatim}
1344 \end{scriptsize}
1345 \end{tclcommandsampleinvocations}
1346
1347 \begin{tclcommandseealso}
1348 See also the \emph{rnmul} DOS command-line utility,
1349 Section \cdcmzeroxrefhyphen{}\ref{cdcm0:srnu0:srdv0}.
1350 \end{tclcommandseealso}
1351
1352
1353 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1354 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1355 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1356 \subsection{The \texttt{arbint rncmp} Extension}
1357 %Subsection Tag: RCM0
1358 \label{cxtn0:srne0:srcm0}
1359
1360 \index{arbint rncmp@\emph{arbint rncmp}}
1361 \index{rncmp@\emph{rncmp}}
1362 \begin{tclcommandname}{arbint rncmp}%
1363 compares two rational numbers.
1364 \end{tclcommandname}
1365
1366 \begin{tclcommandsynopsis}
1367 \tclcommandsynopsisline{arbint rncmp}{srn\_arg1 srn\_arg2}
1368 \end{tclcommandsynopsis}
1369
1370 \begin{tclcommanddescription}
1371 The \emph{arbint rncmp} extension compares two rational numbers
1372 and returns $\{-1, 0, 1\}$ if $arg_1$
1373 $\{<, =, >\}$ $arg_2$.
1374
1375 The rational numbers do not need to be reduced or normalized in any way.
1376 Any combination of signs on the numerators and denominators is permitted,
1377 and the numerators and denominators are not required to be coprime.
1378
1379 If for any reason the extension cannot compare the rational numbers,
1380 an error message will be returned and the extension will return
1381 \texttt{TCL\_ERROR}, which will normally cause a script to fail.
1382 The reason for the error return is that if the two rational number
1383 cannot be compared, in most cases it is logically impossible for a script to
1384 continue.
1385 \end{tclcommanddescription}
1386
1387 \begin{tclcommandsampleinvocations}
1388 \begin{scriptsize}
1389 \begin{verbatim}
1390 % arbint rncmp -4/-7 0.5
1391 1
1392 \end{verbatim}
1393 \end{scriptsize}
1394 \end{tclcommandsampleinvocations}
1395
1396
1397 \begin{tclcommandseealso}
1398 See also the \emph{arbint intcmp} Tcl extension,
1399 Section \ref{cxtn0:sarb0:scmp0}, which performs a similar
1400 function for arbitrary integers.
1401 \end{tclcommandseealso}
1402
1403
1404 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1405 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1406 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1407 \section{Number Theory Extensions}
1408 %Section Tag: NTH0
1409 \label{cxtn0:snth0}
1410
1411 This section describes extensions that are related to number theory.
1412 Extensions that deal with continued fractions are included in this
1413 category because of the relationship between continued fractions
1414 and number theory. Any extensions related to number theory that
1415 must process large integers are
1416 still a subextension of \texttt{arbint}.\footnote{This was done to
1417 avoid creating an excessive number of software modules and
1418 Tcl extensions.}
1419
1420
1421 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1422 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1423 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1424 \subsection{The \texttt{arbint cfratnum} Extension}
1425 %Subsection Tag: CFR0
1426 \label{cxtn0:snth0:scfr0}
1427
1428 \index{arbint cfratnum@\emph{arbint cfratnum}}
1429 \index{cfratnum@\emph{cfratnum}}
1430 \begin{tclcommandname}{arbint cfratnum}%
1431 calculates the partial quotients and convergents of
1432 a non-negative rational number.
1433 \end{tclcommandname}
1434
1435 \begin{tclcommandsynopsis}
1436 \tclcommandsynopsisline{arbint cfratnum}{urn}
1437 \end{tclcommandsynopsis}
1438
1439 \begin{tclcommanddescription}
1440 This extension calculates the partial quotients and convergents of
1441 of a non-negative rational number. The results are
1442 returned as a string containing integers separated by spaces.
1443 The integers are arranged in consecutive triplets of the form
1444 ``$a_k \; p_k \; q_k$''. Such a string can be converted to a
1445 list and processed from a Tcl script.
1446 \end{tclcommanddescription}
1447
1448 \begin{tclcommandsampleinvocations}
1449 \begin{scriptsize}
1450 \begin{verbatim}
1451 % arbint cfratnum 3.14
1452 3 3 1 7 22 7 7 157 50
1453 \end{verbatim}
1454 \end{scriptsize}
1455
1456 In the sample invocation above, note that $a_0 = 3$,
1457 $p_0 = 3$, $q_0 = 1$, $a_1 = 7$, $p_1 = 22$, $q_1 = 7$,
1458 $a_2 = 7$, $p_2 = 157$, and $q_2 = 50$.
1459 \end{tclcommandsampleinvocations}
1460
1461 \begin{tclcommandseealso}
1462 See also the \emph{cfratnum} DOS command-line utility,
1463 Section \cdcmzeroxrefhyphen{}\ref{cdcm0:snth0:scfr0}.
1464 \end{tclcommandseealso}
1465
1466 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1467 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1468 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1469 \subsection{The \texttt{arbint cfbrapab} Extension}
1470 %Subsection Tag: BRA0
1471 \label{cxtn0:snth0:sbra0}
1472
1473 \index{arbint cfbrapab@\emph{arbint cfbrapab}}
1474 \index{cfbrapab@\emph{cfbrapab}}
1475 \begin{tclcommandname}{arbint cfbrapab}%
1476 finds best rational approximations to a supplied rational
1477 number in either the Farey series of order $k_{MAX}$ (denoted
1478 $F_{k_{MAX}}$), or in a rectangular region of the integer lattice
1479 bounded by $k \leq k_{MAX}$ and $h \leq h_{MAX}$
1480 (denoted $F_{k_{MAX}, \overline{h_{MAX}}}$).
1481 \end{tclcommandname}
1482
1483 \begin{tclcommandsynopsis}
1484 \tclcommandsynopsisline{arbint cfbrapab}{srn uint\_kmax [options]}
1485 \tclcommandsynopsisline{arbint cfbrapab}{srn uint\_kmax uint\_hmax [options]}
1486 \end{tclcommandsynopsis}
1487
1488 \begin{tclcommanddescription}
1489 When used without options, this extension returns the closest rational
1490 number to the specified rational number in $F_{k_{MAX}}$ (if only $k_{MAX}$ is
1491 specified) or in $F_{k_{MAX}, \overline{h_{MAX}}}$ (if both
1492 $k_{MAX}$ and $h_{MAX}$ are specified). If the rational number specified
1493 is already in the series of interest, its reduced form is returned.
1494 If the rational number supplied is equidistant from the two closest
1495 formable rational numbers in the series of interest, the neighbor of smaller
1496 magnitude (absolute value) is returned.
1497
1498 When operating in $F_{k_{MAX}}$, there are no practical constraints
1499 on the size of rational numbers that this extension can approximate.
1500 However, when operating in $F_{k_{MAX}, \overline{h_{MAX}}}$,
1501 this extension will not accept rational numbers outside the
1502 interval $[-h_{MAX}, h_{MAX}]$ (note that $-h_{MAX}/1$ and
1503 $h_{MAX}/1$ are the smallest and largest numbers that can be formed
1504 when the numerator of the rational approximations is constrained).
1505 Any attempt to approximate a rational number outside $[-h_{MAX}, h_{MAX}]$
1506 will result in a Tcl error, which will normally terminate a script.
1507
1508 The \texttt{-neversmaller} and \texttt{-neverlarger}
1509 options cause the extension to always choose the larger and
1510 smaller neighbors (rather than the closer neighbor), respectively.
1511 These options are useful when approximations are desired that
1512 do not underestimate or overestimate the function of interest for
1513 large values in the domain. These parameters do not affect
1514 the behavior if the rational number supplied is already in the
1515 series of interest---the reduced form of the specified number
1516 is returned in the case of equality.
1517 The \texttt{-neversmaller} and \texttt{-neverlarger} options
1518 must be used alone, with no other options.
1519
1520 The \texttt{-pred} and \texttt{-succ} options cause this extension
1521 to calculate either the predecessor or successor to the rational
1522 number specified in the series of interest. If the number specified
1523 is already in series of interest, its predecessor or successor
1524 is returned.
1525 If the number specified is not in the series of interest,
1526 the left or right neighbor is returned. If no predecessor,
1527 successor, or left or right neighbor exist, an error is generated.
1528 These options (\texttt{-pred} or \texttt{-succ})
1529 must be used alone, with no other options.
1530
1531 The normal behavior of this extension is to return a single
1532 rational number, as described above.
1533 The \texttt{-n \emph{uint32\_count}} option will cause the extension
1534 to return \emph{count} rational numbers on each side of the
1535 rational number specified. If the rational number specified is already
1536 in the series of interest, it will be returned as well, normally\footnote{If
1537 the set of returned rational numbers is not clipped at $-h_{MAX}/1$ or
1538 $h_{MAX}/1$.} resulting
1539 in an odd number of rational numbers returned. If the rational number
1540 specified is not already in the series of interest, an even number of
1541 rational numbers will normally be returned. The rational
1542 numbers returned are prefixed with integer indices, which
1543 indicate their ordinal distance from the rational number to be approximated
1544 (see the invocation examples below). The index of 0 is reserved for
1545 the reduced form of the rational number specified, and and a rational number with
1546 this index will be in the output only if the rational number supplied was already
1547 in the series of interest.
1548 The rational numbers returned
1549 will be formatted as integer indices and slash-separated integers, separated
1550 by single spaces and arranged in ascending order..
1551 If the number of rational numbers requested by this option exceeds
1552 the number available, the sequence will simply be truncated at
1553 $-h_{MAX}/1$ or $h_{MAX}/1$, as appropriate. Any request for more than
1554 10,000 neighbors (on each side) will be clipped to 10,000.
1555 \end{tclcommanddescription}
1556
1557 \begin{tclcommandsampleinvocations}
1558 \begin{scriptsize}
1559 \begin{verbatim}
1560 % arbint cfbrapab 1.6093 255
1561 346/215
1562 % arbint cfbrapab 1.6093 255 255
1563 243/151
1564 % arbint cfbrapab 1.6093 255 255 -neversmaller
1565 103/64
1566 % arbint cfbrapab 1.6093 255 255 -neverlarger
1567 243/151
1568 % arbint cfbrapab 1.6093 255 255 -n 20
1569 -20 143/89 -19 188/117 -18 233/145 -17 45/28 -16 217/135 -15 172/107 -14 127/79
1570 -13 209/130 -12 82/51 -11 201/125 -10 119/74 -9 156/97 -8 193/120 -7 230/143 -6
1571 37/23 -5 251/156 -4 214/133 -3 177/110 -2 140/87 -1 243/151 1 103/64 2 169/105
1572 3 235/146 4 66/41 5 227/141 6 161/100 7 95/59 8 219/136 9 124/77 10 153/95 11
1573 182/113 12 211/131 13 240/149 14 29/18 15 253/157 16 224/139 17 195/121 18
1574 166/103 19 137/85 20 245/152
1575 % arbint cfbrapab 1.6093 255 255 -succ
1576 103/64
1577 % arbint cfbrapab 1.6093 255 255 -pred
1578 243/151
1579 % arbint cfbrapab 2/3 255 255 -pred
1580 169/254
1581 \end{verbatim}
1582 \end{scriptsize}
1583 \end{tclcommandsampleinvocations}
1584
1585 \begin{tclcommandseealso}
1586 This extension uses the continued fraction
1587 algorithms presented in Chapter \ccfrzeroxrefhyphen{}\ref{ccfr0}.
1588 See also the \emph{cfratnum} DOS command-line utility,
1589 Section \cdcmzeroxrefhyphen{}\ref{cdcm0:snth0:sbra0}.
1590 \end{tclcommandseealso}
1591
1592
1593 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1594 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1595 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1596 \subsection{The \texttt{arbint const} Extension}
1597 %Subsection Tag: CEX0
1598 \label{cxtn0:snth0:scex0}
1599
1600 \index{arbint const@\emph{arbint const}}
1601 \index{const (Tcl arbint sub-extension)@\emph{const} (Tcl \emph{arbint} sub-extension)}
1602 \begin{tclcommandname}{arbint const}%
1603 returns a string representing the value of important
1604 mathematical and conversion constants (such as the value
1605 of $\pi$ or $e$, or the conversion factor from miles to kilometers).
1606 \end{tclcommandname}
1607
1608 \begin{tclcommandsynopsis}
1609 \tclcommandsynopsisline{arbint const}{const\_tag}
1610 \tclcommandsynopsisline{arbint const}{const\_tag uint32\_ndigits}
1611 \end{tclcommandsynopsis}
1612
1613 \begin{tclcommanddescription}
1614 The \emph{const} subextension returns the value (as a string) of
1615 constants that may be useful in engineering work. Such constants
1616 may include mathematically significant numbers (such as
1617 \index{pi@$\pi$ (transcendental constant)}$\pi$ or
1618 \index{e@$e$ (transcendental constant)}$e$), or
1619 useful conversion factors (the conversion factor from
1620 miles to kilometers, for example). These string constants
1621 can be used in calculations involving rational numbers.
1622
1623 All constants are simply tabulated as character strings
1624 within the `C' source code.
1625
1626 Mathematically significant numbers (which, to the best
1627 of the author's knowledge are always irrational and
1628 usually transcendental, as mathematicians
1629 don't seem to have any lasting interest in specific integers
1630 or rational numbers) are available to about 1,000 significant digits,
1631 and have been obtained from various web pages. It is reasoned that
1632 1,000 significant digits should be adequate for engineering applications.
1633
1634 Measurement unit conversion constants have typically been obtained from
1635 \emph{NIST Special Publication 811} \cite{bibref:b:nistsp811:1995ed}.
1636 These constants are always tabulated with their full precision, since
1637 no physical constant can be precise to more than several decimal places.
1638
1639 If the number of significant figures is not specified,
1640 each constant is returned as a string with a default number of
1641 decimal places (typically about 30). In most cases, the default
1642 number of decimal places provides more than enough precision for
1643 engineering work. However, an optional parameter allows more
1644 or fewer digits to be obtained, up to the maximum number tabulated internally
1645 in the software. The default number of decimal places is a compromise
1646 between calculation speed and accuracy. It is felt in most cases that
1647 the default number of decimal places provides excellent accuracy
1648 and good calculation speed.
1649
1650 Please e-mail the authors if you would like additional useful
1651 constants included. Because the list of tabulated constants
1652 may grow and shrink, it would not be a sound decision to document
1653 the constants which are included here. Instead, use
1654 \emph{arbint const} with an invalid tag, and the software itself
1655 will list all of the internally tabulated constants and their
1656 significance.
1657 \end{tclcommanddescription}
1658
1659 \begin{tclcommandsampleinvocations}
1660 Please note that the sample invocation below was created using
1661 v1.05 of the tool set. The list of constants may have grown
1662 since this example was created. Please poll the software directly
1663 by using \emph{arbint const} with an invalid tag to obtain the
1664 list of constants and their significance.
1665 \begin{scriptsize}
1666 \begin{verbatim}
1667 % arbint const xxx
1668 arbint const: "xxx" is not a recognized constant.
1669 Available constants are:
1670 e (1000 digits available)
1671 Historically significant transcendental constant. Digits obtained
1672 from http://fermi.udw.ac.za/physics/e.html on 08/17/01.
1673 g_si (6 digits available)
1674 Gravitational acceleration in SI units, meters per second**2.
1675 Obtained from NIST Special Publication 811 on 08/17/01.
1676 in2m (3 digits available)
1677 Multiplicative conversion factor from inches to meters.
1678 Obtained from NIST Special Publication 811 on 08/17/01.
1679 mi2km (7 digits available)
1680 Multiplicative conversion factor from miles to kilometers.
1681 Obtained from NIST Special Publication 811 on 08/17/01.
1682 pi (1201 digits available)
1683 Transcendental constant supplying ratio of a circle's circumference
1684 to its diameter. Digits obtained from http://www.joyofpi.com/
1685 pi.htm on 08/17/01.
1686 sqrt5 (1040 digits available)
1687 The square root of 5. Digits obtained from
1688 http://home.earthlink.net/~maryski/sqrt51000000.txt on 08/17/01.
1689 % arbint const pi
1690 3.14159265358979323846264338327
1691 % arbint const pi 100
1692 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067
1693 % arbint const pi 10
1694 3.141592653
1695 % arbint cfbrapab [arbint const pi 100] 65535 65535
1696 65298/20785
1697 \end{verbatim}
1698 \end{scriptsize}
1699 \end{tclcommandsampleinvocations}
1700
1701
1702 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1703 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1704 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1705 \section{Miscellaneous Extensions}
1706
1707 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1708 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1709 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1710 \subsection{credits}
1711
1712 \index{credits@\emph{credits}}
1713 \begin{tclcommandname}{credits}%
1714 returns information about authorship of software components.
1715 \end{tclcommandname}
1716
1717 \begin{tclcommandsynopsis}
1718 \tclcommandsynopsisline{credits}{}
1719 \tclcommandsynopsisline{credits}{searchstring}
1720 \end{tclcommandsynopsis}
1721
1722 \begin{tclcommanddescription}
1723 The \emph{credits} command returns a list of contributors to the tools,
1724 their area(s) of contribution, and e-mail addresses. The volume of
1725 information returned can be reduced by using an optional \emph{searchstring}.
1726
1727 \tclcommanddescsynopsisline{credits}{}
1728 \begin{tclcommandinternaldescription}
1729 Returns the complete list of contributors to the tools and their area(s) of contribution.
1730 \end{tclcommandinternaldescription}
1731
1732 \tclcommanddescsynopsisline{credits}{searchstring}
1733 \begin{tclcommandinternaldescription}
1734 Returns all credit records containing \emph{searchstring}.
1735 Most commonly, this option is used to search for information about a specific
1736 command by using the command name as the \emph{searchstring}, or about a
1737 specific individual by using a component of the individual's name as the
1738 \emph{searchstring}.
1739
1740 \end{tclcommandinternaldescription}
1741
1742 \end{tclcommanddescription}
1743
1744
1745
1746 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1747 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1748 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1749 \noindent\begin{figure}[!b]
1750 \noindent\rule[-0.25in]{\textwidth}{1pt}
1751 \begin{tiny}
1752 \begin{verbatim}
1753 $RCSfile: c_xtn0.tex,v $
1754 $Source: /home/dashley/cvsrep/e3ft_gpl01/e3ft_gpl01/dtaipubs/esrgubka/c_xtn0/c_xtn0.tex,v $
1755 $Revision: 1.11 $
1756 $Author: dtashley $
1757 $Date: 2003/04/03 19:49:36 $
1758 \end{verbatim}
1759 \end{tiny}
1760 \noindent\rule[0.25in]{\textwidth}{1pt}
1761 \end{figure}
1762
1763 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1764 % $Log: c_xtn0.tex,v $
1765 % Revision 1.11 2003/04/03 19:49:36 dtashley
1766 % Global corrections to typeface of "gcd" made as per Jan-Hinnerk Reichert's
1767 % recommendation.
1768 %
1769 % Revision 1.10 2001/08/18 18:37:56 dtashley
1770 % Preparation for v1.05 release.
1771 %
1772 % Revision 1.9 2001/08/16 19:53:27 dtashley
1773 % Beginning to prepare for v1.05 release.
1774 %
1775 % Revision 1.8 2001/08/12 10:15:33 dtashley
1776 % Safety check-in. Substantial progress.
1777 %
1778 % Revision 1.7 2001/08/10 00:56:07 dtashley
1779 % Completion of basic rational number arithmetic utilities and extensions.
1780 %
1781 % Revision 1.6 2001/08/08 02:25:03 dtashley
1782 % Completion of RNRED utility and ARBINT RNRED Tcl extension.
1783 %
1784 % Revision 1.5 2001/08/07 10:46:44 dtashley
1785 % Completion of CFRATNUM Tcl extension and DOS command-line utility.
1786 %
1787 % Revision 1.4 2001/08/01 03:37:39 dtashley
1788 % Finished most primitive integer operations, both as Tcl extensions and
1789 % as DOS command-line utilities, such as addition, subtraction,
1790 % multiplication, division, and modulo.
1791 %
1792 % Revision 1.3 2001/07/30 02:54:17 dtashley
1793 % INTFAC extension and command-line utility finished.
1794 %
1795 % Revision 1.2 2001/07/01 20:50:58 dtashley
1796 % Move out of binary mode for use with CVS.
1797 %
1798 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1799 % $History: c_xtn0.tex $
1800 %
1801 % ***************** Version 3 *****************
1802 % User: Dashley1 Date: 2/10/01 Time: 2:03a
1803 % Updated in $/uC Software Multi-Volume Book (A)/Chapter, XTN0, IjuScripter-IjuConsole Tcl-Tk Extensions
1804 % Completion of Farey series chapter.
1805 %
1806 % ***************** Version 2 *****************
1807 % User: Dashley1 Date: 1/01/01 Time: 8:13p
1808 % Updated in $/uC Software Multi-Volume Book (A)/Chapter, XTN0, IjuScripter-IjuConsole Tcl-Tk Extensions
1809 % Edits.
1810 %
1811 % ***************** Version 1 *****************
1812 % User: Dashley1 Date: 12/31/00 Time: 9:34p
1813 % Created in $/uC Software Multi-Volume Book (A)/Chapter, XTN0, IjuScripter-IjuConsole Tcl-Tk Extensions
1814 % Initial check-in.
1815 %
1816 %End of file C_XTN0.TEX

Properties

Name Value
svn:eol-style native
svn:keywords Header

dashley@gmail.com
ViewVC Help
Powered by ViewVC 1.1.25