Parent Directory | Revision Log

Revision **5** -
(**hide annotations**)
(**download**)
(**as text**)

*Thu Oct 6 23:27:41 2016 UTC*
(7 years, 2 months ago)
by *dashley*

File MIME type: application/x-tex

File size: 74604 byte(s)

File MIME type: application/x-tex

File size: 74604 byte(s)

Initial commit after migrating from CVS.

1 | dashley | 5 | %$Header: /home/dashley/cvsrep/e3ft_gpl01/e3ft_gpl01/dtaipubs/esrgubka/c_xtn0/c_xtn0.tex,v 1.11 2003/04/03 19:49:36 dtashley Exp $ |

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 |

dashley@gmail.com | ViewVC Help |

Powered by ViewVC 1.1.25 |