From a7f39918ee500bbf3b3fbd0d0c7808b2053b7bdf Mon Sep 17 00:00:00 2001 From: Richard Kreckel Date: Thu, 4 May 2000 19:32:30 +0000 Subject: [PATCH] - Added lots of @cindex to produce an index. - Minor updates / fixed typos. --- doc/cln.dvi | Bin 157376 -> 257596 bytes doc/cln.html | 420 +++- doc/cln.info | 489 +++- doc/cln.ps | 5519 ++++++++++++++++++++++++++++------------------ doc/cln.tex | 358 ++- doc/cln.texi | 358 ++- doc/cln_1.html | 13 +- doc/cln_10.html | 18 +- doc/cln_11.html | 20 +- doc/cln_12.html | 17 +- doc/cln_13.html | 2 +- doc/cln_2.html | 16 +- doc/cln_3.html | 39 +- doc/cln_4.html | 211 +- doc/cln_5.html | 14 +- doc/cln_6.html | 2 +- doc/cln_7.html | 34 +- doc/cln_8.html | 18 +- doc/cln_9.html | 38 +- doc/cln_toc.html | 4 +- 20 files changed, 5252 insertions(+), 2338 deletions(-) diff --git a/doc/cln.dvi b/doc/cln.dvi index a1e064dcae4275401a1a67e6e5617eaffe63bd2c..086cf54ac849ccff0928188b6bc52f3035b1a310 100644 GIT binary patch literal 257596 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

>fF%Xfnv3uVLn|c2_ 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 - + CLN, a Class Library for Numbers @@ -243,8 +243,9 @@ The kernel of CLN has been written in assembly language for some CPUs (i386, m68k, sparc, mips, arm).
  • -On all CPUs, CLN uses the superefficient low-level routines from GNU -GMP version 2. + +On all CPUs, CLN may be configured to use the superefficient low-level +routines from GNU GMP version 3.
  • It uses Karatsuba multiplication, which is significantly faster @@ -253,9 +254,9 @@ for large numbers than the standard multiplication algorithm. For very large numbers (more than 12000 decimal digits), it uses Schönhage-Strassen -multiplication, which is an asymptotically -optimal multiplication algorithm, for multiplication, division and -radix conversion. + +multiplication, which is an asymptotically optimal multiplication +algorithm, for multiplication, division and radix conversion.

    @@ -292,7 +293,7 @@ This section describes how to install the CLN package on your system. To build CLN, you need a C++ compiler. Actually, you need GNU g++ 2.7.0 or newer. On HPPA, you need GNU g++ 2.8.0 or newer. -I recommend GNU egcs 1.1 or newer. +I recommend GNU g++ 2.95 or newer.

    @@ -315,6 +316,8 @@ of static and global variables, a feature which I could implement for GNU g++ only. +

    +

    2.1.2 Make utility

    @@ -323,6 +326,8 @@ implement for GNU g++ only. To build CLN, you also need to have GNU make installed. +

    +

    2.1.3 Sed utility

    @@ -446,11 +451,6 @@ With full `-O2', g++ miscompiles the division routines --enable-shared to work, you need egcs-1.1.2 or newer. -

    -On MIPS (SGI Irix 6), pass option --without-gmp to configure. gmp does -not work when compiled in `n32' binary format on Irix. - -

    By default, only a static library is built. You can build CLN as a shared library too, by calling configure with the option `--enable-shared'. @@ -467,6 +467,9 @@ library.

    2.3 Installing the library

    +

    + +

    As with any autoconfiguring GNU software, installation is as easy as this: @@ -552,6 +555,8 @@ Rational number Floating-point number

    + + The base class cl_number is an abstract base class. It is not useful to declare a variable of this type except if you want to completely disable compile-time type checking and use run-time type @@ -559,17 +564,24 @@ checking instead.

    + + + The class cl_N comprises real and complex numbers. There is no special class for complex numbers since complex numbers with imaginary part 0 are automatically converted to real numbers.

    + The class cl_R comprises real numbers of different kinds. It is an abstract class.

    + + + The class cl_RA comprises exact real numbers: rational numbers, including integers. There is no special class for non-integral rational numbers since rational numbers with denominator 1 are automatically converted @@ -577,6 +589,7 @@ to integers.

    + The class cl_F implements floating-point approximations to real numbers. It is an abstract class. @@ -584,6 +597,9 @@ It is an abstract class.

    3.1 Exact numbers

    +

    + +

    Some numbers are represented as exact numbers: there is no loss of information @@ -625,6 +641,9 @@ is completely transparent.

    3.2 Floating-point numbers

    +

    + +

    Not all real numbers can be represented exactly. (There is an easy mathematical @@ -635,6 +654,7 @@ CLN implements ordinary floating-point numbers, with mantissa and exponent.

    + The elementary operations (+, -, *, /, ...) only return approximate results. For example, the value of the expression (cl_F) 0.3 + (cl_F) 0.4 prints as `0.70000005', not as @@ -665,6 +685,7 @@ Floating point numbers come in four flavors:

    • + Short floats, type cl_SF. They have 1 sign bit, 8 exponent bits (including the exponent's sign), and 17 mantissa bits (including the "hidden" bit). @@ -672,6 +693,7 @@ They don't consume heap allocation.
    • + Single floats, type cl_FF. They have 1 sign bit, 8 exponent bits (including the exponent's sign), and 24 mantissa bits (including the "hidden" bit). @@ -680,6 +702,7 @@ This corresponds closely to the C/C++ type `float'.
    • + Double floats, type cl_DF. They have 1 sign bit, 11 exponent bits (including the exponent's sign), and 53 mantissa bits (including the "hidden" bit). @@ -688,6 +711,7 @@ This corresponds closely to the C/C++ type `double'.
    • + Long floats, type cl_LF. They have 1 sign bit, 32 exponent bits (including the exponent's sign), and n mantissa bits (including the "hidden" bit), where n >= 64. @@ -708,6 +732,7 @@ with larger exponent range.

      + As a user of CLN, you can forget about the differences between the four floating-point types and just declare all your floating-point variables as being of type cl_F. This has the advantage that @@ -723,6 +748,9 @@ the floating point contagion rule happened to change in the future.)

      3.3 Complex numbers

      +

      + +

      Complex numbers, as implemented by the class cl_N, have a real @@ -739,6 +767,9 @@ through application of sqrt or transcendental functions.

      3.4 Conversions

      +

      + +

      Conversions from any class to any its superclasses ("base classes" in @@ -796,6 +827,7 @@ Conversions from `const char *' are provided for the classes cl_R, cl_N. The easiest way to specify a value which is outside of the range of the C++ built-in types is therefore to specify it as a string, like this: +

          cl_I order_of_rubiks_cube_group = "43252003274489856000";
      @@ -815,12 +847,16 @@ the functions
       
       
      int cl_I_to_int (const cl_I& x)
      +
      unsigned int cl_I_to_uint (const cl_I& x)
      +
      long cl_I_to_long (const cl_I& x)
      +
      unsigned long cl_I_to_ulong (const cl_I& x)
      + Returns x as element of the C type ctype. If x is not representable in the range of ctype, a runtime error occurs. @@ -837,8 +873,10 @@ the functions
      float cl_float_approx (const type& x)
      +
      double cl_double_approx (const type& x)
      + Returns an approximation of x of C type ctype. If abs(x) is too close to 0 (underflow), 0 is returned. If abs(x) is too large (overflow), an IEEE infinity is returned. @@ -849,8 +887,10 @@ Conversions from any class to any of its subclasses ("derived classes" in C++ terminology) are not provided. Instead, you can assert and check that a value belongs to a certain subclass, and return it as element of that class, using the `As' and `The' macros. + As(type)(value) checks that value belongs to type and returns it as such. + The(type)(value) assumes that value belongs to type and returns it as such. It is your responsibility to ensure that this assumption is valid. @@ -967,10 +1007,12 @@ defines the following operations:
      type operator + (const type&, const type&)
      + Addition.
      type operator - (const type&, const type&)
      + Subtraction.
      type operator - (const type&) @@ -979,18 +1021,22 @@ Returns the negative of the argument.
      type plus1 (const type& x)
      + Returns x + 1.
      type minus1 (const type& x)
      + Returns x - 1.
      type operator * (const type&, const type&)
      + Multiplication.
      type square (const type& x)
      + Returns x * x. @@ -1004,10 +1050,12 @@ defines the following operations:
      type operator / (const type&, const type&)
      + Division.
      type recip (const type&)
      + Returns the reciprocal of the argument. @@ -1023,6 +1071,7 @@ Instead, cl_I defines an "exact quotient" function:
      cl_I exquo (const cl_I& x, const cl_I& y)
      + Checks that y divides x, and returns the quotient x/y. @@ -1034,12 +1083,14 @@ The following exponentiation functions are defined:
      cl_I expt_pos (const cl_I& x, const cl_I& y)
      +
      cl_RA expt_pos (const cl_RA& x, const cl_I& y)
      y must be > 0. Returns x^y.
      cl_RA expt (const cl_RA& x, const cl_I& y)
      +
      cl_R expt (const cl_R& x, const cl_I& y)
      cl_N expt (const cl_N& x, const cl_I& y) @@ -1057,6 +1108,7 @@ defines the following operation:
      type abs (const type& x)
      + Returns the absolute value of x. This is x if x >= 0, and -x if x <= 0. @@ -1082,6 +1134,7 @@ defines the following operation:
      type signum (const type& x)
      + Returns the sign of x, in the same number format as x. This is defined as x / abs(x) if x is non-zero, and x if x is zero. If x is real, the value is either @@ -1100,10 +1153,12 @@ Each of the classes cl_RA, cl_I defines the following
      cl_I numerator (const type& x)
      + Returns the numerator of x.
      cl_I denominator (const type& x)
      + Returns the denominator of x. @@ -1124,6 +1179,7 @@ The class cl_N defines the following operation:
      cl_N complex (const cl_R& a, const cl_R& b)
      + Returns the complex number a+bi, that is, the complex number with real part a and imaginary part b. @@ -1136,14 +1192,17 @@ Each of the classes cl_N, cl_R defines the following o
      cl_R realpart (const type& x)
      + Returns the real part of x.
      cl_R imagpart (const type& x)
      + Returns the imaginary part of x.
      type conjugate (const type& x)
      + Returns the complex conjugate of x. @@ -1164,6 +1223,9 @@ We have the relations

      4.5 Comparisons

      +

      + +

      Each of the classes cl_N, cl_R, cl_RA, cl_I, @@ -1175,18 +1237,22 @@ defines the following operations:

      bool operator == (const type&, const type&)
      +
      bool operator != (const type&, const type&)
      + Comparison, as in C and C++.
      uint32 cl_equal_hashcode (const type&)
      + Returns a 32-bit hash code that is the same for any two numbers which are the same according to ==. This hash code depends on the number's value, not its type or precision.
      cl_boolean zerop (const type& x)
      + Compare against zero: x == 0 @@ -1200,33 +1266,42 @@ defines the following operations:
      cl_signean cl_compare (const type& x, const type& y)
      + Compares x and y. Returns +1 if x>y, -1 if x<y, 0 if x=y.
      bool operator <= (const type&, const type&)
      +
      bool operator < (const type&, const type&)
      +
      bool operator >= (const type&, const type&)
      +
      bool operator > (const type&, const type&)
      + Comparison, as in C and C++.
      cl_boolean minusp (const type& x)
      + Compare against zero: x < 0
      cl_boolean plusp (const type& x)
      + Compare against zero: x > 0
      type max (const type& x, const type& y)
      + Return the maximum of x and y.
      type min (const type& x, const type& y)
      + Return the minimum of x and y. @@ -1242,6 +1317,9 @@ there is no floating point number whose value is exactly 1/3.

      4.6 Rounding functions

      +

      + +

      When a real number is to be converted to an integer, there is no "best" @@ -1311,15 +1389,19 @@ defines the following operations:

      cl_I floor1 (const type& x)
      + Returns floor(x).
      cl_I ceiling1 (const type& x)
      + Returns ceiling(x).
      cl_I truncate1 (const type& x)
      + Returns truncate(x).
      cl_I round1 (const type& x)
      + Returns round(x). @@ -1408,12 +1490,16 @@ defines the following operations:
      type_div_t floor2 (const type& x, const type& y)
      +
      type_div_t ceiling2 (const type& x, const type& y)
      +
      type_div_t truncate2 (const type& x, const type& y)
      +
      type_div_t round2 (const type& x, const type& y)
      +

      @@ -1432,12 +1518,16 @@ defines the following operations:

      type ffloor (const type& x)
      +
      type fceiling (const type& x)
      +
      type ftruncate (const type& x)
      +
      type fround (const type& x)
      +

      @@ -1477,12 +1567,16 @@ defines the following operations:

      type_fdiv_t ffloor2 (const type& x)
      +
      type_fdiv_t fceiling2 (const type& x)
      +
      type_fdiv_t ftruncate2 (const type& x)
      +
      type_fdiv_t fround2 (const type& x)
      +

      and similarly for class cl_R, but with quotient type cl_F. @@ -1537,8 +1631,10 @@ The classes cl_R, cl_I define the following operations

      type mod (const type& x, const type& y)
      +
      type rem (const type& x, const type& y)
      + @@ -1555,6 +1651,7 @@ defines the following operation:
      type sqrt (const type& x)
      + x must be >= 0. This function returns the square root of x, normalized to be >= 0. If x is the square of a rational number, sqrt(x) will be a rational number, else it will return a @@ -1569,6 +1666,7 @@ The classes cl_RA, cl_I define the following operation
      cl_boolean sqrtp (const type& x, type* root)
      + This tests whether x is a perfect square. If so, it returns true and the exact square root in *root, else it returns false. @@ -1581,6 +1679,7 @@ Furthermore, for integers, similarly:
      cl_boolean isqrt (const type& x, type* root)
      + x should be >= 0. This function sets *root to floor(sqrt(x)) and returns the same value as sqrtp: the boolean value (expt(*root,2) == x). @@ -1595,6 +1694,7 @@ define the following operation:
      cl_boolean rootp (const type& x, const cl_I& n, type* root)
      + x must be >= 0. n must be > 0. This tests whether x is an nth power of a rational number. If so, it returns true and the exact root in *root, else it returns @@ -1610,6 +1710,7 @@ for class cl_N:
      cl_N sqrt (const cl_N& z)
      + Returns the square root of z, as defined by the formula sqrt(z) = exp(log(z)/2). Conversion to a floating-point type or to a complex number are done if necessary. The range of the result is the @@ -1622,6 +1723,9 @@ The result is an exact number only if z is an exact number.

      4.8 Transcendental functions

      +

      + +

      The transcendental functions return an exact result if the argument @@ -1638,6 +1742,7 @@ For example, cos(0) = 1 returns the rational number 1.

      cl_R exp (const cl_R& x)
      +
      cl_N exp (const cl_N& x)
      Returns the exponential function of x. This is e^x where @@ -1646,10 +1751,12 @@ is the entire complex plane excluding 0.
      cl_R ln (const cl_R& x)
      + x must be > 0. Returns the (natural) logarithm of x.
      cl_N log (const cl_N& x)
      + Returns the (natural) logarithm of x. If x is real and positive, this is ln(x). In general, log(x) = log(abs(x)) + i*phase(x). The range of the result is the strip in the complex plane @@ -1657,6 +1764,7 @@ The range of the result is the strip in the complex plane
      cl_R phase (const cl_N& x)
      + Returns the angle part of x in its polar representation as a complex number. That is, phase(x) = atan(realpart(x),imagpart(x)). This is also the imaginary part of log(x). @@ -1678,6 +1786,7 @@ Returns the logarithm of a with respect to base b.
      cl_N expt (const cl_N& x, const cl_N& y)
      + Exponentiation: Returns x^y = exp(y*log(x)). @@ -1689,6 +1798,7 @@ The constant e = exp(1) = 2.71828... is returned by the following functions:
      cl_F cl_exp1 (cl_float_format_t f)
      + Returns e as a float of format f.
      cl_F cl_exp1 (const cl_F& y) @@ -1708,6 +1818,7 @@ Returns e as a float of format cl_default_float_format.
      cl_R sin (const cl_R& x)
      + Returns sin(x). The range of the result is the interval -1 <= sin(x) <= 1. @@ -1717,6 +1828,7 @@ Returns sin(z). The range of the result is the entire complex plane
      cl_R cos (const cl_R& x)
      + Returns cos(x). The range of the result is the interval -1 <= cos(x) <= 1. @@ -1726,25 +1838,31 @@ Returns cos(z). The range of the result is the entire complex plane
      struct cl_cos_sin_t { cl_R cos; cl_R sin; };
      +
      cl_cos_sin_t cl_cos_sin (const cl_R& x)
      Returns both sin(x) and cos(x). This is more efficient than + computing them separately. The relation cos^2 + sin^2 = 1 will hold only approximately.
      cl_R tan (const cl_R& x)
      +
      cl_N tan (const cl_N& x)
      Returns tan(x) = sin(x)/cos(x).
      cl_N cis (const cl_R& x)
      +
      cl_N cis (const cl_N& x)
      Returns exp(i*x). The name `cis' means "cos + i sin", because e^(i*x) = cos(x) + i*sin(x). + +
      cl_N asin (const cl_N& z)
      Returns arcsin(z). This is defined as @@ -1757,6 +1875,7 @@ with realpart = pi/2 and imagpart > 0.
      cl_N acos (const cl_N& z)
      + Returns arccos(z). This is defined as arccos(z) = pi/2 - arcsin(z) = log(z+i*sqrt(1-z^2))/i and satisfies arccos(-z) = pi - arccos(z). @@ -1765,6 +1884,8 @@ The range of the result is the strip in the complex domain with realpart = 0 and imagpart < 0 and the numbers with realpart = pi and imagpart > 0. + +
      cl_R atan (const cl_R& x, const cl_R& y)
      Returns the angle of the polar representation of the complex number @@ -1793,13 +1914,16 @@ with realpart = pi/2 and imagpart <= 0.

      -The constant pi = 3.14... is returned by the following functions: + + +Archimedes' constant pi = 3.14... is returned by the following functions:

      cl_F cl_pi (cl_float_format_t f)
      + Returns pi as a float of format f.
      cl_F cl_pi (const cl_F& y) @@ -1819,6 +1943,7 @@ Returns pi as a float of format cl_default_float_format.
      cl_R sinh (const cl_R& x)
      + Returns sinh(x).
      cl_N sinh (const cl_N& z) @@ -1827,6 +1952,7 @@ Returns sinh(z). The range of the result is the entire complex plan
      cl_R cosh (const cl_R& x)
      + Returns cosh(x). The range of the result is the interval cosh(x) >= 1. @@ -1836,20 +1962,24 @@ Returns cosh(z). The range of the result is the entire complex plan
      struct cl_cosh_sinh_t { cl_R cosh; cl_R sinh; };
      +
      cl_cosh_sinh_t cl_cosh_sinh (const cl_R& x)
      + Returns both sinh(x) and cosh(x). This is more efficient than computing them separately. The relation cosh^2 - sinh^2 = 1 will hold only approximately.
      cl_R tanh (const cl_R& x)
      +
      cl_N tanh (const cl_N& x)
      Returns tanh(x) = sinh(x)/cosh(x).
      cl_N asinh (const cl_N& z)
      + Returns arsinh(z). This is defined as arsinh(z) = log(z+sqrt(1+z^2)) and satisfies arsinh(-z) = -arsinh(z). @@ -1860,6 +1990,7 @@ with imagpart = pi/2 and realpart < 0.
      cl_N acosh (const cl_N& z)
      + Returns arcosh(z). This is defined as arcosh(z) = 2*log(sqrt((z+1)/2)+sqrt((z-1)/2)). The range of the result is the half-strip in the complex domain @@ -1868,6 +1999,7 @@ excluding the numbers with realpart = 0 and -pi < imagpar
      cl_N atanh (const cl_N& z)
      + Returns artanh(z). This is defined as artanh(z) = (log(1+z)-log(1-z)) / 2 and satisfies artanh(-z) = -artanh(z). The range of the result is @@ -1880,6 +2012,9 @@ with imagpart = pi/2 and realpart >= 0.

      4.8.4 Euler gamma

      +

      + +

      Euler's constant C = 0.577... is returned by the following functions: @@ -1889,6 +2024,7 @@ Euler's constant C = 0.577... is returned by the following functions:

      cl_F cl_eulerconst (cl_float_format_t f)
      + Returns Euler's constant as a float of format f.
      cl_F cl_eulerconst (const cl_F& y) @@ -1902,12 +2038,14 @@ Returns Euler's constant as a float of format cl_default_float_format Catalan's constant G = 0.915... is returned by the following functions: +
      cl_F cl_catalanconst (cl_float_format_t f)
      + Returns Catalan's constant as a float of format f.
      cl_F cl_catalanconst (const cl_F& y) @@ -1922,6 +2060,9 @@ Returns Catalan's constant as a float of format cl_default_float_format4.8.5 Riemann zeta +

      + +

      Riemann's zeta function at an integral point s>1 is returned by the @@ -1932,6 +2073,7 @@ following functions:

      cl_F cl_zeta (int s, cl_float_format_t f)
      + Returns Riemann's zeta function at s as a float of format f.
      cl_F cl_zeta (int s, const cl_F& y) @@ -1971,54 +2113,69 @@ on each of the bit positions in parallel.
      cl_I lognot (const cl_I& x)
      +
      cl_I operator ~ (const cl_I& x)
      + Logical not, like ~x in C. This is the same as -1-x.
      cl_I logand (const cl_I& x, const cl_I& y)
      +
      cl_I operator & (const cl_I& x, const cl_I& y)
      + Logical and, like x & y in C.
      cl_I logior (const cl_I& x, const cl_I& y)
      +
      cl_I operator | (const cl_I& x, const cl_I& y)
      + Logical (inclusive) or, like x | y in C.
      cl_I logxor (const cl_I& x, const cl_I& y)
      +
      cl_I operator ^ (const cl_I& x, const cl_I& y)
      + Exclusive or, like x ^ y in C.
      cl_I logeqv (const cl_I& x, const cl_I& y)
      + Bitwise equivalence, like ~(x ^ y) in C.
      cl_I lognand (const cl_I& x, const cl_I& y)
      + Bitwise not and, like ~(x & y) in C.
      cl_I lognor (const cl_I& x, const cl_I& y)
      + Bitwise not or, like ~(x | y) in C.
      cl_I logandc1 (const cl_I& x, const cl_I& y)
      + Logical and, complementing the first argument, like ~x & y in C.
      cl_I logandc2 (const cl_I& x, const cl_I& y)
      + Logical and, complementing the second argument, like x & ~y in C.
      cl_I logorc1 (const cl_I& x, const cl_I& y)
      + Logical or, complementing the first argument, like ~x | y in C.
      cl_I logorc2 (const cl_I& x, const cl_I& y)
      + Logical or, complementing the second argument, like x | ~y in C.
      @@ -2028,6 +2185,7 @@ These operations are all available though the function
      cl_I boole (cl_boole op, const cl_I& x, const cl_I& y)
      +

      where op must have one of the 16 values (each one stands for a function @@ -2036,6 +2194,21 @@ which combines two bits into one bit): boole_clr, boole_setboole_and, boole_ior, boole_xor, boole_eqv, boole_nand, boole_nor, boole_andc1, boole_andc2, boole_orc1, boole_orc2. + + + + + + + + + + + + + + +

      @@ -2046,16 +2219,19 @@ Other functions that view integers as bit strings:

      cl_boolean logtest (const cl_I& x, const cl_I& y)
      + Returns true if some bit is set in both x and y, i.e. if logand(x,y) != 0.
      cl_boolean logbitp (const cl_I& n, const cl_I& x)
      + Returns true if the nth bit (from the right) of x is set. Bit 0 is the least significant bit.
      uintL logcount (const cl_I& x)
      + Returns the number of one bits in x, if x >= 0, or the number of zero bits in x, if x < 0. @@ -2069,6 +2245,7 @@ struct cl_byte { uintL size; uintL position; };

      + represents the bit interval containing the bits position...position+size-1 of an integer. The constructor cl_byte(size,position) constructs a cl_byte. @@ -2078,16 +2255,19 @@ The constructor cl_byte(size,position) constructs a cl_bytecl_I ldb (const cl_I& n, const cl_byte& b)

      + extracts the bits of n described by the bit interval b and returns them as a nonnegative integer with b.size bits.
      cl_boolean ldb_test (const cl_I& n, const cl_byte& b)
      + Returns true if some bit described by the bit interval b is set in n.
      cl_I dpb (const cl_I& newbyte, const cl_I& n, const cl_byte& b)
      + Returns n, with the bits described by the bit interval b replaced by newbyte. Only the lowest b.size bits of newbyte are relevant. @@ -2102,11 +2282,13 @@ functions are their counterparts without shifting:
      cl_I mask_field (const cl_I& n, const cl_byte& b)
      + returns an integer with the bits described by the bit interval b copied from the corresponding bits in n, the other bits zero.
      cl_I deposit_field (const cl_I& newbyte, const cl_I& n, const cl_byte& b)
      + returns an integer where the bits described by the bit interval b come from newbyte and the other bits come from n. @@ -2137,33 +2319,39 @@ for common arithmetic operations:
      cl_boolean oddp (const cl_I& x)
      + Returns true if the least significant bit of x is 1. Equivalent to mod(x,2) != 0.
      cl_boolean evenp (const cl_I& x)
      + Returns true if the least significant bit of x is 0. Equivalent to mod(x,2) == 0.
      cl_I operator << (const cl_I& x, const cl_I& n)
      + Shifts x by n bits to the left. n should be >=0. Equivalent to x * expt(2,n).
      cl_I operator >> (const cl_I& x, const cl_I& n)
      + Shifts x by n bits to the right. n should be >=0. Bits shifted out to the right are thrown away. Equivalent to floor(x / expt(2,n)).
      cl_I ash (const cl_I& x, const cl_I& y)
      + Shifts x by y bits to the left (if y>=0) or by -y bits to the right (if y<=0). In other words, this returns floor(x * expt(2,y)).
      uintL integer_length (const cl_I& x)
      + Returns the number of bits (excluding the sign bit) needed to represent x in two's complement notation. This is the smallest n >= 0 such that -2^n <= x < 2^n. If x > 0, this is the unique n > 0 such that @@ -2171,12 +2359,14 @@ in two's complement notation. This is the smallest n >= 0 such that
      uintL ord2 (const cl_I& x)
      + x must be non-zero. This function returns the number of 0 bits at the right of x in two's complement notation. This is the largest n >= 0 such that 2^n divides x.
      uintL power2p (const cl_I& x)
      + x must be > 0. This function checks whether x is a power of 2. If x = 2^(n-1), it returns n. Else it returns 0. (See also the function logp.) @@ -2190,6 +2380,7 @@ If x = 2^(n-1), it returns n. Else it returns 0.
      uint32 gcd (uint32 a, uint32 b)
      +
      cl_I gcd (const cl_I& a, const cl_I& b)
      This function returns the greatest common divisor of a and b, @@ -2197,6 +2388,7 @@ normalized to be >= 0.
      cl_I xgcd (const cl_I& a, const cl_I& b, cl_I* u, cl_I* v)
      + This function ("extended gcd") returns the greatest common divisor g of a and b and at the same time the representation of g as an integral linear combination of a and b: @@ -2208,11 +2400,13 @@ value, in the following sense: If a and b are non-zero
      cl_I lcm (const cl_I& a, const cl_I& b)
      + This function returns the least common multiple of a and b, normalized to be >= 0.
      cl_boolean logp (const cl_I& a, const cl_I& b, cl_RA* l)
      +
      cl_boolean logp (const cl_RA& a, const cl_RA& b, cl_RA* l)
      a must be > 0. b must be >0 and != 1. If log(a,b) is @@ -2228,17 +2422,20 @@ it returns false.
      cl_I factorial (uintL n)
      + n must be a small integer >= 0. This function returns the factorial n! = 1*2*...*n.
      cl_I doublefactorial (uintL n)
      + n must be a small integer >= 0. This function returns the doublefactorial n!! = 1*3*...*n or n!! = 2*4*...*n, respectively.
      cl_I binomial (uintL n, uintL k)
      + n and k must be small integers >= 0. This function returns the binomial coefficient (n choose k) = n! / k! (n-k)! @@ -2265,6 +2462,7 @@ defines the following operations.
      type scale_float (const type& x, sintL delta)
      +
      type scale_float (const type& x, const cl_I& delta)
      Returns x*2^delta. This is more efficient than an explicit multiplication @@ -2280,27 +2478,32 @@ representation of floating-point numbers.
      sintL float_exponent (const type& x)
      + Returns the exponent e of x. For x = 0.0, this is 0. For x non-zero, this is the unique integer with 2^(e-1) <= abs(x) < 2^e.
      sintL float_radix (const type& x)
      + Returns the base of the floating-point representation. This is always 2.
      type float_sign (const type& x)
      + Returns the sign s of x as a float. The value is 1 for x >= 0, -1 for x < 0.
      uintL float_digits (const type& x)
      + Returns the number of mantissa bits in the floating-point representation of x, including the hidden bit. The value only depends on the type of x, not on its value.
      uintL float_precision (const type& x)
      + Returns the number of significant mantissa bits in the floating-point representation of x. Since denormalized numbers are not supported, this is the same as float_digits(x) if x is non-zero, and @@ -2309,6 +2512,11 @@ this is the same as float_digits(x) if x is non-zero,

      The complete internal representation of a float is encoded in the type + + + + + cl_decoded_float (or cl_decoded_sfloat, cl_decoded_ffloat, cl_decoded_dfloat, cl_decoded_lfloat, respectively), defined by @@ -2326,6 +2534,7 @@ and returned by the function

      cl_decoded_typefloat decode_float (const type& x)
      + For x non-zero, this returns (-1)^s, e, m with x = (-1)^s * 2^e * m and 0.5 <= m < 1.0. For x = 0, it returns (-1)^s=1, e=0, m=0. @@ -2336,7 +2545,7 @@ it returns (-1)^s=1, e=0, m=0. A complete decoding in terms of integers is provided as type
      -struct cl_idecoded_float {
      +struct cl_idecoded_float {
               cl_I mantissa; cl_I exponent; cl_I sign;
       };
       
      @@ -2349,6 +2558,7 @@ by the following function:
      cl_idecoded_float integer_decode_float (const type& x)
      + For x non-zero, this returns (-1)^s, e, m with x = (-1)^s * 2^e * m and m an integer with float_digits(x) bits. For x = 0, it returns (-1)^s=1, e=0, m=0. @@ -2364,6 +2574,7 @@ Some other function, implemented only for class cl_F:
      cl_F float_sign (const cl_F& x, const cl_F& y)
      + This returns a floating point number whose precision and absolute value is that of y and whose sign is that of x. If x is zero, it is treated as positive. Same for y. @@ -2372,6 +2583,9 @@ zero, it is treated as positive. Same for y.

      4.11 Conversion functions

      +

      + + @@ -2385,6 +2599,7 @@ The type cl_float_format_t describes a floating-point format.

      cl_float_format_t cl_float_format (uintL n)
      + Returns the smallest float format which guarantees at least n decimal digits in the mantissa (after the decimal point). @@ -2394,6 +2609,7 @@ Returns the floating point format of x.
      cl_float_format_t cl_default_float_format
      + Global variable: the default float format used when converting rational numbers to floats. @@ -2409,6 +2625,7 @@ defines the following operations:
      cl_F cl_float (const type&x, cl_float_format_t f)
      + Returns x as a float of format f.
      cl_F cl_float (const type&x, const cl_F& y)
      @@ -2431,28 +2648,34 @@ Every floating-point format has some characteristic numbers:
      cl_F most_positive_float (cl_float_format_t f)
      + Returns the largest (most positive) floating point number in float format f.
      cl_F most_negative_float (cl_float_format_t f)
      + Returns the smallest (most negative) floating point number in float format f.
      cl_F least_positive_float (cl_float_format_t f)
      + Returns the least positive floating point number (i.e. > 0 but closest to 0) in float format f.
      cl_F least_negative_float (cl_float_format_t f)
      + Returns the least negative floating point number (i.e. < 0 but closest to 0) in float format f.
      cl_F float_epsilon (cl_float_format_t f)
      + Returns the smallest floating point number e > 0 such that 1+e != 1.
      cl_F float_negative_epsilon (cl_float_format_t f)
      + Returns the smallest floating point number e > 0 such that 1-e != 1. @@ -2469,6 +2692,7 @@ defines the following operation:
      cl_RA rational (const type& x)
      + Returns the value of x as an exact number. If x is already an exact number, this is x. If x is a floating-point number, the value is a rational number whose denominator is a power of 2. @@ -2483,6 +2707,7 @@ the function
      cl_RA rationalize (const cl_R& x)
      + If x is a floating-point number, it actually represents an interval of real numbers, and this function returns the rational number with smallest denominator (and smallest numerator, in magnitude) @@ -2524,6 +2749,7 @@ a complicated but deterministic way.

      The global variable +

       cl_random_state cl_default_random_state
      @@ -2540,12 +2766,14 @@ below are called without cl_random_state argument.
       
      uint32 random32 ()
      + Returns a random unsigned 32-bit number. All bits are equally random.
      cl_I random_I (cl_random_state& randomstate, const cl_I& n)
      cl_I random_I (const cl_I& n)
      + n must be an integer > 0. This function returns a random integer x in the range 0 <= x < n. @@ -2553,6 +2781,7 @@ in the range 0 <= x < n.
      cl_F random_F (const cl_F& n)
      + n must be a float > 0. This function returns a random floating-point number of the same format as n in the range 0 <= x < n. @@ -2560,6 +2789,7 @@ number of the same format as n in the range 0 <= x <
      cl_R random_R (const cl_R& n)
      + Behaves like random_I if n is an integer and like random_F if n is a float. @@ -2567,6 +2797,9 @@ if n is a float.

      4.13 Obfuscating operators

      +

      + +

      The modifying C/C++ operators +=, -=, *=, /=, @@ -2581,6 +2814,7 @@ to get happy, then add

      + to the beginning of your source files, before the inclusion of any CLN include files. This flag will enable the following operators: @@ -2594,12 +2828,16 @@ For the classes cl_N, cl_R, cl_RA,

      type& operator += (type&, const type&)
      +
      type& operator -= (type&, const type&)
      +
      type& operator *= (type&, const type&)
      +
      type& operator /= (type&, const type&)
      +

      @@ -2616,14 +2854,19 @@ For the class cl_I:

      type& operator &= (type&, const type&)
      +
      type& operator |= (type&, const type&)
      +
      type& operator ^= (type&, const type&)
      +
      type& operator <<= (type&, const type&)
      +
      type& operator >>= (type&, const type&)
      +

      @@ -2635,6 +2878,7 @@ For the classes cl_N, cl_R, cl_RA,

      type& operator ++ (type& x)
      + The prefix operator ++x.
      void operator ++ (type& x, int) @@ -2643,6 +2887,7 @@ The postfix operator x++.
      type& operator -- (type& x)
      + The prefix operator --x.
      void operator -- (type& x, int) @@ -2659,10 +2904,16 @@ efficient.

      5. Input/Output

      +

      + +

      5.1 Internal and printed representation

      +

      + +

      All computations deal with the internal representations of the numbers. @@ -2676,8 +2927,10 @@ Several external representations may denote the same number, for example,

      Converting an internal to an external representation is called "printing", + converting an external to an internal representation is called "reading". -In CLN, is it always true that conversion of an internal to an external + +In CLN, it is always true that conversion of an internal to an external representation and then back to an internal representation will yield the same internal representation. Symbolically: read(print(x)) == x. This is called "print-read consistency". @@ -3058,7 +3311,7 @@ using this variable name. Default is "x".

      The global variable cl_default_print_flags contains the default values, -used by the function fprint, +used by the function fprint. @@ -3163,10 +3416,16 @@ Tests whether the given number is an element of the number ring R.

      7. Modular integers

      +

      + +

      7.1 Modular integer rings

      +

      + +

      CLN implements modular integers, i.e. integers modulo a fixed integer N. @@ -3212,9 +3471,11 @@ Modular integer rings are constructed using the function

      cl_modint_ring cl_find_modint_ring (const cl_I& N)
      + This function returns the modular ring `Z/NZ'. It takes care of finding out about special cases of N, like powers of two and odd numbers for which Montgomery multiplication will be a win, + and precomputes any necessary auxiliary data for computing modulo N. There is a cache table of rings, indexed by N (or, more precisely, by abs(N)). This ensures that the precomputation costs are reduced @@ -3229,8 +3490,10 @@ Modular integer rings can be compared for equality:
      bool operator== (const cl_modint_ring&, const cl_modint_ring&)
      +
      bool operator!= (const cl_modint_ring&, const cl_modint_ring&)
      + These compare two modular integer rings for equality. Two different calls to cl_find_modint_ring with the same argument necessarily return the same ring because it is memoized in the cache table. @@ -3248,22 +3511,27 @@ Given a modular integer ring R, the following members can be used.
      cl_I R->modulus
      + This is the ring's modulus, normalized to be nonnegative: abs(N).
      cl_MI R->zero()
      + This returns 0 mod N.
      cl_MI R->one()
      + This returns 1 mod N.
      cl_MI R->canonhom (const cl_I& x)
      + This returns x mod N.
      cl_I R->retract (const cl_MI& x)
      + This is a partial inverse function to R->canonhom. It returns the standard representative (>=0, <N) of x. @@ -3271,6 +3539,7 @@ standard representative (>=0, <N) of x
      cl_MI R->random()
      + This returns a random integer modulo N. @@ -3282,15 +3551,18 @@ The following operations are defined on modular integers.
      cl_modint_ring x.ring ()
      + Returns the ring to which the modular integer x belongs.
      cl_MI operator+ (const cl_MI&, const cl_MI&)
      + Returns the sum of two modular integers. One of the arguments may also be a plain integer.
      cl_MI operator- (const cl_MI&, const cl_MI&)
      + Returns the difference of two modular integers. One of the arguments may also be a plain integer. @@ -3300,50 +3572,61 @@ Returns the negative of a modular integer.
      cl_MI operator* (const cl_MI&, const cl_MI&)
      + Returns the product of two modular integers. One of the arguments may also be a plain integer.
      cl_MI square (const cl_MI&)
      + Returns the square of a modular integer.
      cl_MI recip (const cl_MI& x)
      + Returns the reciprocal x^-1 of a modular integer x. x must be coprime to the modulus, otherwise an error message is issued.
      cl_MI div (const cl_MI& x, const cl_MI& y)
      + Returns the quotient x*y^-1 of two modular integers x, y. y must be coprime to the modulus, otherwise an error message is issued.
      cl_MI expt_pos (const cl_MI& x, const cl_I& y)
      + y must be > 0. Returns x^y.
      cl_MI expt (const cl_MI& x, const cl_I& y)
      + Returns x^y. If y is negative, x must be coprime to the modulus, else an error message is issued.
      cl_MI operator<< (const cl_MI& x, const cl_I& y)
      + Returns x*2^y.
      cl_MI operator>> (const cl_MI& x, const cl_I& y)
      + Returns x*2^-y. When y is positive, the modulus must be odd, or an error message is issued.
      bool operator== (const cl_MI&, const cl_MI&)
      +
      bool operator!= (const cl_MI&, const cl_MI&)
      + Compares two modular integers, belonging to the same modular integer ring, for equality.
      cl_boolean zerop (const cl_MI& x)
      + Returns true if x is 0 mod N. @@ -3356,8 +3639,10 @@ input/output).
      void fprint (cl_ostream stream, const cl_MI& x)
      +
      cl_ostream operator<< (cl_ostream stream, const cl_MI& x)
      + Prints the modular integer x on the stream. The output may depend on the global printer settings in the variable cl_default_print_flags. @@ -3365,6 +3650,9 @@ on the global printer settings in the variable cl_default_print_flags8. Symbolic data types +

      + +

      CLN implements two symbolic (non-numeric) data types: strings and symbols. @@ -3373,6 +3661,9 @@ CLN implements two symbolic (non-numeric) data types: strings and symbols.

      8.1 Strings

      +

      + +

      The class @@ -3397,6 +3688,7 @@ Strings are constructed through the following constructors:

      cl_string (const char * s)
      + Returns an immutable copy of the (zero-terminated) C string s.
      cl_string (const char * ptr, unsigned long len) @@ -3417,17 +3709,21 @@ Assignment from cl_string and const char *.
      s.length()
      +
      strlen(s)
      + Returns the length of the string s.
      s[i]
      + Returns the ith character of the string s. i must be in the range 0 <= i < s.length().
      bool equal (const cl_string& s1, const cl_string& s2)
      + Compares two strings for equality. One of the arguments may also be a plain const char *. @@ -3435,6 +3731,9 @@ plain const char *.

      8.2 Symbols

      +

      + +

      Symbols are uniquified strings: all symbols with the same name are shared. @@ -3453,6 +3752,7 @@ Symbols are constructed through the following constructor:

      cl_symbol (const cl_string& s)
      + Looks up or creates a new symbol with a given name. @@ -3469,12 +3769,17 @@ Conversion to cl_string: Returns the string which names the symbol
      bool equal (const cl_symbol& sym1, const cl_symbol& sym2)
      + Compares two symbols for equality. This is very fast.

      9. Univariate polynomials

      +

      + + + @@ -3586,6 +3891,7 @@ return the same polynomial ring.

      cl_univpoly_complex_ring cl_find_univpoly_ring (const cl_complex_ring& R)
      +
      cl_univpoly_complex_ring cl_find_univpoly_ring (const cl_complex_ring& R, const cl_symbol& varname)
      cl_univpoly_real_ring cl_find_univpoly_ring (const cl_real_ring& R) @@ -3620,27 +3926,33 @@ Given a univariate polynomial ring R, the following members can be
      cl_ring R->basering()
      + This returns the base ring, as passed to `cl_find_univpoly_ring'.
      cl_UP R->zero()
      + This returns 0 in R, a polynomial of degree -1.
      cl_UP R->one()
      + This returns 1 in R, a polynomial of degree <= 0.
      cl_UP R->canonhom (const cl_I& x)
      + This returns x in R, a polynomial of degree <= 0.
      cl_UP R->monomial (const cl_ring_element& x, uintL e)
      + This returns a sparse polynomial: x * X^e, where X is the indeterminate.
      cl_UP R->create (sintL degree)
      + Creates a new polynomial with a given degree. The zero polynomial has degree -1. After creating the polynomial, you should put in the coefficients, using the set_coeff member function, and then call the finalize @@ -3655,12 +3967,14 @@ The following are the only destructive operations on univariate polynomials.
      void set_coeff (cl_UP& x, uintL index, const cl_ring_element& y)
      + This changes the coefficient of X^index in x to be y. After changing a polynomial and before applying any "normal" operation on it, you should call its finalize member function.
      void finalize (cl_UP& x)
      + This function marks the endpoint of destructive modifications of a polynomial. It normalizes the internal representation so that subsequent computations have less overhead. Doing normal computations on unnormalized polynomials may @@ -3675,14 +3989,17 @@ The following operations are defined on univariate polynomials.
      cl_univpoly_ring x.ring ()
      + Returns the ring to which the univariate polynomial x belongs.
      cl_UP operator+ (const cl_UP&, const cl_UP&)
      + Returns the sum of two univariate polynomials.
      cl_UP operator- (const cl_UP&, const cl_UP&)
      + Returns the difference of two univariate polynomials.
      cl_UP operator- (const cl_UP&) @@ -3691,44 +4008,54 @@ Returns the negative of a univariate polynomial.
      cl_UP operator* (const cl_UP&, const cl_UP&)
      + Returns the product of two univariate polynomials. One of the arguments may also be a plain integer or an element of the base ring.
      cl_UP square (const cl_UP&)
      + Returns the square of a univariate polynomial.
      cl_UP expt_pos (const cl_UP& x, const cl_I& y)
      + y must be > 0. Returns x^y.
      bool operator== (const cl_UP&, const cl_UP&)
      +
      bool operator!= (const cl_UP&, const cl_UP&)
      + Compares two univariate polynomials, belonging to the same univariate polynomial ring, for equality.
      cl_boolean zerop (const cl_UP& x)
      + Returns true if x is 0 in R.
      sintL degree (const cl_UP& x)
      + Returns the degree of the polynomial. The zero polynomial has degree -1.
      cl_ring_element coeff (const cl_UP& x, uintL index)
      + Returns the coefficient of X^index in the polynomial x.
      cl_ring_element x (const cl_ring_element& y)
      + Evaluation: If x is a polynomial and y belongs to the base ring, then `x(y)' returns the value of the substitution of y into x.
      cl_UP deriv (const cl_UP& x)
      + Returns the derivative of the polynomial x with respect to the indeterminate X. @@ -3742,8 +4069,10 @@ input/output).
      void fprint (cl_ostream stream, const cl_UP& x)
      +
      cl_ostream operator<< (cl_ostream stream, const cl_UP& x)
      + Prints the univariate polynomial x on the stream. The output may depend on the global printer settings in the variable cl_default_print_flags. @@ -3761,18 +4090,26 @@ The following functions return special polynomials.
      cl_UP_I cl_tschebychev (sintL n)
      + + Returns the n-th Tchebychev polynomial (n >= 0).
      cl_UP_I cl_hermite (sintL n)
      + + Returns the n-th Hermite polynomial (n >= 0).
      cl_UP_RA cl_legendre (sintL n)
      + + Returns the n-th Legendre polynomial (n >= 0).
      cl_UP_I cl_laguerre (sintL n)
      + + Returns the n-th Laguerre polynomial (n >= 0). @@ -3789,6 +4126,9 @@ of these polynomials from their definition can be found in the

      10.1 Why C++ ?

      +

      + +

      Using C++ as an implementation language provides @@ -3802,6 +4142,7 @@ Efficiency: It compiles to machine code.

    • + Portability: It runs on all platforms supporting a C++ compiler. Because of the availability of GNU C++, this includes all currently used 32-bit and 64-bit platforms, independently of the quality of the vendor's C++ compiler. @@ -3811,7 +4152,7 @@ of the availability of GNU C++, this includes all currently used 32-bit and Type safety: The C++ compilers knows about the number types and complains if, for example, you try to assign a float to an integer variable. However, a drawback is that C++ doesn't know about generic types, hence a restriction -like that operation+ (const cl_MI&, const cl_MI&) requires that both +like that operator+ (const cl_MI&, const cl_MI&) requires that both arguments belong to the same modular ring cannot be expressed as a compile-time information. @@ -3847,6 +4188,8 @@ Object sharing: An operation like x+0 returns x withou it.
    • + + Garbage collection: A reference counting mechanism makes sure that any number object's storage is freed immediately when the last reference to the object is gone. @@ -3879,8 +4222,8 @@ The kernel of CLN has been written in assembly language for some CPUs (i386, m68k, sparc, mips, arm).
    • -On all CPUs, CLN uses the superefficient low-level routines from GNU -GMP version 2. +On all CPUs, CLN may be configured to use the superefficient low-level +routines from GNU GMP version 3.
    • For large numbers, CLN uses, instead of the standard O(N^2) @@ -3891,6 +4234,7 @@ algorithm. For very large numbers (more than 12000 decimal digits), CLN uses Schönhage-Strassen + multiplication, which is an asymptotically optimal multiplication algorithm.
    • @@ -3902,6 +4246,9 @@ of division and radix conversion.

      10.4 Garbage collection

      +

      + +

      All the number classes are reference count classes: They only contain a pointer @@ -3937,6 +4284,9 @@ environment variables, or directly substitute the appropriate values.

      11.1 Compiler options

      +

      + +

      Until you have installed CLN in a public place, the following options are @@ -3973,6 +4323,10 @@ linking a CLN application it is sufficient to give the flag -lcln.

      11.2 Include files

      +

      + + +

      Here is a summary of the include files and their contents. @@ -4168,6 +4522,7 @@ Includes all of the above.

      A function which computes the nth Fibonacci number can be written as follows. + @@ -4244,9 +4599,17 @@ automatically reclaimed (garbage collected). Only the result survives and gets passed to the caller. +

      +The file fibonacci.cc in the subdirectory examples +contains this implementation together with an even faster algorithm. + +

      11.4 Debugging support

      +

      + +

      When debugging a CLN application with GNU gdb, two facilities are @@ -4279,6 +4642,7 @@ CLN offers a function cl_print, callable from the debugger, for printing number objects. In order to get this function, you have to define the macro `CL_DEBUG' and then include all the header files for which you want cl_print debugging support. For example: +

       #define CL_DEBUG
      @@ -4305,6 +4669,7 @@ only with number objects and similar. Therefore CLN offers a member function
       debug_print() on all CLN types. The same macro `CL_DEBUG'
       is needed for this member function to be implemented. Under gdb,
       you call it like this:
      +
       
       
       (gdb) print s
      @@ -4325,6 +4690,9 @@ Unfortunately, this feature does not seem to work under all circumstances.
       
       
       

      12. Customizing

      +

      + + @@ -4343,12 +4711,16 @@ void cl_abort (void);

      + This function must not return control to its caller.

      12.2 Floating-point underflow

      +

      + +

      Floating point underflow denotes the situation when a floating-point number @@ -4362,9 +4734,8 @@ cl_boolean cl_inhibit_floating_point_underflow

      to cl_true, the error will be inhibited, and a floating-point zero -will be generated instead. -The default value of cl_inhibit_floating_point_underflow is -cl_false. +will be generated instead. The default value of +cl_inhibit_floating_point_underflow is cl_false. @@ -4374,6 +4745,7 @@ The default value of cl_inhibit_floating_point_underflow is

      The output of the function fprint may be customized by changing the value of the global variable cl_default_print_flags. + @@ -4397,6 +4769,8 @@ void (*cl_free_hook) (void* ptr) = ...;

      + + The cl_malloc_hook function must not return a NULL pointer. @@ -4416,7 +4790,7 @@ Jump to:


      -This document was generated on 14 January 2000 using +This document was generated on 4 May 2000 using texi2html 1.56k. diff --git a/doc/cln.info b/doc/cln.info index 2b72212..2adcbc2 100644 --- a/doc/cln.info +++ b/doc/cln.info @@ -215,8 +215,8 @@ CLN is speed efficient: * The kernel of CLN has been written in assembly language for some CPUs (`i386', `m68k', `sparc', `mips', `arm'). - * On all CPUs, CLN uses the superefficient low-level routines from - GNU GMP version 2. + * On all CPUs, CLN may be configured to use the superefficient + low-level routines from GNU GMP version 3. * It uses Karatsuba multiplication, which is significantly faster for large numbers than the standard multiplication algorithm. @@ -267,7 +267,7 @@ C++ compiler To build CLN, you need a C++ compiler. Actually, you need GNU `g++ 2.7.0' or newer. On HPPA, you need GNU `g++ 2.8.0' or newer. I -recommend GNU `egcs 1.1' or newer. +recommend GNU `g++ 2.95' or newer. The following C++ features are used: classes, member functions, overloading of functions and operators, constructors and destructors, @@ -375,9 +375,6 @@ add either `-O' or `-O2 -fno-schedule-insns' to the CXXFLAGS. With full `-O2', `g++' miscompiles the division routines. Also, for -enable-shared to work, you need egcs-1.1.2 or newer. -On MIPS (SGI Irix 6), pass option `--without-gmp' to configure. gmp does -not work when compiled in `n32' binary format on Irix. - By default, only a static library is built. You can build CLN as a shared library too, by calling `configure' with the option `--enable-shared'. To get it built as a shared library only, call @@ -1310,7 +1307,8 @@ Trigonometric functions numbers with `realpart = -pi/2' and `imagpart >= 0' and the numbers with `realpart = pi/2' and `imagpart <= 0'. -The constant pi = 3.14... is returned by the following functions: +Archimedes' constant pi = 3.14... is returned by the following +functions: `cl_F cl_pi (cl_float_format_t f)' Returns pi as a float of format `f'. @@ -1943,7 +1941,7 @@ number, for example, "20.0" and "20.000". Converting an internal to an external representation is called "printing", converting an external to an internal representation is -called "reading". In CLN, is it always true that conversion of an +called "reading". In CLN, it is always true that conversion of an internal to an external representation and then back to an internal representation will yield the same internal representation. Symbolically: `read(print(x)) == x'. This is called "print-read @@ -2186,7 +2184,7 @@ The structure type `cl_print_flags' contains the following fields: printed using this variable name. Default is `"x"'. The global variable `cl_default_print_flags' contains the default -values, used by the function `fprint', +values, used by the function `fprint'.  File: cln.info, Node: Rings, Next: Modular integers, Prev: Input/Output, Up: Top @@ -2755,7 +2753,7 @@ Using C++ as an implementation language provides * Type safety: The C++ compilers knows about the number types and complains if, for example, you try to assign a float to an integer variable. However, a drawback is that C++ doesn't know about - generic types, hence a restriction like that `operation+ (const + generic types, hence a restriction like that `operator+ (const cl_MI&, const cl_MI&)' requires that both arguments belong to the same modular ring cannot be expressed as a compile-time information. @@ -2808,8 +2806,8 @@ and algorithms: * The kernel of CLN has been written in assembly language for some CPUs (`i386', `m68k', `sparc', `mips', `arm'). - * On all CPUs, CLN uses the superefficient low-level routines from - GNU GMP version 2. + * On all CPUs, CLN may be configured to use the superefficient + low-level routines from GNU GMP version 3. * For large numbers, CLN uses, instead of the standard `O(N^2)' algorithm, the Karatsuba multiplication, which is an `O(N^1.6)' @@ -3138,6 +3136,9 @@ When the function returns, all the local variables in the function are automatically reclaimed (garbage collected). Only the result survives and gets passed to the caller. +The file `fibonacci.cc' in the subdirectory `examples' contains this +implementation together with an even faster algorithm. +  File: cln.info, Node: Debugging support, Prev: An Example, Up: Using the library @@ -3275,81 +3276,401 @@ Index * Menu: +* abs (): Elementary functions. +* abstract class: Ordinary number types. +* acos (): Trigonometric functions. +* acosh (): Hyperbolic functions. +* advocacy: Why C++ ?. +* Archimedes' constant: Trigonometric functions. +* As() (): Conversions. +* ash (): Logical functions. +* asin: Trigonometric functions. +* asin (): Trigonometric functions. +* asinh (): Hyperbolic functions. +* atan: Trigonometric functions. +* atan (): Trigonometric functions. +* atanh (): Hyperbolic functions. +* basering (): Functions on univariate polynomials. +* binomial (): Combinatorial functions. +* boole (): Logical functions. +* boole_1: Logical functions. +* boole_2: Logical functions. +* boole_and: Logical functions. +* boole_andc1: Logical functions. +* boole_andc2: Logical functions. +* boole_c1: Logical functions. +* boole_c2: Logical functions. +* boole_clr: Logical functions. +* boole_eqv: Logical functions. +* boole_nand: Logical functions. +* boole_nor: Logical functions. +* boole_orc1: Logical functions. +* boole_orc2: Logical functions. +* boole_set: Logical functions. +* boole_xor: Logical functions. +* canonhom () <1>: Functions on univariate polynomials. +* canonhom (): Functions on modular integers. +* Catalan's constant: Euler gamma. +* ceiling1 (): Rounding functions. +* ceiling2 (): Rounding functions. +* cis (): Trigonometric functions. +* cl_abort (): Error handling. +* cl_byte: Logical functions. +* cl_catalanconst (): Euler gamma. +* cl_compare (): Comparisons. +* cl_cos_sin (): Trigonometric functions. +* cl_cos_sin_t: Trigonometric functions. +* cl_cosh_sinh (): Hyperbolic functions. +* cl_cosh_sinh_t: Hyperbolic functions. +* CL_DEBUG: Debugging support. +* cl_decoded_dfloat: Functions on floating-point numbers. +* cl_decoded_ffloat: Functions on floating-point numbers. +* cl_decoded_float: Functions on floating-point numbers. +* cl_decoded_lfloat: Functions on floating-point numbers. +* cl_decoded_sfloat: Functions on floating-point numbers. +* cl_default_float_format: Conversion to floating-point numbers. +* cl_default_print_flags: Customizing I/O. +* cl_default_random_state: Random number generators. +* cl_DF: Floating-point numbers. +* cl_double_approx (): Conversions. +* cl_equal_hashcode (): Comparisons. +* cl_eulerconst (): Euler gamma. +* cl_F <1>: Floating-point numbers. +* cl_F: Ordinary number types. +* cl_FF: Floating-point numbers. +* cl_find_modint_ring (): Modular integer rings. +* cl_find_univpoly_ring (): Univariate polynomial rings. +* cl_float: Conversion to floating-point numbers. +* cl_float_approx (): Conversions. +* cl_float_format (): Conversion to floating-point numbers. +* cl_free_hook (): Customizing the memory allocator. +* cl_hermite (): Special polynomials. +* cl_I_to_int (): Conversions. +* cl_I_to_long (): Conversions. +* cl_I_to_uint (): Conversions. +* cl_I_to_ulong (): Conversions. +* cl_idecoded_float: Functions on floating-point numbers. +* cl_laguerre (): Special polynomials. +* cl_legendre (): Special polynomials. +* cl_LF: Floating-point numbers. +* cl_malloc_hook (): Customizing the memory allocator. +* cl_N: Ordinary number types. +* cl_number: Ordinary number types. +* cl_pi: Trigonometric functions. +* cl_R: Ordinary number types. +* cl_RA: Ordinary number types. +* cl_SF: Floating-point numbers. +* cl_string (): Strings. +* cl_symbol (): Symbols. +* cl_tschebychev (): Special polynomials. +* cl_zeta (): Riemann zeta. +* coeff (): Functions on univariate polynomials. +* comparison: Comparisons. +* compiler options: Compiler options. +* complex (): Elementary complex functions. +* complex number <1>: Complex numbers. +* complex number: Ordinary number types. +* conjugate (): Elementary complex functions. +* conversion <1>: Conversion functions. +* conversion: Conversions. +* cos (): Trigonometric functions. +* cosh (): Hyperbolic functions. +* create (): Functions on univariate polynomials. +* customizing: Customizing. +* debug_print (): Debugging support. +* debugging: Debugging support. +* decode_float (): Functions on floating-point numbers. +* degree (): Functions on univariate polynomials. +* denominator (): Elementary rational functions. +* deposit_field (): Logical functions. +* deriv (): Functions on univariate polynomials. +* div (): Functions on modular integers. +* doublefactorial (): Combinatorial functions. +* dpb (): Logical functions. +* equal () <1>: Symbols. +* equal (): Strings. +* etract (): Functions on modular integers. +* Euler's constant: Euler gamma. +* evenp (): Logical functions. +* exact number: Exact numbers. +* exp (): Exponential and logarithmic functions. +* exp1 (): Exponential and logarithmic functions. +* expt () <1>: Functions on modular integers. +* expt () <2>: Exponential and logarithmic functions. +* expt (): Elementary functions. +* expt_pos () <1>: Functions on univariate polynomials. +* expt_pos () <2>: Functions on modular integers. +* expt_pos (): Elementary functions. +* exquo (): Elementary functions. +* factorial (): Combinatorial functions. +* fceiling (): Rounding functions. +* fceiling2 (): Rounding functions. +* ffloor (): Rounding functions. +* ffloor2 (): Rounding functions. +* Fibonacci number: An Example. +* finalize (): Functions on univariate polynomials. +* float_digits (): Functions on floating-point numbers. +* float_epsilon (): Conversion to floating-point numbers. +* float_exponent (): Functions on floating-point numbers. +* float_negative_epsilon (): Conversion to floating-point numbers. +* float_precision (): Functions on floating-point numbers. +* float_radix (): Functions on floating-point numbers. +* float_sign (): Functions on floating-point numbers. +* floating-point number: Floating-point numbers. +* floor1 (): Rounding functions. +* floor2 (): Rounding functions. +* fprint () <1>: Functions on univariate polynomials. +* fprint (): Functions on modular integers. +* fround (): Rounding functions. +* fround2 (): Rounding functions. +* ftruncate (): Rounding functions. +* ftruncate2 (): Rounding functions. +* garbage collection <1>: Garbage collection. +* garbage collection: Memory efficiency. +* gcd (): Number theoretic functions. +* GMP: Introduction. +* header files: Include files. +* Hermite polynomial: Special polynomials. +* imagpart (): Elementary complex functions. +* include files: Include files. +* Input/Output: Input/Output. +* installation: Installing the library. +* integer: Ordinary number types. +* integer_decode_float (): Functions on floating-point numbers. +* integer_length (): Logical functions. +* isqrt (): Roots. +* Laguerre polynomial: Special polynomials. +* lcm (): Number theoretic functions. +* ldb (): Logical functions. +* ldb_test (): Logical functions. +* least_negative_float (): Conversion to floating-point numbers. +* least_positive_float (): Conversion to floating-point numbers. +* Legende polynomial: Special polynomials. +* length (): Strings. +* ln (): Exponential and logarithmic functions. +* log (): Exponential and logarithmic functions. +* logand (): Logical functions. +* logandc1 (): Logical functions. +* logandc2 (): Logical functions. +* logbitp (): Logical functions. +* logcount (): Logical functions. +* logeqv (): Logical functions. +* logior (): Logical functions. +* lognand (): Logical functions. +* lognor (): Logical functions. +* lognot (): Logical functions. +* logorc1 (): Logical functions. +* logorc2 (): Logical functions. +* logp (): Number theoretic functions. +* logtest (): Logical functions. +* logxor (): Logical functions. +* make: C++ compiler. +* mask_field (): Logical functions. +* max (): Comparisons. +* min (): Comparisons. +* minus1 (): Elementary functions. +* minusp (): Comparisons. +* mod (): Rounding functions. +* modifying operators: Obfuscating operators. +* modular integer: Modular integers. +* modulus: Functions on modular integers. +* monomial (): Functions on univariate polynomials. +* Montgomery multiplication: Modular integer rings. +* most_negative_float (): Conversion to floating-point numbers. +* most_positive_float (): Conversion to floating-point numbers. +* numerator (): Elementary rational functions. +* oddp (): Logical functions. +* one () <1>: Functions on univariate polynomials. +* one (): Functions on modular integers. +* operator != () <1>: Functions on univariate polynomials. +* operator != () <2>: Functions on modular integers. +* operator != () <3>: Modular integer rings. +* operator != (): Comparisons. +* operator & (): Logical functions. +* operator &= (): Obfuscating operators. +* operator () (): Functions on univariate polynomials. +* operator * () <1>: Functions on univariate polynomials. +* operator * () <2>: Functions on modular integers. +* operator * (): Elementary functions. +* operator *= (): Obfuscating operators. +* operator + () <1>: Functions on univariate polynomials. +* operator + () <2>: Functions on modular integers. +* operator + (): Elementary functions. +* operator ++ (): Obfuscating operators. +* operator += (): Obfuscating operators. +* operator - () <1>: Functions on univariate polynomials. +* operator - () <2>: Functions on modular integers. +* operator - (): Elementary functions. +* operator -- (): Obfuscating operators. +* operator -= (): Obfuscating operators. +* operator / (): Elementary functions. +* operator /= (): Obfuscating operators. +* operator < (): Comparisons. +* operator << () <1>: Functions on univariate polynomials. +* operator << () <2>: Functions on modular integers. +* operator << (): Logical functions. +* operator <<= (): Obfuscating operators. +* operator <= (): Comparisons. +* operator == () <1>: Functions on univariate polynomials. +* operator == () <2>: Functions on modular integers. +* operator == () <3>: Modular integer rings. +* operator == (): Comparisons. +* operator > (): Comparisons. +* operator >= (): Comparisons. +* operator >> () <1>: Functions on modular integers. +* operator >> (): Logical functions. +* operator >>= (): Obfuscating operators. +* operator [] (): Strings. +* operator ^ (): Logical functions. +* operator ^= (): Obfuscating operators. +* operator | (): Logical functions. +* operator |= (): Obfuscating operators. +* operator ~ (): Logical functions. +* ord2 (): Logical functions. +* phase (): Exponential and logarithmic functions. +* pi: Trigonometric functions. +* plus1 (): Elementary functions. +* plusp (): Comparisons. +* polynomial: Univariate polynomials. +* portability: Why C++ ?. +* power2p (): Logical functions. +* printing: Internal and printed representation. +* random (): Functions on modular integers. +* random32 (): Random number generators. +* random_F (): Random number generators. +* random_I (): Random number generators. +* random_R (): Random number generators. +* rational (): Conversion to rational numbers. +* rational number: Ordinary number types. +* rationalize (): Conversion to rational numbers. +* reading: Internal and printed representation. +* real number: Ordinary number types. +* realpart (): Elementary complex functions. +* recip () <1>: Functions on modular integers. +* recip (): Elementary functions. +* reference counting: Memory efficiency. +* rem (): Rounding functions. +* representation: Internal and printed representation. +* Riemann's zeta: Riemann zeta. +* ring: Modular integer rings. +* ring (): Functions on univariate polynomials. +* ring(): Functions on modular integers. +* rootp (): Roots. +* round1 (): Rounding functions. +* round2 (): Rounding functions. +* rounding: Rounding functions. +* rounding error: Floating-point numbers. +* Rubik's cube: Conversions. +* scale_float (): Functions on floating-point numbers. +* Schönhage-Strassen: Speed efficiency. +* Schönhage-Strassen multiplication: Introduction. +* sed: Make utility. +* set_coeff (): Functions on univariate polynomials. +* signum (): Elementary functions. +* sin (): Trigonometric functions. +* sinh (): Hyperbolic functions. +* sqrt (): Roots. +* sqrtp (): Roots. +* square () <1>: Functions on univariate polynomials. +* square () <2>: Functions on modular integers. +* square (): Elementary functions. +* string: Strings. +* strlen (): Strings. +* symbol: Symbols. +* symbolic type: Symbolic data types. +* tan (): Trigonometric functions. +* tanh (): Hyperbolic functions. +* The() (): Conversions. +* transcendental functions: Transcendental functions. +* truncate1 (): Rounding functions. +* truncate2 (): Rounding functions. +* Tschebychev polynomial: Special polynomials. +* underflow: Floating-point underflow. +* univariate polynomial: Univariate polynomials. +* WANT_OBFUSCATING_OPERATORS: Obfuscating operators. +* xgcd (): Number theoretic functions. +* zero () <1>: Functions on univariate polynomials. +* zero (): Functions on modular integers. +* zerop () <1>: Functions on univariate polynomials. +* zerop () <2>: Functions on modular integers. +* zerop (): Comparisons. + +  Tag Table: Node: Top957 Node: Introduction3124 -Node: Installation5626 -Node: Prerequisites5920 -Node: C++ compiler6118 -Node: Make utility6833 -Node: Sed utility7019 -Node: Building the library7339 -Node: Installing the library10650 -Node: Cleaning up11373 -Node: Ordinary number types11698 -Node: Exact numbers14045 -Node: Floating-point numbers15210 -Node: Complex numbers18789 -Node: Conversions19286 -Node: Functions on numbers22752 -Node: Constructing numbers23455 -Node: Constructing integers23827 -Node: Constructing rational numbers24117 -Node: Constructing floating-point numbers24592 -Node: Constructing complex numbers25712 -Node: Elementary functions26076 -Node: Elementary rational functions28543 -Node: Elementary complex functions29115 -Node: Comparisons29943 -Node: Rounding functions31842 -Node: Roots37619 -Node: Transcendental functions39500 -Node: Exponential and logarithmic functions40056 -Node: Trigonometric functions42073 -Node: Hyperbolic functions45416 -Node: Euler gamma47489 -Node: Riemann zeta48405 -Node: Functions on integers48961 -Node: Logical functions49249 -Node: Number theoretic functions55202 -Node: Combinatorial functions56569 -Node: Functions on floating-point numbers57247 -Node: Conversion functions60478 -Node: Conversion to floating-point numbers60758 -Node: Conversion to rational numbers62981 -Node: Random number generators64035 -Node: Obfuscating operators65709 -Node: Input/Output67439 -Node: Internal and printed representation67649 -Node: Input functions70191 -Node: Output functions74742 -Node: Rings78478 -Node: Modular integers80402 -Node: Modular integer rings80602 -Node: Functions on modular integers82692 -Node: Symbolic data types85702 -Node: Strings85965 -Node: Symbols87030 -Node: Univariate polynomials87932 -Node: Univariate polynomial rings88190 -Node: Functions on univariate polynomials93144 -Node: Special polynomials96925 -Node: Internals97645 -Node: Why C++ ?97859 -Node: Memory efficiency99360 -Node: Speed efficiency100058 -Node: Garbage collection101122 -Node: Using the library101949 -Node: Compiler options102483 -Node: Include files103401 -Node: An Example107042 -Node: Debugging support110067 -Node: Customizing112417 -Node: Error handling112645 -Node: Floating-point underflow113219 -Node: Customizing I/O113858 -Node: Customizing the memory allocator114151 -Node: Index115108 +Node: Installation5646 +Node: Prerequisites5940 +Node: C++ compiler6138 +Node: Make utility6853 +Node: Sed utility7039 +Node: Building the library7359 +Node: Installing the library10541 +Node: Cleaning up11264 +Node: Ordinary number types11589 +Node: Exact numbers13936 +Node: Floating-point numbers15101 +Node: Complex numbers18680 +Node: Conversions19177 +Node: Functions on numbers22643 +Node: Constructing numbers23346 +Node: Constructing integers23718 +Node: Constructing rational numbers24008 +Node: Constructing floating-point numbers24483 +Node: Constructing complex numbers25603 +Node: Elementary functions25967 +Node: Elementary rational functions28434 +Node: Elementary complex functions29006 +Node: Comparisons29834 +Node: Rounding functions31733 +Node: Roots37510 +Node: Transcendental functions39391 +Node: Exponential and logarithmic functions39947 +Node: Trigonometric functions41964 +Node: Hyperbolic functions45315 +Node: Euler gamma47388 +Node: Riemann zeta48304 +Node: Functions on integers48860 +Node: Logical functions49148 +Node: Number theoretic functions55101 +Node: Combinatorial functions56468 +Node: Functions on floating-point numbers57146 +Node: Conversion functions60377 +Node: Conversion to floating-point numbers60657 +Node: Conversion to rational numbers62880 +Node: Random number generators63934 +Node: Obfuscating operators65608 +Node: Input/Output67338 +Node: Internal and printed representation67548 +Node: Input functions70090 +Node: Output functions74641 +Node: Rings78377 +Node: Modular integers80301 +Node: Modular integer rings80501 +Node: Functions on modular integers82591 +Node: Symbolic data types85601 +Node: Strings85864 +Node: Symbols86929 +Node: Univariate polynomials87831 +Node: Univariate polynomial rings88089 +Node: Functions on univariate polynomials93043 +Node: Special polynomials96824 +Node: Internals97544 +Node: Why C++ ?97758 +Node: Memory efficiency99258 +Node: Speed efficiency99956 +Node: Garbage collection101040 +Node: Using the library101867 +Node: Compiler options102401 +Node: Include files103319 +Node: An Example106960 +Node: Debugging support110110 +Node: Customizing112460 +Node: Error handling112688 +Node: Floating-point underflow113262 +Node: Customizing I/O113901 +Node: Customizing the memory allocator114194 +Node: Index115151  End Tag Table diff --git a/doc/cln.ps b/doc/cln.ps index 2b21c11..1241843 100644 --- a/doc/cln.ps +++ b/doc/cln.ps @@ -1,7 +1,7 @@ %!PS-Adobe-2.0 %%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software %%Title: cln.dvi -%%Pages: 71 +%%Pages: 74 %%PageOrder: Ascend %%BoundingBox: 0 0 596 842 %%EndComments @@ -9,7 +9,7 @@ %DVIPSCommandLine: /usr/local/teTeX/bin/ix86-linux-libc6/dvips -D600 -o %+ cln.ps cln.dvi %DVIPSParameters: dpi=600, compressed -%DVIPSSource: TeX output 2000.05.03:1938 +%DVIPSSource: TeX output 2000.05.04:2122 %%BeginProcSet: texc.pro %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S @@ -78,43 +78,302 @@ D E /Fb 1 47 df<13FCEA03FF481380121F4813C0A25AA2B5FCA31480A26C13005B6C5AEA1F F0EA07C0121271912B>46 D E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Fc cmr9 9 11 -/Fc 11 121 df<14C01301EB03005B130E5B5B137813705B12015B1203485AA248C7FCA3 -121EA3123E123CA2127CA4127812F8B01278127CA4123CA2123E121EA37EA36C7EA26C7E -12017F12001370137813387F7F7F7FEB01C01300124A79B71E>40 -D<7E7E126012707E7E7E120F7E6C7E7F12017F6C7EA21378A37FA3133E131EA2131FA47F -1480B014005BA4131EA2133E133CA35BA35BA2485A5B12035B48C7FC5A120E5A5A5A1260 -5A5A114A7BB71E>I73 -D<153FEC0FFFA2EC007F81AFEB07F0EB3FFCEBFC0F3901E003BF4848C6B4FC48487F48C7 -FC4880123EA2127E127CA212FCA8127CA2127E123EA27E6C5C6C6C5B3903C001BF3A01E0 -033F802600F81E13FCEB3FFCD90FE0130026357DB32B>100 DI105 -D<3903F01FC000FFEB7FF09038F1E0F83907F3807C3903F6007E01FC133E153F5BA35BB3 -A2486CEB7F80B538C7FFFCA226217EA02B>110 DI115 -D<1330A51370A313F0A2120112031207121FB512FEA23803F000B01403A81201EBF80612 -00140CEB7E1CEB1FF8EB07E0182F7FAD1E>I120 -D E +%DVIPSBitmapFont: Fc cmr9 9 55 +/Fc 55 128 df12 DI<123C127EB4FCA21380A2127F123D1201A4EA0300A31206A35A5A5A127012200917 +7AB315>39 D<123C127EB4FCA21380A2127F123D1201A4EA0300A31206A35A5A5A127012 +2009177A8715>44 DI<15301578A215F815F0A2140115E0A214 +0315C014071580A2140F1500A25C141EA2143E143CA2147C1478A214F85C13015CA21303 +5CA213075CA2130F91C7FCA25B131EA2133E133CA2137C137813F85BA212015BA212035B +A212075BA2120F90C8FCA25A121E123E123CA2127C1278A212F85AA212601D4B7CB726> +47 DI<13075B5B137FEA07FFEAFFBFEAF83F1200B3B3A4EBFFC0007FEBFF80A219327A +B126>IIII<000C14C0380FC00F90B5128015005C5C14F014C0D80C18C7FC90C8FCA9EB0FC0EB7F +F8EBF07C380D801E380F000F000E1480000CEB07C0A2000814E0C7EA03F0A415F8A31218 +127C12FEA315F05A00D81307006014E0A26C14C0EC0F806CEB1F006C131E6C5B3803C0F8 +3801FFE038003F801D347CB126>I<14FE903807FF8090380F81C090383C006049137090 +38F001F83801E0031203EA07C0A2390F8001F0001F90C7FC90C8FC5AA35A127EEB07F0EB +1FFC38FE381F903860078001C013C0EC03E039FF8001F0A2010013F8140015FC5A15FEA4 +127EA5123E003F14FCA26C14F81401D80F8013F015E03807C0030003EB07C03901E00F80 +3900F81E00EB3FFCEB0FE01F347DB126>I<1230123C003FB6FCA215FE4814FCA215F800 +70C7123000601460A215C048EB0180A2EC0300C71206A25C5C143814305CA214E0495AA2 +1303A2495AA3130FA349C7FCA35BA55BA8133E131C20347CB126>III<15E0A34A7EA24A7EA34A7EA3EC0DFE140CA2EC187FA3 +4A6C7EA202707FEC601FA202E07FECC00FA2D901807F1507A249486C7EA301066D7EA201 +0E80010C1300010FB5FC49800118C77EA24981163FA2496E7EA3496E7EA2000182160712 +03486C81D81FF0EC1FFCD8FFFE49B512E0A233367DB53A>65 D67 +D69 +DIIII76 +DI79 DI82 D<90381FE003EB7FFC3901F01F +07390380038F48C712CF000E147F4880003C80A24880A200F880A3817EA27E007E91C7FC +127F13C0EA3FF013FF6C13F06C13FF6C14C06C80C614F8013F7F01037FEB003FEC03FF14 +00ED3F80151F16C0150F124000C01407A47E1680A27EED0F007E6C141E6C141C00F35CD8 +F1E013F039E0FC03E039C01FFF80D903FEC7FC22377CB42B>I<007FB712FEA29039800F +F8013B7C0007F0003E0078161E0070160EA200601606A200E01607A2481603A6C71500B3 +ADEC1FFC011FB512FCA230337DB237>I97 DII<153FEC0FFFA2EC007F81AFEB07F0EB3FFCEB +FC0F3901E003BF4848C6B4FC48487F48C7FC4880123EA2127E127CA212FCA8127CA2127E +123EA27E6C5C6C6C5B3903C001BF3A01E0033F802600F81E13FCEB3FFCD90FE013002635 +7DB32B>III<151F90391FC07F8090397FF1 +E3C09038F07B833903C01E039039800E01800007010FC7FC000F80EB00074880A66C5CEB +800F000791C7FC0003130E6D5AEBF07838067FF0380E1FC090C9FCA5EA0F80EBFFFE6CEB +FFC06C14F06C80000780390F0001FE001EEB007F48141F007C158048140FA5007CEC1F00 +A26C143E6C5C390FC001F83903F007E0C6B51280D91FFCC7FC22337EA126>III107 DI<2703 +F01FE013FF00FF90267FF80313C0913AE07C0703E03C07F3803E1C01F02803F7003F387F +01F690381F300001FC02E07F495CA3495CB3A2486C496C487EB53BC7FFFE3FFFF0A23C21 +7EA041>I<3903F01FC000FFEB7FF09038F1E0F83907F3807C3903F6007E01FC133E153F +5BA35BB3A2486CEB7F80B538C7FFFCA226217EA02B>II<3903F03F8000FFEBFFE09038F3C0F83907F7003CD803FC7F497F +168049EB07C016E0150316F0A2150116F8A816F01503A216E0150716C06DEB0F80ED1F00 +6D131E01F6137C9038F381F89038F1FFE0D9F07FC7FC91C8FCAB487EB512C0A225307EA0 +2B>I<3803E07C00FF13FF9038E18F803907E31FC0EA03E613ECEC0F809038F8070091C7 +FCA35BB3487EB512E0A21A217FA01E>114 DI<1330A51370A313F0A2120112031207121FB512FEA23803F000B01403 +A81201EBF8061200140CEB7E1CEB1FF8EB07E0182F7FAD1E>IIIII<3A7FFF807FF8A23A07F8001FE00003EC0F80ED07 +0000011406A26C6C5BA26D131C017E1318A26D5BA2EC8070011F1360ECC0E0010F5BA290 +3807E180A214F3010390C7FC14FBEB01FEA26D5AA31478A21430A25CA214E05CA2495A12 +78D8FC03C8FCA21306130EEA701CEA7838EA1FF0EA0FC025307F9F29>I<003FB512F0A2 +90380007E0003CEB0FC00038131F0030EB3F8000701400147E006013FE5C495A1303C648 +5A5C495A131F495A91C7FC017E133013FE485A5B485A000714705B48481360001F14E048 +5AEB0003007E130FB6FCA21C207E9F22>I<001C1370003E13F8387F01FC00FF13FEA200 +7F13FC383E00F8001C1370170879B226>127 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Fd cmsl9 9 1 +/Fd 1 47 df<123C127E12FFA312FE127C12380808798715>46 D +E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Fd cmtt12 14.4 1 -/Fd 1 44 df<157815FC4A7EB3A2003FB812E04817F0B912F8A46C17F06C17E0C7D801FE +%DVIPSBitmapFont: Fe cmtt9 9 63 +/Fe 63 127 df<123C127E12FFAF127EAE123C1200A7123C127E12FFA4127E123C082F71 +AE27>33 D<131FEB7FC0497E5A80EA03F1EBE1F8EA07E013C0A513C15C9039C3F1FF80D9 +E3E113C03803E7E3EBEFC1D9FF811380EDF800EC01F0EA01FEEBFC0301F85B00031307D8 +07FC5B120F381FFE0FD83FBE5BEB3F1FD87E1F90C7FC149F38FC0FBF14FE1307ECFC0201 +031307903901F80F80A238FE03FC387E07FE397F1FFF9F6CB61200149F6CEB0FFE390FFC +03FC3903F000F822307EAE27>38 D40 +D<127012F812FE7E6C7E6C7EEA0FE06C7E12036C7E7F1200137EA27FA2EB1F80A3EB0FC0 +A4EB07E0ACEB0FC0A4EB1F80A3EB3F00A2137EA25B12015B485A1207485AEA3FC0485A48 +C7FC5A12F81270133A7AB327>I<130F497EA60078EB81E000FEEB87F000FF138FEBDFBF +6CB512E06C14C0000F1400000313FCC613F0A2000313FC000F13FF003F14C04814E039FF +DFBFF0EB1F8F00FE13870078EB81E00000EB8000A66DC7FC1C207BA627>II<007FB512F8B612FCA4 +6C14F81E067C9927>45 D<1538157C15FCA2140115F8140315F0140715E0140F15C0141F +1580143F1500A25C147E14FE5C13015C13035C13075C130F5CA2131F5C133F91C7FC5B13 +7E13FE5B12015B12035BA212075B120F5B121F5B123F90C8FC5A127E12FE5AA25A12781E +3A7CB327>47 D<130E131FA25BA25B5B5A5A123F5AB5FC13BFEA7C3F1200B3AA003FB512 +805A15C01580A21A2F79AE27>49 DII< +153815FC14011407140FEC3FF8EC7FE0ECFFC001031300495AEB1FF8495A495A3801FF80 +4890C7FCEA0FFC485AEA7FF0EAFFC05BA27FEA7FF0EA1FF86C7EEA03FF6C7F38007FE06D +7E6D7EEB07FE6D7E010013C0EC7FE0EC3FF8EC0FFC14071401140015381E287CAA27>60 +D<007FB512FEB7FCA4003F14FEC9FCA6003FB512FEB7FCA46C14FE20127D9F27>I<1270 +12FC7E6C7E7FEA7FF0EA1FF86C7EEA03FF6C7F38007FE06D7E6D7EEB07FE6D7E010013C0 +EC7FE0EC3FF8EC0FFC1407A2140FEC3FF8EC7FE0ECFFC001031300495AEB1FF8495A495A +3801FF804890C7FCEA0FFC485AEA7FF0EAFFC05B48C8FC5A12701E287CAA27>I65 D<007FB5FCB612C08115F87E3907E003FCEC00FE157E157F81A6157EA25D14 +03EC0FF890B55A15C015F081819038E000FE157FED3F80151FA2ED0FC0A6151F1680153F +ED7F004A5A007FB55AB65A5D15E06C1480222E7FAD27>I<903803F80E90381FFE1F9038 +3FFFBF90B6FC5A3803FE0FEBF80348487E48487E5B4848137FA248C7123FA25A127E151E +150012FE5AAA7E127EA2151E007F143F7EA26C7E157F6C6C137E6D13FE3907F001FC3803 +F8039038FE0FF86CB512F06C14E0013F13C06D1300EB03F820307DAE27>I<387FFFFC14 +FFB612C06C80813907E00FF81407EC01FC6E7EA2157E157F811680151FA316C0150FABED +1F80A3153F1600A25D15FEA24A5A4A5A140F007FB55A5DB65A6C91C7FC14FC222E7FAD27 +>I<007FB61280B712C0A37E3907E0000FA6ED078092C7FCA4EC07804A7EA390B5FCA5EB +E00FA36E5A91C8FCA4ED03C0ED07E0A7007FB6FCB7FCA36C15C0232E7FAD27>I<007FB6 +1280B712C0A37E3907E0000FA6ED078092C7FCA4EC07804A7EA390B5FCA5EBE00FA36E5A +91C8FCAC387FFF80B5FC805C7E222E7EAD27>I<903807E03890381FFC7C90387FFFFC90 +B5FC5A3803FC1F3807F00FEBE007380FC003001F13011380123F90C7FCA2127EA2157892 +C7FC5AA8EC1FFF4A1380A3007E6D1300EC00FCA36C1301A21380121FEBC003120F3807E0 +07EBF00F3803FC1F6CB5FC7EEB7FFE90381FFC78D907E0C7FC21307DAE27>I<007FB512 +E0B612F0A36C14E039001F8000B3B2007FB512E0B612F0A36C14E01C2E7BAD27>73 +D<387FFFC080B5FC7E5CD803F0C8FCB3AAED0780ED0FC0A7007FB6FCA2B7FC7E1680222E +7FAD27>76 D<3A7FF003FFE013F800FF4913F06C6C6C13E0A200079038003E0013DEA313 +CFA3148013C714C0A213C314E0A213C114F0A3EBC0F8A31478147CA2143C143EA2141E14 +1F140FA3EC07BEA3EC03FEEA7FFCA238FFFE01EA7FFC6E5A242E7FAD27>78 +DI<007FB5FCB612E081816C803907E003FEEC00FF81ED3F80151F16C0 +150FA6151F1680153FED7F005DEC03FE90B55A5D5D5D92C7FC01E0C8FCADEA7FFEB5FCA3 +6C5A222E7FAD27>I<387FFFF014FEB67E6C80813907E01FF014076E7E1401811400A514 +015D14034A5A141F90B55A5D5DA281EBE01F6E7E14076E7EA816F0EDF1F8A4397FFE01FB +EDFFF0B57E6C4814E0ED7FC0C8EA0F00252F7FAD27>82 D<90383F80E03901FFF1F00007 +13FF5A5A383FC07FEB801F387F000F007E130712FE5A1403A3EC01E06C90C7FC127E127F +EA3FC013F86CB47E6C13F86C13FE6CEBFF80C66C13C0010713E0EB007FEC0FF0EC07F814 +03140115FC1400127812FCA46CEB01F8A26C130390388007F09038F01FE090B5FC15C015 +0000F85B38701FF01E307CAE27>I<007FB61280B712C0A439FC03F00FA60078EC078000 +0091C7FCB3AB90B512C0A248806C5CA2222E7EAD27>I<3A7FFE01FFF8B54813FCA36C48 +6C13F83A07E0001F80B3AB6D133F00031500A26D5B0001147E6D13FE6C6C485A90387F87 +F814FF6D5B010F13C06D5BD900FCC7FC262F80AD27>I87 D<387FFFF0B512F8A314F000FCC7FCB3B3ACB512F014F8A36C13F015 +3A71B327>91 D<387FFFF0B512F8A37EEA0001B3B3ACEA7FFFB5FCA36C13F0153A7EB327 +>93 D<131C137E3801FF80000713E0001F13F84813FC38FFE7FF13C3130000FC133F0078 +131E180B79AD27>I<007FB512F8B612FCA46C14F81E067C7E27>I<48B47E000F13F04813 +FC4813FF81EB807FEC1FC0381F000F00046D7EC7FCA2EB07FF137F0003B5FC120F5A383F +F807EA7FC0130012FE5AA46C130F007F131F383F807F90B612806C15C07E000313F13A00 +7F807F8022207C9F27>97 DIIIII<153F90391FC0FF80D97FF313C048 +B612E05A4814EF390FF07F873A1FC01FC3C09039800FC000A248486C7EA66C6C485AA2EB +C01F390FF07F8090B5C7FC5C485BEB7FF0EB1FC090C9FCA27F6CB5FC6C14E04814F84814 +FE5A90388000FF007EC7EA3F80007C140F00FC15C0481407A46C140F007C1580007F143F +6C6CEB7F00391FF003FE90B5FC000714F86C5CC66C1380D90FFCC7FC23337EA027>II<130F497E497EA46D5A6DC7 +FC90C8FCA7383FFF80487FA37EEA000FB3A4007FB512F0A2B612F86C14F0A21D2F7BAE27 +>I<143C147E14FFA4147E143C1400A73801FFFE4813FFA37EC7123FB3B0147E1238007C +13FE38FE01FCEB03F8B5FC6C13F014E06C13803807FE0018407CAE27>II<387FFF80B57EA37EEA000F +B3B2007FB512F8B612FCA36C14F81E2E7CAD27>I<397F07C01F3AFF9FF07FC09039FFF9 +FFE091B57E7E3A0FFC7FF1F89038F03FC001E0138001C01300A3EB803EB03A7FF0FFC3FF +486C01E3138001F913E701F813E36C4801C313002920819F27>I<387FE03F39FFF1FFC0 +01F77F90B57E6C80000313C1EC01FCEBFE005B5BA25BB03A7FFF83FFE0B500C713F0A36C +018313E024207F9F27>II< +387FE07E39FFF3FFC090B512F0816C800003EB81FE49C67E49EB3F8049131F16C049130F +A216E01507A6150F16C07F151F6DEB3F80ED7F006D5B9038FF83FEECFFFC5D5D01F313C0 +D9F0FEC7FC91C8FCAC387FFF80B57EA36C5B23317F9F27>I<903807F03C90383FFE7E90 +B5FC000314FE5A380FF80F381FE007EBC003383F800148C7FC127EA200FE147E5AA67E00 +7E14FEA2127F383F8001381FC003EBE007380FF81F6CB5FC7E6C147E38007FFCEB0FE090 +C7FCAC91381FFFF8A24A13FC6E13F8A226317E9F27>I<397FFC01FC39FFFE0FFF023F13 +804A13C0007F90B5FC39007FFE1F14F89138F00F809138E002004AC7FC5CA291C8FCA213 +7EAD007FB57EB67EA36C5C22207E9F27>I<90387FF3800007B512C0121F5AA2387F801F +38FC000F5AA2EC07806C90C7FCEA7F8013FC383FFFE06C13FC000713FFC61480010F13C0 +9038003FE014070078EB03F000FC1301A27E14036CEB07E0EBC01F90B512C01580150000 +FB13FC38707FE01C207B9F27>I<133C137EA8007FB512F0B612F8A36C14F0D8007EC7FC +AE1518153C157EA315FE6D13FC148390381FFFF815F06D13E0010313C0903800FE001F29 +7EA827>I<397FE01FF8486C487EA3007F131F00031300B21401A21403EBF80F6CB612E0 +6C15F0A2EB3FFE90390FF07FE024207F9F27>I<3A7FFC0FFF80486C4813C0A36C486C13 +803A07C000F800EBE00100035CA2EBF00300015CA2EBF80700005CA390387C0F80A36D48 +C7FCA3EB3F3FEB1F3EA3EB0FFCA36D5AA26D5A22207E9F27>I<3A7FFE07FFE0A2B54813 +F06C486C13E0A23A0F80001F00A36D5B0007143EA414F0EBC1F83903E3FC7CA4EBE79EA2 +00011478A301F713F8A2EBFF0F6C5CA3EBFE0790387C03E024207F9F27>I<393FFC1FFF +486C5A168016006C487E3901F807E06C6C485A4A5A017E90C7FC6D5AEB1F7E5C6D5A1307 +6D5A5C80497E130F497E143EEB3E3FEB7E1F90387C0F8001F87F00016D7E3803F0033A7F +FE1FFF80A2B54813C06C486C1380A222207E9F27>I<3A7FFC0FFF80486C4813C0A36C48 +6C13803A07E000F800000313015D13F012016D485A1200A26D485A137CA290387E0F8013 +3EA2011F90C7FC5CA2130F149E14BE130714FC1303A25C1301A25CA213035CA213075C12 +08EA3E0F007F5B131FD87E7FC8FCEA7FFE6C5A5B6C5AEA07C022317E9F27>I<001FB512 +FE4814FFA490380001FEEC03FCEC07F8EC0FF0001EEB1FE0C7EA3FC0EC7F80ECFF00495A +495A495AEB1FE0495A495A49C7FC485A4848131E4848133F485A485A485A485AB7FCA46C +14FE20207E9F27>I<127812FCB3B3B3A21278063A70B327>124 D<9038F003803903FC07 +C0000F130F381FFE1F393FFF7F80397FBFFF0038FE1FFE486C5A00F813F0387003C01A0A +7AAD27>126 D E +%EndDVIPSBitmapFont +%DVIPSBitmapFont: Ff cmtt12 14.4 1 +/Ff 1 44 df<157815FC4A7EB3A2003FB812E04817F0B912F8A46C17F06C17E0C7D801FE C8FCB3A26E5A157835347CBE3E>43 D E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Fe cmsy7 7 1 -/Fe 1 1 df0 D E +%DVIPSBitmapFont: Fg cmsy7 7 1 +/Fg 1 1 df0 D E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Ff cmr7 7 5 -/Ff 5 55 df<1238127C12FEA6127CAA1238AA12101200A51238127C12FEA3127C123807 +%DVIPSBitmapFont: Fh cmr7 7 5 +/Fh 5 55 df<1238127C12FEA6127CAA1238AA12101200A51238127C12FEA3127C123807 297BA813>33 D<1306130C13181330136013E0EA01C0EA0380A2EA07005A120E121EA212 1C123CA35AA512F85AAB7E1278A57EA3121C121EA2120E120F7EEA0380A2EA01C0EA00E0 136013301318130C13060F3B7AAB1A>40 D<12C012607E7E7E120E7EEA0380A2EA01C013 @@ -125,8 +384,8 @@ E01200B3AB487EB512F8A215267BA521>49 D54 D E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Fg cmmi7 7 3 -/Fg 3 111 df<1238127C12FEA3127C123807077A8614>58 D<1378EA07FC5BEA0078A3 +%DVIPSBitmapFont: Fi cmmi7 7 3 +/Fi 3 111 df<1238127C12FEA3127C123807077A8614>58 D<1378EA07FC5BEA0078A3 5BA4485AA43903C00780EC1FC0EC3860EC60E0380780C1EB8103138290388401C0D80F18 C7FC5B13E07FEA1FFE381E3F80EB07C06D7EEA3C011560A30078EBC0C01303903801C180 A200F0EBE300EB00FE0060133C1B297CA723>107 D<3907C01FC0390FE07FE03918F0E0 @@ -134,8 +393,8 @@ F03930718078EB7B00D8607E1338017C133C01781338D8C0F813785B1200A248485BA34A 5AEA03C01660EC03C0A23A07800780C0A2ED8180ED8300390F000386EC01FC00066D5A23 1B7D9929>110 D E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Fh cmex10 10 2 -/Fh 2 2 df<1430147014E0EB01C0EB0380A2EB0700130E131E131C133C5BA25BA2485A +%DVIPSBitmapFont: Fj cmex10 10 2 +/Fj 2 2 df<1430147014E0EB01C0EB0380A2EB0700130E131E131C133C5BA25BA2485A A212035B1207A2485AA348C7FCA45A123EA3127EA5127CA212FCB3A2127CA2127EA5123E A3123F7EA46C7EA36C7EA212037F1201A26C7EA21378A27F131C131E130E7FEB0380A2EB 01C0EB00E0147014301462738226>0 D<124012E012707E7EA27E7E7F12037F6C7EA26C @@ -143,8 +402,8 @@ A3123F7EA46C7EA36C7EA212037F1201A26C7EA21378A27F131C131E130E7FEB0380A2EB 1307A514C0A3130F1480A4EB1F00A3133EA2133C137C1378A25BA2485AA2485A5B120790 C7FC120E5AA25A5A5A124014627C8226>I E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Fi cmsl10 10.95 20 -/Fi 20 122 dfI E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Fj cmtt12 13.14 1 -/Fj 1 44 df43 D E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Fk cmbx12 13.14 42 -/Fk 42 123 df<923803FFF0037FEBFE7C0203B612FC141F91397FFE001FDAFFE0133F01 +%DVIPSBitmapFont: Fm cmbx12 13.14 42 +/Fm 42 123 df<923803FFF0037FEBFE7C0203B612FC141F91397FFE001FDAFFE0133F01 030180137F4990C7FC495A4A14FF4948147F495AA24A143F017F151FAFB9FCA526007FF0 C7121FB3B3A2003FB5D8E00FB512F8A53D4D7ECC44>13 D45 D @@ -367,8 +626,8 @@ AF41>I<001FB712FCA4DA000113F801F84913F001E04913E05B494913C04B138048C748 5B5D5B495B4990C712F85C137F495A48491301485BA248491303484913074849130F161F 4890C7EA7FF04848EB03FFB8FCA42E307DAF37>I E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Fl cmmi10 10.95 3 -/Fl 3 80 df<121E123FEA7F80EAFFC0A4EA7F80EA3F00121E0A0A798919>58 +%DVIPSBitmapFont: Fn cmmi10 10.95 3 +/Fn 3 80 df<121E123FEA7F80EAFFC0A4EA7F80EA3F00121E0A0A798919>58 D<49B592B512F082A290C76D913807FE00DA01BFED01F0705D039F6F5AA29126031FF04A 5A150F82150702066D4AC7FC1503A26F7E020C16068281834A017F5CA2707EA24A6E5B16 1F83160F4A6E5B1607A2834A01035C8316018349486D5CA21880177F49C8EBC180173F18 @@ -381,8 +640,8 @@ A219004D5A1703604D5A6C7E4D5A4D5A003F5F4D5A6C6C4BC7FC17FE6C6C4A5A4C5A6C6C EC07E06C6CEC1FC06C6C4A5A6C6C02FEC8FC90393F8003F890390FE01FE00103B5C9FC90 38007FF03E427BBF45>I E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Fm cmbx12 17.28 42 -/Fm 42 123 df<19F0F001F819FC1803A2180719F8180F19F0A2181F19E0183F19C0A218 +%DVIPSBitmapFont: Fo cmbx12 17.28 42 +/Fo 42 123 df<19F0F001F819FC1803A2180719F8180F19F0A2181F19E0183F19C0A218 7F198018FF1900A25F60170360A2170760170F60A2171F60173F60A2177F60A217FF95C7 FC5E5FA216035F16075FA2160F5F161F5FA2163F5F167F5FA216FF94C8FC5D5EA215035E 15075EA2150F5E151F5EA2153F5E157F5EA215FF93C9FC5C5DA214035D14075DA2140F5D @@ -591,8 +850,8 @@ FC604B5C001F4A91C7FC495B5F4B5B4B5B5DC85C4B5B92B55A5C5F4A91C8FC5C4A5B5E4A 484A141F5A92C8123F4849157F484915FF485E4A14074849021F13C0484BB5FCBAFCA47E 3C407CBF48>I E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Fn cmtt10 10.95 85 -/Fn 85 127 df<121C127FA2EAFF80B2EA7F00B1123EC7FCA9121C127FA2EAFF80A3EA7F +%DVIPSBitmapFont: Fp cmtt10 10.95 85 +/Fp 85 127 df<121C127FA2EAFF80B2EA7F00B1123EC7FCA9121C127FA2EAFF80A3EA7F 00A2121C09396DB830>33 D<003C131E00FEEB3F80A26C137FA248133FB3007E1400007C 7F003C131E191B75B830>I<903903800380496C487E496C487EA8011F131F02C05BA400 3FB612FE4881B81280A36C16006C5D3A003F803F80017F137F020090C7FCA9495B495B00 @@ -837,8 +1096,8 @@ FC14C05C01FCC8FCEA7FC025477BBE30>I<01781338D803FE137C3907FF80FE001F13C1 48EBE7FC4813FF01CF13F8D8FF0713F0486C13C0D87C0013800038EB3C001F0B78B730> I E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Fo cmsy10 10.95 3 -/Fo 3 16 df<007FB812F8B912FCA26C17F83604789847>0 D0 D15 D E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Fp cmr10 10.95 83 -/Fp 83 128 df11 DI<001FB61280A29039E0003F0090C7127E001E14FE 7EEB1F80007F133F39FF807FC0A3397F003F80007E131F001CEB0E001A0977BD2D>127 D E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Fq cmbx12 14.4 58 -/Fq 58 123 df12 DIII77 D<93380FFFC00303B6FC031F15E092B712FC0203D9FC0013FF020F01C0010F13 -C0023F90C7000313F0DA7FFC02007F494848ED7FFE4901E0ED1FFF49496F7F49496F7F49 -90C96C7F49854948707F4948707FA24849717E48864A83481B804A83481BC0A2481BE04A -83A2481BF0A348497113F8A5B51AFCAF6C1BF86E5FA46C1BF0A26E5F6C1BE0A36C6D4D13 -C0A26C6D4D1380A26C1B006C6D4D5A6E5E6C626D6C4C5B6D6D4B5B6D6D4B5B6D6D4B5B6D -6D4B5B6D6D4B90C7FC6D6D4B5A6D01FF02035B023F01E0011F13F0020F01FC90B512C002 -0390B7C8FC020016FC031F15E0030392C9FCDB001F13E0565479D265>79 -DI82 D<91260FFF80130791B500F85B01 -0302FF5B010FEDC03F013FEDF07F90267FF8006D5A2601FFC0EB07FD4890C70001B5FC48 -486E7E49814848150F48488183003F825B007F82A284A200FF83A27F84A27F7F7F6D93C7 -FC6C13C014F014FF6C14F0EDFF806C15F8EEFF806C16F017FC6C16FF6C836C17E06C836D -82011F826D821303010082020F16801400030715C0ED007F1603DC007F13E083170F7113 -F08383127800F882A3187FA27E19E0A37E19C06C17FF6D17807F6D4B13006D5D6D5E01FE -4B5AD9FFC0EC1FF802F84A5A903B1FFFC003FFE0D8FE0790B65AD8FC0193C7FC486C6C14 -FC48010714E0489026003FFEC8FC3C5479D24B>I<003FBC1280A59126C0003F9038C000 -7F49C71607D87FF8060113C001E08449197F49193F90C8171FA2007E1A0FA3007C1A07A5 -00FC1BE0481A03A6C994C7FCB3B3AC91B912F0A553517BD05E>II87 +B3B3B3B2B812C0A52A527CD132>I76 DII<93380FFFC00303B6FC031F15E092B712FC0203D9FC +0013FF020F01C0010F13C0023F90C7000313F0DA7FFC02007F494848ED7FFE4901E0ED1F +FF49496F7F49496F7F4990C96C7F49854948707F4948707FA24849717E48864A83481B80 +4A83481BC0A2481BE04A83A2481BF0A348497113F8A5B51AFCAF6C1BF86E5FA46C1BF0A2 +6E5F6C1BE0A36C6D4D13C0A26C6D4D1380A26C1B006C6D4D5A6E5E6C626D6C4C5B6D6D4B +5B6D6D4B5B6D6D4B5B6D6D4B5B6D6D4B90C7FC6D6D4B5A6D01FF02035B023F01E0011F13 +F0020F01FC90B512C0020390B7C8FC020016FC031F15E0030392C9FCDB001F13E0565479 +D265>II82 D<91260FFF80130791B500 +F85B010302FF5B010FEDC03F013FEDF07F90267FF8006D5A2601FFC0EB07FD4890C70001 +B5FC48486E7E49814848150F48488183003F825B007F82A284A200FF83A27F84A27F7F7F +6D93C7FC6C13C014F014FF6C14F0EDFF806C15F8EEFF806C16F017FC6C16FF6C836C17E0 +6C836D82011F826D821303010082020F16801400030715C0ED007F1603DC007F13E08317 +0F7113F08383127800F882A3187FA27E19E0A37E19C06C17FF6D17807F6D4B13006D5D6D +5E01FE4B5AD9FFC0EC1FF802F84A5A903B1FFFC003FFE0D8FE0790B65AD8FC0193C7FC48 +6C6C14FC48010714E0489026003FFEC8FC3C5479D24B>I<003FBC1280A59126C0003F90 +38C0007F49C71607D87FF8060113C001E08449197F49193F90C8171FA2007E1A0FA3007C +1A07A500FC1BE0481A03A6C994C7FCB3B3AC91B912F0A553517BD05E>II87 +D<003FB7D88003B7FCA5D8000749C8000701F8C7FC6D6D9238007F806D6E93C8FC7015FE +6D17016E6D5D704A5A6E16076E6D4A5A6E6D5D4F5A6E6D143F6E6D4A5A7191C9FC6E16FE +6EECC00171485A6F5D6F6D485A6FEBF80F71485A6F5D6F6D485AEFFF7F6F4ACAFC6F5C6F +5CA2705B705B8482707F707FA2707F7080855E4C80855E4C80DC3FCF7F058F7FEE7F074C +6C7FDB01FE814C7E4B486C8003076E7F4B48814C7F4B486D7F033F824C7F4BC76C7F4B6E +7F4A5A4B6E804A486E800207844A48814B6F7F4A4883023F824A486F7F92C96C7F02FE84 +0101834948708090263FFFC084B76C0103B712F8A55D527CD166>I<001FBA12C01AE0A4 +0380C714C002F8C8148002C05C91C8481400495F495D494B5B495F495D48484B5B61495D +94B55A6190C85A4C91C7FC605E003E4B5B605E4C5B60C95A93B55A605D4B91C8FC5F5D4B +5B5F5D4B5B5F5D92B55A5F5C4A91C9FC5E5C4A5B5E4AEE03E04A5B5E5C91B55A5E491707 +4991C8FC4B16C05B495B5D49170F495B5D49171F90B55A4B153F5A4891C9127F4A16FF48 +5F48495D4A5D485F4849033F13804A4AB5FC48163FBBFCA47E435279D152>90 DI E %EndDVIPSBitmapFont -%DVIPSBitmapFont: Fr cmbx12 20.736 16 -/Fr 16 122 df<13FF000313C04813F0487F487F487F5A801580B6FCA215C0A315E0A27E +%DVIPSBitmapFont: Ft cmbx12 20.736 16 +/Ft 16 122 df<13FF000313C04813F0487F487F487F5A801580B6FCA215C0A315E0A27E A37E7E7E6C13F76C13E7C61387EB0007A2140F15C0A3141FA21580143FA215005C147E14 FEA2495AA2495A495AA2495A495A133F495A49C7FC485A485A485A485A6C5A6C5A6C5A1B 3A729836>44 D<96267FFFE01670063FB616F80503B700E01401053F04FC14034CB91407 @@ -1431,15 +1708,15 @@ TeXDict begin %%EndSetup %%Page: 1 1 -1 0 bop 0 1386 a Fr(CLN,)65 b(a)g(Class)h(Library)g(for)e(Num)-5 -b(b)5 b(ers)p 0 1486 3900 34 v 0 5068 a Fq(b)l(y)45 b(Bruno)f(Haible)p +1 0 bop 0 1386 a Ft(CLN,)65 b(a)g(Class)h(Library)g(for)e(Num)-5 +b(b)5 b(ers)p 0 1486 3900 34 v 0 5068 a Fs(b)l(y)45 b(Bruno)f(Haible)p 0 5141 3900 17 v eop %%Page: 2 2 -2 1 bop 0 3355 a Fp(Cop)m(yrigh)m(t)452 3352 y(c)427 -3355 y Fo(\015)30 b Fp(Bruno)g(Haible)h(1995,)i(1996,)f(1997,)g(1998,)h +2 1 bop 0 3355 a Fr(Cop)m(yrigh)m(t)452 3352 y(c)427 +3355 y Fq(\015)30 b Fr(Bruno)g(Haible)h(1995,)i(1996,)f(1997,)g(1998,)h (1999,)f(2000.)0 3878 y(Published)19 b(b)m(y)h(Bruno)g(Haible,)j -Fn()14 b Fp(and)20 b(Ric)m(hard)g(Krec)m(k)m -(el,)k Fn()p Fp(.)0 4152 y(P)m(ermission)g(is)h(gran) +Fp()14 b Fr(and)20 b(Ric)m(hard)g(Krec)m(k)m +(el,)k Fp()p Fr(.)0 4152 y(P)m(ermission)g(is)h(gran) m(ted)g(to)h(mak)m(e)f(and)f(distribute)g(v)m(erbatim)h(copies)g(of)g (this)g(man)m(ual)f(pro)m(vided)h(the)g(cop)m(yrigh)m(t)0 4276 y(notice)32 b(and)d(this)i(p)s(ermission)d(notice)k(are)e(preserv) @@ -1457,146 +1734,147 @@ h(another)f(language,)0 5198 y(under)27 b(the)h(ab)s(o)m(v)m(e)h 5322 y(in)j(a)h(translation)g(appro)m(v)m(ed)g(b)m(y)f(the)h(author.)p eop %%Page: 1 3 -1 2 bop 0 -116 a Fp(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2892 -b(1)0 366 y Fm(1)80 b(In)l(tro)t(duction)0 719 y Fp(CLN)30 +1 2 bop 0 -116 a Fr(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2892 +b(1)0 366 y Fo(1)80 b(In)l(tro)t(duction)0 719 y Fr(CLN)30 b(is)g(a)h(library)f(for)g(computations)g(with)g(all)i(kinds)d(of)i(n)m (um)m(b)s(ers.)38 b(It)30 b(has)h(a)f(ric)m(h)h(set)g(of)f(n)m(um)m(b)s -(er)e(classes:)75 993 y Fo(\017)60 b Fp(In)m(tegers)31 -b(\(with)g(unlimited)e(precision\),)75 1137 y Fo(\017)60 -b Fp(Rational)32 b(n)m(um)m(b)s(ers,)75 1281 y Fo(\017)60 -b Fp(Floating-p)s(oin)m(t)33 b(n)m(um)m(b)s(ers:)229 -1425 y Fo(\000)60 b Fp(Short)30 b(\015oat,)229 1569 y -Fo(\000)60 b Fp(Single)31 b(\015oat,)229 1713 y Fo(\000)60 -b Fp(Double)31 b(\015oat,)229 1857 y Fo(\000)60 b Fp(Long)31 +(er)e(classes:)75 993 y Fq(\017)60 b Fr(In)m(tegers)31 +b(\(with)g(unlimited)e(precision\),)75 1137 y Fq(\017)60 +b Fr(Rational)32 b(n)m(um)m(b)s(ers,)75 1281 y Fq(\017)60 +b Fr(Floating-p)s(oin)m(t)33 b(n)m(um)m(b)s(ers:)229 +1425 y Fq(\000)60 b Fr(Short)30 b(\015oat,)229 1569 y +Fq(\000)60 b Fr(Single)31 b(\015oat,)229 1713 y Fq(\000)60 +b Fr(Double)31 b(\015oat,)229 1857 y Fq(\000)60 b Fr(Long)31 b(\015oat)g(\(with)f(unlimited)f(precision\),)75 2001 -y Fo(\017)60 b Fp(Complex)29 b(n)m(um)m(b)s(ers,)75 2145 -y Fo(\017)60 b Fp(Mo)s(dular)30 b(in)m(tegers)i(\(in)m(tegers)g(mo)s -(dulo)c(a)j(\014xed)f(in)m(teger\),)75 2289 y Fo(\017)60 -b Fp(Univ)-5 b(ariate)32 b(p)s(olynomials.)0 2583 y(The)38 +y Fq(\017)60 b Fr(Complex)29 b(n)m(um)m(b)s(ers,)75 2145 +y Fq(\017)60 b Fr(Mo)s(dular)30 b(in)m(tegers)i(\(in)m(tegers)g(mo)s +(dulo)c(a)j(\014xed)f(in)m(teger\),)75 2289 y Fq(\017)60 +b Fr(Univ)-5 b(ariate)32 b(p)s(olynomials.)0 2583 y(The)38 b(subt)m(yp)s(es)g(of)h(the)g(complex)f(n)m(um)m(b)s(ers)f(among)h (these)h(are)g(exactly)i(the)e(t)m(yp)s(es)g(of)g(n)m(um)m(b)s(ers)d (kno)m(wn)i(to)0 2707 y(the)29 b(Common)d(Lisp)j(language.)41 -b(Therefore)29 b Fn(CLN)f Fp(can)h(b)s(e)f(used)g(for)h(Common)d(Lisp)i -(implemen)m(tations,)h(giving)0 2832 y(`)p Fn(CLN)p Fp(')h(another)h +b(Therefore)29 b Fp(CLN)f Fr(can)h(b)s(e)f(used)g(for)h(Common)d(Lisp)i +(implemen)m(tations,)h(giving)0 2832 y(`)p Fp(CLN)p Fr(')h(another)h (meaning:)40 b(it)30 b(b)s(ecomes)g(an)g(abbreviation)h(of)g(\\Common)d (Lisp)i(Num)m(b)s(ers".)0 3106 y(The)g(CLN)g(pac)m(k)-5 -b(age)32 b(implemen)m(ts)75 3380 y Fo(\017)60 b Fp(Elemen)m(tary)30 -b(functions)g(\()p Fn(+)p Fp(,)h Fn(-)p Fp(,)f Fn(*)p -Fp(,)g Fn(/)p Fp(,)h Fn(sqrt)p Fp(,)e(comparisons,)h -Fl(:)15 b(:)g(:)q Fp(\),)75 3524 y Fo(\017)60 b Fp(Logical)32 -b(functions)e(\(logical)j Fn(and)p Fp(,)d Fn(or)p Fp(,)g -Fn(not)p Fp(,)g Fl(:)15 b(:)g(:)q Fp(\),)75 3668 y Fo(\017)60 -b Fp(T)-8 b(ranscenden)m(tal)40 b(functions)f(\(exp)s(onen)m(tial,)k +b(age)32 b(implemen)m(ts)75 3380 y Fq(\017)60 b Fr(Elemen)m(tary)30 +b(functions)g(\()p Fp(+)p Fr(,)h Fp(-)p Fr(,)f Fp(*)p +Fr(,)g Fp(/)p Fr(,)h Fp(sqrt)p Fr(,)e(comparisons,)h +Fn(:)15 b(:)g(:)q Fr(\),)75 3524 y Fq(\017)60 b Fr(Logical)32 +b(functions)e(\(logical)j Fp(and)p Fr(,)d Fp(or)p Fr(,)g +Fp(not)p Fr(,)g Fn(:)15 b(:)g(:)q Fr(\),)75 3668 y Fq(\017)60 +b Fr(T)-8 b(ranscenden)m(tal)40 b(functions)f(\(exp)s(onen)m(tial,)k (logarithmic,)f(trigonometric,)g(h)m(yp)s(erb)s(olic)d(functions)g(and) 180 3792 y(their)30 b(in)m(v)m(erse)i(functions\).)0 -4086 y(CLN)e(is)g(a)h(C)p Fn(++)f Fp(library)-8 b(.)40 -b(Using)31 b(C)p Fn(++)e Fp(as)i(an)f(implemen)m(tation)g(language)i -(pro)m(vides)75 4360 y Fo(\017)60 b Fp(e\016ciency:)42 +4086 y(CLN)e(is)g(a)h(C)p Fp(++)f Fr(library)-8 b(.)40 +b(Using)31 b(C)p Fp(++)e Fr(as)i(an)f(implemen)m(tation)g(language)i +(pro)m(vides)75 4360 y Fq(\017)60 b Fr(e\016ciency:)42 b(it)31 b(compiles)f(to)h(mac)m(hine)f(co)s(de,)75 4504 -y Fo(\017)60 b Fp(t)m(yp)s(e)33 b(safet)m(y:)48 b(the)33 -b(C)p Fn(++)f Fp(compiler)h(kno)m(ws)f(ab)s(out)h(the)g(n)m(um)m(b)s +y Fq(\017)60 b Fr(t)m(yp)s(e)33 b(safet)m(y:)48 b(the)33 +b(C)p Fp(++)f Fr(compiler)h(kno)m(ws)f(ab)s(out)h(the)g(n)m(um)m(b)s (er)e(t)m(yp)s(es)i(and)g(complains)f(if,)i(for)f(example,)180 4628 y(y)m(ou)e(try)f(to)h(assign)g(a)g(\015oat)g(to)g(an)f(in)m(teger) -i(v)-5 b(ariable.)75 4773 y Fo(\017)60 b Fp(algebraic)32 -b(syn)m(tax:)41 b(Y)-8 b(ou)31 b(can)g(use)f(the)h Fn(+)p -Fp(,)f Fn(-)p Fp(,)g Fn(*)p Fp(,)g Fn(=)p Fp(,)h Fn(==)p -Fp(,)f Fl(:)15 b(:)g(:)31 b Fp(op)s(erators)g(as)f(in)g(C)g(or)h(C)p -Fn(++)p Fp(.)0 5066 y(CLN)f(is)g(memory)f(e\016cien)m(t:)75 -5340 y Fo(\017)60 b Fp(Small)30 b(in)m(tegers)h(and)f(short)g(\015oats) +i(v)-5 b(ariable.)75 4773 y Fq(\017)60 b Fr(algebraic)32 +b(syn)m(tax:)41 b(Y)-8 b(ou)31 b(can)g(use)f(the)h Fp(+)p +Fr(,)f Fp(-)p Fr(,)g Fp(*)p Fr(,)g Fp(=)p Fr(,)h Fp(==)p +Fr(,)f Fn(:)15 b(:)g(:)31 b Fr(op)s(erators)g(as)f(in)g(C)g(or)h(C)p +Fp(++)p Fr(.)0 5066 y(CLN)f(is)g(memory)f(e\016cien)m(t:)75 +5340 y Fq(\017)60 b Fr(Small)30 b(in)m(tegers)h(and)f(short)g(\015oats) h(are)g(immediate,)e(not)i(heap)f(allo)s(cated.)p eop %%Page: 2 4 -2 3 bop 0 -116 a Fp(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2892 -b(2)75 366 y Fo(\017)60 b Fp(Heap-allo)s(cated)40 b(memory)35 +2 3 bop 0 -116 a Fr(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2892 +b(2)75 366 y Fq(\017)60 b Fr(Heap-allo)s(cated)40 b(memory)35 b(is)i(reclaimed)g(through)f(an)h(automatic,)j(non-in)m(terruptiv)m(e)d (garbage)i(collec-)180 491 y(tion.)0 790 y(CLN)30 b(is)g(sp)s(eed)g -(e\016cien)m(t:)75 1064 y Fo(\017)60 b Fp(The)27 b(k)m(ernel)h(of)f +(e\016cien)m(t:)75 1064 y Fq(\017)60 b Fr(The)27 b(k)m(ernel)h(of)f (CLN)g(has)g(b)s(een)g(written)g(in)g(assem)m(bly)g(language)h(for)f -(some)g(CPUs)g(\()p Fn(i386)p Fp(,)g Fn(m68k)p Fp(,)g -Fn(sparc)p Fp(,)180 1188 y Fn(mips)p Fp(,)i Fn(arm)p -Fp(\).)75 1338 y Fo(\017)60 b Fp(On)30 b(all)h(CPUs,)f(CLN)g(uses)g -(the)g(sup)s(ere\016cien)m(t)h(lo)m(w-lev)m(el)i(routines)d(from)f(GNU) -i(GMP)g(v)m(ersion)g(2.)75 1487 y Fo(\017)60 b Fp(It)28 -b(uses)g(Karatsuba)g(m)m(ultiplication,)i(whic)m(h)e(is)g(signi\014can) -m(tly)i(faster)e(for)g(large)h(n)m(um)m(b)s(ers)d(than)i(the)h(stan-) -180 1612 y(dard)g(m)m(ultiplication)j(algorithm.)75 1761 -y Fo(\017)60 b Fp(F)-8 b(or)41 b(v)m(ery)g(large)h(n)m(um)m(b)s(ers)c -(\(more)h(than)i(12000)h(decimal)f(digits\),)j(it)d(uses)f(Sc)m(h\177) --45 b(onhage-Strassen)41 b(m)m(ul-)180 1886 y(tiplication,)k(whic)m(h)c -(is)f(an)h(asymptotically)h(optimal)e(m)m(ultiplication)i(algorithm,)h -(for)e(m)m(ultiplication,)180 2010 y(division)30 b(and)g(radix)g(con)m -(v)m(ersion.)0 2309 y(CLN)g(aims)g(at)h(b)s(eing)f(easily)h(in)m -(tegrated)h(in)m(to)g(larger)f(soft)m(w)m(are)g(pac)m(k)-5 -b(ages:)75 2583 y Fo(\017)60 b Fp(The)30 b(garbage)i(collection)h(imp)s -(oses)28 b(no)j(burden)d(on)i(the)h(main)e(application.)75 -2733 y Fo(\017)60 b Fp(The)30 b(library)g(pro)m(vides)g(ho)s(oks)g(for) -g(memory)f(allo)s(cation)j(and)e(exceptions.)p eop +(some)g(CPUs)g(\()p Fp(i386)p Fr(,)g Fp(m68k)p Fr(,)g +Fp(sparc)p Fr(,)180 1188 y Fp(mips)p Fr(,)i Fp(arm)p +Fr(\).)75 1338 y Fq(\017)60 b Fr(On)33 b(all)i(CPUs,)g(CLN)f(ma)m(y)g +(b)s(e)g(con\014gured)f(to)i(use)f(the)g(sup)s(ere\016cien)m(t)g(lo)m +(w-lev)m(el)j(routines)e(from)d(GNU)180 1462 y(GMP)f(v)m(ersion)g(3.)75 +1612 y Fq(\017)60 b Fr(It)28 b(uses)g(Karatsuba)g(m)m(ultiplication,)i +(whic)m(h)e(is)g(signi\014can)m(tly)i(faster)e(for)g(large)h(n)m(um)m +(b)s(ers)d(than)i(the)h(stan-)180 1736 y(dard)g(m)m(ultiplication)j +(algorithm.)75 1886 y Fq(\017)60 b Fr(F)-8 b(or)56 b(v)m(ery)f(large)h +(n)m(um)m(b)s(ers)d(\(more)i(than)f(12000)k(decimal)d(digits\),)62 +b(it)56 b(uses)e(Sc)m(h\177)-45 b(onhage-Strassen)180 +2010 y(m)m(ultiplication,)27 b(whic)m(h)d(is)g(an)h(asymptotically)g +(optimal)f(m)m(ultiplication)i(algorithm,)g(for)e(m)m(ultiplication,) +180 2135 y(division)30 b(and)g(radix)g(con)m(v)m(ersion.)0 +2434 y(CLN)g(aims)g(at)h(b)s(eing)f(easily)h(in)m(tegrated)h(in)m(to)g +(larger)f(soft)m(w)m(are)g(pac)m(k)-5 b(ages:)75 2708 +y Fq(\017)60 b Fr(The)30 b(garbage)i(collection)h(imp)s(oses)28 +b(no)j(burden)d(on)i(the)h(main)e(application.)75 2857 +y Fq(\017)60 b Fr(The)30 b(library)g(pro)m(vides)g(ho)s(oks)g(for)g +(memory)f(allo)s(cation)j(and)e(exceptions.)p eop %%Page: 3 5 -3 4 bop 0 -116 a Fp(Chapter)30 b(2:)41 b(Installation)2939 -b(3)0 366 y Fm(2)80 b(Installation)0 808 y Fp(This)30 +3 4 bop 0 -116 a Fr(Chapter)30 b(2:)41 b(Installation)2939 +b(3)0 366 y Fo(2)80 b(Installation)0 808 y Fr(This)30 b(section)h(describ)s(es)f(ho)m(w)g(to)h(install)g(the)g(CLN)f(pac)m(k) --5 b(age)32 b(on)f(y)m(our)f(system.)0 1379 y Fq(2.1)68 -b(Prerequisites)0 1917 y Fk(2.1.1)63 b(C)p Fj(++)30 b -Fk(compiler)0 2204 y Fp(T)-8 b(o)27 b(build)f(CLN,)g(y)m(ou)h(need)f(a) -h(C)p Fn(++)f Fp(compiler.)39 b(Actually)-8 b(,)29 b(y)m(ou)e(need)g -(GNU)g Fn(g++)i(2.7.0)c Fp(or)i(new)m(er.)39 b(On)26 -b(HPP)-8 b(A,)0 2329 y(y)m(ou)31 b(need)f(GNU)h Fn(g++)e(2.8.0)g -Fp(or)i(new)m(er.)40 b(I)30 b(recommend)f(GNU)i Fn(egcs)e(1.1)g -Fp(or)i(new)m(er.)0 2616 y(The)44 b(follo)m(wing)j(C)p -Fn(++)d Fp(features)h(are)g(used:)69 b(classes,)50 b(mem)m(b)s(er)42 +-5 b(age)32 b(on)f(y)m(our)f(system.)0 1379 y Fs(2.1)68 +b(Prerequisites)0 1917 y Fm(2.1.1)63 b(C)p Fl(++)30 b +Fm(compiler)0 2204 y Fr(T)-8 b(o)27 b(build)f(CLN,)g(y)m(ou)h(need)f(a) +h(C)p Fp(++)f Fr(compiler.)39 b(Actually)-8 b(,)29 b(y)m(ou)e(need)g +(GNU)g Fp(g++)i(2.7.0)c Fr(or)i(new)m(er.)39 b(On)26 +b(HPP)-8 b(A,)0 2329 y(y)m(ou)31 b(need)f(GNU)h Fp(g++)e(2.8.0)g +Fr(or)i(new)m(er.)40 b(I)30 b(recommend)f(GNU)i Fp(g++)e(2.95)g +Fr(or)i(new)m(er.)0 2616 y(The)44 b(follo)m(wing)j(C)p +Fp(++)d Fr(features)h(are)g(used:)69 b(classes,)50 b(mem)m(b)s(er)42 b(functions,)49 b(o)m(v)m(erloading)e(of)e(functions)g(and)0 2741 y(op)s(erators,)31 b(constructors)f(and)g(destructors,)h(inline,)f (const,)i(m)m(ultiple)e(inheritance,)h(templates.)0 3028 -y(The)f(follo)m(wing)i(C)p Fn(++)d Fp(features)i(are)g(not)f(used:)40 -b Fn(new)p Fp(,)30 b Fn(delete)p Fp(,)f(virtual)h(inheritance,)i +y(The)f(follo)m(wing)i(C)p Fp(++)d Fr(features)i(are)g(not)f(used:)40 +b Fp(new)p Fr(,)30 b Fp(delete)p Fr(,)f(virtual)h(inheritance,)i (exceptions.)0 3316 y(CLN)38 b(relies)h(on)f(semi-automatic)h(ordering) f(of)g(initializations)j(of)e(static)g(and)f(global)i(v)-5 b(ariables,)41 b(a)d(feature)0 3441 y(whic)m(h)30 b(I)g(could)h -(implemen)m(t)e(for)h(GNU)h(g)p Fn(++)f Fp(only)-8 b(.)0 -3978 y Fk(2.1.2)63 b(Mak)m(e)29 b(utilit)m(y)0 4266 y -Fp(T)-8 b(o)31 b(build)e(CLN,)h(y)m(ou)h(also)g(need)g(to)g(ha)m(v)m(e) -g(GNU)g Fn(make)e Fp(installed.)0 4803 y Fk(2.1.3)63 -b(Sed)30 b(utilit)m(y)0 5091 y Fp(T)-8 b(o)36 b(build)e(CLN)g(on)h +(implemen)m(t)e(for)h(GNU)h(g)p Fp(++)f Fr(only)-8 b(.)0 +3978 y Fm(2.1.2)63 b(Mak)m(e)29 b(utilit)m(y)0 4266 y +Fr(T)-8 b(o)31 b(build)e(CLN,)h(y)m(ou)h(also)g(need)g(to)g(ha)m(v)m(e) +g(GNU)g Fp(make)e Fr(installed.)0 4803 y Fm(2.1.3)63 +b(Sed)30 b(utilit)m(y)0 5091 y Fr(T)-8 b(o)36 b(build)e(CLN)g(on)h (HP-UX,)h(y)m(ou)g(also)g(need)f(to)g(ha)m(v)m(e)i(GNU)e -Fn(sed)g Fp(installed.)55 b(This)34 b(is)i(b)s(ecause)f(the)g(libto)s +Fp(sed)g Fr(installed.)55 b(This)34 b(is)i(b)s(ecause)f(the)g(libto)s (ol)0 5215 y(script,)c(whic)m(h)f(creates)i(the)f(CLN)f(library)-8 -b(,)31 b(relies)g(on)g Fn(sed)p Fp(,)f(and)g(the)g(v)m(endor's)h -Fn(sed)f Fp(utilit)m(y)h(on)g(these)g(systems)0 5340 +b(,)31 b(relies)g(on)g Fp(sed)p Fr(,)f(and)g(the)g(v)m(endor's)h +Fp(sed)f Fr(utilit)m(y)h(on)g(these)g(systems)0 5340 y(is)f(to)s(o)i(limited.)p eop %%Page: 4 6 -4 5 bop 0 -116 a Fp(Chapter)30 b(2:)41 b(Installation)2939 -b(4)0 366 y Fq(2.2)68 b(Building)31 b(the)f(library)0 -647 y Fp(As)g(with)g(an)m(y)h(auto)s(con\014guring)f(GNU)h(soft)m(w)m +4 5 bop 0 -116 a Fr(Chapter)30 b(2:)41 b(Installation)2939 +b(4)0 366 y Fs(2.2)68 b(Building)31 b(the)f(library)0 +647 y Fr(As)g(with)g(an)m(y)h(auto)s(con\014guring)f(GNU)h(soft)m(w)m (are,)h(installation)h(is)d(as)h(easy)g(as)f(this:)240 -906 y Fn($)47 b(./configure)240 1010 y($)g(make)240 1114 -y($)g(make)g(check)0 1394 y Fp(If)30 b(on)g(y)m(our)g(system,)g(`)p -Fn(make)p Fp(')g(is)g(not)h(GNU)g Fn(make)p Fp(,)e(y)m(ou)i(ha)m(v)m(e) -h(to)f(use)f(`)p Fn(gmake)p Fp(')f(instead)i(of)g(`)p -Fn(make)p Fp(')e(ab)s(o)m(v)m(e.)0 1675 y(The)34 b Fn(configure)f -Fp(command)f(c)m(hec)m(ks)37 b(out)e(some)f(features)h(of)g(y)m(our)g -(system)f(and)g(C)p Fn(++)g Fp(compiler)h(and)f(builds)0 -1799 y(the)e Fn(Makefile)p Fp(s.)42 b(The)31 b Fn(make)f -Fp(command)f(builds)i(the)g(library)-8 b(.)45 b(This)30 +906 y Fp($)47 b(./configure)240 1010 y($)g(make)240 1114 +y($)g(make)g(check)0 1394 y Fr(If)30 b(on)g(y)m(our)g(system,)g(`)p +Fp(make)p Fr(')g(is)g(not)h(GNU)g Fp(make)p Fr(,)e(y)m(ou)i(ha)m(v)m(e) +h(to)f(use)f(`)p Fp(gmake)p Fr(')f(instead)i(of)g(`)p +Fp(make)p Fr(')e(ab)s(o)m(v)m(e.)0 1675 y(The)34 b Fp(configure)f +Fr(command)f(c)m(hec)m(ks)37 b(out)e(some)f(features)h(of)g(y)m(our)g +(system)f(and)g(C)p Fp(++)g Fr(compiler)h(and)f(builds)0 +1799 y(the)e Fp(Makefile)p Fr(s.)42 b(The)31 b Fp(make)f +Fr(command)f(builds)i(the)g(library)-8 b(.)45 b(This)30 b(step)i(ma)m(y)f(tak)m(e)i(4)f(hours)e(on)i(an)f(a)m(v)m(erage)0 -1924 y(w)m(orkstation.)78 b(The)42 b Fn(make)29 b(check)41 -b Fp(runs)f(some)i(test)h(to)g(c)m(hec)m(k)h(that)f(no)f(imp)s(ortan)m +1924 y(w)m(orkstation.)78 b(The)42 b Fp(make)29 b(check)41 +b Fr(runs)f(some)i(test)h(to)g(c)m(hec)m(k)h(that)f(no)f(imp)s(ortan)m (t)f(subroutine)h(has)g(b)s(een)0 2048 y(miscompiled.)0 -2329 y(The)30 b Fn(configure)e Fp(command)g(accepts)k(options.)41 +2329 y(The)30 b Fp(configure)e Fr(command)g(accepts)k(options.)41 b(T)-8 b(o)30 b(get)i(a)f(summary)c(of)j(them,)g(try)240 -2588 y Fn($)47 b(./configure)e(--help)0 2868 y Fp(Some)29 +2588 y Fp($)47 b(./configure)e(--help)0 2868 y Fr(Some)29 b(of)i(the)g(options)f(are)h(explained)g(in)f(detail)h(in)f(the)h(`)p -Fn(INSTALL.generic)p Fp(')26 b(\014le.)0 3149 y(Y)-8 +Fp(INSTALL.generic)p Fr(')26 b(\014le.)0 3149 y(Y)-8 b(ou)28 b(can)g(sp)s(ecify)g(the)g(C)f(compiler,)h(the)g(C)p -Fn(++)f Fp(compiler)g(and)g(their)h(options)g(through)f(the)h(follo)m +Fp(++)f Fr(compiler)g(and)g(their)h(options)g(through)f(the)h(follo)m (wing)i(en)m(viron-)0 3273 y(men)m(t)g(v)-5 b(ariables)31 -b(when)e(running)g Fn(configure)p Fp(:)0 3585 y Fn(CC)384 -b Fp(Sp)s(eci\014es)30 b(the)g(C)g(compiler.)0 3772 y -Fn(CFLAGS)192 b Fp(Flags)32 b(to)f(b)s(e)f(giv)m(en)h(to)g(the)g(C)f +b(when)e(running)g Fp(configure)p Fr(:)0 3585 y Fp(CC)384 +b Fr(Sp)s(eci\014es)30 b(the)g(C)g(compiler.)0 3772 y +Fp(CFLAGS)192 b Fr(Flags)32 b(to)f(b)s(e)f(giv)m(en)h(to)g(the)g(C)f (compiler)f(when)h(compiling)g(programs)f(\(not)i(when)e(linking\).)0 -3959 y Fn(CXX)336 b Fp(Sp)s(eci\014es)30 b(the)g(C)p -Fn(++)g Fp(compiler.)0 4146 y Fn(CXXFLAGS)96 b Fp(Flags)32 -b(to)f(b)s(e)f(giv)m(en)h(to)g(the)g(C)p Fn(++)e Fp(compiler)h(when)f +3959 y Fp(CXX)336 b Fr(Sp)s(eci\014es)30 b(the)g(C)p +Fp(++)g Fr(compiler.)0 4146 y Fp(CXXFLAGS)96 b Fr(Flags)32 +b(to)f(b)s(e)f(giv)m(en)h(to)g(the)g(C)p Fp(++)e Fr(compiler)h(when)f (compiling)h(programs)f(\(not)i(when)f(linking\).)0 4458 -y(Examples:)240 4717 y Fn($)47 b(CC="gcc")f(CFLAGS="-O")f(CXX="g++")g +y(Examples:)240 4717 y Fp($)47 b(CC="gcc")f(CFLAGS="-O")f(CXX="g++")g (CXXFLAGS="-O")f(./configure)240 4821 y($)j(CC="gcc)f(-V)h(2.7.2")g (CFLAGS="-O)e(-g")h(\\)335 4925 y(CXX="g++)g(-V)h(2.7.2")f (CXXFLAGS="-O)f(-g")i(./configure)240 5029 y($)g(CC="gcc)f(-V)h(2.8.1") @@ -1606,83 +1884,79 @@ y($)k(CC="gcc)f(-V)h(egcs-2.91.60")e(CFLAGS="-O2)f(-fno-exceptions")g (\\)335 5340 y(CXX="g++)i(-V)h(egcs-2.91.60")d(CFLAGS="-O2)h (-fno-exceptions")e(./configure)p eop %%Page: 5 7 -5 6 bop 0 -116 a Fp(Chapter)30 b(2:)41 b(Installation)2939 +5 6 bop 0 -116 a Fr(Chapter)30 b(2:)41 b(Installation)2939 b(5)0 366 y(Note)28 b(that)g(for)f(these)h(en)m(vironmen)m(t)e(v)-5 b(ariables)28 b(to)g(tak)m(e)h(e\013ect,)g(y)m(ou)e(ha)m(v)m(e)i(to)f (set)f(them)f(\(assuming)g(a)i(Bourne-)0 491 y(compatible)i(shell\))f -(on)g(the)h(same)f(line)g(as)h(the)f Fn(configure)e Fp(command.)38 +(on)g(the)h(same)f(line)g(as)h(the)f Fp(configure)e Fr(command.)38 b(If)29 b(y)m(ou)g(made)f(the)i(settings)g(in)f(earlier)0 616 y(shell)f(commands,)e(y)m(ou)i(ha)m(v)m(e)g(to)h -Fn(export)d Fp(the)h(en)m(vironmen)m(t)g(v)-5 b(ariables)29 -b(b)s(efore)e(calling)i Fn(configure)p Fp(.)37 b(In)27 -b(a)h Fn(csh)0 740 y Fp(shell,)j(y)m(ou)g(ha)m(v)m(e)g(to)g(use)f(the)h -(`)p Fn(setenv)p Fp(')e(command)f(for)i(setting)i(eac)m(h)f(of)g(the)f -(en)m(vironmen)m(t)g(v)-5 b(ariables.)0 1017 y(On)34 -b(Lin)m(ux,)i Fn(g++)e Fp(needs)g(15)i(MB)f(to)h(compile)f(the)g +Fp(export)d Fr(the)h(en)m(vironmen)m(t)g(v)-5 b(ariables)29 +b(b)s(efore)e(calling)i Fp(configure)p Fr(.)37 b(In)27 +b(a)h Fp(csh)0 740 y Fr(shell,)j(y)m(ou)g(ha)m(v)m(e)g(to)g(use)f(the)h +(`)p Fp(setenv)p Fr(')e(command)f(for)i(setting)i(eac)m(h)f(of)g(the)f +(en)m(vironmen)m(t)g(v)-5 b(ariables.)0 1040 y(On)34 +b(Lin)m(ux,)i Fp(g++)e Fr(needs)g(15)i(MB)f(to)h(compile)f(the)g (tests.)55 b(So)34 b(y)m(ou)i(should)d(b)s(etter)i(ha)m(v)m(e)h(17)g -(MB)g(sw)m(ap)e(space)0 1142 y(and)c(1)h(MB)g(ro)s(om)e(in)h($TMPDIR.)0 -1419 y(If)d(y)m(ou)h(use)g Fn(g++)e Fp(v)m(ersion)i(2.7.x,)i(don't)e -(add)f(`)p Fn(-O2)p Fp(')g(to)i(the)f(CXXFLA)m(GS,)g(b)s(ecause)g(`)p -Fn(g++)h(-O)p Fp(')f(generates)h(b)s(etter)0 1544 y(co)s(de)i(for)f -(CLN)g(than)g(`)p Fn(g++)g(-O2)p Fp('.)0 1821 y(If)40 -b(y)m(ou)i(use)e Fn(g++)g Fp(v)m(ersion)h(2.8.x)i(or)e(egcs-2.91.x)j +(MB)g(sw)m(ap)e(space)0 1164 y(and)c(1)h(MB)g(ro)s(om)e(in)h($TMPDIR.)0 +1464 y(If)d(y)m(ou)h(use)g Fp(g++)e Fr(v)m(ersion)i(2.7.x,)i(don't)e +(add)f(`)p Fp(-O2)p Fr(')g(to)i(the)f(CXXFLA)m(GS,)g(b)s(ecause)g(`)p +Fp(g++)h(-O)p Fr(')f(generates)h(b)s(etter)0 1588 y(co)s(de)i(for)f +(CLN)g(than)g(`)p Fp(g++)g(-O2)p Fr('.)0 1888 y(If)40 +b(y)m(ou)i(use)e Fp(g++)g Fr(v)m(ersion)h(2.8.x)i(or)e(egcs-2.91.x)j (\(a.k.a.)73 b(egcs-1.1\))44 b(or)d(gcc-2.95.x,)47 b(I)41 -b(recommend)d(adding)0 1946 y(`)p Fn(-fno-exceptions)p -Fp(')27 b(to)k(the)f(CXXFLA)m(GS.)i(This)d(will)i(lik)m(ely)h(generate) -g(b)s(etter)e(co)s(de.)0 2223 y(If)50 b(y)m(ou)g(use)g -Fn(g++)g Fp(v)m(ersion)g(egcs-2.91.x)k(\(egcs-1.1\))f(or)d(gcc-2.95.x)k -(on)c(Sparc,)55 b(add)50 b(either)g(`)p Fn(-O)p Fp(')g(or)h(`)p -Fn(-O2)0 2347 y(-fno-schedule-insns)p Fp(')21 b(to)26 -b(the)g(CXXFLA)m(GS.)g(With)g(full)g(`)p Fn(-O2)p Fp(',)g -Fn(g++)f Fp(miscompiles)f(the)i(division)g(routines.)0 -2472 y(Also,)31 b(for)f({enable-shared)h(to)g(w)m(ork,)g(y)m(ou)g(need) -f(egcs-1.1.2)k(or)c(new)m(er.)0 2749 y(On)23 b(MIPS)h(\(SGI)g(Irix)g -(6\),)i(pass)e(option)g Fn(--without-gmp)d Fp(to)k(con\014gure.)38 -b(gmp)23 b(do)s(es)h(not)g(w)m(ork)g(when)f(compiled)0 -2874 y(in)30 b(`)p Fn(n32)p Fp(')g(binary)g(format)f(on)i(Irix.)0 -3151 y(By)36 b(default,)i(only)e(a)h(static)h(library)d(is)h(built.)58 -b(Y)-8 b(ou)36 b(can)h(build)e(CLN)g(as)i(a)f(shared)f(library)h(to)s -(o,)i(b)m(y)e(calling)0 3275 y Fn(configure)43 b Fp(with)i(the)g -(option)h(`)p Fn(--enable-shared)p Fp('.)82 b(T)-8 b(o)46 -b(get)g(it)g(built)f(as)h(a)f(shared)g(library)g(only)-8 -b(,)50 b(call)0 3400 y Fn(configure)28 b Fp(with)i(the)g(options)h(`)p -Fn(--enable-shared)c(--disable-static)p Fp('.)0 3677 -y(If)j(y)m(ou)g(use)g Fn(g++)f Fp(v)m(ersion)i(egcs-2.91.x)i -(\(egcs-1.1\))h(on)c(Sparc,)f(y)m(ou)i(cannot)g(use)e(`)p -Fn(--enable-shared)p Fp(')e(b)s(ecause)0 3802 y Fn(g++)i -Fp(w)m(ould)i(miscompile)e(parts)h(of)g(the)h(library)-8 -b(.)0 4280 y Fq(2.3)68 b(Installing)32 b(the)f(library)0 -4557 y Fp(As)f(with)g(an)m(y)h(auto)s(con\014guring)f(GNU)h(soft)m(w)m +b(recommend)d(adding)0 2012 y(`)p Fp(-fno-exceptions)p +Fr(')27 b(to)k(the)f(CXXFLA)m(GS.)i(This)d(will)i(lik)m(ely)h(generate) +g(b)s(etter)e(co)s(de.)0 2312 y(If)50 b(y)m(ou)g(use)g +Fp(g++)g Fr(v)m(ersion)g(egcs-2.91.x)k(\(egcs-1.1\))f(or)d(gcc-2.95.x)k +(on)c(Sparc,)55 b(add)50 b(either)g(`)p Fp(-O)p Fr(')g(or)h(`)p +Fp(-O2)0 2437 y(-fno-schedule-insns)p Fr(')21 b(to)26 +b(the)g(CXXFLA)m(GS.)g(With)g(full)g(`)p Fp(-O2)p Fr(',)g +Fp(g++)f Fr(miscompiles)f(the)i(division)g(routines.)0 +2561 y(Also,)31 b(for)f({enable-shared)h(to)g(w)m(ork,)g(y)m(ou)g(need) +f(egcs-1.1.2)k(or)c(new)m(er.)0 2861 y(By)36 b(default,)i(only)e(a)h +(static)h(library)d(is)h(built.)58 b(Y)-8 b(ou)36 b(can)h(build)e(CLN)g +(as)i(a)f(shared)f(library)h(to)s(o,)i(b)m(y)e(calling)0 +2985 y Fp(configure)43 b Fr(with)i(the)g(option)h(`)p +Fp(--enable-shared)p Fr('.)82 b(T)-8 b(o)46 b(get)g(it)g(built)f(as)h +(a)f(shared)g(library)g(only)-8 b(,)50 b(call)0 3110 +y Fp(configure)28 b Fr(with)i(the)g(options)h(`)p Fp(--enable-shared)c +(--disable-static)p Fr('.)0 3409 y(If)j(y)m(ou)g(use)g +Fp(g++)f Fr(v)m(ersion)i(egcs-2.91.x)i(\(egcs-1.1\))h(on)c(Sparc,)f(y)m +(ou)i(cannot)g(use)e(`)p Fp(--enable-shared)p Fr(')e(b)s(ecause)0 +3534 y Fp(g++)i Fr(w)m(ould)i(miscompile)e(parts)h(of)g(the)h(library) +-8 b(.)0 4213 y Fs(2.3)68 b(Installing)32 b(the)f(library)0 +4512 y Fr(As)f(with)g(an)m(y)h(auto)s(con\014guring)f(GNU)h(soft)m(w)m (are,)h(installation)h(is)d(as)h(easy)g(as)f(this:)240 -4814 y Fn($)47 b(make)g(install)0 5091 y Fp(The)20 b(`)p -Fn(make)29 b(install)p Fp(')19 b(command)f(installs)j(the)f(library)g +4791 y Fp($)47 b(make)g(install)0 5091 y Fr(The)20 b(`)p +Fp(make)29 b(install)p Fr(')19 b(command)f(installs)j(the)f(library)g (and)g(the)g(include)g(\014les)h(in)m(to)g(public)e(places)i(\(`)p -Fn(/usr/local/lib/)p Fp(')0 5215 y(and)28 b(`)p Fn(/usr/local/include/) -p Fp(',)d(if)k(y)m(ou)h(ha)m(v)m(en't)g(sp)s(eci\014ed)f(a)g -Fn(--prefix)e Fp(option)j(to)f Fn(configure)p Fp(\).)39 +Fp(/usr/local/lib/)p Fr(')0 5215 y(and)28 b(`)p Fp(/usr/local/include/) +p Fr(',)d(if)k(y)m(ou)h(ha)m(v)m(en't)g(sp)s(eci\014ed)f(a)g +Fp(--prefix)e Fr(option)j(to)f Fp(configure)p Fr(\).)39 b(This)28 b(step)0 5340 y(ma)m(y)i(require)g(sup)s(eruser)e (privileges.)p eop %%Page: 6 8 -6 7 bop 0 -116 a Fp(Chapter)30 b(2:)41 b(Installation)2939 +6 7 bop 0 -116 a Fr(Chapter)30 b(2:)41 b(Installation)2939 b(6)0 366 y(If)40 b(y)m(ou)i(ha)m(v)m(e)g(already)f(built)g(the)g (library)f(and)g(wish)g(to)i(install)g(it,)i(but)c(didn't)g(sp)s(ecify) -h Fn(--prefix=)p Fl(:)15 b(:)g(:)39 b Fp(at)0 491 y(con\014gure)g -(time,)i(just)d(re-run)g Fn(configure)p Fp(,)h(giving)h(it)f(the)g +h Fp(--prefix=)p Fn(:)15 b(:)g(:)39 b Fr(at)0 491 y(con\014gure)g +(time,)i(just)d(re-run)g Fp(configure)p Fr(,)h(giving)h(it)f(the)g (same)g(options)g(as)g(the)g(\014rst)f(time,)j(plus)d(the)i -Fn(--)0 616 y(prefix=)p Fl(:)15 b(:)g(:)29 b Fp(option.)0 -1064 y Fq(2.4)68 b(Cleaning)32 b(up)0 1338 y Fp(Y)-8 +Fp(--)0 616 y(prefix=)p Fn(:)15 b(:)g(:)29 b Fr(option.)0 +1064 y Fs(2.4)68 b(Cleaning)32 b(up)0 1338 y Fr(Y)-8 b(ou)31 b(can)g(remo)m(v)m(e)f(system-dep)s(enden)m(t)f(\014les)i -(generated)g(b)m(y)f Fn(make)f Fp(through)240 1591 y -Fn($)47 b(make)g(clean)0 1865 y Fp(Y)-8 b(ou)28 b(can)f(remo)m(v)m(e)h -(all)g(\014les)f(generated)h(b)m(y)f Fn(make)p Fp(,)g(th)m(us)g(rev)m +(generated)g(b)m(y)f Fp(make)f Fr(through)240 1591 y +Fp($)47 b(make)g(clean)0 1865 y Fr(Y)-8 b(ou)28 b(can)f(remo)m(v)m(e)h +(all)g(\014les)f(generated)h(b)m(y)f Fp(make)p Fr(,)g(th)m(us)g(rev)m (erting)h(to)g(a)g(virgin)f(distribution)f(of)i(CLN,)f(through)240 -2118 y Fn($)47 b(make)g(distclean)p eop +2118 y Fp($)47 b(make)g(distclean)p eop %%Page: 7 9 -7 8 bop 0 -116 a Fp(Chapter)30 b(3:)41 b(Ordinary)29 -b(n)m(um)m(b)s(er)f(t)m(yp)s(es)2457 b(7)0 366 y Fm(3)80 +7 8 bop 0 -116 a Fr(Chapter)30 b(3:)41 b(Ordinary)29 +b(n)m(um)m(b)s(er)f(t)m(yp)s(es)2457 b(7)0 366 y Fo(3)80 b(Ordinary)32 b(n)l(um)l(b)t(er)27 b(t)l(yp)t(es)0 809 -y Fp(CLN)j(implemen)m(ts)f(the)h(follo)m(wing)i(class)f(hierarc)m(h)m -(y:)1385 1076 y Fn(Number)1338 1180 y(cl_number)1242 +y Fr(CLN)j(implemen)m(ts)f(the)h(follo)m(wing)i(class)f(hierarc)m(h)m +(y:)1385 1076 y Fp(Number)1338 1180 y(cl_number)1242 1283 y()1481 1387 y(|)1481 1491 y(|)1051 1595 y(Real)47 b(or)g(complex)f(number)1385 1698 y(cl_N)1242 1802 y()1481 1906 y(|)1481 2010 y(|)1242 @@ -1697,62 +1971,62 @@ b(|)h(|)f(|)431 3359 y(cl_I)572 b(Short-Float)140 b(Single-Float)92 b(Double-Float)140 b(Long-Float)288 3463 y()378 b(cl_SF)428 b(cl_FF)g(cl_DF)g(cl_LF)1147 3566 y()44 b()g()g()0 3854 -y Fp(The)36 b(base)g(class)h Fn(cl_number)d Fp(is)i(an)g(abstract)h +y Fr(The)36 b(base)g(class)h Fp(cl_number)d Fr(is)i(an)g(abstract)h (base)f(class.)59 b(It)36 b(is)g(not)h(useful)e(to)i(declare)g(a)g(v)-5 b(ariable)37 b(of)f(this)0 3979 y(t)m(yp)s(e)f(except)i(if)e(y)m(ou)g (w)m(an)m(t)h(to)g(completely)g(disable)g(compile-time)f(t)m(yp)s(e)g (c)m(hec)m(king)i(and)e(use)g(run-time)f(t)m(yp)s(e)0 4103 y(c)m(hec)m(king)e(instead.)0 4391 y(The)25 b(class)h -Fn(cl_N)f Fp(comprises)f(real)i(and)f(complex)g(n)m(um)m(b)s(ers.)37 +Fp(cl_N)f Fr(comprises)f(real)i(and)f(complex)g(n)m(um)m(b)s(ers.)37 b(There)25 b(is)g(no)h(sp)s(ecial)g(class)g(for)f(complex)g(n)m(um)m(b) s(ers)0 4515 y(since)31 b(complex)f(n)m(um)m(b)s(ers)e(with)i -(imaginary)g(part)g Fn(0)g Fp(are)h(automatically)h(con)m(v)m(erted)g +(imaginary)g(part)g Fp(0)g Fr(are)h(automatically)h(con)m(v)m(erted)g (to)f(real)g(n)m(um)m(b)s(ers.)0 4803 y(The)f(class)h -Fn(cl_R)e Fp(comprises)h(real)h(n)m(um)m(b)s(ers)d(of)i(di\013eren)m(t) +Fp(cl_R)e Fr(comprises)h(real)h(n)m(um)m(b)s(ers)d(of)i(di\013eren)m(t) h(kinds.)40 b(It)30 b(is)h(an)f(abstract)h(class.)0 5091 -y(The)41 b(class)i Fn(cl_RA)e Fp(comprises)f(exact)k(real)e(n)m(um)m(b) +y(The)41 b(class)i Fp(cl_RA)e Fr(comprises)f(exact)k(real)e(n)m(um)m(b) s(ers:)62 b(rational)43 b(n)m(um)m(b)s(ers,)f(including)g(in)m(tegers.) 76 b(There)42 b(is)0 5215 y(no)34 b(sp)s(ecial)g(class)h(for)f(non-in)m (tegral)h(rational)h(n)m(um)m(b)s(ers)31 b(since)j(rational)i(n)m(um)m -(b)s(ers)31 b(with)j(denominator)f Fn(1)h Fp(are)0 5340 +(b)s(ers)31 b(with)j(denominator)f Fp(1)h Fr(are)0 5340 y(automatically)e(con)m(v)m(erted)g(to)f(in)m(tegers.)p eop %%Page: 8 10 -8 9 bop 0 -116 a Fp(Chapter)30 b(3:)41 b(Ordinary)29 +8 9 bop 0 -116 a Fr(Chapter)30 b(3:)41 b(Ordinary)29 b(n)m(um)m(b)s(er)f(t)m(yp)s(es)2457 b(8)0 366 y(The)30 -b(class)h Fn(cl_F)e Fp(implemen)m(ts)g(\015oating-p)s(oin)m(t)j(appro)m +b(class)h Fp(cl_F)e Fr(implemen)m(ts)g(\015oating-p)s(oin)m(t)j(appro)m (ximations)e(to)h(real)g(n)m(um)m(b)s(ers.)38 b(It)31 -b(is)f(an)g(abstract)i(class.)0 802 y Fq(3.1)68 b(Exact)31 -b(n)l(um)l(b)t(ers)0 1076 y Fp(Some)42 b(n)m(um)m(b)s(ers)e(are)j +b(is)f(an)g(abstract)i(class.)0 802 y Fs(3.1)68 b(Exact)31 +b(n)l(um)l(b)t(ers)0 1076 y Fr(Some)42 b(n)m(um)m(b)s(ers)e(are)j (represen)m(ted)f(as)h(exact)h(n)m(um)m(b)s(ers:)63 b(there)42 b(is)h(no)f(loss)h(of)g(information)f(when)f(suc)m(h)i(a)0 1200 y(n)m(um)m(b)s(er)25 b(is)i(con)m(v)m(erted)i(from)d(its)h (mathematical)h(v)-5 b(alue)28 b(to)g(its)f(in)m(ternal)h(represen)m (tation.)41 b(On)26 b(exact)j(n)m(um)m(b)s(ers,)0 1325 -y(the)i(elemen)m(tary)f(op)s(erations)h(\()p Fn(+)p Fp(,)g -Fn(-)p Fp(,)f Fn(*)p Fp(,)g Fn(/)p Fp(,)h(comparisons,)e -Fl(:)15 b(:)g(:)q Fp(\))31 b(compute)f(the)g(completely)h(correct)h +y(the)i(elemen)m(tary)f(op)s(erations)h(\()p Fp(+)p Fr(,)g +Fp(-)p Fr(,)f Fp(*)p Fr(,)g Fp(/)p Fr(,)h(comparisons,)e +Fn(:)15 b(:)g(:)q Fr(\))31 b(compute)f(the)g(completely)h(correct)h (result.)0 1599 y(In)e(CLN,)g(the)g(exact)i(n)m(um)m(b)s(ers)c(are:)75 -1873 y Fo(\017)60 b Fp(rational)32 b(n)m(um)m(b)s(ers)c(\(including)i -(in)m(tegers\),)75 2019 y Fo(\017)60 b Fp(complex)30 +1873 y Fq(\017)60 b Fr(rational)32 b(n)m(um)m(b)s(ers)c(\(including)i +(in)m(tegers\),)75 2019 y Fq(\017)60 b Fr(complex)30 b(n)m(um)m(b)s(ers)e(whose)i(real)h(and)f(imaginary)g(parts)g(are)h(b)s (oth)e(rational)j(n)m(um)m(b)s(ers.)0 2314 y(Rational)26 b(n)m(um)m(b)s(ers)d(are)i(alw)m(a)m(ys)h(normalized)e(to)i(the)f(form) -e Fi(n)m(umerator)7 b Fn(/)p Fi(denominator)29 b Fp(where)24 +e Fk(n)m(umerator)7 b Fp(/)p Fk(denominator)29 b Fr(where)24 b(the)h(n)m(umerator)0 2439 y(and)e(denominator)f(are)i(coprime)e(in)m (tegers)i(and)f(the)g(denominator)g(is)g(p)s(ositiv)m(e.)39 b(If)23 b(the)g(resulting)h(denominator)0 2564 y(is)30 -b Fn(1)p Fp(,)h(the)f(rational)i(n)m(um)m(b)s(er)c(is)i(con)m(v)m +b Fp(1)p Fr(,)h(the)f(rational)i(n)m(um)m(b)s(er)c(is)i(con)m(v)m (erted)i(to)f(an)g(in)m(teger.)0 2838 y(Small)d(in)m(tegers)j(\(t)m -(ypically)g(in)e(the)g(range)h Fn(-2^30)p Fl(:)15 b(:)g(:)p -Fn(2^30-1)p Fp(,)28 b(for)h(32-bit)h(mac)m(hines\))f(are)h(esp)s +(ypically)g(in)e(the)g(range)h Fp(-2^30)p Fn(:)15 b(:)g(:)p +Fp(2^30-1)p Fr(,)28 b(for)h(32-bit)h(mac)m(hines\))f(are)h(esp)s (ecially)g(e\016cien)m(t,)0 2962 y(b)s(ecause)c(they)g(consume)f(no)h (heap)g(allo)s(cation.)41 b(Otherwise)26 b(the)g(distinction)h(b)s(et)m (w)m(een)f(these)h(immediate)e(in)m(te-)0 3087 y(gers)31 b(\(called)h(\\\014xn)m(ums"\))d(and)g(heap)i(allo)s(cated)h(in)m (tegers)g(\(called)g(\\bign)m(ums"\))d(is)i(completely)g(transparen)m -(t.)0 3522 y Fq(3.2)68 b(Floating-p)t(oin)l(t)32 b(n)l(um)l(b)t(ers)0 -3796 y Fp(Not)37 b(all)g(real)g(n)m(um)m(b)s(ers)d(can)j(b)s(e)e +(t.)0 3522 y Fs(3.2)68 b(Floating-p)t(oin)l(t)32 b(n)l(um)l(b)t(ers)0 +3796 y Fr(Not)37 b(all)g(real)g(n)m(um)m(b)s(ers)d(can)j(b)s(e)e (represen)m(ted)i(exactly)-8 b(.)60 b(\(There)36 b(is)h(an)f(easy)h (mathematical)f(pro)s(of)g(for)g(this:)0 3920 y(Only)31 b(a)h(coun)m(table)h(set)f(of)g(n)m(um)m(b)s(ers)d(can)j(b)s(e)f @@ -1762,61 +2036,61 @@ b(there)g(are)g(uncoun)m(tably)g(man)m(y)f(real)i(n)m(um)m(b)s(ers.\)) 41 b(So)31 b(some)f(appro)m(ximation)h(is)0 4169 y(needed.)40 b(CLN)30 b(implemen)m(ts)f(ordinary)h(\015oating-p)s(oin)m(t)h(n)m(um)m (b)s(ers,)e(with)h(man)m(tissa)g(and)g(exp)s(onen)m(t.)0 -4443 y(The)c(elemen)m(tary)i(op)s(erations)f(\()p Fn(+)p -Fp(,)g Fn(-)p Fp(,)h Fn(*)p Fp(,)f Fn(/)p Fp(,)h Fl(:)15 -b(:)g(:)q Fp(\))27 b(only)g(return)e(appro)m(ximate)i(results.)40 +4443 y(The)c(elemen)m(tary)i(op)s(erations)f(\()p Fp(+)p +Fr(,)g Fp(-)p Fr(,)h Fp(*)p Fr(,)f Fp(/)p Fr(,)h Fn(:)15 +b(:)g(:)q Fr(\))27 b(only)g(return)e(appro)m(ximate)i(results.)40 b(F)-8 b(or)27 b(example,)g(the)g(v)-5 b(alue)0 4568 -y(of)31 b(the)h(expression)f Fn(\(cl_F\))d(0.3)i(+)g(\(cl_F\))f(0.4)h -Fp(prin)m(ts)h(as)g(`)p Fn(0.70000005)p Fp(',)e(not)j(as)f(`)p -Fn(0.7)p Fp('.)43 b(Rounding)30 b(errors)0 4692 y(lik)m(e)i(this)e(one) +y(of)31 b(the)h(expression)f Fp(\(cl_F\))d(0.3)i(+)g(\(cl_F\))f(0.4)h +Fr(prin)m(ts)h(as)g(`)p Fp(0.70000005)p Fr(',)e(not)j(as)f(`)p +Fp(0.7)p Fr('.)43 b(Rounding)30 b(errors)0 4692 y(lik)m(e)i(this)e(one) h(are)f(inevitable)i(when)d(computing)h(with)g(\015oating-p)s(oin)m(t)i (n)m(um)m(b)s(ers.)0 4966 y(Nev)m(ertheless,)41 b(CLN)36 b(rounds)g(the)h(\015oating-p)s(oin)m(t)i(results)e(of)g(the)g(op)s -(erations)h Fn(+)p Fp(,)h Fn(-)p Fp(,)f Fn(*)p Fp(,)h -Fn(/)p Fp(,)g Fn(sqrt)d Fp(according)0 5091 y(to)c(the)f(\\round-to-ev) +(erations)h Fp(+)p Fr(,)h Fp(-)p Fr(,)f Fp(*)p Fr(,)h +Fp(/)p Fr(,)g Fp(sqrt)d Fr(according)0 5091 y(to)c(the)f(\\round-to-ev) m(en")h(rule:)42 b(It)31 b(\014rst)f(computes)g(the)h(exact)h (mathematical)f(result)g(and)g(then)f(returns)g(the)0 5215 y(\015oating-p)s(oin)m(t)37 b(n)m(um)m(b)s(er)c(whic)m(h)i(is)h (nearest)g(to)h(this.)56 b(If)35 b(t)m(w)m(o)i(\015oating-p)s(oin)m(t)g (n)m(um)m(b)s(ers)c(are)j(equally)g(distan)m(t)0 5340 y(from)29 b(the)h(ideal)i(result,)e(the)h(one)f(with)g(a)h -Fn(0)f Fp(in)g(its)h(least)h(signi\014can)m(t)f(man)m(tissa)f(bit)h(is) +Fp(0)f Fr(in)g(its)h(least)h(signi\014can)m(t)f(man)m(tissa)f(bit)h(is) f(c)m(hosen.)p eop %%Page: 9 11 -9 10 bop 0 -116 a Fp(Chapter)30 b(3:)41 b(Ordinary)29 +9 10 bop 0 -116 a Fr(Chapter)30 b(3:)41 b(Ordinary)29 b(n)m(um)m(b)s(er)f(t)m(yp)s(es)2457 b(9)0 366 y(Similarly)-8 b(,)48 b(testing)d(\015oating)g(p)s(oin)m(t)f(n)m(um)m(b)s(ers)e(for)i -(equalit)m(y)i(`)p Fn(x)30 b(==)g(y)p Fp(')44 b(is)h(gam)m(bling)f +(equalit)m(y)i(`)p Fp(x)30 b(==)g(y)p Fr(')44 b(is)h(gam)m(bling)f (with)g(random)e(errors.)0 491 y(Better)32 b(c)m(hec)m(k)g(for)e(`)p -Fn(abs\(x)f(-)h(y\))g(<)g(epsilon)p Fp(')f(for)h(some)f(w)m(ell-c)m -(hosen)k Fn(epsilon)p Fp(.)0 850 y(Floating)f(p)s(oin)m(t)f(n)m(um)m(b) +Fp(abs\(x)f(-)h(y\))g(<)g(epsilon)p Fr(')f(for)h(some)f(w)m(ell-c)m +(hosen)k Fp(epsilon)p Fr(.)0 850 y(Floating)f(p)s(oin)m(t)f(n)m(um)m(b) s(ers)d(come)i(in)g(four)g(\015a)m(v)m(ors:)75 1209 y -Fo(\017)60 b Fp(Short)24 b(\015oats,)j(t)m(yp)s(e)d Fn(cl_SF)p -Fp(.)38 b(They)24 b(ha)m(v)m(e)i(1)f(sign)g(bit,)h(8)f(exp)s(onen)m(t)f +Fq(\017)60 b Fr(Short)24 b(\015oats,)j(t)m(yp)s(e)d Fp(cl_SF)p +Fr(.)38 b(They)24 b(ha)m(v)m(e)i(1)f(sign)g(bit,)h(8)f(exp)s(onen)m(t)f (bits)h(\(including)g(the)g(exp)s(onen)m(t's)f(sign\),)180 1333 y(and)30 b(17)h(man)m(tissa)f(bits)h(\(including)f(the)g (\\hidden")g(bit\).)41 b(They)30 b(don't)h(consume)e(heap)h(allo)s -(cation.)75 1568 y Fo(\017)60 b Fp(Single)40 b(\015oats,)i(t)m(yp)s(e)e -Fn(cl_FF)p Fp(.)66 b(They)39 b(ha)m(v)m(e)h(1)g(sign)g(bit,)h(8)f(exp)s +(cation.)75 1568 y Fq(\017)60 b Fr(Single)40 b(\015oats,)i(t)m(yp)s(e)e +Fp(cl_FF)p Fr(.)66 b(They)39 b(ha)m(v)m(e)h(1)g(sign)g(bit,)h(8)f(exp)s (onen)m(t)g(bits)f(\(including)g(the)h(exp)s(onen)m(t's)180 1692 y(sign\),)j(and)c(24)h(man)m(tissa)g(bits)g(\(including)f(the)h (\\hidden")f(bit\).)69 b(In)39 b(CLN,)h(they)g(are)g(represen)m(ted)g (as)180 1817 y(IEEE)g(single-precision)h(\015oating)g(p)s(oin)m(t)g(n)m (um)m(b)s(ers.)68 b(This)39 b(corresp)s(onds)g(closely)j(to)f(the)f -(C/C)p Fn(++)g Fp(t)m(yp)s(e)180 1941 y(`)p Fn(float)p -Fp('.)75 2176 y Fo(\017)60 b Fp(Double)34 b(\015oats,)i(t)m(yp)s(e)e -Fn(cl_DF)p Fp(.)50 b(They)34 b(ha)m(v)m(e)h(1)f(sign)g(bit,)h(11)g(exp) +(C/C)p Fp(++)g Fr(t)m(yp)s(e)180 1941 y(`)p Fp(float)p +Fr('.)75 2176 y Fq(\017)60 b Fr(Double)34 b(\015oats,)i(t)m(yp)s(e)e +Fp(cl_DF)p Fr(.)50 b(They)34 b(ha)m(v)m(e)h(1)f(sign)g(bit,)h(11)g(exp) s(onen)m(t)f(bits)g(\(including)g(the)g(exp)s(onen)m(t's)180 2300 y(sign\),)43 b(and)c(53)h(man)m(tissa)g(bits)g(\(including)f(the)h (\\hidden")f(bit\).)69 b(In)39 b(CLN,)h(they)g(are)g(represen)m(ted)g (as)180 2425 y(IEEE)d(double-precision)g(\015oating)h(p)s(oin)m(t)f(n)m (um)m(b)s(ers.)59 b(This)36 b(corresp)s(onds)g(closely)j(to)f(the)f -(C/C)p Fn(++)g Fp(t)m(yp)s(e)180 2549 y(`)p Fn(double)p -Fp('.)75 2784 y Fo(\017)60 b Fp(Long)23 b(\015oats,)i(t)m(yp)s(e)e -Fn(cl_LF)p Fp(.)37 b(They)22 b(ha)m(v)m(e)i(1)f(sign)g(bit,)i(32)e(exp) +(C/C)p Fp(++)g Fr(t)m(yp)s(e)180 2549 y(`)p Fp(double)p +Fr('.)75 2784 y Fq(\017)60 b Fr(Long)23 b(\015oats,)i(t)m(yp)s(e)e +Fp(cl_LF)p Fr(.)37 b(They)22 b(ha)m(v)m(e)i(1)f(sign)g(bit,)i(32)e(exp) s(onen)m(t)g(bits)g(\(including)f(the)h(exp)s(onen)m(t's)g(sign\),)180 2908 y(and)k(n)h(man)m(tissa)g(bits)g(\(including)g(the)g(\\hidden")g -(bit\),)h(where)e(n)h Fn(>)p Fp(=)f(64.)41 b(The)28 b(precision)g(of)g +(bit\),)h(where)e(n)h Fp(>)p Fr(=)f(64.)41 b(The)28 b(precision)g(of)g (a)h(long)f(\015oat)180 3033 y(is)i(unlimited,)g(but)f(once)i(created,) h(a)f(long)g(\015oat)g(has)f(a)h(\014xed)f(precision.)40 b(\(No)32 b(\\lazy)g(recomputation".\))0 3501 y(Of)27 @@ -1832,440 +2106,440 @@ h(limited)f(for)g(y)m(our)g(application,)i(c)m(ho)s(ose)f(another)0 (forget)h(ab)s(out)f(the)g(di\013erences)g(b)s(et)m(w)m(een)g(the)g (four)g(\015oating-p)s(oin)m(t)h(t)m(yp)s(es)f(and)0 4717 y(just)i(declare)i(all)g(y)m(our)e(\015oating-p)s(oin)m(t)i(v)-5 -b(ariables)37 b(as)f(b)s(eing)f(of)h(t)m(yp)s(e)g Fn(cl_F)p -Fp(.)56 b(This)35 b(has)h(the)g(adv)-5 b(an)m(tage)37 +b(ariables)37 b(as)f(b)s(eing)f(of)h(t)m(yp)s(e)g Fp(cl_F)p +Fr(.)56 b(This)35 b(has)h(the)g(adv)-5 b(an)m(tage)37 b(that)0 4842 y(when)27 b(y)m(ou)h(c)m(hange)h(the)f(precision)f(of)h -(some)f(computation)h(\(sa)m(y)-8 b(,)30 b(from)c Fn(cl_DF)h -Fp(to)h Fn(cl_LF)p Fp(\),)f(y)m(ou)i(don't)e(ha)m(v)m(e)i(to)0 +(some)f(computation)h(\(sa)m(y)-8 b(,)30 b(from)c Fp(cl_DF)h +Fr(to)h Fp(cl_LF)p Fr(\),)f(y)m(ou)i(don't)e(ha)m(v)m(e)i(to)0 4966 y(c)m(hange)h(the)g(co)s(de,)g(only)f(the)h(precision)f(of)g(the)h (initial)g(v)-5 b(alues.)41 b(Also,)30 b(man)m(y)f(transcenden)m(tal)h (functions)f(ha)m(v)m(e)0 5091 y(b)s(een)f(declared)i(as)f(returning)g -(a)g Fn(cl_F)f Fp(when)g(the)i(argumen)m(t)e(is)i(a)f -Fn(cl_F)p Fp(,)g(but)f(suc)m(h)h(declarations)i(are)e(missing)0 -5215 y(for)g(the)g(t)m(yp)s(es)g Fn(cl_SF)p Fp(,)f Fn(cl_FF)p -Fp(,)f Fn(cl_DF)p Fp(,)h Fn(cl_LF)p Fp(.)39 b(\(Suc)m(h)29 +(a)g Fp(cl_F)f Fr(when)g(the)i(argumen)m(t)e(is)i(a)f +Fp(cl_F)p Fr(,)g(but)f(suc)m(h)h(declarations)i(are)e(missing)0 +5215 y(for)g(the)g(t)m(yp)s(es)g Fp(cl_SF)p Fr(,)f Fp(cl_FF)p +Fr(,)f Fp(cl_DF)p Fr(,)h Fp(cl_LF)p Fr(.)39 b(\(Suc)m(h)29 b(declarations)h(w)m(ould)f(b)s(e)f(wrong)g(if)h(the)g(\015oating)h(p)s (oin)m(t)0 5340 y(con)m(tagion)j(rule)d(happ)s(ened)e(to)j(c)m(hange)h (in)e(the)h(future.\))p eop %%Page: 10 12 -10 11 bop 0 -116 a Fp(Chapter)30 b(3:)41 b(Ordinary)29 -b(n)m(um)m(b)s(er)f(t)m(yp)s(es)2411 b(10)0 366 y Fq(3.3)68 -b(Complex)31 b(n)l(um)l(b)t(ers)0 654 y Fp(Complex)25 +10 11 bop 0 -116 a Fr(Chapter)30 b(3:)41 b(Ordinary)29 +b(n)m(um)m(b)s(er)f(t)m(yp)s(es)2411 b(10)0 366 y Fs(3.3)68 +b(Complex)31 b(n)l(um)l(b)t(ers)0 654 y Fr(Complex)25 b(n)m(um)m(b)s(ers,)g(as)i(implemen)m(ted)e(b)m(y)h(the)h(class)g -Fn(cl_N)p Fp(,)f(ha)m(v)m(e)h(a)g(real)g(part)f(and)g(an)g(imaginary)g +Fp(cl_N)p Fr(,)f(ha)m(v)m(e)h(a)g(real)g(part)f(and)g(an)g(imaginary)g (part,)i(b)s(oth)0 778 y(real)38 b(n)m(um)m(b)s(ers.)59 b(A)38 b(complex)f(n)m(um)m(b)s(er)e(whose)i(imaginary)g(part)g(is)g -(the)h(exact)h(n)m(um)m(b)s(er)c Fn(0)i Fp(is)g(automatically)0 +(the)h(exact)h(n)m(um)m(b)s(er)c Fp(0)i Fr(is)g(automatically)0 903 y(con)m(v)m(erted)32 b(to)f(a)g(real)g(n)m(um)m(b)s(er.)0 1190 y(Complex)h(n)m(um)m(b)s(ers)e(can)k(arise)f(from)e(real)j(n)m(um) m(b)s(ers)c(alone,)35 b(for)e(example)g(through)f(application)i(of)f -Fn(sqrt)f Fp(or)0 1315 y(transcenden)m(tal)f(functions.)0 -1883 y Fq(3.4)68 b(Con)l(v)l(ersions)0 2170 y Fp(Con)m(v)m(ersions)42 +Fp(sqrt)f Fr(or)0 1315 y(transcenden)m(tal)f(functions.)0 +1883 y Fs(3.4)68 b(Con)l(v)l(ersions)0 2170 y Fr(Con)m(v)m(ersions)42 b(from)d(an)m(y)j(class)f(to)h(an)m(y)g(its)f(sup)s(erclasses)g -(\(\\base)h(classes")g(in)f(C)p Fn(++)f Fp(terminology\))i(is)f(done)0 +(\(\\base)h(classes")g(in)f(C)p Fp(++)f Fr(terminology\))i(is)f(done)0 2295 y(automatically)-8 b(.)0 2582 y(Con)m(v)m(ersions)24 -b(from)e(the)i(C)f(built-in)h(t)m(yp)s(es)f(`)p Fn(long)p -Fp(')g(and)h(`)p Fn(unsigned)k(long)p Fp(')23 b(are)h(pro)m(vided)f -(for)g(the)h(classes)h Fn(cl_I)p Fp(,)0 2706 y Fn(cl_RA)p -Fp(,)k Fn(cl_R)p Fp(,)h Fn(cl_N)f Fp(and)h Fn(cl_number)p -Fp(.)0 2994 y(Con)m(v)m(ersions)h(from)e(the)i(C)f(built-in)g(t)m(yp)s -(es)g(`)p Fn(int)p Fp(')g(and)g(`)p Fn(unsigned)f(int)p -Fp(')h(are)g(pro)m(vided)g(for)h(the)f(classes)i Fn(cl_I)p -Fp(,)0 3118 y Fn(cl_RA)p Fp(,)h Fn(cl_R)p Fp(,)g Fn(cl_N)f -Fp(and)g Fn(cl_number)p Fp(.)47 b(Ho)m(w)m(ev)m(er,)36 +b(from)e(the)i(C)f(built-in)h(t)m(yp)s(es)f(`)p Fp(long)p +Fr(')g(and)h(`)p Fp(unsigned)k(long)p Fr(')23 b(are)h(pro)m(vided)f +(for)g(the)h(classes)h Fp(cl_I)p Fr(,)0 2706 y Fp(cl_RA)p +Fr(,)k Fp(cl_R)p Fr(,)h Fp(cl_N)f Fr(and)h Fp(cl_number)p +Fr(.)0 2994 y(Con)m(v)m(ersions)h(from)e(the)i(C)f(built-in)g(t)m(yp)s +(es)g(`)p Fp(int)p Fr(')g(and)g(`)p Fp(unsigned)f(int)p +Fr(')h(are)g(pro)m(vided)g(for)h(the)f(classes)i Fp(cl_I)p +Fr(,)0 3118 y Fp(cl_RA)p Fr(,)h Fp(cl_R)p Fr(,)g Fp(cl_N)f +Fr(and)g Fp(cl_number)p Fr(.)47 b(Ho)m(w)m(ev)m(er,)36 b(these)e(con)m(v)m(ersions)g(emphasize)e(e\016ciency)-8 b(.)51 b(Their)33 b(range)0 3243 y(is)d(therefore)h(limited:)49 -3530 y Fo(\000)60 b Fp(The)30 b(con)m(v)m(ersion)i(from)c(`)p -Fn(int)p Fp(')i(w)m(orks)h(only)f(if)h(the)f(argumen)m(t)g(is)g -Fn(<)g Fp(2)p Fn(^)p Fp(29)i(and)e Fn(>)g Fp(-2)p Fn(^)p -Fp(29.)49 3693 y Fo(\000)60 b Fp(The)30 b(con)m(v)m(ersion)i(from)c(`)p -Fn(unsigned)h(int)p Fp(')h(w)m(orks)g(only)g(if)h(the)f(argumen)m(t)g -(is)h Fn(<)f Fp(2)p Fn(^)p Fp(29.)0 4018 y(In)g(a)g(declaration)i(lik)m -(e)g(`)p Fn(cl_I)d(x)h(=)g(10;)p Fp(')g(the)g(C)p Fn(++)f -Fp(compiler)h(is)h(able)f(to)h(do)f(the)h(con)m(v)m(ersion)g(of)g -Fn(10)f Fp(from)e(`)p Fn(int)p Fp(')0 4143 y(to)43 b(`)p -Fn(cl_I)p Fp(')e(at)i(compile)g(time)e(already)-8 b(.)78 +3530 y Fq(\000)60 b Fr(The)30 b(con)m(v)m(ersion)i(from)c(`)p +Fp(int)p Fr(')i(w)m(orks)h(only)f(if)h(the)f(argumen)m(t)g(is)g +Fp(<)g Fr(2)p Fp(^)p Fr(29)i(and)e Fp(>)g Fr(-2)p Fp(^)p +Fr(29.)49 3693 y Fq(\000)60 b Fr(The)30 b(con)m(v)m(ersion)i(from)c(`)p +Fp(unsigned)h(int)p Fr(')h(w)m(orks)g(only)g(if)h(the)f(argumen)m(t)g +(is)h Fp(<)f Fr(2)p Fp(^)p Fr(29.)0 4018 y(In)g(a)g(declaration)i(lik)m +(e)g(`)p Fp(cl_I)d(x)h(=)g(10;)p Fr(')g(the)g(C)p Fp(++)f +Fr(compiler)h(is)h(able)f(to)h(do)f(the)h(con)m(v)m(ersion)g(of)g +Fp(10)f Fr(from)e(`)p Fp(int)p Fr(')0 4143 y(to)43 b(`)p +Fp(cl_I)p Fr(')e(at)i(compile)g(time)e(already)-8 b(.)78 b(On)41 b(the)h(other)h(hand,)h(co)s(de)f(lik)m(e)g(`)p -Fn(cl_I)30 b(x)g(=)g(1000000000;)p Fp(')39 b(is)j(in)0 +Fp(cl_I)30 b(x)g(=)g(1000000000;)p Fr(')39 b(is)j(in)0 4267 y(error.)g(So,)31 b(if)g(y)m(ou)g(w)m(an)m(t)h(to)g(b)s(e)e(sure)g -(that)h(an)g(`)p Fn(int)p Fp(')g(whose)f(magnitude)h(is)f(not)i(guaran) -m(teed)g(to)f(b)s(e)f Fn(<)h Fp(2)p Fn(^)p Fp(29)h(is)0 -4392 y(correctly)j(con)m(v)m(erted)f(to)g(a)g(`)p Fn(cl_I)p -Fp(',)f(\014rst)f(con)m(v)m(ert)j(it)f(to)g(a)f(`)p Fn(long)p -Fp('.)48 b(Similarly)-8 b(,)34 b(if)f(a)h(large)g(`)p -Fn(unsigned)28 b(int)p Fp(')33 b(is)0 4516 y(to)e(b)s(e)f(con)m(v)m -(erted)i(to)f(a)g(`)p Fn(cl_I)p Fp(',)f(\014rst)f(con)m(v)m(ert)j(it)f -(to)g(an)f(`)p Fn(unsigned)f(long)p Fp('.)0 4804 y(Con)m(v)m(ersions)h -(from)f(the)h(C)f(built-in)h(t)m(yp)s(e)g(`)p Fn(float)p -Fp(')f(are)h(pro)m(vided)g(for)f(the)h(classes)h Fn(cl_FF)p -Fp(,)e Fn(cl_F)p Fp(,)g Fn(cl_R)p Fp(,)g Fn(cl_N)0 4928 -y Fp(and)h Fn(cl_number)p Fp(.)0 5215 y(Con)m(v)m(ersions)d(from)e(the) -i(C)f(built-in)g(t)m(yp)s(e)h(`)p Fn(double)p Fp(')e(are)i(pro)m(vided) -g(for)f(the)h(classes)g Fn(cl_DF)p Fp(,)f Fn(cl_F)p Fp(,)h -Fn(cl_R)p Fp(,)f Fn(cl_N)0 5340 y Fp(and)k Fn(cl_number)p -Fp(.)p eop +(that)h(an)g(`)p Fp(int)p Fr(')g(whose)f(magnitude)h(is)f(not)i(guaran) +m(teed)g(to)f(b)s(e)f Fp(<)h Fr(2)p Fp(^)p Fr(29)h(is)0 +4392 y(correctly)j(con)m(v)m(erted)f(to)g(a)g(`)p Fp(cl_I)p +Fr(',)f(\014rst)f(con)m(v)m(ert)j(it)f(to)g(a)f(`)p Fp(long)p +Fr('.)48 b(Similarly)-8 b(,)34 b(if)f(a)h(large)g(`)p +Fp(unsigned)28 b(int)p Fr(')33 b(is)0 4516 y(to)e(b)s(e)f(con)m(v)m +(erted)i(to)f(a)g(`)p Fp(cl_I)p Fr(',)f(\014rst)f(con)m(v)m(ert)j(it)f +(to)g(an)f(`)p Fp(unsigned)f(long)p Fr('.)0 4804 y(Con)m(v)m(ersions)h +(from)f(the)h(C)f(built-in)h(t)m(yp)s(e)g(`)p Fp(float)p +Fr(')f(are)h(pro)m(vided)g(for)f(the)h(classes)h Fp(cl_FF)p +Fr(,)e Fp(cl_F)p Fr(,)g Fp(cl_R)p Fr(,)g Fp(cl_N)0 4928 +y Fr(and)h Fp(cl_number)p Fr(.)0 5215 y(Con)m(v)m(ersions)d(from)e(the) +i(C)f(built-in)g(t)m(yp)s(e)h(`)p Fp(double)p Fr(')e(are)i(pro)m(vided) +g(for)f(the)h(classes)g Fp(cl_DF)p Fr(,)f Fp(cl_F)p Fr(,)h +Fp(cl_R)p Fr(,)f Fp(cl_N)0 5340 y Fr(and)k Fp(cl_number)p +Fr(.)p eop %%Page: 11 13 -11 12 bop 0 -116 a Fp(Chapter)30 b(3:)41 b(Ordinary)29 +11 12 bop 0 -116 a Fr(Chapter)30 b(3:)41 b(Ordinary)29 b(n)m(um)m(b)s(er)f(t)m(yp)s(es)2411 b(11)0 366 y(Con)m(v)m(ersions)35 -b(from)f(`)p Fn(const)29 b(char)g(*)p Fp(')35 b(are)g(pro)m(vided)g -(for)f(the)i(classes)f Fn(cl_I)p Fp(,)h Fn(cl_RA)p Fp(,)e -Fn(cl_SF)p Fp(,)h Fn(cl_FF)p Fp(,)g Fn(cl_DF)p Fp(,)0 -491 y Fn(cl_LF)p Fp(,)e Fn(cl_F)p Fp(,)h Fn(cl_R)p Fp(,)g -Fn(cl_N)p Fp(.)50 b(The)33 b(easiest)i(w)m(a)m(y)g(to)g(sp)s(ecify)e(a) +b(from)f(`)p Fp(const)29 b(char)g(*)p Fr(')35 b(are)g(pro)m(vided)g +(for)f(the)i(classes)f Fp(cl_I)p Fr(,)h Fp(cl_RA)p Fr(,)e +Fp(cl_SF)p Fr(,)h Fp(cl_FF)p Fr(,)g Fp(cl_DF)p Fr(,)0 +491 y Fp(cl_LF)p Fr(,)e Fp(cl_F)p Fr(,)h Fp(cl_R)p Fr(,)g +Fp(cl_N)p Fr(.)50 b(The)33 b(easiest)i(w)m(a)m(y)g(to)g(sp)s(ecify)e(a) h(v)-5 b(alue)34 b(whic)m(h)g(is)g(outside)g(of)g(the)g(range)g(of)g -(the)0 616 y(C)p Fn(++)29 b Fp(built-in)i(t)m(yp)s(es)f(is)g(therefore) +(the)0 616 y(C)p Fp(++)29 b Fr(built-in)i(t)m(yp)s(es)f(is)g(therefore) h(to)g(sp)s(ecify)f(it)h(as)g(a)g(string,)f(lik)m(e)i(this:)383 -869 y Fn(cl_I)47 b(order_of_rubiks_cube_gro)o(up)41 b(=)48 -b("43252003274489856000";)0 1143 y Fp(Note)32 b(that)f(this)f(con)m(v)m +869 y Fp(cl_I)47 b(order_of_rubiks_cube_gro)o(up)41 b(=)48 +b("43252003274489856000";)0 1143 y Fr(Note)32 b(that)f(this)f(con)m(v)m (ersion)i(is)e(done)g(at)h(run)m(time,)f(not)g(at)h(compile-time.)0 -1417 y(Con)m(v)m(ersions)h(from)f Fn(cl_I)g Fp(to)h(the)g(C)g(built-in) -g(t)m(yp)s(es)g(`)p Fn(int)p Fp(',)g(`)p Fn(unsigned)c(int)p -Fp(',)k(`)p Fn(long)p Fp(',)g(`)p Fn(unsigned)d(long)p -Fp(')i(are)0 1541 y(pro)m(vided)f(through)g(the)g(functions)0 -1840 y Fn(int)f(cl_I_to_int)f(\(const)g(cl_I&)h(x\))0 +1417 y(Con)m(v)m(ersions)h(from)f Fp(cl_I)g Fr(to)h(the)g(C)g(built-in) +g(t)m(yp)s(es)g(`)p Fp(int)p Fr(',)g(`)p Fp(unsigned)c(int)p +Fr(',)k(`)p Fp(long)p Fr(',)g(`)p Fp(unsigned)d(long)p +Fr(')i(are)0 1541 y(pro)m(vided)f(through)g(the)g(functions)0 +1840 y Fp(int)f(cl_I_to_int)f(\(const)g(cl_I&)h(x\))0 1965 y(unsigned)f(int)i(cl_I_to_uint)d(\(const)h(cl_I&)h(x\))0 2089 y(long)g(cl_I_to_long)e(\(const)i(cl_I&)g(x\))0 2214 y(unsigned)f(long)h(cl_I_to_ulong)e(\(const)i(cl_I&)g(x\))480 -2338 y Fp(Returns)37 b Fn(x)h Fp(as)h(elemen)m(t)f(of)h(the)f(C)g(t)m -(yp)s(e)g Fi(ct)m(yp)s(e)p Fp(.)65 b(If)38 b Fn(x)f Fp(is)i(not)f +2338 y Fr(Returns)37 b Fp(x)h Fr(as)h(elemen)m(t)f(of)h(the)f(C)g(t)m +(yp)s(e)g Fk(ct)m(yp)s(e)p Fr(.)65 b(If)38 b Fp(x)f Fr(is)i(not)f (represen)m(table)h(in)f(the)g(range)h(of)480 2463 y -Fi(ct)m(yp)s(e)p Fp(,)31 b(a)g(run)m(time)e(error)h(o)s(ccurs.)0 +Fk(ct)m(yp)s(e)p Fr(,)31 b(a)g(run)m(time)e(error)h(o)s(ccurs.)0 2762 y(Con)m(v)m(ersions)35 b(from)e(the)h(classes)i -Fn(cl_I)p Fp(,)e Fn(cl_RA)p Fp(,)g Fn(cl_SF)p Fp(,)g -Fn(cl_FF)p Fp(,)g Fn(cl_DF)p Fp(,)h Fn(cl_LF)p Fp(,)f -Fn(cl_F)f Fp(and)h Fn(cl_R)f Fp(to)i(the)f(C)0 2886 y(built-in)c(t)m -(yp)s(es)h(`)p Fn(float)p Fp(')e(and)h(`)p Fn(double)p -Fp(')f(are)i(pro)m(vided)f(through)f(the)i(functions)0 -3185 y Fn(float)e(cl_float_approx)d(\(const)j Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x\))0 3310 y(double)f(cl_double_approx)d(\(const)i -Fi(t)m(yp)s(e)5 b Fn(&)31 b(x\))480 3434 y Fp(Returns)25 -b(an)h(appro)m(ximation)g(of)g Fn(x)f Fp(of)h(C)g(t)m(yp)s(e)g -Fi(ct)m(yp)s(e)p Fp(.)39 b(If)26 b Fn(abs\(x\))e Fp(is)i(to)s(o)g +Fp(cl_I)p Fr(,)e Fp(cl_RA)p Fr(,)g Fp(cl_SF)p Fr(,)g +Fp(cl_FF)p Fr(,)g Fp(cl_DF)p Fr(,)h Fp(cl_LF)p Fr(,)f +Fp(cl_F)f Fr(and)h Fp(cl_R)f Fr(to)i(the)f(C)0 2886 y(built-in)c(t)m +(yp)s(es)h(`)p Fp(float)p Fr(')e(and)h(`)p Fp(double)p +Fr(')f(are)i(pro)m(vided)f(through)f(the)i(functions)0 +3185 y Fp(float)e(cl_float_approx)d(\(const)j Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x\))0 3310 y(double)f(cl_double_approx)d(\(const)i +Fk(t)m(yp)s(e)5 b Fp(&)31 b(x\))480 3434 y Fr(Returns)25 +b(an)h(appro)m(ximation)g(of)g Fp(x)f Fr(of)h(C)g(t)m(yp)s(e)g +Fk(ct)m(yp)s(e)p Fr(.)39 b(If)26 b Fp(abs\(x\))e Fr(is)i(to)s(o)g (close)i(to)e(0)g(\(under\015o)m(w\),)480 3559 y(0)31 -b(is)f(returned.)40 b(If)30 b Fn(abs\(x\))e Fp(is)j(to)s(o)g(large)g +b(is)f(returned.)40 b(If)30 b Fp(abs\(x\))e Fr(is)j(to)s(o)g(large)g (\(o)m(v)m(er\015o)m(w\),)i(an)d(IEEE)g(in\014nit)m(y)g(is)h(returned.) 0 3858 y(Con)m(v)m(ersions)g(from)e(an)m(y)i(class)g(to)g(an)m(y)g(of)g (its)g(sub)s(classes)f(\(\\deriv)m(ed)h(classes")h(in)e(C)p -Fn(++)g Fp(terminology\))h(are)g(not)0 3982 y(pro)m(vided.)40 +Fp(++)g Fr(terminology\))h(are)g(not)0 3982 y(pro)m(vided.)40 b(Instead,)31 b(y)m(ou)f(can)h(assert)g(and)e(c)m(hec)m(k)j(that)f(a)g (v)-5 b(alue)31 b(b)s(elongs)f(to)h(a)f(certain)i(sub)s(class,)d(and)h (return)0 4107 y(it)38 b(as)f(elemen)m(t)h(of)g(that)f(class,)j(using)d -(the)h(`)p Fn(As)p Fp(')f(and)g(`)p Fn(The)p Fp(')f(macros.)61 -b Fn(As\()p Fi(t)m(yp)s(e)5 b Fn(\)\()p Fi(v)-5 b(alue)5 -b Fn(\))37 b Fp(c)m(hec)m(ks)i(that)e Fi(v)-5 b(alue)0 -4231 y Fp(b)s(elongs)29 b(to)h Fi(t)m(yp)s(e)35 b Fp(and)29 -b(returns)f(it)i(as)f(suc)m(h.)40 b Fn(The\()p Fi(t)m(yp)s(e)5 -b Fn(\)\()p Fi(v)-5 b(alue)5 b Fn(\))29 b Fp(assumes)f(that)i -Fi(v)-5 b(alue)35 b Fp(b)s(elongs)29 b(to)h Fi(t)m(yp)s(e)35 -b Fp(and)0 4356 y(returns)29 b(it)i(as)g(suc)m(h.)40 +(the)h(`)p Fp(As)p Fr(')f(and)g(`)p Fp(The)p Fr(')f(macros.)61 +b Fp(As\()p Fk(t)m(yp)s(e)5 b Fp(\)\()p Fk(v)-5 b(alue)5 +b Fp(\))37 b Fr(c)m(hec)m(ks)i(that)e Fk(v)-5 b(alue)0 +4231 y Fr(b)s(elongs)29 b(to)h Fk(t)m(yp)s(e)35 b Fr(and)29 +b(returns)f(it)i(as)f(suc)m(h.)40 b Fp(The\()p Fk(t)m(yp)s(e)5 +b Fp(\)\()p Fk(v)-5 b(alue)5 b Fp(\))29 b Fr(assumes)f(that)i +Fk(v)-5 b(alue)35 b Fr(b)s(elongs)29 b(to)h Fk(t)m(yp)s(e)35 +b Fr(and)0 4356 y(returns)29 b(it)i(as)g(suc)m(h.)40 b(It)31 b(is)f(y)m(our)g(resp)s(onsibilit)m(y)h(to)g(ensure)e(that)i (this)g(assumption)d(is)j(v)-5 b(alid.)41 b(Example:)383 -4609 y Fn(cl_I)47 b(x)g(=)h Fl(:)15 b(:)g(:)q Fn(;)383 +4609 y Fp(cl_I)47 b(x)g(=)h Fn(:)15 b(:)g(:)q Fp(;)383 4713 y(if)47 b(\(!\(x)g(>=)g(0\)\))g(abort\(\);)383 4816 y(cl_I)g(ten_x)f(=)i(The\(cl_I\)\(expt\(10,x\)\);)41 b(//)48 b(If)f(x)g(>=)g(0,)h(10^x)e(is)h(an)h(integer.)1004 4920 y(//)f(In)g(general,)f(it)h(would)f(be)h(a)h(rational)d(number.)p eop %%Page: 12 14 -12 13 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 -b(on)f(n)m(um)m(b)s(ers)2463 b(12)0 366 y Fm(4)80 b(F)-13 -b(unctions)29 b(on)h(n)l(um)l(b)t(ers)0 754 y Fp(Eac)m(h)i(of)f(the)g +12 13 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +b(on)f(n)m(um)m(b)s(ers)2463 b(12)0 366 y Fo(4)80 b(F)-13 +b(unctions)29 b(on)h(n)l(um)l(b)t(ers)0 754 y Fr(Eac)m(h)i(of)f(the)g (n)m(um)m(b)s(er)e(classes)i(declares)h(its)g(mathematical)f(op)s (erations)g(in)g(the)g(corresp)s(onding)f(include)h(\014le.)0 879 y(F)-8 b(or)26 b(example,)g(if)g(y)m(our)f(co)s(de)g(op)s(erates)h -(with)f(ob)5 b(jects)26 b(of)f(t)m(yp)s(e)h Fn(cl_I)p -Fp(,)f(it)h(should)e Fn(#include)29 b()p -Fp(.)0 1353 y Fq(4.1)68 b(Constructing)31 b(n)l(um)l(b)t(ers)0 -1630 y Fp(Here)g(is)f(ho)m(w)h(to)g(create)h(n)m(um)m(b)s(er)c(ob)5 -b(jects)31 b(\\from)e(nothing".)0 2071 y Fk(4.1.1)63 -b(Constructing)30 b(in)m(tegers)0 2348 y Fn(cl_I)i Fp(ob)5 +(with)f(ob)5 b(jects)26 b(of)f(t)m(yp)s(e)h Fp(cl_I)p +Fr(,)f(it)h(should)e Fp(#include)29 b()p +Fr(.)0 1353 y Fs(4.1)68 b(Constructing)31 b(n)l(um)l(b)t(ers)0 +1630 y Fr(Here)g(is)f(ho)m(w)h(to)g(create)h(n)m(um)m(b)s(er)c(ob)5 +b(jects)31 b(\\from)e(nothing".)0 2071 y Fm(4.1.1)63 +b(Constructing)30 b(in)m(tegers)0 2348 y Fp(cl_I)i Fr(ob)5 b(jects)33 b(are)g(most)f(easily)i(constructed)f(from)e(C)i(in)m (tegers)h(and)e(from)f(strings.)48 b(See)32 b(Section)i(3.4)g([Con-)0 -2472 y(v)m(ersions],)d(page)g(10.)0 2913 y Fk(4.1.2)63 +2472 y(v)m(ersions],)d(page)g(10.)0 2913 y Fm(4.1.2)63 b(Constructing)30 b(rational)h(n)m(um)m(b)s(ers)0 3190 -y Fn(cl_RA)k Fp(ob)5 b(jects)38 b(can)f(b)s(e)f(constructed)h(from)e +y Fp(cl_RA)k Fr(ob)5 b(jects)38 b(can)f(b)s(e)f(constructed)h(from)e (strings.)60 b(The)37 b(syn)m(tax)g(for)f(rational)i(n)m(um)m(b)s(ers)d (is)i(describ)s(ed)e(in)0 3314 y(Section)40 b(5.1)h([In)m(ternal)f(and) e(prin)m(ted)h(represen)m(tation],)k(page)e(37.)68 b(Another)39 b(standard)g(w)m(a)m(y)h(to)g(pro)s(duce)f(a)0 3439 y(rational)32 b(n)m(um)m(b)s(er)c(is)i(through)g(application)h(of)g(`)p -Fn(operator)d(/)p Fp(')j(or)f(`)p Fn(recip)p Fp(')f(on)i(in)m(tegers.)0 -3880 y Fk(4.1.3)63 b(Constructing)30 b(\015oating-p)s(oin)m(t)i(n)m(um) -m(b)s(ers)0 4157 y Fn(cl_F)39 b Fp(ob)5 b(jects)41 b(with)f(lo)m(w)i +Fp(operator)d(/)p Fr(')j(or)f(`)p Fp(recip)p Fr(')f(on)i(in)m(tegers.)0 +3880 y Fm(4.1.3)63 b(Constructing)30 b(\015oating-p)s(oin)m(t)i(n)m(um) +m(b)s(ers)0 4157 y Fp(cl_F)39 b Fr(ob)5 b(jects)41 b(with)f(lo)m(w)i (precision)e(are)h(most)f(easily)h(constructed)g(from)e(C)h(`)p -Fn(float)p Fp(')f(and)h(`)p Fn(double)p Fp('.)70 b(See)0 +Fp(float)p Fr(')f(and)h(`)p Fp(double)p Fr('.)70 b(See)0 4281 y(Section)31 b(3.4)h([Con)m(v)m(ersions],)f(page)g(10.)0 -4558 y(T)-8 b(o)42 b(construct)g(a)h Fn(cl_F)d Fp(with)i(high)f +4558 y(T)-8 b(o)42 b(construct)g(a)h Fp(cl_F)d Fr(with)i(high)f (precision,)k(y)m(ou)d(can)h(use)e(the)h(con)m(v)m(ersion)h(from)d(`)p -Fn(const)30 b(char)f(*)p Fp(',)45 b(but)0 4683 y(y)m(ou)33 +Fp(const)30 b(char)f(*)p Fr(',)45 b(but)0 4683 y(y)m(ou)33 b(ha)m(v)m(e)h(to)f(sp)s(ecify)f(the)g(desired)g(precision)h(within)f (the)h(string.)47 b(\(See)33 b(Section)g(5.1)g([In)m(ternal)h(and)d (prin)m(ted)0 4807 y(represen)m(tation],)h(page)f(37.\))42 -b(Example:)383 5063 y Fn(cl_F)47 b(e)g(=)h("0.27182818284590452353)o +b(Example:)383 5063 y Fp(cl_F)47 b(e)g(=)h("0.27182818284590452353)o (6028)o(7471)o(352)o(6624)o(9775)o(724)o(7093)o(6999)o(6e+)o(1_40)o(";) -0 5340 y Fp(will)31 b(set)g(`)p Fn(e)p Fp(')f(to)h(the)g(giv)m(en)g(v) +0 5340 y Fr(will)31 b(set)g(`)p Fp(e)p Fr(')f(to)h(the)g(giv)m(en)g(v) -5 b(alue,)31 b(with)f(a)h(precision)g(of)f(40)h(decimal)g(digits.)p eop %%Page: 13 15 -13 14 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +13 14 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 b(on)f(n)m(um)m(b)s(ers)2463 b(13)0 366 y(The)25 b(programmatic)f(w)m -(a)m(y)j(to)f(construct)f(a)h Fn(cl_F)e Fp(with)h(high)g(precision)h -(is)f(through)g(the)h Fn(cl_float)d Fp(con)m(v)m(ersion)0 +(a)m(y)j(to)f(construct)f(a)h Fp(cl_F)e Fr(with)h(high)g(precision)h +(is)f(through)g(the)h Fp(cl_float)d Fr(con)m(v)m(ersion)0 491 y(function,)29 b(see)h(Section)g(4.11.1)i([Con)m(v)m(ersion)e(to)g (\015oating-p)s(oin)m(t)h(n)m(um)m(b)s(ers],)c(page)j(32.)42 b(F)-8 b(or)30 b(example,)f(to)h(com-)0 616 y(pute)d -Fn(e)f Fp(to)i(40)f(decimal)g(places,)i(\014rst)d(construct)h(1.0)h(to) +Fp(e)f Fr(to)i(40)f(decimal)g(places,)i(\014rst)d(construct)h(1.0)h(to) g(40)f(decimal)g(places)h(and)e(then)g(apply)h(the)g(exp)s(onen)m(tial) -0 740 y(function:)383 993 y Fn(cl_float_format_t)43 b(precision)j(=)h +0 740 y(function:)383 993 y Fp(cl_float_format_t)43 b(precision)j(=)h (cl_float_format\(40\);)383 1097 y(cl_F)g(e)g(=)h -(exp\(cl_float\(1,precisio)o(n\)\);)0 1505 y Fk(4.1.4)63 +(exp\(cl_float\(1,precisio)o(n\)\);)0 1505 y Fm(4.1.4)63 b(Constructing)30 b(complex)g(n)m(um)m(b)s(ers)0 1779 -y Fp(Non-real)h Fn(cl_N)f Fp(ob)5 b(jects)31 b(are)g(normally)e -(constructed)i(through)e(the)i(function)383 2032 y Fn(cl_N)47 +y Fr(Non-real)h Fp(cl_N)f Fr(ob)5 b(jects)31 b(are)g(normally)e +(constructed)i(through)e(the)i(function)383 2032 y Fp(cl_N)47 b(complex)f(\(const)g(cl_R&)g(realpart,)f(const)i(cl_R&)f(imagpart\))0 -2306 y Fp(See)31 b(Section)g(4.4)g([Elemen)m(tary)g(complex)f -(functions],)g(page)h(15.)0 2748 y Fq(4.2)68 b(Elemen)l(tary)32 -b(functions)0 3022 y Fp(Eac)m(h)22 b(of)g(the)g(classes)h -Fn(cl_N)p Fp(,)g Fn(cl_R)p Fp(,)f Fn(cl_RA)p Fp(,)g Fn(cl_I)p -Fp(,)h Fn(cl_F)p Fp(,)g Fn(cl_SF)p Fp(,)f Fn(cl_FF)p -Fp(,)g Fn(cl_DF)p Fp(,)g Fn(cl_LF)f Fp(de\014nes)g(the)g(follo)m(wing)0 -3146 y(op)s(erations:)0 3443 y Fi(t)m(yp)s(e)36 b Fn(operator)28 -b(+)i(\(const)e Fi(t)m(yp)s(e)5 b Fn(&,)31 b(const)d -Fi(t)m(yp)s(e)5 b Fn(&\))480 3568 y Fp(Addition.)0 3739 -y Fi(t)m(yp)s(e)36 b Fn(operator)28 b(-)i(\(const)e Fi(t)m(yp)s(e)5 -b Fn(&,)31 b(const)d Fi(t)m(yp)s(e)5 b Fn(&\))480 3863 -y Fp(Subtraction.)0 4034 y Fi(t)m(yp)s(e)36 b Fn(operator)28 -b(-)i(\(const)e Fi(t)m(yp)s(e)5 b Fn(&\))480 4159 y Fp(Returns)29 +2306 y Fr(See)31 b(Section)g(4.4)g([Elemen)m(tary)g(complex)f +(functions],)g(page)h(15.)0 2748 y Fs(4.2)68 b(Elemen)l(tary)32 +b(functions)0 3022 y Fr(Eac)m(h)22 b(of)g(the)g(classes)h +Fp(cl_N)p Fr(,)g Fp(cl_R)p Fr(,)f Fp(cl_RA)p Fr(,)g Fp(cl_I)p +Fr(,)h Fp(cl_F)p Fr(,)g Fp(cl_SF)p Fr(,)f Fp(cl_FF)p +Fr(,)g Fp(cl_DF)p Fr(,)g Fp(cl_LF)f Fr(de\014nes)g(the)g(follo)m(wing)0 +3146 y(op)s(erations:)0 3443 y Fk(t)m(yp)s(e)36 b Fp(operator)28 +b(+)i(\(const)e Fk(t)m(yp)s(e)5 b Fp(&,)31 b(const)d +Fk(t)m(yp)s(e)5 b Fp(&\))480 3568 y Fr(Addition.)0 3739 +y Fk(t)m(yp)s(e)36 b Fp(operator)28 b(-)i(\(const)e Fk(t)m(yp)s(e)5 +b Fp(&,)31 b(const)d Fk(t)m(yp)s(e)5 b Fp(&\))480 3863 +y Fr(Subtraction.)0 4034 y Fk(t)m(yp)s(e)36 b Fp(operator)28 +b(-)i(\(const)e Fk(t)m(yp)s(e)5 b Fp(&\))480 4159 y Fr(Returns)29 b(the)i(negativ)m(e)i(of)d(the)h(argumen)m(t.)0 4329 -y Fi(t)m(yp)s(e)36 b Fn(plus1)29 b(\(const)f Fi(t)m(yp)s(e)5 -b Fn(&)31 b(x\))480 4454 y Fp(Returns)e Fn(x)h(+)h(1)p -Fp(.)0 4625 y Fi(t)m(yp)s(e)36 b Fn(minus1)28 b(\(const)h -Fi(t)m(yp)s(e)5 b Fn(&)30 b(x\))480 4749 y Fp(Returns)f -Fn(x)h(-)h(1)p Fp(.)0 4920 y Fi(t)m(yp)s(e)36 b Fn(operator)28 -b(*)i(\(const)e Fi(t)m(yp)s(e)5 b Fn(&,)31 b(const)d -Fi(t)m(yp)s(e)5 b Fn(&\))480 5045 y Fp(Multiplication.)0 -5215 y Fi(t)m(yp)s(e)36 b Fn(square)28 b(\(const)h Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x\))480 5340 y Fp(Returns)f Fn(x)h(*)h(x)p -Fp(.)p eop +y Fk(t)m(yp)s(e)36 b Fp(plus1)29 b(\(const)f Fk(t)m(yp)s(e)5 +b Fp(&)31 b(x\))480 4454 y Fr(Returns)e Fp(x)h(+)h(1)p +Fr(.)0 4625 y Fk(t)m(yp)s(e)36 b Fp(minus1)28 b(\(const)h +Fk(t)m(yp)s(e)5 b Fp(&)30 b(x\))480 4749 y Fr(Returns)f +Fp(x)h(-)h(1)p Fr(.)0 4920 y Fk(t)m(yp)s(e)36 b Fp(operator)28 +b(*)i(\(const)e Fk(t)m(yp)s(e)5 b Fp(&,)31 b(const)d +Fk(t)m(yp)s(e)5 b Fp(&\))480 5045 y Fr(Multiplication.)0 +5215 y Fk(t)m(yp)s(e)36 b Fp(square)28 b(\(const)h Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x\))480 5340 y Fr(Returns)f Fp(x)h(*)h(x)p +Fr(.)p eop %%Page: 14 16 -14 15 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +14 15 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 b(on)f(n)m(um)m(b)s(ers)2463 b(14)0 366 y(Eac)m(h)39 -b(of)g(the)g(classes)h Fn(cl_N)p Fp(,)g Fn(cl_R)p Fp(,)f -Fn(cl_RA)p Fp(,)h Fn(cl_F)p Fp(,)g Fn(cl_SF)p Fp(,)f -Fn(cl_FF)p Fp(,)h Fn(cl_DF)p Fp(,)g Fn(cl_LF)d Fp(de\014nes)h(the)g -(follo)m(wing)0 491 y(op)s(erations:)0 796 y Fi(t)m(yp)s(e)e -Fn(operator)28 b(/)i(\(const)e Fi(t)m(yp)s(e)5 b Fn(&,)31 -b(const)d Fi(t)m(yp)s(e)5 b Fn(&\))480 921 y Fp(Division.)0 -1101 y Fi(t)m(yp)s(e)36 b Fn(recip)29 b(\(const)f Fi(t)m(yp)s(e)5 -b Fn(&\))480 1225 y Fp(Returns)29 b(the)i(recipro)s(cal)g(of)g(the)f -(argumen)m(t.)0 1530 y(The)d(class)g Fn(cl_I)f Fp(do)s(esn't)h -(de\014ne)g(a)g(`)p Fn(/)p Fp(')g(op)s(eration)h(b)s(ecause)f(in)g(the) -g(C/C)p Fn(++)f Fp(language)j(this)e(op)s(erator,)h(applied)0 +b(of)g(the)g(classes)h Fp(cl_N)p Fr(,)g Fp(cl_R)p Fr(,)f +Fp(cl_RA)p Fr(,)h Fp(cl_F)p Fr(,)g Fp(cl_SF)p Fr(,)f +Fp(cl_FF)p Fr(,)h Fp(cl_DF)p Fr(,)g Fp(cl_LF)d Fr(de\014nes)h(the)g +(follo)m(wing)0 491 y(op)s(erations:)0 796 y Fk(t)m(yp)s(e)e +Fp(operator)28 b(/)i(\(const)e Fk(t)m(yp)s(e)5 b Fp(&,)31 +b(const)d Fk(t)m(yp)s(e)5 b Fp(&\))480 921 y Fr(Division.)0 +1101 y Fk(t)m(yp)s(e)36 b Fp(recip)29 b(\(const)f Fk(t)m(yp)s(e)5 +b Fp(&\))480 1225 y Fr(Returns)29 b(the)i(recipro)s(cal)g(of)g(the)f +(argumen)m(t.)0 1530 y(The)d(class)g Fp(cl_I)f Fr(do)s(esn't)h +(de\014ne)g(a)g(`)p Fp(/)p Fr(')g(op)s(eration)h(b)s(ecause)f(in)g(the) +g(C/C)p Fp(++)f Fr(language)j(this)e(op)s(erator,)h(applied)0 1655 y(to)j(in)m(tegral)h(t)m(yp)s(es,)f(denotes)f(the)h(`)p -Fn(floor)p Fp(')e(or)h(`)p Fn(truncate)p Fp(')f(op)s(eration)i(\(whic)m +Fp(floor)p Fr(')e(or)h(`)p Fp(truncate)p Fr(')f(op)s(eration)i(\(whic)m (h)f(one)h(of)f(these,)h(is)g(implemen)m(ta-)0 1780 y(tion)j(dep)s (enden)m(t\).)48 b(\(See)34 b(Section)f(4.6)i([Rounding)d(functions],)i -(page)g(17\))g(Instead,)g Fn(cl_I)e Fp(de\014nes)g(an)h(\\exact)0 -1904 y(quotien)m(t")f(function:)0 2209 y Fn(cl_I)d(exquo)g(\(const)g -(cl_I&)g(x,)h(const)e(cl_I&)h(y\))480 2334 y Fp(Chec)m(ks)i(that)g -Fn(y)f Fp(divides)g Fn(x)p Fp(,)g(and)g(returns)f(the)h(quotien)m(t)i -Fn(x)p Fp(/)p Fn(y)p Fp(.)0 2638 y(The)e(follo)m(wing)i(exp)s(onen)m -(tiation)f(functions)f(are)h(de\014ned:)0 2943 y Fn(cl_I)e(expt_pos)f +(page)g(17\))g(Instead,)g Fp(cl_I)e Fr(de\014nes)g(an)h(\\exact)0 +1904 y(quotien)m(t")f(function:)0 2209 y Fp(cl_I)d(exquo)g(\(const)g +(cl_I&)g(x,)h(const)e(cl_I&)h(y\))480 2334 y Fr(Chec)m(ks)i(that)g +Fp(y)f Fr(divides)g Fp(x)p Fr(,)g(and)g(returns)f(the)h(quotien)m(t)i +Fp(x)p Fr(/)p Fp(y)p Fr(.)0 2638 y(The)e(follo)m(wing)i(exp)s(onen)m +(tiation)f(functions)f(are)h(de\014ned:)0 2943 y Fp(cl_I)e(expt_pos)f (\(const)h(cl_I&)g(x,)h(const)f(cl_I&)g(y\))0 3068 y(cl_RA)g(expt_pos)f (\(const)h(cl_RA&)f(x,)i(const)f(cl_I&)g(y\))480 3193 -y(y)h Fp(m)m(ust)f(b)s(e)h Fn(>)g Fp(0.)41 b(Returns)30 -b Fn(x^y)p Fp(.)0 3373 y Fn(cl_RA)f(expt)g(\(const)g(cl_RA&)f(x,)i +y(y)h Fr(m)m(ust)f(b)s(e)h Fp(>)g Fr(0.)41 b(Returns)30 +b Fp(x^y)p Fr(.)0 3373 y Fp(cl_RA)f(expt)g(\(const)g(cl_RA&)f(x,)i (const)f(cl_I&)g(y\))0 3497 y(cl_R)g(expt)g(\(const)g(cl_R&)g(x,)h (const)f(cl_I&)g(y\))0 3622 y(cl_N)g(expt)g(\(const)g(cl_N&)g(x,)h -(const)f(cl_I&)g(y\))480 3747 y Fp(Returns)g Fn(x^y)p -Fp(.)0 4052 y(Eac)m(h)39 b(of)g(the)g(classes)h Fn(cl_R)p -Fp(,)g Fn(cl_RA)p Fp(,)f Fn(cl_I)p Fp(,)h Fn(cl_F)p Fp(,)g -Fn(cl_SF)p Fp(,)f Fn(cl_FF)p Fp(,)h Fn(cl_DF)p Fp(,)g -Fn(cl_LF)d Fp(de\014nes)h(the)g(follo)m(wing)0 4176 y(op)s(eration:)0 -4481 y Fi(t)m(yp)s(e)e Fn(abs)29 b(\(const)g Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x\))480 4606 y Fp(Returns)f(the)i(absolute)g(v)-5 -b(alue)31 b(of)f Fn(x)p Fp(.)41 b(This)29 b(is)i Fn(x)f -Fp(if)g Fn(x)g(>=)g(0)p Fp(,)g(and)g Fn(-x)g Fp(if)g -Fn(x)g(<=)g(0)p Fp(.)0 4911 y(The)g(class)h Fn(cl_N)e -Fp(implemen)m(ts)g(this)h(as)h(follo)m(ws:)0 5215 y Fn(cl_R)e(abs)h -(\(const)e(cl_N)i(x\))480 5340 y Fp(Returns)f(the)i(absolute)g(v)-5 -b(alue)31 b(of)f Fn(x)p Fp(.)p eop +(const)f(cl_I&)g(y\))480 3747 y Fr(Returns)g Fp(x^y)p +Fr(.)0 4052 y(Eac)m(h)39 b(of)g(the)g(classes)h Fp(cl_R)p +Fr(,)g Fp(cl_RA)p Fr(,)f Fp(cl_I)p Fr(,)h Fp(cl_F)p Fr(,)g +Fp(cl_SF)p Fr(,)f Fp(cl_FF)p Fr(,)h Fp(cl_DF)p Fr(,)g +Fp(cl_LF)d Fr(de\014nes)h(the)g(follo)m(wing)0 4176 y(op)s(eration:)0 +4481 y Fk(t)m(yp)s(e)e Fp(abs)29 b(\(const)g Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x\))480 4606 y Fr(Returns)f(the)i(absolute)g(v)-5 +b(alue)31 b(of)f Fp(x)p Fr(.)41 b(This)29 b(is)i Fp(x)f +Fr(if)g Fp(x)g(>=)g(0)p Fr(,)g(and)g Fp(-x)g Fr(if)g +Fp(x)g(<=)g(0)p Fr(.)0 4911 y(The)g(class)h Fp(cl_N)e +Fr(implemen)m(ts)g(this)h(as)h(follo)m(ws:)0 5215 y Fp(cl_R)e(abs)h +(\(const)e(cl_N)i(x\))480 5340 y Fr(Returns)f(the)i(absolute)g(v)-5 +b(alue)31 b(of)f Fp(x)p Fr(.)p eop %%Page: 15 17 -15 16 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +15 16 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 b(on)f(n)m(um)m(b)s(ers)2463 b(15)0 366 y(Eac)m(h)22 -b(of)g(the)g(classes)h Fn(cl_N)p Fp(,)g Fn(cl_R)p Fp(,)f -Fn(cl_RA)p Fp(,)g Fn(cl_I)p Fp(,)h Fn(cl_F)p Fp(,)g Fn(cl_SF)p -Fp(,)f Fn(cl_FF)p Fp(,)g Fn(cl_DF)p Fp(,)g Fn(cl_LF)f -Fp(de\014nes)g(the)g(follo)m(wing)0 491 y(op)s(eration:)0 -798 y Fi(t)m(yp)s(e)36 b Fn(signum)28 b(\(const)h Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x\))480 922 y Fp(Returns)g(the)i(sign)f(of)g -Fn(x)p Fp(,)h(in)f(the)g(same)g(n)m(um)m(b)s(er)e(format)h(as)i -Fn(x)p Fp(.)42 b(This)31 b(is)g(de\014ned)f(as)i Fn(x)e(/)g(abs\(x\)) -480 1047 y Fp(if)g Fn(x)g Fp(is)h(non-zero,)g(and)f Fn(x)g -Fp(if)g Fn(x)g Fp(is)h(zero.)41 b(If)30 b Fn(x)g Fp(is)g(real,)i(the)e +b(of)g(the)g(classes)h Fp(cl_N)p Fr(,)g Fp(cl_R)p Fr(,)f +Fp(cl_RA)p Fr(,)g Fp(cl_I)p Fr(,)h Fp(cl_F)p Fr(,)g Fp(cl_SF)p +Fr(,)f Fp(cl_FF)p Fr(,)g Fp(cl_DF)p Fr(,)g Fp(cl_LF)f +Fr(de\014nes)g(the)g(follo)m(wing)0 491 y(op)s(eration:)0 +798 y Fk(t)m(yp)s(e)36 b Fp(signum)28 b(\(const)h Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x\))480 922 y Fr(Returns)g(the)i(sign)f(of)g +Fp(x)p Fr(,)h(in)f(the)g(same)g(n)m(um)m(b)s(er)e(format)h(as)i +Fp(x)p Fr(.)42 b(This)31 b(is)g(de\014ned)f(as)i Fp(x)e(/)g(abs\(x\)) +480 1047 y Fr(if)g Fp(x)g Fr(is)h(non-zero,)g(and)f Fp(x)g +Fr(if)g Fp(x)g Fr(is)h(zero.)41 b(If)30 b Fp(x)g Fr(is)g(real,)i(the)e (v)-5 b(alue)31 b(is)g(either)f(0)h(or)f(1)h(or)g(-1.)0 -1531 y Fq(4.3)68 b(Elemen)l(tary)32 b(rational)g(functions)0 -1808 y Fp(Eac)m(h)f(of)g(the)f(classes)i Fn(cl_RA)p Fp(,)d -Fn(cl_I)g Fp(de\014nes)g(the)i(follo)m(wing)h(op)s(erations:)0 -2115 y Fn(cl_I)d(numerator)f(\(const)h Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x\))480 2240 y Fp(Returns)f(the)i(n)m(umerator)e(of)i -Fn(x)p Fp(.)0 2422 y Fn(cl_I)e(denominator)f(\(const)g -Fi(t)m(yp)s(e)5 b Fn(&)31 b(x\))480 2546 y Fp(Returns)e(the)i -(denominator)f(of)g Fn(x)p Fp(.)0 2853 y(The)c(n)m(umerator)h(and)f +1531 y Fs(4.3)68 b(Elemen)l(tary)32 b(rational)g(functions)0 +1808 y Fr(Eac)m(h)f(of)g(the)f(classes)i Fp(cl_RA)p Fr(,)d +Fp(cl_I)g Fr(de\014nes)g(the)i(follo)m(wing)h(op)s(erations:)0 +2115 y Fp(cl_I)d(numerator)f(\(const)h Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x\))480 2240 y Fr(Returns)f(the)i(n)m(umerator)e(of)i +Fp(x)p Fr(.)0 2422 y Fp(cl_I)e(denominator)f(\(const)g +Fk(t)m(yp)s(e)5 b Fp(&)31 b(x\))480 2546 y Fr(Returns)e(the)i +(denominator)f(of)g Fp(x)p Fr(.)0 2853 y(The)c(n)m(umerator)h(and)f (denominator)g(of)h(a)h(rational)g(n)m(um)m(b)s(er)c(are)k(normalized)e (in)h(suc)m(h)g(a)g(w)m(a)m(y)h(that)g(they)f(ha)m(v)m(e)0 2978 y(no)j(factor)i(in)e(common)e(and)i(the)h(denominator)e(is)i(p)s -(ositiv)m(e.)0 3462 y Fq(4.4)68 b(Elemen)l(tary)32 b(complex)f -(functions)0 3739 y Fp(The)f(class)h Fn(cl_N)e Fp(de\014nes)h(the)g -(follo)m(wing)i(op)s(eration:)0 4046 y Fn(cl_N)d(complex)g(\(const)f -(cl_R&)h(a,)h(const)f(cl_R&)g(b\))480 4171 y Fp(Returns)i(the)h -(complex)f(n)m(um)m(b)s(er)f Fn(a+bi)p Fp(,)h(that)i(is,)f(the)g -(complex)g(n)m(um)m(b)s(er)d(with)j(real)g(part)g Fn(a)g -Fp(and)480 4295 y(imaginary)e(part)g Fn(b)p Fp(.)0 4602 -y(Eac)m(h)h(of)g(the)f(classes)i Fn(cl_N)p Fp(,)d Fn(cl_R)g -Fp(de\014nes)h(the)g(follo)m(wing)i(op)s(erations:)0 -4909 y Fn(cl_R)d(realpart)f(\(const)h Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x\))480 5033 y Fp(Returns)f(the)i(real)g(part)f(of)h -Fn(x)p Fp(.)0 5215 y Fn(cl_R)e(imagpart)f(\(const)h Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x\))480 5340 y Fp(Returns)f(the)i(imaginary)f(part)g(of)h -Fn(x)p Fp(.)p eop +(ositiv)m(e.)0 3462 y Fs(4.4)68 b(Elemen)l(tary)32 b(complex)f +(functions)0 3739 y Fr(The)f(class)h Fp(cl_N)e Fr(de\014nes)h(the)g +(follo)m(wing)i(op)s(eration:)0 4046 y Fp(cl_N)d(complex)g(\(const)f +(cl_R&)h(a,)h(const)f(cl_R&)g(b\))480 4171 y Fr(Returns)i(the)h +(complex)f(n)m(um)m(b)s(er)f Fp(a+bi)p Fr(,)h(that)i(is,)f(the)g +(complex)g(n)m(um)m(b)s(er)d(with)j(real)g(part)g Fp(a)g +Fr(and)480 4295 y(imaginary)e(part)g Fp(b)p Fr(.)0 4602 +y(Eac)m(h)h(of)g(the)f(classes)i Fp(cl_N)p Fr(,)d Fp(cl_R)g +Fr(de\014nes)h(the)g(follo)m(wing)i(op)s(erations:)0 +4909 y Fp(cl_R)d(realpart)f(\(const)h Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x\))480 5033 y Fr(Returns)f(the)i(real)g(part)f(of)h +Fp(x)p Fr(.)0 5215 y Fp(cl_R)e(imagpart)f(\(const)h Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x\))480 5340 y Fr(Returns)f(the)i(imaginary)f(part)g(of)h +Fp(x)p Fr(.)p eop %%Page: 16 18 -16 17 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 -b(on)f(n)m(um)m(b)s(ers)2463 b(16)0 366 y Fi(t)m(yp)s(e)36 -b Fn(conjugate)27 b(\(const)i Fi(t)m(yp)s(e)5 b Fn(&)31 -b(x\))480 491 y Fp(Returns)e(the)i(complex)f(conjugate)i(of)e -Fn(x)p Fp(.)0 795 y(W)-8 b(e)32 b(ha)m(v)m(e)f(the)g(relations)180 -1071 y Fn(x)f(=)g(complex\(realpart\(x\),)25 b(imagpart\(x\)\))180 +16 17 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +b(on)f(n)m(um)m(b)s(ers)2463 b(16)0 366 y Fk(t)m(yp)s(e)36 +b Fp(conjugate)27 b(\(const)i Fk(t)m(yp)s(e)5 b Fp(&)31 +b(x\))480 491 y Fr(Returns)e(the)i(complex)f(conjugate)i(of)e +Fp(x)p Fr(.)0 795 y(W)-8 b(e)32 b(ha)m(v)m(e)f(the)g(relations)180 +1071 y Fp(x)f(=)g(complex\(realpart\(x\),)25 b(imagpart\(x\)\))180 1223 y(conjugate\(x\))i(=)j(complex\(realpart\(x\),)25 -b(-imagpart\(x\)\))0 1693 y Fq(4.5)68 b(Comparisons)0 -1969 y Fp(Eac)m(h)22 b(of)g(the)g(classes)h Fn(cl_N)p -Fp(,)g Fn(cl_R)p Fp(,)f Fn(cl_RA)p Fp(,)g Fn(cl_I)p Fp(,)h -Fn(cl_F)p Fp(,)g Fn(cl_SF)p Fp(,)f Fn(cl_FF)p Fp(,)g -Fn(cl_DF)p Fp(,)g Fn(cl_LF)f Fp(de\014nes)g(the)g(follo)m(wing)0 -2094 y(op)s(erations:)0 2397 y Fn(bool)29 b(operator)f(==)i(\(const)f -Fi(t)m(yp)s(e)5 b Fn(&,)30 b(const)f Fi(t)m(yp)s(e)5 -b Fn(&\))0 2522 y(bool)29 b(operator)f(!=)i(\(const)f -Fi(t)m(yp)s(e)5 b Fn(&,)30 b(const)f Fi(t)m(yp)s(e)5 -b Fn(&\))480 2646 y Fp(Comparison,)29 b(as)i(in)f(C)g(and)f(C)p -Fn(++)p Fp(.)0 2825 y Fn(uint32)g(cl_equal_hashcode)c(\(const)k -Fi(t)m(yp)s(e)5 b Fn(&\))480 2950 y Fp(Returns)31 b(a)h(32-bit)i(hash)d +b(-imagpart\(x\)\))0 1693 y Fs(4.5)68 b(Comparisons)0 +1969 y Fr(Eac)m(h)22 b(of)g(the)g(classes)h Fp(cl_N)p +Fr(,)g Fp(cl_R)p Fr(,)f Fp(cl_RA)p Fr(,)g Fp(cl_I)p Fr(,)h +Fp(cl_F)p Fr(,)g Fp(cl_SF)p Fr(,)f Fp(cl_FF)p Fr(,)g +Fp(cl_DF)p Fr(,)g Fp(cl_LF)f Fr(de\014nes)g(the)g(follo)m(wing)0 +2094 y(op)s(erations:)0 2397 y Fp(bool)29 b(operator)f(==)i(\(const)f +Fk(t)m(yp)s(e)5 b Fp(&,)30 b(const)f Fk(t)m(yp)s(e)5 +b Fp(&\))0 2522 y(bool)29 b(operator)f(!=)i(\(const)f +Fk(t)m(yp)s(e)5 b Fp(&,)30 b(const)f Fk(t)m(yp)s(e)5 +b Fp(&\))480 2646 y Fr(Comparison,)29 b(as)i(in)f(C)g(and)f(C)p +Fp(++)p Fr(.)0 2825 y Fp(uint32)g(cl_equal_hashcode)c(\(const)k +Fk(t)m(yp)s(e)5 b Fp(&\))480 2950 y Fr(Returns)31 b(a)h(32-bit)i(hash)d (co)s(de)h(that)h(is)f(the)g(same)f(for)h(an)m(y)g(t)m(w)m(o)i(n)m(um)m (b)s(ers)29 b(whic)m(h)j(are)g(the)h(same)480 3075 y(according)e(to)g -Fn(==)p Fp(.)40 b(This)29 b(hash)g(co)s(de)i(dep)s(ends)d(on)i(the)g(n) +Fp(==)p Fr(.)40 b(This)29 b(hash)g(co)s(de)i(dep)s(ends)d(on)i(the)g(n) m(um)m(b)s(er's)e(v)-5 b(alue,)31 b(not)f(its)g(t)m(yp)s(e)g(or)h -(preci-)480 3199 y(sion.)0 3378 y Fn(cl_boolean)d(zerop)h(\(const)f -Fi(t)m(yp)s(e)5 b Fn(&)31 b(x\))480 3503 y Fp(Compare)e(against)j -(zero:)41 b Fn(x)30 b(==)g(0)0 3806 y Fp(Eac)m(h)39 b(of)g(the)g -(classes)h Fn(cl_R)p Fp(,)g Fn(cl_RA)p Fp(,)f Fn(cl_I)p -Fp(,)h Fn(cl_F)p Fp(,)g Fn(cl_SF)p Fp(,)f Fn(cl_FF)p -Fp(,)h Fn(cl_DF)p Fp(,)g Fn(cl_LF)d Fp(de\014nes)h(the)g(follo)m(wing)0 -3931 y(op)s(erations:)0 4235 y Fn(cl_signean)28 b(cl_compare)f(\(const) -i Fi(t)m(yp)s(e)5 b Fn(&)30 b(x,)g(const)f Fi(t)m(yp)s(e)5 -b Fn(&)30 b(y\))480 4359 y Fp(Compares)f Fn(x)h Fp(and)g -Fn(y)p Fp(.)40 b(Returns)30 b Fn(+)p Fp(1)g(if)g Fn(x>y)p -Fp(,)g(-1)h(if)g Fn(x=)i(\(const)f -Fi(t)m(yp)s(e)5 b Fn(&,)30 b(const)f Fi(t)m(yp)s(e)5 -b Fn(&\))0 4912 y(bool)29 b(operator)f(>)i(\(const)f -Fi(t)m(yp)s(e)5 b Fn(&,)30 b(const)f Fi(t)m(yp)s(e)5 -b Fn(&\))480 5036 y Fp(Comparison,)29 b(as)i(in)f(C)g(and)f(C)p -Fn(++)p Fp(.)0 5215 y Fn(cl_boolean)f(minusp)g(\(const)h -Fi(t)m(yp)s(e)5 b Fn(&)30 b(x\))480 5340 y Fp(Compare)f(against)j -(zero:)41 b Fn(x)30 b(<)g(0)p eop +(preci-)480 3199 y(sion.)0 3378 y Fp(cl_boolean)d(zerop)h(\(const)f +Fk(t)m(yp)s(e)5 b Fp(&)31 b(x\))480 3503 y Fr(Compare)e(against)j +(zero:)41 b Fp(x)30 b(==)g(0)0 3806 y Fr(Eac)m(h)39 b(of)g(the)g +(classes)h Fp(cl_R)p Fr(,)g Fp(cl_RA)p Fr(,)f Fp(cl_I)p +Fr(,)h Fp(cl_F)p Fr(,)g Fp(cl_SF)p Fr(,)f Fp(cl_FF)p +Fr(,)h Fp(cl_DF)p Fr(,)g Fp(cl_LF)d Fr(de\014nes)h(the)g(follo)m(wing)0 +3931 y(op)s(erations:)0 4235 y Fp(cl_signean)28 b(cl_compare)f(\(const) +i Fk(t)m(yp)s(e)5 b Fp(&)30 b(x,)g(const)f Fk(t)m(yp)s(e)5 +b Fp(&)30 b(y\))480 4359 y Fr(Compares)f Fp(x)h Fr(and)g +Fp(y)p Fr(.)40 b(Returns)30 b Fp(+)p Fr(1)g(if)g Fp(x>y)p +Fr(,)g(-1)h(if)g Fp(x=)i(\(const)f +Fk(t)m(yp)s(e)5 b Fp(&,)30 b(const)f Fk(t)m(yp)s(e)5 +b Fp(&\))0 4912 y(bool)29 b(operator)f(>)i(\(const)f +Fk(t)m(yp)s(e)5 b Fp(&,)30 b(const)f Fk(t)m(yp)s(e)5 +b Fp(&\))480 5036 y Fr(Comparison,)29 b(as)i(in)f(C)g(and)f(C)p +Fp(++)p Fr(.)0 5215 y Fp(cl_boolean)f(minusp)g(\(const)h +Fk(t)m(yp)s(e)5 b Fp(&)30 b(x\))480 5340 y Fr(Compare)f(against)j +(zero:)41 b Fp(x)30 b(<)g(0)p eop %%Page: 17 19 -17 18 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 -b(on)f(n)m(um)m(b)s(ers)2463 b(17)0 366 y Fn(cl_boolean)28 -b(plusp)h(\(const)f Fi(t)m(yp)s(e)5 b Fn(&)31 b(x\))480 -491 y Fp(Compare)e(against)j(zero:)41 b Fn(x)30 b(>)g(0)0 -656 y Fi(t)m(yp)s(e)36 b Fn(max)29 b(\(const)g Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x,)g(const)f Fi(t)m(yp)s(e)5 b Fn(&)30 b(y\))480 -780 y Fp(Return)g(the)g(maxim)m(um)d(of)k Fn(x)f Fp(and)g -Fn(y)p Fp(.)0 945 y Fi(t)m(yp)s(e)36 b Fn(min)29 b(\(const)g -Fi(t)m(yp)s(e)5 b Fn(&)30 b(x,)g(const)f Fi(t)m(yp)s(e)5 -b Fn(&)30 b(y\))480 1069 y Fp(Return)g(the)g(minim)m(um)d(of)j -Fn(x)g Fp(and)g Fn(y)p Fp(.)0 1363 y(When)h(a)h(\015oating)g(p)s(oin)m +17 18 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +b(on)f(n)m(um)m(b)s(ers)2463 b(17)0 366 y Fp(cl_boolean)28 +b(plusp)h(\(const)f Fk(t)m(yp)s(e)5 b Fp(&)31 b(x\))480 +491 y Fr(Compare)e(against)j(zero:)41 b Fp(x)30 b(>)g(0)0 +656 y Fk(t)m(yp)s(e)36 b Fp(max)29 b(\(const)g Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x,)g(const)f Fk(t)m(yp)s(e)5 b Fp(&)30 b(y\))480 +780 y Fr(Return)g(the)g(maxim)m(um)d(of)k Fp(x)f Fr(and)g +Fp(y)p Fr(.)0 945 y Fk(t)m(yp)s(e)36 b Fp(min)29 b(\(const)g +Fk(t)m(yp)s(e)5 b Fp(&)30 b(x,)g(const)f Fk(t)m(yp)s(e)5 +b Fp(&)30 b(y\))480 1069 y Fr(Return)g(the)g(minim)m(um)d(of)j +Fp(x)g Fr(and)g Fp(y)p Fr(.)0 1363 y(When)h(a)h(\015oating)g(p)s(oin)m (t)f(n)m(um)m(b)s(er)e(and)h(a)i(rational)g(n)m(um)m(b)s(er)d(are)j (compared,)f(the)g(\015oat)h(is)f(\014rst)f(con)m(v)m(erted)j(to)0 1488 y(a)e(rational)h(n)m(um)m(b)s(er)c(using)i(the)h(function)f -Fn(rational)p Fp(.)39 b(Since)31 b(a)g(\015oating)g(p)s(oin)m(t)g(n)m +Fp(rational)p Fr(.)39 b(Since)31 b(a)g(\015oating)g(p)s(oin)m(t)g(n)m (um)m(b)s(er)d(actually)k(represen)m(ts)0 1612 y(an)h(in)m(terv)-5 b(al)34 b(of)g(real)g(n)m(um)m(b)s(ers,)d(the)j(result)f(migh)m(t)g(b)s -(e)f(surprising.)48 b(F)-8 b(or)34 b(example,)g Fn +(e)f(surprising.)48 b(F)-8 b(or)34 b(example,)g Fp (\(cl_F\)\(cl_R\)"1/3")26 b(==)0 1737 y(\(cl_R\)"1/3")h -Fp(returns)i(false)i(b)s(ecause)g(there)f(is)h(no)f(\015oating)h(p)s +Fr(returns)i(false)i(b)s(ecause)g(there)f(is)h(no)f(\015oating)h(p)s (oin)m(t)g(n)m(um)m(b)s(er)d(whose)i(v)-5 b(alue)31 b(is)f(exactly)i -Fn(1/3)p Fp(.)0 2166 y Fq(4.6)68 b(Rounding)30 b(functions)0 -2440 y Fp(When)37 b(a)g(real)h(n)m(um)m(b)s(er)d(is)i(to)h(b)s(e)e(con) +Fp(1/3)p Fr(.)0 2166 y Fs(4.6)68 b(Rounding)30 b(functions)0 +2440 y Fr(When)37 b(a)g(real)h(n)m(um)m(b)s(er)d(is)i(to)h(b)s(e)e(con) m(v)m(erted)j(to)e(an)g(in)m(teger,)k(there)c(is)g(no)g(\\b)s(est")g (rounding.)60 b(The)36 b(desired)0 2564 y(rounding)g(function)g(dep)s (ends)f(on)i(the)g(application.)61 b(The)36 b(Common)e(Lisp)j(and)f (ISO)g(Lisp)g(standards)g(o\013er)0 2689 y(four)30 b(rounding)f -(functions:)0 2983 y Fn(floor\(x\))96 b Fp(This)30 b(is)g(the)h -(largest)g(in)m(teger)h Fn(<)p Fp(=)p Fn(x)p Fp(.)0 3148 -y Fn(ceiling\(x\))480 3272 y Fp(This)e(is)g(the)h(smallest)f(in)m -(teger)i Fn(>)p Fp(=)p Fn(x)p Fp(.)0 3437 y Fn(truncate\(x\))480 -3561 y Fp(Among)e(the)g(in)m(tegers)i(b)s(et)m(w)m(een)f(0)g(and)e -Fn(x)h Fp(\(inclusiv)m(e\))i(the)f(one)g(nearest)f(to)i -Fn(x)p Fp(.)0 3726 y Fn(round\(x\))96 b Fp(The)29 b(in)m(teger)h -(nearest)f(to)h Fn(x)p Fp(.)40 b(If)29 b Fn(x)f Fp(is)h(exactly)i +(functions:)0 2983 y Fp(floor\(x\))96 b Fr(This)30 b(is)g(the)h +(largest)g(in)m(teger)h Fp(<)p Fr(=)p Fp(x)p Fr(.)0 3148 +y Fp(ceiling\(x\))480 3272 y Fr(This)e(is)g(the)h(smallest)f(in)m +(teger)i Fp(>)p Fr(=)p Fp(x)p Fr(.)0 3437 y Fp(truncate\(x\))480 +3561 y Fr(Among)e(the)g(in)m(tegers)i(b)s(et)m(w)m(een)f(0)g(and)e +Fp(x)h Fr(\(inclusiv)m(e\))i(the)f(one)g(nearest)f(to)i +Fp(x)p Fr(.)0 3726 y Fp(round\(x\))96 b Fr(The)29 b(in)m(teger)h +(nearest)f(to)h Fp(x)p Fr(.)40 b(If)29 b Fp(x)f Fr(is)h(exactly)i (halfw)m(a)m(y)f(b)s(et)m(w)m(een)g(t)m(w)m(o)g(in)m(tegers,)h(c)m(ho)s (ose)f(the)f(ev)m(en)480 3850 y(one.)0 4144 y(These)h(functions)g(ha)m (v)m(e)i(di\013eren)m(t)e(adv)-5 b(an)m(tages:)0 4418 -y Fn(floor)38 b Fp(and)g Fn(ceiling)g Fp(are)h(translation)h(in)m(v)-5 -b(arian)m(t:)60 b Fn(floor\(x+n\))28 b(=)i(floor\(x\))e(+)i(n)39 -b Fp(and)f Fn(ceiling\(x+n\))27 b(=)0 4543 y(ceiling\(x\))h(+)i(n)g -Fp(for)g(ev)m(ery)h Fn(x)f Fp(and)g(ev)m(ery)h(in)m(teger)h -Fn(n)p Fp(.)0 4817 y(On)46 b(the)h(other)g(hand,)j Fn(truncate)44 -b Fp(and)i Fn(round)f Fp(are)i(symmetric:)72 b Fn(truncate\(-x\))27 -b(=)j(-truncate\(x\))44 b Fp(and)0 4941 y Fn(round\(-x\))28 -b(=)i(-round\(x\))p Fp(,)38 b(and)g(furthermore)e Fn(round)h -Fp(is)h(un)m(biased:)57 b(on)38 b(the)h(\\a)m(v)m(erage",)44 +y Fp(floor)38 b Fr(and)g Fp(ceiling)g Fr(are)h(translation)h(in)m(v)-5 +b(arian)m(t:)60 b Fp(floor\(x+n\))28 b(=)i(floor\(x\))e(+)i(n)39 +b Fr(and)f Fp(ceiling\(x+n\))27 b(=)0 4543 y(ceiling\(x\))h(+)i(n)g +Fr(for)g(ev)m(ery)h Fp(x)f Fr(and)g(ev)m(ery)h(in)m(teger)h +Fp(n)p Fr(.)0 4817 y(On)46 b(the)h(other)g(hand,)j Fp(truncate)44 +b Fr(and)i Fp(round)f Fr(are)i(symmetric:)72 b Fp(truncate\(-x\))27 +b(=)j(-truncate\(x\))44 b Fr(and)0 4941 y Fp(round\(-x\))28 +b(=)i(-round\(x\))p Fr(,)38 b(and)g(furthermore)e Fp(round)h +Fr(is)h(un)m(biased:)57 b(on)38 b(the)h(\\a)m(v)m(erage",)44 b(it)39 b(rounds)d(do)m(wn)0 5066 y(exactly)c(as)f(often)g(as)f(it)h (rounds)e(up.)0 5340 y(The)h(functions)g(are)h(related)g(lik)m(e)h (this:)p eop %%Page: 18 20 -18 19 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 -b(on)f(n)m(um)m(b)s(ers)2463 b(18)180 366 y Fn(ceiling\(m/n\))27 +18 19 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +b(on)f(n)m(um)m(b)s(ers)2463 b(18)180 366 y Fp(ceiling\(m/n\))27 b(=)j(floor\(\(m+n-1\)/n\))c(=)k(floor\(\(m-1\)/n\)+1)g -Fp(for)35 b(rational)h(n)m(um)m(b)s(ers)c Fn(m/n)i Fp(\()p -Fn(m)p Fp(,)i Fn(n)f Fp(in-)180 491 y(tegers,)d Fn(n>)p -Fp(0\),)e(and)180 646 y Fn(truncate\(x\))d(=)j(sign\(x\))f(*)h -(floor\(abs\(x\)\))0 957 y Fp(Eac)m(h)24 b(of)f(the)h(classes)g -Fn(cl_R)p Fp(,)g Fn(cl_RA)p Fp(,)g Fn(cl_F)p Fp(,)f Fn(cl_SF)p -Fp(,)h Fn(cl_FF)p Fp(,)f Fn(cl_DF)p Fp(,)h Fn(cl_LF)e -Fp(de\014nes)g(the)i(follo)m(wing)g(op)s(erations:)0 -1268 y Fn(cl_I)29 b(floor1)g(\(const)g Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x\))480 1392 y Fp(Returns)f Fn(floor\(x\))p -Fp(.)0 1578 y Fn(cl_I)g(ceiling1)f(\(const)h Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x\))480 1703 y Fp(Returns)f Fn(ceiling\(x\))p -Fp(.)0 1889 y Fn(cl_I)g(truncate1)f(\(const)h Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x\))480 2014 y Fp(Returns)f Fn(truncate\(x\))p -Fp(.)0 2200 y Fn(cl_I)g(round1)g(\(const)g Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x\))480 2324 y Fp(Returns)f Fn(round\(x\))p -Fp(.)0 2635 y(Eac)m(h)39 b(of)g(the)g(classes)h Fn(cl_R)p -Fp(,)g Fn(cl_RA)p Fp(,)f Fn(cl_I)p Fp(,)h Fn(cl_F)p Fp(,)g -Fn(cl_SF)p Fp(,)f Fn(cl_FF)p Fp(,)h Fn(cl_DF)p Fp(,)g -Fn(cl_LF)d Fp(de\014nes)h(the)g(follo)m(wing)0 2760 y(op)s(erations:)0 -3070 y Fn(cl_I)29 b(floor1)g(\(const)g Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x,)g(const)f Fi(t)m(yp)s(e)5 b Fn(&)30 b(y\))480 -3195 y Fp(Returns)f Fn(floor\(x/y\))p Fp(.)0 3381 y Fn(cl_I)g(ceiling1) -f(\(const)h Fi(t)m(yp)s(e)5 b Fn(&)30 b(x,)g(const)f -Fi(t)m(yp)s(e)5 b Fn(&)30 b(y\))480 3505 y Fp(Returns)f -Fn(ceiling\(x/y\))p Fp(.)0 3692 y Fn(cl_I)g(truncate1)f(\(const)h -Fi(t)m(yp)s(e)5 b Fn(&)30 b(x,)g(const)f Fi(t)m(yp)s(e)5 -b Fn(&)30 b(y\))480 3816 y Fp(Returns)f Fn(truncate\(x/y\))p -Fp(.)0 4002 y Fn(cl_I)g(round1)g(\(const)g Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x,)g(const)f Fi(t)m(yp)s(e)5 b Fn(&)30 b(y\))480 -4127 y Fp(Returns)f Fn(round\(x/y\))p Fp(.)0 4437 y(These)41 -b(functions)g(are)h(called)h(`)p Fn(floor1)p Fp(',)g -Fl(:)15 b(:)g(:)42 b Fp(here)g(instead)f(of)h(`)p Fn(floor)p -Fp(',)i Fl(:)15 b(:)g(:)q Fp(,)44 b(b)s(ecause)d(on)h(some)f(systems,)0 +Fr(for)35 b(rational)h(n)m(um)m(b)s(ers)c Fp(m/n)i Fr(\()p +Fp(m)p Fr(,)i Fp(n)f Fr(in-)180 491 y(tegers,)d Fp(n>)p +Fr(0\),)e(and)180 646 y Fp(truncate\(x\))d(=)j(sign\(x\))f(*)h +(floor\(abs\(x\)\))0 957 y Fr(Eac)m(h)24 b(of)f(the)h(classes)g +Fp(cl_R)p Fr(,)g Fp(cl_RA)p Fr(,)g Fp(cl_F)p Fr(,)f Fp(cl_SF)p +Fr(,)h Fp(cl_FF)p Fr(,)f Fp(cl_DF)p Fr(,)h Fp(cl_LF)e +Fr(de\014nes)g(the)i(follo)m(wing)g(op)s(erations:)0 +1268 y Fp(cl_I)29 b(floor1)g(\(const)g Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x\))480 1392 y Fr(Returns)f Fp(floor\(x\))p +Fr(.)0 1578 y Fp(cl_I)g(ceiling1)f(\(const)h Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x\))480 1703 y Fr(Returns)f Fp(ceiling\(x\))p +Fr(.)0 1889 y Fp(cl_I)g(truncate1)f(\(const)h Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x\))480 2014 y Fr(Returns)f Fp(truncate\(x\))p +Fr(.)0 2200 y Fp(cl_I)g(round1)g(\(const)g Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x\))480 2324 y Fr(Returns)f Fp(round\(x\))p +Fr(.)0 2635 y(Eac)m(h)39 b(of)g(the)g(classes)h Fp(cl_R)p +Fr(,)g Fp(cl_RA)p Fr(,)f Fp(cl_I)p Fr(,)h Fp(cl_F)p Fr(,)g +Fp(cl_SF)p Fr(,)f Fp(cl_FF)p Fr(,)h Fp(cl_DF)p Fr(,)g +Fp(cl_LF)d Fr(de\014nes)h(the)g(follo)m(wing)0 2760 y(op)s(erations:)0 +3070 y Fp(cl_I)29 b(floor1)g(\(const)g Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x,)g(const)f Fk(t)m(yp)s(e)5 b Fp(&)30 b(y\))480 +3195 y Fr(Returns)f Fp(floor\(x/y\))p Fr(.)0 3381 y Fp(cl_I)g(ceiling1) +f(\(const)h Fk(t)m(yp)s(e)5 b Fp(&)30 b(x,)g(const)f +Fk(t)m(yp)s(e)5 b Fp(&)30 b(y\))480 3505 y Fr(Returns)f +Fp(ceiling\(x/y\))p Fr(.)0 3692 y Fp(cl_I)g(truncate1)f(\(const)h +Fk(t)m(yp)s(e)5 b Fp(&)30 b(x,)g(const)f Fk(t)m(yp)s(e)5 +b Fp(&)30 b(y\))480 3816 y Fr(Returns)f Fp(truncate\(x/y\))p +Fr(.)0 4002 y Fp(cl_I)g(round1)g(\(const)g Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x,)g(const)f Fk(t)m(yp)s(e)5 b Fp(&)30 b(y\))480 +4127 y Fr(Returns)f Fp(round\(x/y\))p Fr(.)0 4437 y(These)41 +b(functions)g(are)h(called)h(`)p Fp(floor1)p Fr(',)g +Fn(:)15 b(:)g(:)42 b Fr(here)g(instead)f(of)h(`)p Fp(floor)p +Fr(',)i Fn(:)15 b(:)g(:)q Fr(,)44 b(b)s(ecause)d(on)h(some)f(systems,)0 4562 y(system)30 b(dep)s(enden)m(t)f(include)h(\014les)g(de\014ne)g(`)p -Fn(floor)p Fp(')f(and)h(`)p Fn(ceiling)p Fp(')f(as)i(macros.)0 +Fp(floor)p Fr(')f(and)h(`)p Fp(ceiling)p Fr(')f(as)i(macros.)0 4842 y(In)k(man)m(y)g(cases,)j(one)e(needs)g(b)s(oth)f(the)h(quotien)m (t)h(and)e(the)h(remainder)e(of)i(a)g(division.)57 b(It)36 b(is)g(more)e(e\016cien)m(t)0 4966 y(to)j(compute)e(b)s(oth)g(at)i(the) @@ -2274,829 +2548,829 @@ f(same)f(time)g(than)h(to)h(p)s(erform)c(t)m(w)m(o)k(divisions,)h(one)e (remainder.)59 b(The)37 b(follo)m(wing)h(functions)f(therefore)g (return)g(a)g(structure)g(con)m(taining)h(b)s(oth)f(the)0 5215 y(quotien)m(t)28 b(and)e(the)h(remainder.)38 b(The)27 -b(su\016x)e(`)p Fn(2)p Fp(')i(indicates)h(the)f(n)m(um)m(b)s(er)e(of)i +b(su\016x)e(`)p Fp(2)p Fr(')i(indicates)h(the)f(n)m(um)m(b)s(er)e(of)i (\\return)f(v)-5 b(alues".)40 b(The)27 b(remainder)0 5340 y(is)j(de\014ned)g(as)g(follo)m(ws:)p eop %%Page: 19 21 -19 20 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 -b(on)f(n)m(um)m(b)s(ers)2463 b(19)75 366 y Fo(\017)60 -b Fp(for)30 b(the)h(computation)f(of)h Fn(quotient)d(=)i(floor\(x\))p -Fp(,)e Fn(remainder)g(=)i(x)g(-)g(quotient)p Fp(,)75 -540 y Fo(\017)60 b Fp(for)30 b(the)h(computation)f(of)h -Fn(quotient)d(=)i(floor\(x,y\))p Fp(,)e Fn(remainder)f(=)j(x)g(-)g -(quotient*y)p Fp(,)0 888 y(and)g(similarly)g(for)g(the)g(other)h(three) +19 20 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +b(on)f(n)m(um)m(b)s(ers)2463 b(19)75 366 y Fq(\017)60 +b Fr(for)30 b(the)h(computation)f(of)h Fp(quotient)d(=)i(floor\(x\))p +Fr(,)e Fp(remainder)g(=)i(x)g(-)g(quotient)p Fr(,)75 +540 y Fq(\017)60 b Fr(for)30 b(the)h(computation)f(of)h +Fp(quotient)d(=)i(floor\(x,y\))p Fr(,)e Fp(remainder)f(=)j(x)g(-)g +(quotient*y)p Fr(,)0 888 y(and)g(similarly)g(for)g(the)g(other)h(three) g(op)s(erations.)0 1186 y(Eac)m(h)24 b(of)f(the)h(classes)g -Fn(cl_R)p Fp(,)g Fn(cl_RA)p Fp(,)g Fn(cl_F)p Fp(,)f Fn(cl_SF)p -Fp(,)h Fn(cl_FF)p Fp(,)f Fn(cl_DF)p Fp(,)h Fn(cl_LF)e -Fp(de\014nes)g(the)i(follo)m(wing)g(op)s(erations:)0 -1534 y Fn(struct)29 b Fi(t)m(yp)s(e)5 b Fn(_div_t)29 -b({)h(cl_I)f(quotient;)f Fi(t)m(yp)s(e)35 b Fn(remainder;)28 -b(};)0 1659 y Fi(t)m(yp)s(e)5 b Fn(_div_t)29 b(floor2)g(\(const)f -Fi(t)m(yp)s(e)5 b Fn(&)31 b(x\))0 1783 y Fi(t)m(yp)s(e)5 -b Fn(_div_t)29 b(ceiling2)f(\(const)h Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x\))0 1908 y Fi(t)m(yp)s(e)5 b Fn(_div_t)29 -b(truncate2)f(\(const)h Fi(t)m(yp)s(e)5 b Fn(&)30 b(x\))0 -2032 y Fi(t)m(yp)s(e)5 b Fn(_div_t)29 b(round2)g(\(const)f -Fi(t)m(yp)s(e)5 b Fn(&)31 b(x\))0 2330 y Fp(Eac)m(h)39 -b(of)g(the)g(classes)h Fn(cl_R)p Fp(,)g Fn(cl_RA)p Fp(,)f -Fn(cl_I)p Fp(,)h Fn(cl_F)p Fp(,)g Fn(cl_SF)p Fp(,)f Fn(cl_FF)p -Fp(,)h Fn(cl_DF)p Fp(,)g Fn(cl_LF)d Fp(de\014nes)h(the)g(follo)m(wing)0 -2455 y(op)s(erations:)0 2803 y Fn(struct)29 b Fi(t)m(yp)s(e)5 -b Fn(_div_t)29 b({)h(cl_I)f(quotient;)f Fi(t)m(yp)s(e)35 -b Fn(remainder;)28 b(};)0 2927 y Fi(t)m(yp)s(e)5 b Fn(_div_t)29 -b(floor2)g(\(const)f Fi(t)m(yp)s(e)5 b Fn(&)31 b(x,)e(const)g -Fi(t)m(yp)s(e)5 b Fn(&)31 b(y\))0 3052 y Fi(t)m(yp)s(e)5 -b Fn(_div_t)29 b(ceiling2)f(\(const)h Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x,)g(const)f Fi(t)m(yp)s(e)5 b Fn(&)30 b(y\))0 -3176 y Fi(t)m(yp)s(e)5 b Fn(_div_t)29 b(truncate2)f(\(const)h -Fi(t)m(yp)s(e)5 b Fn(&)30 b(x,)g(const)f Fi(t)m(yp)s(e)5 -b Fn(&)30 b(y\))0 3301 y Fi(t)m(yp)s(e)5 b Fn(_div_t)29 -b(round2)g(\(const)f Fi(t)m(yp)s(e)5 b Fn(&)31 b(x,)e(const)g -Fi(t)m(yp)s(e)5 b Fn(&)31 b(y\))0 3599 y Fp(Sometimes,)24 +Fp(cl_R)p Fr(,)g Fp(cl_RA)p Fr(,)g Fp(cl_F)p Fr(,)f Fp(cl_SF)p +Fr(,)h Fp(cl_FF)p Fr(,)f Fp(cl_DF)p Fr(,)h Fp(cl_LF)e +Fr(de\014nes)g(the)i(follo)m(wing)g(op)s(erations:)0 +1534 y Fp(struct)29 b Fk(t)m(yp)s(e)5 b Fp(_div_t)29 +b({)h(cl_I)f(quotient;)f Fk(t)m(yp)s(e)35 b Fp(remainder;)28 +b(};)0 1659 y Fk(t)m(yp)s(e)5 b Fp(_div_t)29 b(floor2)g(\(const)f +Fk(t)m(yp)s(e)5 b Fp(&)31 b(x\))0 1783 y Fk(t)m(yp)s(e)5 +b Fp(_div_t)29 b(ceiling2)f(\(const)h Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x\))0 1908 y Fk(t)m(yp)s(e)5 b Fp(_div_t)29 +b(truncate2)f(\(const)h Fk(t)m(yp)s(e)5 b Fp(&)30 b(x\))0 +2032 y Fk(t)m(yp)s(e)5 b Fp(_div_t)29 b(round2)g(\(const)f +Fk(t)m(yp)s(e)5 b Fp(&)31 b(x\))0 2330 y Fr(Eac)m(h)39 +b(of)g(the)g(classes)h Fp(cl_R)p Fr(,)g Fp(cl_RA)p Fr(,)f +Fp(cl_I)p Fr(,)h Fp(cl_F)p Fr(,)g Fp(cl_SF)p Fr(,)f Fp(cl_FF)p +Fr(,)h Fp(cl_DF)p Fr(,)g Fp(cl_LF)d Fr(de\014nes)h(the)g(follo)m(wing)0 +2455 y(op)s(erations:)0 2803 y Fp(struct)29 b Fk(t)m(yp)s(e)5 +b Fp(_div_t)29 b({)h(cl_I)f(quotient;)f Fk(t)m(yp)s(e)35 +b Fp(remainder;)28 b(};)0 2927 y Fk(t)m(yp)s(e)5 b Fp(_div_t)29 +b(floor2)g(\(const)f Fk(t)m(yp)s(e)5 b Fp(&)31 b(x,)e(const)g +Fk(t)m(yp)s(e)5 b Fp(&)31 b(y\))0 3052 y Fk(t)m(yp)s(e)5 +b Fp(_div_t)29 b(ceiling2)f(\(const)h Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x,)g(const)f Fk(t)m(yp)s(e)5 b Fp(&)30 b(y\))0 +3176 y Fk(t)m(yp)s(e)5 b Fp(_div_t)29 b(truncate2)f(\(const)h +Fk(t)m(yp)s(e)5 b Fp(&)30 b(x,)g(const)f Fk(t)m(yp)s(e)5 +b Fp(&)30 b(y\))0 3301 y Fk(t)m(yp)s(e)5 b Fp(_div_t)29 +b(round2)g(\(const)f Fk(t)m(yp)s(e)5 b Fp(&)31 b(x,)e(const)g +Fk(t)m(yp)s(e)5 b Fp(&)31 b(y\))0 3599 y Fr(Sometimes,)24 b(one)h(w)m(an)m(ts)f(the)h(quotien)m(t)g(as)f(a)h(\015oating-p)s(oin)m (t)g(n)m(um)m(b)s(er)d(\(of)i(the)h(same)e(format)h(as)g(the)g(argumen) m(t,)0 3724 y(if)30 b(the)h(argumen)m(t)f(is)g(a)h(\015oat\))g(instead) g(of)f(as)h(an)f(in)m(teger.)42 b(The)30 b(pre\014x)g(`)p -Fn(f)p Fp(')g(indicates)h(this.)0 4022 y(Eac)m(h)g(of)g(the)f(classes)i -Fn(cl_F)p Fp(,)d Fn(cl_SF)p Fp(,)g Fn(cl_FF)p Fp(,)g -Fn(cl_DF)p Fp(,)h Fn(cl_LF)e Fp(de\014nes)i(the)h(follo)m(wing)g(op)s -(erations:)0 4370 y Fi(t)m(yp)s(e)36 b Fn(ffloor)28 b(\(const)h -Fi(t)m(yp)s(e)5 b Fn(&)30 b(x\))0 4494 y Fi(t)m(yp)s(e)36 -b Fn(fceiling)28 b(\(const)g Fi(t)m(yp)s(e)5 b Fn(&)31 -b(x\))0 4619 y Fi(t)m(yp)s(e)36 b Fn(ftruncate)27 b(\(const)i -Fi(t)m(yp)s(e)5 b Fn(&)31 b(x\))0 4743 y Fi(t)m(yp)s(e)36 -b Fn(fround)28 b(\(const)h Fi(t)m(yp)s(e)5 b Fn(&)30 -b(x\))0 5042 y Fp(and)g(similarly)g(for)g(class)h Fn(cl_R)p -Fp(,)e(but)h(with)g(return)f(t)m(yp)s(e)i Fn(cl_F)p Fp(.)0 -5340 y(The)f(class)h Fn(cl_R)e Fp(de\014nes)h(the)g(follo)m(wing)i(op)s +Fp(f)p Fr(')g(indicates)h(this.)0 4022 y(Eac)m(h)g(of)g(the)f(classes)i +Fp(cl_F)p Fr(,)d Fp(cl_SF)p Fr(,)g Fp(cl_FF)p Fr(,)g +Fp(cl_DF)p Fr(,)h Fp(cl_LF)e Fr(de\014nes)i(the)h(follo)m(wing)g(op)s +(erations:)0 4370 y Fk(t)m(yp)s(e)36 b Fp(ffloor)28 b(\(const)h +Fk(t)m(yp)s(e)5 b Fp(&)30 b(x\))0 4494 y Fk(t)m(yp)s(e)36 +b Fp(fceiling)28 b(\(const)g Fk(t)m(yp)s(e)5 b Fp(&)31 +b(x\))0 4619 y Fk(t)m(yp)s(e)36 b Fp(ftruncate)27 b(\(const)i +Fk(t)m(yp)s(e)5 b Fp(&)31 b(x\))0 4743 y Fk(t)m(yp)s(e)36 +b Fp(fround)28 b(\(const)h Fk(t)m(yp)s(e)5 b Fp(&)30 +b(x\))0 5042 y Fr(and)g(similarly)g(for)g(class)h Fp(cl_R)p +Fr(,)e(but)h(with)g(return)f(t)m(yp)s(e)i Fp(cl_F)p Fr(.)0 +5340 y(The)f(class)h Fp(cl_R)e Fr(de\014nes)h(the)g(follo)m(wing)i(op)s (erations:)p eop %%Page: 20 22 -20 21 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 -b(on)f(n)m(um)m(b)s(ers)2463 b(20)0 366 y Fn(cl_F)29 -b(ffloor)g(\(const)g Fi(t)m(yp)s(e)5 b Fn(&)30 b(x,)g(const)f -Fi(t)m(yp)s(e)5 b Fn(&)30 b(y\))0 491 y(cl_F)f(fceiling)f(\(const)h -Fi(t)m(yp)s(e)5 b Fn(&)30 b(x,)g(const)f Fi(t)m(yp)s(e)5 -b Fn(&)30 b(y\))0 616 y(cl_F)f(ftruncate)f(\(const)h -Fi(t)m(yp)s(e)5 b Fn(&)30 b(x,)g(const)f Fi(t)m(yp)s(e)5 -b Fn(&)30 b(y\))0 740 y(cl_F)f(fround)g(\(const)g Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x,)g(const)f Fi(t)m(yp)s(e)5 b Fn(&)30 b(y\))0 -1024 y Fp(These)25 b(functions)h(also)g(exist)h(in)e(v)m(ersions)h +20 21 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +b(on)f(n)m(um)m(b)s(ers)2463 b(20)0 366 y Fp(cl_F)29 +b(ffloor)g(\(const)g Fk(t)m(yp)s(e)5 b Fp(&)30 b(x,)g(const)f +Fk(t)m(yp)s(e)5 b Fp(&)30 b(y\))0 491 y(cl_F)f(fceiling)f(\(const)h +Fk(t)m(yp)s(e)5 b Fp(&)30 b(x,)g(const)f Fk(t)m(yp)s(e)5 +b Fp(&)30 b(y\))0 616 y(cl_F)f(ftruncate)f(\(const)h +Fk(t)m(yp)s(e)5 b Fp(&)30 b(x,)g(const)f Fk(t)m(yp)s(e)5 +b Fp(&)30 b(y\))0 740 y(cl_F)f(fround)g(\(const)g Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x,)g(const)f Fk(t)m(yp)s(e)5 b Fp(&)30 b(y\))0 +1024 y Fr(These)25 b(functions)h(also)g(exist)h(in)e(v)m(ersions)h (whic)m(h)g(return)e(b)s(oth)h(the)h(quotien)m(t)h(and)e(the)h -(remainder.)38 b(The)25 b(su\016x)0 1149 y(`)p Fn(2)p -Fp(')31 b(indicates)g(this.)0 1433 y(Eac)m(h)g(of)g(the)f(classes)i -Fn(cl_F)p Fp(,)d Fn(cl_SF)p Fp(,)g Fn(cl_FF)p Fp(,)g -Fn(cl_DF)p Fp(,)h Fn(cl_LF)e Fp(de\014nes)i(the)h(follo)m(wing)g(op)s -(erations:)0 1752 y Fn(struct)e Fi(t)m(yp)s(e)5 b Fn(_fdiv_t)28 -b({)i Fi(t)m(yp)s(e)36 b Fn(quotient;)28 b Fi(t)m(yp)s(e)36 -b Fn(remainder;)27 b(};)0 1876 y Fi(t)m(yp)s(e)5 b Fn(_fdiv_t)29 -b(ffloor2)f(\(const)h Fi(t)m(yp)s(e)5 b Fn(&)30 b(x\))0 -2001 y Fi(t)m(yp)s(e)5 b Fn(_fdiv_t)29 b(fceiling2)f(\(const)g -Fi(t)m(yp)s(e)5 b Fn(&)31 b(x\))0 2126 y Fi(t)m(yp)s(e)5 -b Fn(_fdiv_t)29 b(ftruncate2)e(\(const)i Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x\))0 2250 y Fi(t)m(yp)s(e)5 b Fn(_fdiv_t)29 -b(fround2)f(\(const)h Fi(t)m(yp)s(e)5 b Fn(&)30 b(x\))0 -2534 y Fp(and)g(similarly)g(for)g(class)h Fn(cl_R)p Fp(,)e(but)h(with)g -(quotien)m(t)i(t)m(yp)s(e)e Fn(cl_F)p Fp(.)0 2818 y(The)g(class)h -Fn(cl_R)e Fp(de\014nes)h(the)g(follo)m(wing)i(op)s(erations:)0 -3137 y Fn(struct)d Fi(t)m(yp)s(e)5 b Fn(_fdiv_t)28 b({)i(cl_F)g -(quotient;)d(cl_R)j(remainder;)d(};)0 3262 y Fi(t)m(yp)s(e)5 -b Fn(_fdiv_t)29 b(ffloor2)f(\(const)h Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x,)g(const)f Fi(t)m(yp)s(e)5 b Fn(&)30 b(y\))0 -3386 y Fi(t)m(yp)s(e)5 b Fn(_fdiv_t)29 b(fceiling2)f(\(const)g -Fi(t)m(yp)s(e)5 b Fn(&)31 b(x,)e(const)g Fi(t)m(yp)s(e)5 -b Fn(&)31 b(y\))0 3511 y Fi(t)m(yp)s(e)5 b Fn(_fdiv_t)29 -b(ftruncate2)e(\(const)i Fi(t)m(yp)s(e)5 b Fn(&)30 b(x,)g(const)f -Fi(t)m(yp)s(e)5 b Fn(&)30 b(y\))0 3635 y Fi(t)m(yp)s(e)5 -b Fn(_fdiv_t)29 b(fround2)f(\(const)h Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x,)g(const)f Fi(t)m(yp)s(e)5 b Fn(&)30 b(y\))0 -3920 y Fp(Other)i(applications)h(need)f(only)g(the)h(remainder)d(of)j -(a)f(division.)47 b(The)31 b(remainder)g(of)h(`)p Fn(floor)p -Fp(')g(and)f(`)p Fn(ffloor)p Fp(')0 4044 y(is)37 b(called)h(`)p -Fn(mod)p Fp(')e(\(abbreviation)h(of)g(\\mo)s(dulo"\).)59 -b(The)36 b(remainder)g(`)p Fn(truncate)p Fp(')e(and)i(`)p -Fn(ftruncate)p Fp(')f(is)i(called)0 4169 y(`)p Fn(rem)p -Fp(')30 b(\(abbreviation)h(of)g(\\remainder"\).)75 4453 -y Fo(\017)60 b Fn(mod\(x,y\))28 b(=)i(floor2\(x,y\).remainder)25 -b(=)30 b(x)g(-)g(floor\(x/y\)*y)75 4612 y Fo(\017)60 -b Fn(rem\(x,y\))28 b(=)i(truncate2\(x,y\).remainder)24 -b(=)30 b(x)g(-)g(truncate\(x/y\)*y)0 4931 y Fp(If)g Fn(x)f -Fp(and)h Fn(y)f Fp(are)i(b)s(oth)e Fn(>)p Fp(=)g(0,)i -Fn(mod\(x,y\))d(=)i(rem\(x,y\))e(>=)i(0)p Fp(.)41 b(In)29 -b(general,)i Fn(mod\(x,y\))d Fp(has)i(the)g(sign)g(of)g -Fn(y)g Fp(or)g(is)0 5056 y(zero,)h(and)f Fn(rem\(x,y\))e -Fp(has)i(the)h(sign)f(of)h Fn(x)f Fp(or)g(is)h(zero.)0 -5340 y(The)f(classes)h Fn(cl_R)p Fp(,)f Fn(cl_I)f Fp(de\014ne)h(the)g +(remainder.)38 b(The)25 b(su\016x)0 1149 y(`)p Fp(2)p +Fr(')31 b(indicates)g(this.)0 1433 y(Eac)m(h)g(of)g(the)f(classes)i +Fp(cl_F)p Fr(,)d Fp(cl_SF)p Fr(,)g Fp(cl_FF)p Fr(,)g +Fp(cl_DF)p Fr(,)h Fp(cl_LF)e Fr(de\014nes)i(the)h(follo)m(wing)g(op)s +(erations:)0 1752 y Fp(struct)e Fk(t)m(yp)s(e)5 b Fp(_fdiv_t)28 +b({)i Fk(t)m(yp)s(e)36 b Fp(quotient;)28 b Fk(t)m(yp)s(e)36 +b Fp(remainder;)27 b(};)0 1876 y Fk(t)m(yp)s(e)5 b Fp(_fdiv_t)29 +b(ffloor2)f(\(const)h Fk(t)m(yp)s(e)5 b Fp(&)30 b(x\))0 +2001 y Fk(t)m(yp)s(e)5 b Fp(_fdiv_t)29 b(fceiling2)f(\(const)g +Fk(t)m(yp)s(e)5 b Fp(&)31 b(x\))0 2126 y Fk(t)m(yp)s(e)5 +b Fp(_fdiv_t)29 b(ftruncate2)e(\(const)i Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x\))0 2250 y Fk(t)m(yp)s(e)5 b Fp(_fdiv_t)29 +b(fround2)f(\(const)h Fk(t)m(yp)s(e)5 b Fp(&)30 b(x\))0 +2534 y Fr(and)g(similarly)g(for)g(class)h Fp(cl_R)p Fr(,)e(but)h(with)g +(quotien)m(t)i(t)m(yp)s(e)e Fp(cl_F)p Fr(.)0 2818 y(The)g(class)h +Fp(cl_R)e Fr(de\014nes)h(the)g(follo)m(wing)i(op)s(erations:)0 +3137 y Fp(struct)d Fk(t)m(yp)s(e)5 b Fp(_fdiv_t)28 b({)i(cl_F)g +(quotient;)d(cl_R)j(remainder;)d(};)0 3262 y Fk(t)m(yp)s(e)5 +b Fp(_fdiv_t)29 b(ffloor2)f(\(const)h Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x,)g(const)f Fk(t)m(yp)s(e)5 b Fp(&)30 b(y\))0 +3386 y Fk(t)m(yp)s(e)5 b Fp(_fdiv_t)29 b(fceiling2)f(\(const)g +Fk(t)m(yp)s(e)5 b Fp(&)31 b(x,)e(const)g Fk(t)m(yp)s(e)5 +b Fp(&)31 b(y\))0 3511 y Fk(t)m(yp)s(e)5 b Fp(_fdiv_t)29 +b(ftruncate2)e(\(const)i Fk(t)m(yp)s(e)5 b Fp(&)30 b(x,)g(const)f +Fk(t)m(yp)s(e)5 b Fp(&)30 b(y\))0 3635 y Fk(t)m(yp)s(e)5 +b Fp(_fdiv_t)29 b(fround2)f(\(const)h Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x,)g(const)f Fk(t)m(yp)s(e)5 b Fp(&)30 b(y\))0 +3920 y Fr(Other)i(applications)h(need)f(only)g(the)h(remainder)d(of)j +(a)f(division.)47 b(The)31 b(remainder)g(of)h(`)p Fp(floor)p +Fr(')g(and)f(`)p Fp(ffloor)p Fr(')0 4044 y(is)37 b(called)h(`)p +Fp(mod)p Fr(')e(\(abbreviation)h(of)g(\\mo)s(dulo"\).)59 +b(The)36 b(remainder)g(`)p Fp(truncate)p Fr(')e(and)i(`)p +Fp(ftruncate)p Fr(')f(is)i(called)0 4169 y(`)p Fp(rem)p +Fr(')30 b(\(abbreviation)h(of)g(\\remainder"\).)75 4453 +y Fq(\017)60 b Fp(mod\(x,y\))28 b(=)i(floor2\(x,y\).remainder)25 +b(=)30 b(x)g(-)g(floor\(x/y\)*y)75 4612 y Fq(\017)60 +b Fp(rem\(x,y\))28 b(=)i(truncate2\(x,y\).remainder)24 +b(=)30 b(x)g(-)g(truncate\(x/y\)*y)0 4931 y Fr(If)g Fp(x)f +Fr(and)h Fp(y)f Fr(are)i(b)s(oth)e Fp(>)p Fr(=)g(0,)i +Fp(mod\(x,y\))d(=)i(rem\(x,y\))e(>=)i(0)p Fr(.)41 b(In)29 +b(general,)i Fp(mod\(x,y\))d Fr(has)i(the)g(sign)g(of)g +Fp(y)g Fr(or)g(is)0 5056 y(zero,)h(and)f Fp(rem\(x,y\))e +Fr(has)i(the)h(sign)f(of)h Fp(x)f Fr(or)g(is)h(zero.)0 +5340 y(The)f(classes)h Fp(cl_R)p Fr(,)f Fp(cl_I)f Fr(de\014ne)h(the)g (follo)m(wing)i(op)s(erations:)p eop %%Page: 21 23 -21 22 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 -b(on)f(n)m(um)m(b)s(ers)2463 b(21)0 366 y Fi(t)m(yp)s(e)36 -b Fn(mod)29 b(\(const)g Fi(t)m(yp)s(e)5 b Fn(&)30 b(x,)g(const)f -Fi(t)m(yp)s(e)5 b Fn(&)30 b(y\))0 491 y Fi(t)m(yp)s(e)36 -b Fn(rem)29 b(\(const)g Fi(t)m(yp)s(e)5 b Fn(&)30 b(x,)g(const)f -Fi(t)m(yp)s(e)5 b Fn(&)30 b(y\))0 906 y Fq(4.7)68 b(Ro)t(ots)0 -1180 y Fp(Eac)m(h)31 b(of)g(the)f(classes)i Fn(cl_R)p -Fp(,)d Fn(cl_F)p Fp(,)g Fn(cl_SF)p Fp(,)h Fn(cl_FF)p -Fp(,)f Fn(cl_DF)p Fp(,)g Fn(cl_LF)g Fp(de\014nes)g(the)i(follo)m(wing)h -(op)s(eration:)0 1476 y Fi(t)m(yp)s(e)k Fn(sqrt)29 b(\(const)g -Fi(t)m(yp)s(e)5 b Fn(&)30 b(x\))480 1601 y(x)35 b Fp(m)m(ust)f(b)s(e)g -Fn(>)p Fp(=)h(0.)55 b(This)35 b(function)g(returns)e(the)j(square)f(ro) -s(ot)g(of)g Fn(x)p Fp(,)i(normalized)d(to)i(b)s(e)f Fn(>)p -Fp(=)f(0.)480 1725 y(If)c Fn(x)h Fp(is)g(the)g(square)f(of)h(a)g -(rational)h(n)m(um)m(b)s(er,)d Fn(sqrt\(x\))g Fp(will)i(b)s(e)f(a)i +21 22 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +b(on)f(n)m(um)m(b)s(ers)2463 b(21)0 366 y Fk(t)m(yp)s(e)36 +b Fp(mod)29 b(\(const)g Fk(t)m(yp)s(e)5 b Fp(&)30 b(x,)g(const)f +Fk(t)m(yp)s(e)5 b Fp(&)30 b(y\))0 491 y Fk(t)m(yp)s(e)36 +b Fp(rem)29 b(\(const)g Fk(t)m(yp)s(e)5 b Fp(&)30 b(x,)g(const)f +Fk(t)m(yp)s(e)5 b Fp(&)30 b(y\))0 906 y Fs(4.7)68 b(Ro)t(ots)0 +1180 y Fr(Eac)m(h)31 b(of)g(the)f(classes)i Fp(cl_R)p +Fr(,)d Fp(cl_F)p Fr(,)g Fp(cl_SF)p Fr(,)h Fp(cl_FF)p +Fr(,)f Fp(cl_DF)p Fr(,)g Fp(cl_LF)g Fr(de\014nes)g(the)i(follo)m(wing)h +(op)s(eration:)0 1476 y Fk(t)m(yp)s(e)k Fp(sqrt)29 b(\(const)g +Fk(t)m(yp)s(e)5 b Fp(&)30 b(x\))480 1601 y(x)35 b Fr(m)m(ust)f(b)s(e)g +Fp(>)p Fr(=)h(0.)55 b(This)35 b(function)g(returns)e(the)j(square)f(ro) +s(ot)g(of)g Fp(x)p Fr(,)i(normalized)d(to)i(b)s(e)f Fp(>)p +Fr(=)f(0.)480 1725 y(If)c Fp(x)h Fr(is)g(the)g(square)f(of)h(a)g +(rational)h(n)m(um)m(b)s(er,)d Fp(sqrt\(x\))g Fr(will)i(b)s(e)f(a)i (rational)g(n)m(um)m(b)s(er,)d(else)i(it)h(will)480 1850 y(return)d(a)i(\015oating-p)s(oin)m(t)h(appro)m(ximation.)0 -2146 y(The)e(classes)h Fn(cl_RA)p Fp(,)e Fn(cl_I)h Fp(de\014ne)f(the)i -(follo)m(wing)h(op)s(eration:)0 2442 y Fn(cl_boolean)c(sqrtp)h(\(const) -f Fi(t)m(yp)s(e)5 b Fn(&)31 b(x,)e Fi(t)m(yp)s(e)5 b -Fn(*)31 b(root\))480 2567 y Fp(This)25 b(tests)i(whether)f -Fn(x)g Fp(is)g(a)g(p)s(erfect)g(square.)39 b(If)26 b(so,)i(it)e +2146 y(The)e(classes)h Fp(cl_RA)p Fr(,)e Fp(cl_I)h Fr(de\014ne)f(the)i +(follo)m(wing)h(op)s(eration:)0 2442 y Fp(cl_boolean)c(sqrtp)h(\(const) +f Fk(t)m(yp)s(e)5 b Fp(&)31 b(x,)e Fk(t)m(yp)s(e)5 b +Fp(*)31 b(root\))480 2567 y Fr(This)25 b(tests)i(whether)f +Fp(x)g Fr(is)g(a)g(p)s(erfect)g(square.)39 b(If)26 b(so,)i(it)e (returns)f(true)h(and)g(the)g(exact)i(square)e(ro)s(ot)480 -2691 y(in)k Fn(*root)p Fp(,)f(else)i(it)g(returns)f(false.)0 +2691 y(in)k Fp(*root)p Fr(,)f(else)i(it)g(returns)f(false.)0 2988 y(F)-8 b(urthermore,)30 b(for)g(in)m(tegers,)i(similarly:)0 -3284 y Fn(cl_boolean)c(isqrt)h(\(const)f Fi(t)m(yp)s(e)5 -b Fn(&)31 b(x,)e Fi(t)m(yp)s(e)5 b Fn(*)31 b(root\))480 -3408 y(x)f Fp(should)g(b)s(e)g Fn(>)p Fp(=)g(0.)42 b(This)30 -b(function)h(sets)g Fn(*root)e Fp(to)i Fn(floor\(sqrt\(x\)\))c -Fp(and)j(returns)g(the)h(same)480 3533 y(v)-5 b(alue)31 -b(as)f Fn(sqrtp)p Fp(:)40 b(the)30 b(b)s(o)s(olean)h(v)-5 -b(alue)31 b Fn(\(expt\(*root,2\))26 b(==)k(x\))p Fp(.)0 -3829 y(F)-8 b(or)31 b Fn(n)p Fp(th)f(ro)s(ots,)h(the)f(classes)i -Fn(cl_RA)p Fp(,)d Fn(cl_I)g Fp(de\014ne)h(the)g(follo)m(wing)i(op)s -(eration:)0 4125 y Fn(cl_boolean)c(rootp)h(\(const)f -Fi(t)m(yp)s(e)5 b Fn(&)31 b(x,)e(const)g(cl_I&)g(n,)h -Fi(t)m(yp)s(e)5 b Fn(*)30 b(root\))480 4250 y(x)36 b -Fp(m)m(ust)f(b)s(e)g Fn(>)p Fp(=)g(0.)58 b Fn(n)36 b -Fp(m)m(ust)f(b)s(e)g Fn(>)h Fp(0.)58 b(This)35 b(tests)i(whether)e -Fn(x)h Fp(is)g(an)g Fn(n)p Fp(th)f(p)s(o)m(w)m(er)h(of)g(a)h(rational) +3284 y Fp(cl_boolean)c(isqrt)h(\(const)f Fk(t)m(yp)s(e)5 +b Fp(&)31 b(x,)e Fk(t)m(yp)s(e)5 b Fp(*)31 b(root\))480 +3408 y(x)f Fr(should)g(b)s(e)g Fp(>)p Fr(=)g(0.)42 b(This)30 +b(function)h(sets)g Fp(*root)e Fr(to)i Fp(floor\(sqrt\(x\)\))c +Fr(and)j(returns)g(the)h(same)480 3533 y(v)-5 b(alue)31 +b(as)f Fp(sqrtp)p Fr(:)40 b(the)30 b(b)s(o)s(olean)h(v)-5 +b(alue)31 b Fp(\(expt\(*root,2\))26 b(==)k(x\))p Fr(.)0 +3829 y(F)-8 b(or)31 b Fp(n)p Fr(th)f(ro)s(ots,)h(the)f(classes)i +Fp(cl_RA)p Fr(,)d Fp(cl_I)g Fr(de\014ne)h(the)g(follo)m(wing)i(op)s +(eration:)0 4125 y Fp(cl_boolean)c(rootp)h(\(const)f +Fk(t)m(yp)s(e)5 b Fp(&)31 b(x,)e(const)g(cl_I&)g(n,)h +Fk(t)m(yp)s(e)5 b Fp(*)30 b(root\))480 4250 y(x)36 b +Fr(m)m(ust)f(b)s(e)g Fp(>)p Fr(=)g(0.)58 b Fp(n)36 b +Fr(m)m(ust)f(b)s(e)g Fp(>)h Fr(0.)58 b(This)35 b(tests)i(whether)e +Fp(x)h Fr(is)g(an)g Fp(n)p Fr(th)f(p)s(o)m(w)m(er)h(of)g(a)h(rational) 480 4374 y(n)m(um)m(b)s(er.)h(If)30 b(so,)h(it)g(returns)e(true)h(and)g -(the)h(exact)h(ro)s(ot)e(in)g Fn(*root)p Fp(,)g(else)h(it)g(returns)e +(the)h(exact)h(ro)s(ot)e(in)g Fp(*root)p Fr(,)g(else)h(it)g(returns)e (false.)0 4670 y(The)h(only)g(square)g(ro)s(ot)h(function)f(whic)m(h)g (accepts)i(negativ)m(e)h(n)m(um)m(b)s(ers)28 b(is)i(the)h(one)f(for)g -(class)h Fn(cl_N)p Fp(:)0 4966 y Fn(cl_N)e(sqrt)g(\(const)g(cl_N&)g -(z\))480 5091 y Fp(Returns)38 b(the)i(square)f(ro)s(ot)h(of)f -Fn(z)p Fp(,)j(as)d(de\014ned)g(b)m(y)g(the)g(form)m(ula)g -Fn(sqrt\(z\))28 b(=)i(exp\(log\(z\)/2\))p Fp(.)480 5215 +(class)h Fp(cl_N)p Fr(:)0 4966 y Fp(cl_N)e(sqrt)g(\(const)g(cl_N&)g +(z\))480 5091 y Fr(Returns)38 b(the)i(square)f(ro)s(ot)h(of)f +Fp(z)p Fr(,)j(as)d(de\014ned)g(b)m(y)g(the)g(form)m(ula)g +Fp(sqrt\(z\))28 b(=)i(exp\(log\(z\)/2\))p Fr(.)480 5215 y(Con)m(v)m(ersion)44 b(to)g(a)f(\015oating-p)s(oin)m(t)i(t)m(yp)s(e)e (or)h(to)g(a)f(complex)g(n)m(um)m(b)s(er)e(are)j(done)f(if)g(necessary) -8 b(.)480 5340 y(The)31 b(range)h(of)g(the)g(result)g(is)g(the)g(righ) -m(t)g(half)g(plane)g Fn(realpart\(sqrt\(z\)\))25 b(>=)30 -b(0)h Fp(including)h(the)p eop +m(t)g(half)g(plane)g Fp(realpart\(sqrt\(z\)\))25 b(>=)30 +b(0)h Fr(including)h(the)p eop %%Page: 22 24 -22 23 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +22 23 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 b(on)f(n)m(um)m(b)s(ers)2463 b(22)480 366 y(p)s(ositiv)m(e)35 b(imaginary)e(axis)h(and)g(0,)h(but)e(excluding)h(the)g(negativ)m(e)i (imaginary)d(axis.)52 b(The)33 b(result)480 491 y(is)d(an)h(exact)h(n)m -(um)m(b)s(er)c(only)i(if)g Fn(z)g Fp(is)h(an)f(exact)i(n)m(um)m(b)s -(er.)0 930 y Fq(4.8)68 b(T)-11 b(ranscenden)l(tal)31 -b(functions)0 1204 y Fp(The)c(transcenden)m(tal)h(functions)e(return)h +(um)m(b)s(er)c(only)i(if)g Fp(z)g Fr(is)h(an)f(exact)i(n)m(um)m(b)s +(er.)0 930 y Fs(4.8)68 b(T)-11 b(ranscenden)l(tal)31 +b(functions)0 1204 y Fr(The)c(transcenden)m(tal)h(functions)e(return)h (an)g(exact)h(result)f(if)g(the)h(argumen)m(t)e(is)i(exact)g(and)f(the) g(result)g(is)g(exact)0 1329 y(as)k(w)m(ell.)44 b(Otherwise)31 b(they)g(m)m(ust)f(return)g(inexact)i(n)m(um)m(b)s(ers)d(ev)m(en)j(if)f (the)g(argumen)m(t)g(is)g(exact.)44 b(F)-8 b(or)32 b(example,)0 -1453 y Fn(cos\(0\))d(=)h(1)g Fp(returns)f(the)h(rational)i(n)m(um)m(b)s -(er)c Fn(1)p Fp(.)0 1860 y Fk(4.8.1)63 b(Exp)s(onen)m(tial)30 -b(and)g(logarithmic)g(functions)0 2156 y Fn(cl_R)f(exp)h(\(const)e +1453 y Fp(cos\(0\))d(=)h(1)g Fr(returns)f(the)h(rational)i(n)m(um)m(b)s +(er)c Fp(1)p Fr(.)0 1860 y Fm(4.8.1)63 b(Exp)s(onen)m(tial)30 +b(and)g(logarithmic)g(functions)0 2156 y Fp(cl_R)f(exp)h(\(const)e (cl_R&)h(x\))0 2281 y(cl_N)g(exp)h(\(const)e(cl_N&)h(x\))480 -2405 y Fp(Returns)j(the)h(exp)s(onen)m(tial)h(function)f(of)g -Fn(x)p Fp(.)48 b(This)32 b(is)h Fn(e^x)f Fp(where)g Fn(e)h -Fp(is)g(the)g(base)g(of)g(the)g(natural)480 2530 y(logarithms.)41 +2405 y Fr(Returns)j(the)h(exp)s(onen)m(tial)h(function)f(of)g +Fp(x)p Fr(.)48 b(This)32 b(is)h Fp(e^x)f Fr(where)g Fp(e)h +Fr(is)g(the)g(base)g(of)g(the)g(natural)480 2530 y(logarithms.)41 b(The)29 b(range)i(of)g(the)f(result)h(is)f(the)h(en)m(tire)g(complex)f -(plane)g(excluding)h(0.)0 2700 y Fn(cl_R)e(ln)h(\(const)f(cl_R&)g(x\)) -480 2824 y(x)h Fp(m)m(ust)f(b)s(e)h Fn(>)g Fp(0.)41 b(Returns)30 -b(the)g(\(natural\))h(logarithm)g(of)f(x.)0 2994 y Fn(cl_N)f(log)h -(\(const)e(cl_N&)h(x\))480 3119 y Fp(Returns)43 b(the)i(\(natural\))f -(logarithm)h(of)f(x.)82 b(If)44 b Fn(x)f Fp(is)i(real)f(and)g(p)s -(ositiv)m(e,)49 b(this)44 b(is)g Fn(ln\(x\))p Fp(.)81 -b(In)480 3243 y(general,)34 b Fn(log\(x\))29 b(=)h(log\(abs\(x\)\))d(+) -j(i*phase\(x\))p Fp(.)45 b(The)32 b(range)g(of)h(the)g(result)f(is)h +(plane)g(excluding)h(0.)0 2700 y Fp(cl_R)e(ln)h(\(const)f(cl_R&)g(x\)) +480 2824 y(x)h Fr(m)m(ust)f(b)s(e)h Fp(>)g Fr(0.)41 b(Returns)30 +b(the)g(\(natural\))h(logarithm)g(of)f(x.)0 2994 y Fp(cl_N)f(log)h +(\(const)e(cl_N&)h(x\))480 3119 y Fr(Returns)43 b(the)i(\(natural\))f +(logarithm)h(of)f(x.)82 b(If)44 b Fp(x)f Fr(is)i(real)f(and)g(p)s +(ositiv)m(e,)49 b(this)44 b(is)g Fp(ln\(x\))p Fr(.)81 +b(In)480 3243 y(general,)34 b Fp(log\(x\))29 b(=)h(log\(abs\(x\)\))d(+) +j(i*phase\(x\))p Fr(.)45 b(The)32 b(range)g(of)h(the)g(result)f(is)h (the)f(strip)g(in)480 3368 y(the)f(complex)f(plane)g -Fn(-pi)g(<)g(imagpart\(log\(x\)\))25 b(<=)30 b(pi)p Fp(.)0 -3538 y Fn(cl_R)f(phase)g(\(const)g(cl_N&)g(x\))480 3662 -y Fp(Returns)38 b(the)h(angle)g(part)g(of)g Fn(x)f Fp(in)g(its)h(p)s +Fp(-pi)g(<)g(imagpart\(log\(x\)\))25 b(<=)30 b(pi)p Fr(.)0 +3538 y Fp(cl_R)f(phase)g(\(const)g(cl_N&)g(x\))480 3662 +y Fr(Returns)38 b(the)h(angle)g(part)g(of)g Fp(x)f Fr(in)g(its)h(p)s (olar)g(represen)m(tation)g(as)g(a)g(complex)g(n)m(um)m(b)s(er.)63 -b(That)480 3787 y(is,)34 b Fn(phase\(x\))28 b(=)i -(atan\(realpart\(x\),imagpart)o(\(x\)\))o Fp(.)43 b(This)33 +b(That)480 3787 y(is,)34 b Fp(phase\(x\))28 b(=)i +(atan\(realpart\(x\),imagpart)o(\(x\)\))o Fr(.)43 b(This)33 b(is)g(also)h(the)f(imaginary)g(part)g(of)480 3911 y -Fn(log\(x\))p Fp(.)41 b(The)31 b(range)g(of)g(the)h(result)f(is)g(the)g -(in)m(terv)-5 b(al)32 b Fn(-pi)e(<)g(phase\(x\))e(<=)i(pi)p -Fp(.)42 b(The)31 b(result)g(will)480 4036 y(b)s(e)f(an)g(exact)i(n)m -(um)m(b)s(er)c(only)i(if)h Fn(zerop\(x\))d Fp(or)i(if)h -Fn(x)f Fp(is)g(real)h(and)f(p)s(ositiv)m(e.)0 4206 y -Fn(cl_R)f(log)h(\(const)e(cl_R&)h(a,)h(const)f(cl_R&)g(b\))480 -4330 y(a)j Fp(and)g Fn(b)g Fp(m)m(ust)g(b)s(e)g Fn(>)g -Fp(0.)48 b(Returns)31 b(the)i(logarithm)g(of)f Fn(a)g -Fp(with)h(resp)s(ect)f(to)i(base)e Fn(b)p Fp(.)47 b Fn(log\(a,b\))28 -b(=)480 4455 y(ln\(a\)/ln\(b\))p Fp(.)38 b(The)30 b(result)g(can)g(b)s -(e)g(exact)i(only)f(if)f Fn(a)g(=)g(1)g Fp(or)g(if)h -Fn(a)f Fp(and)g Fn(b)g Fp(are)g(b)s(oth)g(rational.)0 -4624 y Fn(cl_N)f(log)h(\(const)e(cl_N&)h(a,)h(const)f(cl_N&)g(b\))480 -4749 y Fp(Returns)g(the)i(logarithm)f(of)h Fn(a)f Fp(with)g(resp)s(ect) -g(to)i(base)e Fn(b)p Fp(.)40 b Fn(log\(a,b\))29 b(=)h -(log\(a\)/log\(b\))p Fp(.)0 4919 y Fn(cl_N)f(expt)g(\(const)g(cl_N&)g -(x,)h(const)f(cl_N&)g(y\))480 5043 y Fp(Exp)s(onen)m(tiation:)42 -b(Returns)29 b Fn(x^y)g(=)h(exp\(y*log\(x\)\))p Fp(.)0 +Fp(log\(x\))p Fr(.)41 b(The)31 b(range)g(of)g(the)h(result)f(is)g(the)g +(in)m(terv)-5 b(al)32 b Fp(-pi)e(<)g(phase\(x\))e(<=)i(pi)p +Fr(.)42 b(The)31 b(result)g(will)480 4036 y(b)s(e)f(an)g(exact)i(n)m +(um)m(b)s(er)c(only)i(if)h Fp(zerop\(x\))d Fr(or)i(if)h +Fp(x)f Fr(is)g(real)h(and)f(p)s(ositiv)m(e.)0 4206 y +Fp(cl_R)f(log)h(\(const)e(cl_R&)h(a,)h(const)f(cl_R&)g(b\))480 +4330 y(a)j Fr(and)g Fp(b)g Fr(m)m(ust)g(b)s(e)g Fp(>)g +Fr(0.)48 b(Returns)31 b(the)i(logarithm)g(of)f Fp(a)g +Fr(with)h(resp)s(ect)f(to)i(base)e Fp(b)p Fr(.)47 b Fp(log\(a,b\))28 +b(=)480 4455 y(ln\(a\)/ln\(b\))p Fr(.)38 b(The)30 b(result)g(can)g(b)s +(e)g(exact)i(only)f(if)f Fp(a)g(=)g(1)g Fr(or)g(if)h +Fp(a)f Fr(and)g Fp(b)g Fr(are)g(b)s(oth)g(rational.)0 +4624 y Fp(cl_N)f(log)h(\(const)e(cl_N&)h(a,)h(const)f(cl_N&)g(b\))480 +4749 y Fr(Returns)g(the)i(logarithm)f(of)h Fp(a)f Fr(with)g(resp)s(ect) +g(to)i(base)e Fp(b)p Fr(.)40 b Fp(log\(a,b\))29 b(=)h +(log\(a\)/log\(b\))p Fr(.)0 4919 y Fp(cl_N)f(expt)g(\(const)g(cl_N&)g +(x,)h(const)f(cl_N&)g(y\))480 5043 y Fr(Exp)s(onen)m(tiation:)42 +b(Returns)29 b Fp(x^y)g(=)h(exp\(y*log\(x\)\))p Fr(.)0 5340 y(The)g(constan)m(t)i(e)e(=)g(exp\(1\))i(=)e(2.71828)p -Fl(:)15 b(:)g(:)34 b Fp(is)c(returned)g(b)m(y)g(the)g(follo)m(wing)i +Fn(:)15 b(:)g(:)34 b Fr(is)c(returned)g(b)m(y)g(the)g(follo)m(wing)i (functions:)p eop %%Page: 23 25 -23 24 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 -b(on)f(n)m(um)m(b)s(ers)2463 b(23)0 366 y Fn(cl_F)29 -b(cl_exp1)g(\(cl_float_format_t)c(f\))480 491 y Fp(Returns)k(e)i(as)g -(a)g(\015oat)g(of)f(format)g Fn(f)p Fp(.)0 657 y Fn(cl_F)f(cl_exp1)g -(\(const)f(cl_F&)h(y\))480 782 y Fp(Returns)g(e)i(in)f(the)h(\015oat)g -(format)f(of)g Fn(y)p Fp(.)0 948 y Fn(cl_F)f(cl_exp1)g(\(void\))480 -1073 y Fp(Returns)g(e)i(as)g(a)g(\015oat)g(of)f(format)g -Fn(cl_default_float_format)p Fp(.)0 1472 y Fk(4.8.2)63 -b(T)-10 b(rigonometric)30 b(functions)0 1767 y Fn(cl_R)f(sin)h(\(const) -e(cl_R&)h(x\))480 1892 y Fp(Returns)g Fn(sin\(x\))p Fp(.)39 +23 24 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +b(on)f(n)m(um)m(b)s(ers)2463 b(23)0 366 y Fp(cl_F)29 +b(cl_exp1)g(\(cl_float_format_t)c(f\))480 491 y Fr(Returns)k(e)i(as)g +(a)g(\015oat)g(of)f(format)g Fp(f)p Fr(.)0 657 y Fp(cl_F)f(cl_exp1)g +(\(const)f(cl_F&)h(y\))480 782 y Fr(Returns)g(e)i(in)f(the)h(\015oat)g +(format)f(of)g Fp(y)p Fr(.)0 948 y Fp(cl_F)f(cl_exp1)g(\(void\))480 +1073 y Fr(Returns)g(e)i(as)g(a)g(\015oat)g(of)f(format)g +Fp(cl_default_float_format)p Fr(.)0 1472 y Fm(4.8.2)63 +b(T)-10 b(rigonometric)30 b(functions)0 1767 y Fp(cl_R)f(sin)h(\(const) +e(cl_R&)h(x\))480 1892 y Fr(Returns)g Fp(sin\(x\))p Fr(.)39 b(The)30 b(range)h(of)g(the)f(result)g(is)h(the)f(in)m(terv)-5 -b(al)32 b Fn(-1)e(<=)f(sin\(x\))g(<=)h(1)p Fp(.)0 2058 -y Fn(cl_N)f(sin)h(\(const)e(cl_N&)h(z\))480 2183 y Fp(Returns)g -Fn(sin\(z\))p Fp(.)39 b(The)30 b(range)h(of)g(the)f(result)g(is)h(the)f -(en)m(tire)i(complex)e(plane.)0 2349 y Fn(cl_R)f(cos)h(\(const)e(cl_R&) -h(x\))480 2474 y Fp(Returns)g Fn(cos\(x\))p Fp(.)39 b(The)30 +b(al)32 b Fp(-1)e(<=)f(sin\(x\))g(<=)h(1)p Fr(.)0 2058 +y Fp(cl_N)f(sin)h(\(const)e(cl_N&)h(z\))480 2183 y Fr(Returns)g +Fp(sin\(z\))p Fr(.)39 b(The)30 b(range)h(of)g(the)f(result)g(is)h(the)f +(en)m(tire)i(complex)e(plane.)0 2349 y Fp(cl_R)f(cos)h(\(const)e(cl_R&) +h(x\))480 2474 y Fr(Returns)g Fp(cos\(x\))p Fr(.)39 b(The)30 b(range)h(of)g(the)f(result)g(is)h(the)f(in)m(terv)-5 -b(al)32 b Fn(-1)e(<=)f(cos\(x\))g(<=)h(1)p Fp(.)0 2640 -y Fn(cl_N)f(cos)h(\(const)e(cl_N&)h(x\))480 2764 y Fp(Returns)g -Fn(cos\(z\))p Fp(.)39 b(The)30 b(range)h(of)g(the)f(result)g(is)h(the)f -(en)m(tire)i(complex)e(plane.)0 2931 y Fn(struct)f(cl_cos_sin_t)e({)j +b(al)32 b Fp(-1)e(<=)f(cos\(x\))g(<=)h(1)p Fr(.)0 2640 +y Fp(cl_N)f(cos)h(\(const)e(cl_N&)h(x\))480 2764 y Fr(Returns)g +Fp(cos\(z\))p Fr(.)39 b(The)30 b(range)h(of)g(the)f(result)g(is)h(the)f +(en)m(tire)i(complex)e(plane.)0 2931 y Fp(struct)f(cl_cos_sin_t)e({)j (cl_R)f(cos;)g(cl_R)g(sin;)h(};)0 3055 y(cl_cos_sin_t)d(cl_cos_sin)h -(\(const)g(cl_R&)h(x\))480 3180 y Fp(Returns)k(b)s(oth)h -Fn(sin\(x\))f Fp(and)g Fn(cos\(x\))p Fp(.)51 b(This)34 +(\(const)g(cl_R&)h(x\))480 3180 y Fr(Returns)k(b)s(oth)h +Fp(sin\(x\))f Fr(and)g Fp(cos\(x\))p Fr(.)51 b(This)34 b(is)g(more)g(e\016cien)m(t)i(than)e(computing)f(them)g(sepa-)480 -3304 y(rately)-8 b(.)42 b(The)30 b(relation)i Fn(cos^2)d(+)h(sin^2)e(=) -j(1)f Fp(will)g(hold)g(only)h(appro)m(ximately)-8 b(.)0 -3471 y Fn(cl_R)29 b(tan)h(\(const)e(cl_R&)h(x\))0 3595 -y(cl_N)g(tan)h(\(const)e(cl_N&)h(x\))480 3720 y Fp(Returns)g -Fn(tan\(x\))g(=)h(sin\(x\)/cos\(x\))p Fp(.)0 3886 y Fn(cl_N)f(cis)h +3304 y(rately)-8 b(.)42 b(The)30 b(relation)i Fp(cos^2)d(+)h(sin^2)e(=) +j(1)f Fr(will)g(hold)g(only)h(appro)m(ximately)-8 b(.)0 +3471 y Fp(cl_R)29 b(tan)h(\(const)e(cl_R&)h(x\))0 3595 +y(cl_N)g(tan)h(\(const)e(cl_N&)h(x\))480 3720 y Fr(Returns)g +Fp(tan\(x\))g(=)h(sin\(x\)/cos\(x\))p Fr(.)0 3886 y Fp(cl_N)f(cis)h (\(const)e(cl_R&)h(x\))0 4011 y(cl_N)g(cis)h(\(const)e(cl_N&)h(x\))480 -4135 y Fp(Returns)h Fn(exp\(i*x\))p Fp(.)41 b(The)30 -b(name)g(`)p Fn(cis)p Fp(')h(means)f(\\cos)i Fn(+)f Fp(i)g(sin",)g(b)s -(ecause)g Fn(e^\(i*x\))e(=)h(cos\(x\))e(+)480 4260 y(i*sin\(x\))p -Fp(.)0 4426 y Fn(cl_N)h(asin)g(\(const)g(cl_N&)g(z\))480 -4551 y Fp(Returns)24 b Fn(arcsin\(z\))p Fp(.)37 b(This)24 -b(is)h(de\014ned)f(as)h Fn(arcsin\(z\))j(=)i(log\(iz+sqrt\(1-z^2\)\)/i) -20 b Fp(and)k(sat-)480 4675 y(is\014es)g Fn(arcsin\(-z\))j(=)j -(-arcsin\(z\))p Fp(.)36 b(The)23 b(range)i(of)f(the)g(result)f(is)h +4135 y Fr(Returns)h Fp(exp\(i*x\))p Fr(.)41 b(The)30 +b(name)g(`)p Fp(cis)p Fr(')h(means)f(\\cos)i Fp(+)f Fr(i)g(sin",)g(b)s +(ecause)g Fp(e^\(i*x\))e(=)h(cos\(x\))e(+)480 4260 y(i*sin\(x\))p +Fr(.)0 4426 y Fp(cl_N)h(asin)g(\(const)g(cl_N&)g(z\))480 +4551 y Fr(Returns)24 b Fp(arcsin\(z\))p Fr(.)37 b(This)24 +b(is)h(de\014ned)f(as)h Fp(arcsin\(z\))j(=)i(log\(iz+sqrt\(1-z^2\)\)/i) +20 b Fr(and)k(sat-)480 4675 y(is\014es)g Fp(arcsin\(-z\))j(=)j +(-arcsin\(z\))p Fr(.)36 b(The)23 b(range)i(of)f(the)g(result)f(is)h (the)g(strip)g(in)f(the)h(complex)g(do-)480 4800 y(main)g -Fn(-pi/2)29 b(<=)h(realpart\(arcsin\(z\)\))25 b(<=)30 -b(pi/2)p Fp(,)25 b(excluding)g(the)h(n)m(um)m(b)s(ers)c(with)j -Fn(realpart)480 4925 y(=)30 b(-pi/2)c Fp(and)g Fn(imagpart)i(<)i(0)d -Fp(and)f(the)h(n)m(um)m(b)s(ers)e(with)i Fn(realpart)h(=)i(pi/2)25 -b Fp(and)i Fn(imagpart)h(>)i(0)p Fp(.)0 5091 y Fn(cl_N)f(acos)g -(\(const)g(cl_N&)g(z\))480 5215 y Fp(Returns)19 b Fn(arccos\(z\))p -Fp(.)35 b(This)20 b(is)g(de\014ned)f(as)i Fn(arccos\(z\))27 +Fp(-pi/2)29 b(<=)h(realpart\(arcsin\(z\)\))25 b(<=)30 +b(pi/2)p Fr(,)25 b(excluding)g(the)h(n)m(um)m(b)s(ers)c(with)j +Fp(realpart)480 4925 y(=)30 b(-pi/2)c Fr(and)g Fp(imagpart)i(<)i(0)d +Fr(and)f(the)h(n)m(um)m(b)s(ers)e(with)i Fp(realpart)h(=)i(pi/2)25 +b Fr(and)i Fp(imagpart)h(>)i(0)p Fr(.)0 5091 y Fp(cl_N)f(acos)g +(\(const)g(cl_N&)g(z\))480 5215 y Fr(Returns)19 b Fp(arccos\(z\))p +Fr(.)35 b(This)20 b(is)g(de\014ned)f(as)i Fp(arccos\(z\))27 b(=)j(pi/2)g(-)g(arcsin\(z\))d(=)k(log\(z+i*sqrt\(1-)480 -5340 y(z^2\)\)/i)36 b Fp(and)i(satis\014es)g Fn(arccos\(-z\))28 -b(=)i(pi)g(-)g(arccos\(z\))p Fp(.)61 b(The)38 b(range)h(of)f(the)g +5340 y(z^2\)\)/i)36 b Fr(and)i(satis\014es)g Fp(arccos\(-z\))28 +b(=)i(pi)g(-)g(arccos\(z\))p Fr(.)61 b(The)38 b(range)h(of)f(the)g (result)h(is)f(the)p eop %%Page: 24 26 -24 25 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +24 25 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 b(on)f(n)m(um)m(b)s(ers)2463 b(24)480 366 y(strip)40 -b(in)f(the)i(complex)e(domain)g Fn(0)30 b(<=)g(realpart\(arcsin\(z\)\)) -25 b(<=)30 b(pi)p Fp(,)42 b(excluding)e(the)g(n)m(um-)480 -491 y(b)s(ers)33 b(with)g Fn(realpart)28 b(=)i(0)k Fp(and)f -Fn(imagpart)28 b(<)i(0)k Fp(and)f(the)h(n)m(um)m(b)s(ers)e(with)h -Fn(realpart)28 b(=)i(pi)k Fp(and)480 616 y Fn(imagpart)28 -b(>)i(0)p Fp(.)0 785 y Fn(cl_R)f(atan)g(\(const)g(cl_R&)g(x,)h(const)f -(cl_R&)g(y\))480 910 y Fp(Returns)37 b(the)i(angle)g(of)g(the)f(p)s +b(in)f(the)i(complex)e(domain)g Fp(0)30 b(<=)g(realpart\(arcsin\(z\)\)) +25 b(<=)30 b(pi)p Fr(,)42 b(excluding)e(the)g(n)m(um-)480 +491 y(b)s(ers)33 b(with)g Fp(realpart)28 b(=)i(0)k Fr(and)f +Fp(imagpart)28 b(<)i(0)k Fr(and)f(the)h(n)m(um)m(b)s(ers)e(with)h +Fp(realpart)28 b(=)i(pi)k Fr(and)480 616 y Fp(imagpart)28 +b(>)i(0)p Fr(.)0 785 y Fp(cl_R)f(atan)g(\(const)g(cl_R&)g(x,)h(const)f +(cl_R&)g(y\))480 910 y Fr(Returns)37 b(the)i(angle)g(of)g(the)f(p)s (olar)g(represen)m(tation)h(of)g(the)f(complex)g(n)m(um)m(b)s(er)e -Fn(x+iy)p Fp(.)63 b(This)38 b(is)480 1034 y Fn(atan\(y/x\))27 -b Fp(if)i Fn(x>0)p Fp(.)40 b(The)28 b(range)i(of)f(the)h(result)f(is)h -(the)f(in)m(terv)-5 b(al)31 b Fn(-pi)e(<)h(atan\(x,y\))e(<=)i(pi)p -Fp(.)39 b(The)480 1159 y(result)j(will)g(b)s(e)f(an)g(exact)i(n)m(um)m -(b)s(er)d(only)h(if)h Fn(x)30 b(>)g(0)41 b Fp(and)h Fn(y)f -Fp(is)h(the)f(exact)j Fn(0)p Fp(.)74 b(W)-10 b(ARNING:)43 +Fp(x+iy)p Fr(.)63 b(This)38 b(is)480 1034 y Fp(atan\(y/x\))27 +b Fr(if)i Fp(x>0)p Fr(.)40 b(The)28 b(range)i(of)f(the)h(result)f(is)h +(the)f(in)m(terv)-5 b(al)31 b Fp(-pi)e(<)h(atan\(x,y\))e(<=)i(pi)p +Fr(.)39 b(The)480 1159 y(result)j(will)g(b)s(e)f(an)g(exact)i(n)m(um)m +(b)s(er)d(only)h(if)h Fp(x)30 b(>)g(0)41 b Fr(and)h Fp(y)f +Fr(is)h(the)f(exact)j Fp(0)p Fr(.)74 b(W)-10 b(ARNING:)43 b(In)480 1283 y(Common)26 b(Lisp,)i(this)g(function)g(is)g(called)h(as) -g Fn(\(atan)g(y)h(x\))p Fp(,)e(with)g(rev)m(ersed)g(order)g(of)g -(argumen)m(ts.)0 1453 y Fn(cl_R)h(atan)g(\(const)g(cl_R&)g(x\))480 -1578 y Fp(Returns)36 b Fn(arctan\(x\))p Fp(.)59 b(This)37 -b(is)g(the)g(same)g(as)g Fn(atan\(1,x\))p Fp(.)59 b(The)37 +g Fp(\(atan)g(y)h(x\))p Fr(,)e(with)g(rev)m(ersed)g(order)g(of)g +(argumen)m(ts.)0 1453 y Fp(cl_R)h(atan)g(\(const)g(cl_R&)g(x\))480 +1578 y Fr(Returns)36 b Fp(arctan\(x\))p Fr(.)59 b(This)37 +b(is)g(the)g(same)g(as)g Fp(atan\(1,x\))p Fr(.)59 b(The)37 b(range)g(of)h(the)f(result)g(is)h(the)480 1702 y(in)m(terv)-5 -b(al)34 b Fn(-pi/2)29 b(<)h(atan\(x\))e(<)i(pi/2)p Fp(.)47 +b(al)34 b Fp(-pi/2)29 b(<)h(atan\(x\))e(<)i(pi/2)p Fr(.)47 b(The)32 b(result)g(will)h(b)s(e)f(an)h(exact)h(n)m(um)m(b)s(er)c(only) -j(if)g Fn(x)f Fp(is)h(the)480 1827 y(exact)f Fn(0)p Fp(.)0 -1996 y Fn(cl_N)d(atan)g(\(const)g(cl_N&)g(z\))480 2121 -y Fp(Returns)43 b Fn(arctan\(z\))p Fp(.)80 b(This)44 -b(is)g(de\014ned)g(as)g Fn(arctan\(z\))28 b(=)i +j(if)g Fp(x)f Fr(is)h(the)480 1827 y(exact)f Fp(0)p Fr(.)0 +1996 y Fp(cl_N)d(atan)g(\(const)g(cl_N&)g(z\))480 2121 +y Fr(Returns)43 b Fp(arctan\(z\))p Fr(.)80 b(This)44 +b(is)g(de\014ned)g(as)g Fp(arctan\(z\))28 b(=)i (\(log\(1+iz\)-log\(1-iz\)\))25 b(/)30 b(2i)480 2245 -y Fp(and)23 b(satis\014es)h Fn(arctan\(-z\))k(=)i(-arctan\(z\))p -Fp(.)35 b(The)23 b(range)h(of)g(the)g(result)f(is)h(the)g(strip)f(in)g -(the)h(com-)480 2370 y(plex)45 b(domain)f Fn(-pi/2)29 -b(<=)h(realpart\(arctan\(z\)\))25 b(<=)30 b(pi/2)p Fp(,)47 +y Fr(and)23 b(satis\014es)h Fp(arctan\(-z\))k(=)i(-arctan\(z\))p +Fr(.)35 b(The)23 b(range)h(of)g(the)g(result)f(is)h(the)g(strip)f(in)g +(the)h(com-)480 2370 y(plex)45 b(domain)f Fp(-pi/2)29 +b(<=)h(realpart\(arctan\(z\)\))25 b(<=)30 b(pi/2)p Fr(,)47 b(excluding)e(the)h(n)m(um)m(b)s(ers)c(with)480 2494 -y Fn(realpart)28 b(=)i(-pi/2)42 b Fp(and)h Fn(imagpart)28 -b(>=)i(0)42 b Fp(and)h(the)h(n)m(um)m(b)s(ers)c(with)j -Fn(realpart)28 b(=)i(pi/2)43 b Fp(and)480 2619 y Fn(imagpart)28 -b(<=)i(0)p Fp(.)0 2915 y(The)g(constan)m(t)i(pi)e(=)g(3.14)p -Fl(:)15 b(:)g(:)33 b Fp(is)d(returned)f(b)m(y)h(the)h(follo)m(wing)h -(functions:)0 3212 y Fn(cl_F)d(cl_pi)g(\(cl_float_format_t)d(f\))480 -3336 y Fp(Returns)j(pi)i(as)f(a)h(\015oat)g(of)f(format)g -Fn(f)p Fp(.)0 3506 y Fn(cl_F)f(cl_pi)g(\(const)g(cl_F&)g(y\))480 -3631 y Fp(Returns)g(pi)i(in)f(the)g(\015oat)h(format)f(of)g -Fn(y)p Fp(.)0 3800 y Fn(cl_F)f(cl_pi)g(\(void\))480 3925 -y Fp(Returns)g(pi)i(as)f(a)h(\015oat)g(of)f(format)g -Fn(cl_default_float_format)p Fp(.)0 4331 y Fk(4.8.3)63 -b(Hyp)s(erb)s(olic)31 b(functions)0 4627 y Fn(cl_R)e(sinh)g(\(const)g -(cl_R&)g(x\))480 4752 y Fp(Returns)g Fn(sinh\(x\))p Fp(.)0 -4921 y Fn(cl_N)g(sinh)g(\(const)g(cl_N&)g(z\))480 5046 -y Fp(Returns)g Fn(sinh\(z\))p Fp(.)39 b(The)30 b(range)h(of)f(the)h +y Fp(realpart)28 b(=)i(-pi/2)42 b Fr(and)h Fp(imagpart)28 +b(>=)i(0)42 b Fr(and)h(the)h(n)m(um)m(b)s(ers)c(with)j +Fp(realpart)28 b(=)i(pi/2)43 b Fr(and)480 2619 y Fp(imagpart)28 +b(<=)i(0)p Fr(.)0 2915 y(Arc)m(himedes')g(constan)m(t)i(pi)e(=)g(3.14)p +Fn(:)15 b(:)g(:)33 b Fr(is)d(returned)f(b)m(y)h(the)h(follo)m(wing)h +(functions:)0 3212 y Fp(cl_F)d(cl_pi)g(\(cl_float_format_t)d(f\))480 +3336 y Fr(Returns)j(pi)i(as)f(a)h(\015oat)g(of)f(format)g +Fp(f)p Fr(.)0 3506 y Fp(cl_F)f(cl_pi)g(\(const)g(cl_F&)g(y\))480 +3631 y Fr(Returns)g(pi)i(in)f(the)g(\015oat)h(format)f(of)g +Fp(y)p Fr(.)0 3800 y Fp(cl_F)f(cl_pi)g(\(void\))480 3925 +y Fr(Returns)g(pi)i(as)f(a)h(\015oat)g(of)f(format)g +Fp(cl_default_float_format)p Fr(.)0 4331 y Fm(4.8.3)63 +b(Hyp)s(erb)s(olic)31 b(functions)0 4627 y Fp(cl_R)e(sinh)g(\(const)g +(cl_R&)g(x\))480 4752 y Fr(Returns)g Fp(sinh\(x\))p Fr(.)0 +4921 y Fp(cl_N)g(sinh)g(\(const)g(cl_N&)g(z\))480 5046 +y Fr(Returns)g Fp(sinh\(z\))p Fr(.)39 b(The)30 b(range)h(of)f(the)h (result)f(is)h(the)f(en)m(tire)h(complex)g(plane.)0 5215 -y Fn(cl_R)e(cosh)g(\(const)g(cl_R&)g(x\))480 5340 y Fp(Returns)g -Fn(cosh\(x\))p Fp(.)39 b(The)30 b(range)h(of)f(the)h(result)f(is)h(the) -f(in)m(terv)-5 b(al)32 b Fn(cosh\(x\))c(>=)i(1)p Fp(.)p +y Fp(cl_R)e(cosh)g(\(const)g(cl_R&)g(x\))480 5340 y Fr(Returns)g +Fp(cosh\(x\))p Fr(.)39 b(The)30 b(range)h(of)f(the)h(result)f(is)h(the) +f(in)m(terv)-5 b(al)32 b Fp(cosh\(x\))c(>=)i(1)p Fr(.)p eop %%Page: 25 27 -25 26 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 -b(on)f(n)m(um)m(b)s(ers)2463 b(25)0 366 y Fn(cl_N)29 -b(cosh)g(\(const)g(cl_N&)g(z\))480 491 y Fp(Returns)g -Fn(cosh\(z\))p Fp(.)39 b(The)30 b(range)h(of)f(the)h(result)f(is)h(the) -f(en)m(tire)h(complex)g(plane.)0 667 y Fn(struct)e(cl_cosh_sinh_t)d({)k +25 26 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +b(on)f(n)m(um)m(b)s(ers)2463 b(25)0 366 y Fp(cl_N)29 +b(cosh)g(\(const)g(cl_N&)g(z\))480 491 y Fr(Returns)g +Fp(cosh\(z\))p Fr(.)39 b(The)30 b(range)h(of)f(the)h(result)f(is)h(the) +f(en)m(tire)h(complex)g(plane.)0 667 y Fp(struct)e(cl_cosh_sinh_t)d({)k (cl_R)f(cosh;)g(cl_R)h(sinh;)e(};)0 792 y(cl_cosh_sinh_t)e -(cl_cosh_sinh)i(\(const)g(cl_R&)h(x\))480 916 y Fp(Returns)44 -b(b)s(oth)h Fn(sinh\(x\))e Fp(and)i Fn(cosh\(x\))p Fp(.)83 +(cl_cosh_sinh)i(\(const)g(cl_R&)h(x\))480 916 y Fr(Returns)44 +b(b)s(oth)h Fp(sinh\(x\))e Fr(and)i Fp(cosh\(x\))p Fr(.)83 b(This)44 b(is)i(more)e(e\016cien)m(t)j(than)e(computing)f(them)480 -1041 y(separately)-8 b(.)42 b(The)30 b(relation)i Fn(cosh^2)c(-)j -(sinh^2)d(=)i(1)g Fp(will)h(hold)f(only)g(appro)m(ximately)-8 -b(.)0 1217 y Fn(cl_R)29 b(tanh)g(\(const)g(cl_R&)g(x\))0 +1041 y(separately)-8 b(.)42 b(The)30 b(relation)i Fp(cosh^2)c(-)j +(sinh^2)d(=)i(1)g Fr(will)h(hold)f(only)g(appro)m(ximately)-8 +b(.)0 1217 y Fp(cl_R)29 b(tanh)g(\(const)g(cl_R&)g(x\))0 1342 y(cl_N)g(tanh)g(\(const)g(cl_N&)g(x\))480 1466 y -Fp(Returns)g Fn(tanh\(x\))g(=)h(sinh\(x\)/cosh\(x\))p -Fp(.)0 1643 y Fn(cl_N)f(asinh)g(\(const)g(cl_N&)g(z\))480 -1767 y Fp(Returns)22 b Fn(arsinh\(z\))p Fp(.)36 b(This)22 -b(is)i(de\014ned)d(as)j Fn(arsinh\(z\))k(=)i(log\(z+sqrt\(1+z^2\)\))18 -b Fp(and)k(satis\014es)480 1892 y Fn(arsinh\(-z\))28 -b(=)i(-arsinh\(z\))p Fp(.)37 b(The)27 b(range)h(of)g(the)g(result)g(is) +Fr(Returns)g Fp(tanh\(x\))g(=)h(sinh\(x\)/cosh\(x\))p +Fr(.)0 1643 y Fp(cl_N)f(asinh)g(\(const)g(cl_N&)g(z\))480 +1767 y Fr(Returns)22 b Fp(arsinh\(z\))p Fr(.)36 b(This)22 +b(is)i(de\014ned)d(as)j Fp(arsinh\(z\))k(=)i(log\(z+sqrt\(1+z^2\)\))18 +b Fr(and)k(satis\014es)480 1892 y Fp(arsinh\(-z\))28 +b(=)i(-arsinh\(z\))p Fr(.)37 b(The)27 b(range)h(of)g(the)g(result)g(is) g(the)g(strip)f(in)h(the)g(complex)f(domain)480 2016 -y Fn(-pi/2)i(<=)h(imagpart\(arsinh\(z\)\))25 b(<=)30 -b(pi/2)p Fp(,)39 b(excluding)f(the)h(n)m(um)m(b)s(ers)c(with)j -Fn(imagpart)28 b(=)i(-)480 2141 y(pi/2)f Fp(and)h Fn(realpart)e(>)i(0)g -Fp(and)g(the)g(n)m(um)m(b)s(ers)e(with)i Fn(imagpart)f(=)h(pi/2)f -Fp(and)h Fn(realpart)e(<)i(0)p Fp(.)0 2317 y Fn(cl_N)f(acosh)g(\(const) -g(cl_N&)g(z\))480 2442 y Fp(Returns)d Fn(arcosh\(z\))p -Fp(.)37 b(This)26 b(is)h(de\014ned)f(as)h Fn(arcosh\(z\))h(=)i +y Fp(-pi/2)i(<=)h(imagpart\(arsinh\(z\)\))25 b(<=)30 +b(pi/2)p Fr(,)39 b(excluding)f(the)h(n)m(um)m(b)s(ers)c(with)j +Fp(imagpart)28 b(=)i(-)480 2141 y(pi/2)f Fr(and)h Fp(realpart)e(>)i(0)g +Fr(and)g(the)g(n)m(um)m(b)s(ers)e(with)i Fp(imagpart)f(=)h(pi/2)f +Fr(and)h Fp(realpart)e(<)i(0)p Fr(.)0 2317 y Fp(cl_N)f(acosh)g(\(const) +g(cl_N&)g(z\))480 2442 y Fr(Returns)d Fp(arcosh\(z\))p +Fr(.)37 b(This)26 b(is)h(de\014ned)f(as)h Fp(arcosh\(z\))h(=)i (2*log\(sqrt\(\(z+1\)/2\)+sqr)o(t\(\(z)o(-)480 2566 y(1\)/2\)\))p -Fp(.)102 b(The)51 b(range)h(of)g(the)g(result)f(is)g(the)h(half-strip)f -(in)h(the)f(complex)g(domain)g Fn(-pi)29 b(<)480 2691 +Fr(.)102 b(The)51 b(range)h(of)g(the)g(result)f(is)g(the)h(half-strip)f +(in)h(the)f(complex)g(domain)g Fp(-pi)29 b(<)480 2691 y(imagpart\(arcosh\(z\)\))c(<=)30 b(pi,)f(realpart\(arcosh\(z\)\))c(>=) -30 b(0)p Fp(,)76 b(excluding)67 b(the)f(n)m(um)m(b)s(ers)480 -2815 y(with)30 b Fn(realpart)e(=)i(0)g Fp(and)g Fn(-pi)g(<)g(imagpart)e -(<)i(0)p Fp(.)0 2991 y Fn(cl_N)f(atanh)g(\(const)g(cl_N&)g(z\))480 -3116 y Fp(Returns)38 b Fn(artanh\(z\))p Fp(.)64 b(This)39 -b(is)g(de\014ned)f(as)h Fn(artanh\(z\))28 b(=)i -(\(log\(1+z\)-log\(1-z\)\))25 b(/)30 b(2)39 b Fp(and)480 -3241 y(satis\014es)f Fn(artanh\(-z\))27 b(=)j(-artanh\(z\))p -Fp(.)58 b(The)37 b(range)g(of)g(the)g(result)g(is)g(the)h(strip)e(in)h -(the)g(com-)480 3365 y(plex)45 b(domain)f Fn(-pi/2)29 -b(<=)h(imagpart\(artanh\(z\)\))25 b(<=)30 b(pi/2)p Fp(,)47 +30 b(0)p Fr(,)76 b(excluding)67 b(the)f(n)m(um)m(b)s(ers)480 +2815 y(with)30 b Fp(realpart)e(=)i(0)g Fr(and)g Fp(-pi)g(<)g(imagpart)e +(<)i(0)p Fr(.)0 2991 y Fp(cl_N)f(atanh)g(\(const)g(cl_N&)g(z\))480 +3116 y Fr(Returns)38 b Fp(artanh\(z\))p Fr(.)64 b(This)39 +b(is)g(de\014ned)f(as)h Fp(artanh\(z\))28 b(=)i +(\(log\(1+z\)-log\(1-z\)\))25 b(/)30 b(2)39 b Fr(and)480 +3241 y(satis\014es)f Fp(artanh\(-z\))27 b(=)j(-artanh\(z\))p +Fr(.)58 b(The)37 b(range)g(of)g(the)g(result)g(is)g(the)h(strip)e(in)h +(the)g(com-)480 3365 y(plex)45 b(domain)f Fp(-pi/2)29 +b(<=)h(imagpart\(artanh\(z\)\))25 b(<=)30 b(pi/2)p Fr(,)47 b(excluding)e(the)h(n)m(um)m(b)s(ers)c(with)480 3490 -y Fn(imagpart)28 b(=)i(-pi/2)42 b Fp(and)h Fn(realpart)28 -b(<=)i(0)42 b Fp(and)h(the)h(n)m(um)m(b)s(ers)c(with)j -Fn(imagpart)28 b(=)i(pi/2)43 b Fp(and)480 3614 y Fn(realpart)28 -b(>=)i(0)p Fp(.)0 4038 y Fk(4.8.4)63 b(Euler)30 b(gamma)0 -4313 y Fp(Euler's)g(constan)m(t)i(C)e(=)g(0.577)p Fl(:)15 -b(:)g(:)33 b Fp(is)e(returned)e(b)m(y)h(the)h(follo)m(wing)g -(functions:)0 4614 y Fn(cl_F)e(cl_eulerconst)e(\(cl_float_format_t)e -(f\))480 4738 y Fp(Returns)k(Euler's)i(constan)m(t)g(as)g(a)g(\015oat)g -(of)f(format)g Fn(f)p Fp(.)0 4915 y Fn(cl_F)f(cl_eulerconst)e(\(const)i -(cl_F&)g(y\))480 5039 y Fp(Returns)g(Euler's)i(constan)m(t)g(in)f(the)h -(\015oat)g(format)f(of)g Fn(y)p Fp(.)0 5215 y Fn(cl_F)f(cl_eulerconst)e -(\(void\))480 5340 y Fp(Returns)i(Euler's)i(constan)m(t)g(as)g(a)g -(\015oat)g(of)f(format)g Fn(cl_default_float_format)p -Fp(.)p eop +y Fp(imagpart)28 b(=)i(-pi/2)42 b Fr(and)h Fp(realpart)28 +b(<=)i(0)42 b Fr(and)h(the)h(n)m(um)m(b)s(ers)c(with)j +Fp(imagpart)28 b(=)i(pi/2)43 b Fr(and)480 3614 y Fp(realpart)28 +b(>=)i(0)p Fr(.)0 4038 y Fm(4.8.4)63 b(Euler)30 b(gamma)0 +4313 y Fr(Euler's)g(constan)m(t)i(C)e(=)g(0.577)p Fn(:)15 +b(:)g(:)33 b Fr(is)e(returned)e(b)m(y)h(the)h(follo)m(wing)g +(functions:)0 4614 y Fp(cl_F)e(cl_eulerconst)e(\(cl_float_format_t)e +(f\))480 4738 y Fr(Returns)k(Euler's)i(constan)m(t)g(as)g(a)g(\015oat)g +(of)f(format)g Fp(f)p Fr(.)0 4915 y Fp(cl_F)f(cl_eulerconst)e(\(const)i +(cl_F&)g(y\))480 5039 y Fr(Returns)g(Euler's)i(constan)m(t)g(in)f(the)h +(\015oat)g(format)f(of)g Fp(y)p Fr(.)0 5215 y Fp(cl_F)f(cl_eulerconst)e +(\(void\))480 5340 y Fr(Returns)i(Euler's)i(constan)m(t)g(as)g(a)g +(\015oat)g(of)f(format)g Fp(cl_default_float_format)p +Fr(.)p eop %%Page: 26 28 -26 27 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +26 27 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 b(on)f(n)m(um)m(b)s(ers)2463 b(26)0 366 y(Catalan's)32 -b(constan)m(t)f(G)g(=)f(0.915)p Fl(:)15 b(:)g(:)33 b -Fp(is)e(returned)e(b)m(y)h(the)h(follo)m(wing)h(functions:)0 -676 y Fn(cl_F)d(cl_catalanconst)d(\(cl_float_format_t)g(f\))480 -800 y Fp(Returns)j(Catalan's)j(constan)m(t)g(as)e(a)h(\015oat)g(of)g -(format)e Fn(f)p Fp(.)0 985 y Fn(cl_F)g(cl_catalanconst)d(\(const)j -(cl_F&)g(y\))480 1110 y Fp(Returns)g(Catalan's)j(constan)m(t)g(in)e -(the)g(\015oat)h(format)f(of)h Fn(y)p Fp(.)0 1294 y Fn(cl_F)e -(cl_catalanconst)d(\(void\))480 1419 y Fp(Returns)j(Catalan's)j -(constan)m(t)g(as)e(a)h(\015oat)g(of)g(format)e Fn -(cl_default_float_format)p Fp(.)0 1881 y Fk(4.8.5)63 -b(Riemann)29 b(zeta)0 2160 y Fp(Riemann's)g(zeta)j(function)e(at)h(an)g -(in)m(tegral)h(p)s(oin)m(t)e Fn(s>1)f Fp(is)i(returned)e(b)m(y)h(the)h -(follo)m(wing)h(functions:)0 2470 y Fn(cl_F)d(cl_zeta)g(\(int)g(s,)h -(cl_float_format_t)25 b(f\))480 2594 y Fp(Returns)k(Riemann's)h(zeta)i -(function)e(at)h Fn(s)f Fp(as)g(a)h(\015oat)g(of)g(format)e -Fn(f)p Fp(.)0 2779 y Fn(cl_F)g(cl_zeta)g(\(int)g(s,)h(const)f(cl_F&)f -(y\))480 2904 y Fp(Returns)h(Riemann's)h(zeta)i(function)e(at)h -Fn(s)f Fp(in)g(the)g(\015oat)h(format)f(of)h Fn(y)p Fp(.)0 -3088 y Fn(cl_F)e(cl_zeta)g(\(int)g(s\))480 3213 y Fp(Returns)e -(Riemann's)g(zeta)j(function)d(at)i Fn(s)f Fp(as)g(a)h(\015oat)f(of)h -(format)e Fn(cl_default_float_format)p Fp(.)0 3708 y -Fq(4.9)68 b(F)-11 b(unctions)30 b(on)g(in)l(tegers)0 -4170 y Fk(4.9.1)63 b(Logical)30 b(functions)0 4450 y -Fp(In)m(tegers,)e(when)c(view)m(ed)i(as)g(in)f(t)m(w)m(o's)i(complemen) +b(constan)m(t)f(G)g(=)f(0.915)p Fn(:)15 b(:)g(:)33 b +Fr(is)e(returned)e(b)m(y)h(the)h(follo)m(wing)h(functions:)0 +676 y Fp(cl_F)d(cl_catalanconst)d(\(cl_float_format_t)g(f\))480 +800 y Fr(Returns)j(Catalan's)j(constan)m(t)g(as)e(a)h(\015oat)g(of)g +(format)e Fp(f)p Fr(.)0 985 y Fp(cl_F)g(cl_catalanconst)d(\(const)j +(cl_F&)g(y\))480 1110 y Fr(Returns)g(Catalan's)j(constan)m(t)g(in)e +(the)g(\015oat)h(format)f(of)h Fp(y)p Fr(.)0 1294 y Fp(cl_F)e +(cl_catalanconst)d(\(void\))480 1419 y Fr(Returns)j(Catalan's)j +(constan)m(t)g(as)e(a)h(\015oat)g(of)g(format)e Fp +(cl_default_float_format)p Fr(.)0 1881 y Fm(4.8.5)63 +b(Riemann)29 b(zeta)0 2160 y Fr(Riemann's)g(zeta)j(function)e(at)h(an)g +(in)m(tegral)h(p)s(oin)m(t)e Fp(s>1)f Fr(is)i(returned)e(b)m(y)h(the)h +(follo)m(wing)h(functions:)0 2470 y Fp(cl_F)d(cl_zeta)g(\(int)g(s,)h +(cl_float_format_t)25 b(f\))480 2594 y Fr(Returns)k(Riemann's)h(zeta)i +(function)e(at)h Fp(s)f Fr(as)g(a)h(\015oat)g(of)g(format)e +Fp(f)p Fr(.)0 2779 y Fp(cl_F)g(cl_zeta)g(\(int)g(s,)h(const)f(cl_F&)f +(y\))480 2904 y Fr(Returns)h(Riemann's)h(zeta)i(function)e(at)h +Fp(s)f Fr(in)g(the)g(\015oat)h(format)f(of)h Fp(y)p Fr(.)0 +3088 y Fp(cl_F)e(cl_zeta)g(\(int)g(s\))480 3213 y Fr(Returns)e +(Riemann's)g(zeta)j(function)d(at)i Fp(s)f Fr(as)g(a)h(\015oat)f(of)h +(format)e Fp(cl_default_float_format)p Fr(.)0 3708 y +Fs(4.9)68 b(F)-11 b(unctions)30 b(on)g(in)l(tegers)0 +4170 y Fm(4.9.1)63 b(Logical)30 b(functions)0 4450 y +Fr(In)m(tegers,)e(when)c(view)m(ed)i(as)g(in)f(t)m(w)m(o's)i(complemen) m(t)e(notation,)j(can)e(b)s(e)f(though)m(t)h(as)f(in\014nite)h(bit)f (strings)g(where)0 4574 y(the)31 b(bits')f(v)-5 b(alues)31 b(ev)m(en)m(tually)h(are)f(constan)m(t.)42 b(F)-8 b(or)31 -b(example,)431 4832 y Fn(17)47 b(=)h(......00010001)431 -4936 y(-6)f(=)h(......11111010)0 5215 y Fp(The)30 b(logical)i(op)s +b(example,)431 4832 y Fp(17)47 b(=)h(......00010001)431 +4936 y(-6)f(=)h(......11111010)0 5215 y Fr(The)30 b(logical)i(op)s (erations)f(view)f(in)m(tegers)h(as)g(suc)m(h)f(bit)g(strings)g(and)f (op)s(erate)i(on)f(eac)m(h)h(of)g(the)f(bit)g(p)s(ositions)g(in)0 5340 y(parallel.)p eop %%Page: 27 29 -27 28 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 -b(on)f(n)m(um)m(b)s(ers)2463 b(27)0 366 y Fn(cl_I)29 +27 28 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +b(on)f(n)m(um)m(b)s(ers)2463 b(27)0 366 y Fp(cl_I)29 b(lognot)g(\(const)g(cl_I&)f(x\))0 491 y(cl_I)h(operator)f(~)i(\(const) -f(cl_I&)g(x\))480 616 y Fp(Logical)j(not,)f(lik)m(e)h -Fn(~x)e Fp(in)g(C.)g(This)g(is)g(the)h(same)e(as)i Fn(-1-x)p -Fp(.)0 776 y Fn(cl_I)e(logand)g(\(const)g(cl_I&)f(x,)i(const)f(cl_I&)g +f(cl_I&)g(x\))480 616 y Fr(Logical)j(not,)f(lik)m(e)h +Fp(~x)e Fr(in)g(C.)g(This)g(is)g(the)h(same)e(as)i Fp(-1-x)p +Fr(.)0 776 y Fp(cl_I)e(logand)g(\(const)g(cl_I&)f(x,)i(const)f(cl_I&)g (y\))0 900 y(cl_I)g(operator)f(&)i(\(const)f(cl_I&)g(x,)h(const)f -(cl_I&)g(y\))480 1025 y Fp(Logical)j(and,)e(lik)m(e)i -Fn(x)e(&)g(y)g Fp(in)g(C.)0 1185 y Fn(cl_I)f(logior)g(\(const)g(cl_I&)f +(cl_I&)g(y\))480 1025 y Fr(Logical)j(and,)e(lik)m(e)i +Fp(x)e(&)g(y)g Fr(in)g(C.)0 1185 y Fp(cl_I)f(logior)g(\(const)g(cl_I&)f (x,)i(const)f(cl_I&)g(y\))0 1309 y(cl_I)g(operator)f(|)i(\(const)f -(cl_I&)g(x,)h(const)f(cl_I&)g(y\))480 1434 y Fp(Logical)j(\(inclusiv)m -(e\))g(or,)f(lik)m(e)h Fn(x)e(|)g(y)g Fp(in)g(C.)0 1594 -y Fn(cl_I)f(logxor)g(\(const)g(cl_I&)f(x,)i(const)f(cl_I&)g(y\))0 +(cl_I&)g(x,)h(const)f(cl_I&)g(y\))480 1434 y Fr(Logical)j(\(inclusiv)m +(e\))g(or,)f(lik)m(e)h Fp(x)e(|)g(y)g Fr(in)g(C.)0 1594 +y Fp(cl_I)f(logxor)g(\(const)g(cl_I&)f(x,)i(const)f(cl_I&)g(y\))0 1718 y(cl_I)g(operator)f(^)i(\(const)f(cl_I&)g(x,)h(const)f(cl_I&)g -(y\))480 1843 y Fp(Exclusiv)m(e)i(or,)g(lik)m(e)h Fn(x)e(^)g(y)g -Fp(in)g(C.)0 2003 y Fn(cl_I)f(logeqv)g(\(const)g(cl_I&)f(x,)i(const)f -(cl_I&)g(y\))480 2127 y Fp(Bit)m(wise)j(equiv)-5 b(alence,)32 -b(lik)m(e)g Fn(~\(x)d(^)h(y\))g Fp(in)g(C.)0 2288 y Fn(cl_I)f(lognand)g +(y\))480 1843 y Fr(Exclusiv)m(e)i(or,)g(lik)m(e)h Fp(x)e(^)g(y)g +Fr(in)g(C.)0 2003 y Fp(cl_I)f(logeqv)g(\(const)g(cl_I&)f(x,)i(const)f +(cl_I&)g(y\))480 2127 y Fr(Bit)m(wise)j(equiv)-5 b(alence,)32 +b(lik)m(e)g Fp(~\(x)d(^)h(y\))g Fr(in)g(C.)0 2288 y Fp(cl_I)f(lognand)g (\(const)f(cl_I&)h(x,)h(const)f(cl_I&)g(y\))480 2412 -y Fp(Bit)m(wise)j(not)f(and,)f(lik)m(e)h Fn(~\(x)f(&)g(y\))g -Fp(in)g(C.)0 2572 y Fn(cl_I)f(lognor)g(\(const)g(cl_I&)f(x,)i(const)f -(cl_I&)g(y\))480 2697 y Fp(Bit)m(wise)j(not)f(or,)f(lik)m(e)i -Fn(~\(x)d(|)h(y\))g Fp(in)g(C.)0 2857 y Fn(cl_I)f(logandc1)f(\(const)h -(cl_I&)g(x,)h(const)f(cl_I&)g(y\))480 2981 y Fp(Logical)j(and,)e +y Fr(Bit)m(wise)j(not)f(and,)f(lik)m(e)h Fp(~\(x)f(&)g(y\))g +Fr(in)g(C.)0 2572 y Fp(cl_I)f(lognor)g(\(const)g(cl_I&)f(x,)i(const)f +(cl_I&)g(y\))480 2697 y Fr(Bit)m(wise)j(not)f(or,)f(lik)m(e)i +Fp(~\(x)d(|)h(y\))g Fr(in)g(C.)0 2857 y Fp(cl_I)f(logandc1)f(\(const)h +(cl_I&)g(x,)h(const)f(cl_I&)g(y\))480 2981 y Fr(Logical)j(and,)e (complemen)m(ting)g(the)h(\014rst)e(argumen)m(t,)h(lik)m(e)i -Fn(~x)e(&)g(y)g Fp(in)g(C.)0 3141 y Fn(cl_I)f(logandc2)f(\(const)h -(cl_I&)g(x,)h(const)f(cl_I&)g(y\))480 3266 y Fp(Logical)j(and,)e +Fp(~x)e(&)g(y)g Fr(in)g(C.)0 3141 y Fp(cl_I)f(logandc2)f(\(const)h +(cl_I&)g(x,)h(const)f(cl_I&)g(y\))480 3266 y Fr(Logical)j(and,)e (complemen)m(ting)g(the)h(second)f(argumen)m(t,)g(lik)m(e)i -Fn(x)e(&)g(~y)g Fp(in)g(C.)0 3426 y Fn(cl_I)f(logorc1)g(\(const)f -(cl_I&)h(x,)h(const)f(cl_I&)g(y\))480 3550 y Fp(Logical)j(or,)f +Fp(x)e(&)g(~y)g Fr(in)g(C.)0 3426 y Fp(cl_I)f(logorc1)g(\(const)f +(cl_I&)h(x,)h(const)f(cl_I&)g(y\))480 3550 y Fr(Logical)j(or,)f (complemen)m(ting)f(the)g(\014rst)g(argumen)m(t,)g(lik)m(e)i -Fn(~x)d(|)i(y)f Fp(in)g(C.)0 3710 y Fn(cl_I)f(logorc2)g(\(const)f -(cl_I&)h(x,)h(const)f(cl_I&)g(y\))480 3835 y Fp(Logical)j(or,)f +Fp(~x)d(|)i(y)f Fr(in)g(C.)0 3710 y Fp(cl_I)f(logorc2)g(\(const)f +(cl_I&)h(x,)h(const)f(cl_I&)g(y\))480 3835 y Fr(Logical)j(or,)f (complemen)m(ting)f(the)g(second)h(argumen)m(t,)f(lik)m(e)i -Fn(x)e(|)g(~y)f Fp(in)h(C.)0 4127 y(These)g(op)s(erations)h(are)g(all)g +Fp(x)e(|)g(~y)f Fr(in)h(C.)0 4127 y(These)g(op)s(erations)h(are)g(all)g (a)m(v)-5 b(ailable)33 b(though)d(the)g(function)0 4418 -y Fn(cl_I)f(boole)g(\(cl_boole)f(op,)h(const)g(cl_I&)g(x,)h(const)f -(cl_I&)g(y\))0 4692 y Fp(where)i Fn(op)g Fp(m)m(ust)g(ha)m(v)m(e)i(one) +y Fp(cl_I)f(boole)g(\(cl_boole)f(op,)h(const)g(cl_I&)g(x,)h(const)f +(cl_I&)g(y\))0 4692 y Fr(where)i Fp(op)g Fr(m)m(ust)g(ha)m(v)m(e)i(one) f(of)g(the)g(16)h(v)-5 b(alues)32 b(\(eac)m(h)h(one)f(stands)g(for)f(a) i(function)e(whic)m(h)h(com)m(bines)f(t)m(w)m(o)i(bits)0 -4817 y(in)m(to)24 b(one)f(bit\):)38 b Fn(boole_clr)p -Fp(,)22 b Fn(boole_set)p Fp(,)h Fn(boole_1)p Fp(,)f Fn(boole_2)p -Fp(,)h Fn(boole_c1)p Fp(,)g Fn(boole_c2)p Fp(,)f Fn(boole_and)p -Fp(,)h Fn(boole_)0 4941 y(ior)p Fp(,)37 b Fn(boole_xor)p -Fp(,)e Fn(boole_eqv)p Fp(,)g Fn(boole_nand)p Fp(,)g Fn(boole_nor)p -Fp(,)g Fn(boole_andc1)p Fp(,)g Fn(boole_andc2)p Fp(,)f -Fn(boole_orc1)p Fp(,)0 5066 y Fn(boole_orc2)p Fp(.)0 +4817 y(in)m(to)24 b(one)f(bit\):)38 b Fp(boole_clr)p +Fr(,)22 b Fp(boole_set)p Fr(,)h Fp(boole_1)p Fr(,)f Fp(boole_2)p +Fr(,)h Fp(boole_c1)p Fr(,)g Fp(boole_c2)p Fr(,)f Fp(boole_and)p +Fr(,)h Fp(boole_)0 4941 y(ior)p Fr(,)37 b Fp(boole_xor)p +Fr(,)e Fp(boole_eqv)p Fr(,)g Fp(boole_nand)p Fr(,)g Fp(boole_nor)p +Fr(,)g Fp(boole_andc1)p Fr(,)g Fp(boole_andc2)p Fr(,)f +Fp(boole_orc1)p Fr(,)0 5066 y Fp(boole_orc2)p Fr(.)0 5340 y(Other)c(functions)g(that)h(view)f(in)m(tegers)i(as)f(bit)f (strings:)p eop %%Page: 28 30 -28 29 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 -b(on)f(n)m(um)m(b)s(ers)2463 b(28)0 366 y Fn(cl_boolean)28 +28 29 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +b(on)f(n)m(um)m(b)s(ers)2463 b(28)0 366 y Fp(cl_boolean)28 b(logtest)g(\(const)h(cl_I&)g(x,)g(const)g(cl_I&)g(y\))480 -491 y Fp(Returns)g(true)i(if)f(some)g(bit)g(is)h(set)f(in)h(b)s(oth)e -Fn(x)h Fp(and)g Fn(y)p Fp(,)g(i.e.)42 b(if)30 b Fn(logand\(x,y\))d(!=)j -(0)p Fp(.)0 671 y Fn(cl_boolean)e(logbitp)g(\(const)h(cl_I&)g(n,)g -(const)g(cl_I&)g(x\))480 795 y Fp(Returns)f(true)g(if)g(the)h -Fn(n)p Fp(th)f(bit)g(\(from)g(the)g(righ)m(t\))h(of)g -Fn(x)f Fp(is)h(set.)40 b(Bit)30 b(0)e(is)h(the)g(least)g(signi\014can)m -(t)h(bit.)0 975 y Fn(uintL)f(logcount)f(\(const)h(cl_I&)g(x\))480 -1100 y Fp(Returns)d(the)i(n)m(um)m(b)s(er)c(of)k(one)f(bits)g(in)g -Fn(x)p Fp(,)h(if)f Fn(x)g(>)p Fp(=)f(0,)j(or)e(the)g(n)m(um)m(b)s(er)e -(of)i(zero)h(bits)f(in)g Fn(x)p Fp(,)h(if)f Fn(x)f(<)h -Fp(0.)0 1404 y(The)j(follo)m(wing)i(functions)e(op)s(erate)h(on)f(in)m +491 y Fr(Returns)g(true)i(if)f(some)g(bit)g(is)h(set)f(in)h(b)s(oth)e +Fp(x)h Fr(and)g Fp(y)p Fr(,)g(i.e.)42 b(if)30 b Fp(logand\(x,y\))d(!=)j +(0)p Fr(.)0 671 y Fp(cl_boolean)e(logbitp)g(\(const)h(cl_I&)g(n,)g +(const)g(cl_I&)g(x\))480 795 y Fr(Returns)f(true)g(if)g(the)h +Fp(n)p Fr(th)f(bit)g(\(from)g(the)g(righ)m(t\))h(of)g +Fp(x)f Fr(is)h(set.)40 b(Bit)30 b(0)e(is)h(the)g(least)g(signi\014can)m +(t)h(bit.)0 975 y Fp(uintL)f(logcount)f(\(const)h(cl_I&)g(x\))480 +1100 y Fr(Returns)d(the)i(n)m(um)m(b)s(er)c(of)k(one)f(bits)g(in)g +Fp(x)p Fr(,)h(if)f Fp(x)g(>)p Fr(=)f(0,)j(or)e(the)g(n)m(um)m(b)s(er)e +(of)i(zero)h(bits)f(in)g Fp(x)p Fr(,)h(if)f Fp(x)f(<)h +Fr(0.)0 1404 y(The)j(follo)m(wing)i(functions)e(op)s(erate)h(on)f(in)m (terv)-5 b(als)31 b(of)g(bits)f(in)g(in)m(tegers.)42 -b(The)30 b(t)m(yp)s(e)240 1660 y Fn(struct)46 b(cl_byte)g({)h(uintL)g -(size;)f(uintL)g(position;)g(};)0 1937 y Fp(represen)m(ts)39 +b(The)30 b(t)m(yp)s(e)240 1660 y Fp(struct)46 b(cl_byte)g({)h(uintL)g +(size;)f(uintL)g(position;)g(};)0 1937 y Fr(represen)m(ts)39 b(the)g(bit)g(in)m(terv)-5 b(al)41 b(con)m(taining)f(the)f(bits)g -Fn(position)p Fl(:)15 b(:)g(:)o Fn(position+size-1)35 -b Fp(of)k(an)g(in)m(teger.)68 b(The)0 2061 y(constructor)31 -b Fn(cl_byte\(size,position\))24 b Fp(constructs)31 b(a)f -Fn(cl_byte)p Fp(.)0 2366 y Fn(cl_I)f(ldb)h(\(const)e(cl_I&)h(n,)h -(const)f(cl_byte&)f(b\))480 2490 y Fp(extracts)g(the)f(bits)f(of)h -Fn(n)f Fp(describ)s(ed)g(b)m(y)g(the)h(bit)g(in)m(terv)-5 -b(al)27 b Fn(b)g Fp(and)f(returns)f(them)g(as)i(a)g(nonnegativ)m(e)480 -2615 y(in)m(teger)32 b(with)e Fn(b.size)e Fp(bits.)0 -2794 y Fn(cl_boolean)g(ldb_test)g(\(const)g(cl_I&)h(n,)h(const)f -(cl_byte&)f(b\))480 2919 y Fp(Returns)h(true)i(if)f(some)g(bit)g +Fp(position)p Fn(:)15 b(:)g(:)o Fp(position+size-1)35 +b Fr(of)k(an)g(in)m(teger.)68 b(The)0 2061 y(constructor)31 +b Fp(cl_byte\(size,position\))24 b Fr(constructs)31 b(a)f +Fp(cl_byte)p Fr(.)0 2366 y Fp(cl_I)f(ldb)h(\(const)e(cl_I&)h(n,)h +(const)f(cl_byte&)f(b\))480 2490 y Fr(extracts)g(the)f(bits)f(of)h +Fp(n)f Fr(describ)s(ed)g(b)m(y)g(the)h(bit)g(in)m(terv)-5 +b(al)27 b Fp(b)g Fr(and)f(returns)f(them)g(as)i(a)g(nonnegativ)m(e)480 +2615 y(in)m(teger)32 b(with)e Fp(b.size)e Fr(bits.)0 +2794 y Fp(cl_boolean)g(ldb_test)g(\(const)g(cl_I&)h(n,)h(const)f +(cl_byte&)f(b\))480 2919 y Fr(Returns)h(true)i(if)f(some)g(bit)g (describ)s(ed)f(b)m(y)i(the)f(bit)h(in)m(terv)-5 b(al)31 -b Fn(b)f Fp(is)h(set)g(in)f Fn(n)p Fp(.)0 3099 y Fn(cl_I)f(dpb)h +b Fp(b)f Fr(is)h(set)g(in)f Fp(n)p Fr(.)0 3099 y Fp(cl_I)f(dpb)h (\(const)e(cl_I&)h(newbyte,)f(const)h(cl_I&)g(n,)h(const)f(cl_byte&)f -(b\))480 3223 y Fp(Returns)f Fn(n)p Fp(,)h(with)f(the)h(bits)g(describ) -s(ed)e(b)m(y)i(the)f(bit)h(in)m(terv)-5 b(al)29 b Fn(b)e -Fp(replaced)h(b)m(y)g Fn(newbyte)p Fp(.)38 b(Only)27 -b(the)480 3348 y(lo)m(w)m(est)32 b Fn(b.size)d Fp(bits)h(of)h -Fn(newbyte)d Fp(are)j(relev)-5 b(an)m(t.)0 3652 y(The)28 -b(functions)h Fn(ldb)f Fp(and)g Fn(dpb)g Fp(implicitly)h(shift.)40 +(b\))480 3223 y Fr(Returns)f Fp(n)p Fr(,)h(with)f(the)h(bits)g(describ) +s(ed)e(b)m(y)i(the)f(bit)h(in)m(terv)-5 b(al)29 b Fp(b)e +Fr(replaced)h(b)m(y)g Fp(newbyte)p Fr(.)38 b(Only)27 +b(the)480 3348 y(lo)m(w)m(est)32 b Fp(b.size)d Fr(bits)h(of)h +Fp(newbyte)d Fr(are)j(relev)-5 b(an)m(t.)0 3652 y(The)28 +b(functions)h Fp(ldb)f Fr(and)g Fp(dpb)g Fr(implicitly)h(shift.)40 b(The)29 b(follo)m(wing)h(functions)e(are)i(their)f(coun)m(terparts)g -(without)0 3777 y(shifting:)0 4081 y Fn(cl_I)g(mask_field)f(\(const)g -(cl_I&)h(n,)h(const)f(cl_byte&)f(b\))480 4206 y Fp(returns)j(an)g(in)m +(without)0 3777 y(shifting:)0 4081 y Fp(cl_I)g(mask_field)f(\(const)g +(cl_I&)h(n,)h(const)f(cl_byte&)f(b\))480 4206 y Fr(returns)j(an)g(in)m (teger)j(with)d(the)h(bits)g(describ)s(ed)f(b)m(y)h(the)g(bit)g(in)m -(terv)-5 b(al)33 b Fn(b)e Fp(copied)i(from)d(the)i(corre-)480 -4330 y(sp)s(onding)d(bits)h(in)g Fn(n)p Fp(,)g(the)h(other)g(bits)f -(zero.)0 4510 y Fn(cl_I)f(deposit_field)e(\(const)i(cl_I&)g(newbyte,)f +(terv)-5 b(al)33 b Fp(b)e Fr(copied)i(from)d(the)i(corre-)480 +4330 y(sp)s(onding)d(bits)h(in)g Fp(n)p Fr(,)g(the)h(other)g(bits)f +(zero.)0 4510 y Fp(cl_I)f(deposit_field)e(\(const)i(cl_I&)g(newbyte,)f (const)h(cl_I&)g(n,)g(const)g(cl_byte&)f(b\))480 4634 -y Fp(returns)34 b(an)h(in)m(teger)i(where)d(the)i(bits)f(describ)s(ed)f -(b)m(y)h(the)h(bit)f(in)m(terv)-5 b(al)36 b Fn(b)f Fp(come)g(from)f -Fn(newbyte)480 4759 y Fp(and)c(the)g(other)h(bits)f(come)h(from)d -Fn(n)p Fp(.)0 5063 y(The)i(follo)m(wing)i(relations)f(hold:)180 -5340 y Fn(ldb)e(\(n,)h(b\))g(=)g(mask_field\(n,)d(b\))i(>>)h -(b.position)p Fp(,)p eop +y Fr(returns)34 b(an)h(in)m(teger)i(where)d(the)i(bits)f(describ)s(ed)f +(b)m(y)h(the)h(bit)f(in)m(terv)-5 b(al)36 b Fp(b)f Fr(come)g(from)f +Fp(newbyte)480 4759 y Fr(and)c(the)g(other)h(bits)f(come)h(from)d +Fp(n)p Fr(.)0 5063 y(The)i(follo)m(wing)i(relations)f(hold:)180 +5340 y Fp(ldb)e(\(n,)h(b\))g(=)g(mask_field\(n,)d(b\))i(>>)h +(b.position)p Fr(,)p eop %%Page: 29 31 -29 30 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 -b(on)f(n)m(um)m(b)s(ers)2463 b(29)180 366 y Fn(dpb)29 +29 30 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +b(on)f(n)m(um)m(b)s(ers)2463 b(29)180 366 y Fp(dpb)29 b(\(newbyte,)f(n,)i(b\))g(=)g(deposit_field)d(\(newbyte)h(<<)h -(b.position,)f(n,)i(b\))p Fp(,)180 522 y Fn(deposit_field\(newbyte,n,)o +(b.position,)f(n,)i(b\))p Fr(,)180 522 y Fp(deposit_field\(newbyte,n,)o (b\))24 b(=)30 b(n)g(^)g(mask_field\(n,b\))c(^)31 b -(mask_field\(new_byte,b\))p Fp(.)0 832 y(The)36 b(follo)m(wing)i(op)s +(mask_field\(new_byte,b\))p Fr(.)0 832 y(The)36 b(follo)m(wing)i(op)s (erations)f(on)g(in)m(tegers)h(as)f(bit)f(strings)h(are)g(e\016cien)m (t)h(shortcuts)e(for)h(common)e(arithmetic)0 957 y(op)s(erations:)0 -1267 y Fn(cl_boolean)28 b(oddp)h(\(const)f(cl_I&)h(x\))480 -1392 y Fp(Returns)g(true)i(if)f(the)h(least)g(signi\014can)m(t)g(bit)g -(of)f Fn(x)g Fp(is)h(1.)41 b(Equiv)-5 b(alen)m(t)31 b(to)g -Fn(mod\(x,2\))d(!=)i(0)p Fp(.)0 1578 y Fn(cl_boolean)e(evenp)h(\(const) -f(cl_I&)h(x\))480 1702 y Fp(Returns)g(true)i(if)f(the)h(least)g -(signi\014can)m(t)g(bit)g(of)f Fn(x)g Fp(is)h(0.)41 b(Equiv)-5 -b(alen)m(t)31 b(to)g Fn(mod\(x,2\))d(==)i(0)p Fp(.)0 -1888 y Fn(cl_I)f(operator)f(<<)i(\(const)f(cl_I&)g(x,)g(const)g(cl_I&)g -(n\))480 2013 y Fp(Shifts)h Fn(x)g Fp(b)m(y)g Fn(n)g -Fp(bits)g(to)h(the)g(left.)41 b Fn(n)30 b Fp(should)g(b)s(e)f -Fn(>)p Fp(=0.)41 b(Equiv)-5 b(alen)m(t)31 b(to)g Fn(x)f(*)g -(expt\(2,n\))p Fp(.)0 2199 y Fn(cl_I)f(operator)f(>>)i(\(const)f(cl_I&) -g(x,)g(const)g(cl_I&)g(n\))480 2323 y Fp(Shifts)24 b -Fn(x)g Fp(b)m(y)g Fn(n)g Fp(bits)g(to)h(the)g(righ)m(t.)39 -b Fn(n)24 b Fp(should)f(b)s(e)h Fn(>)p Fp(=0.)39 b(Bits)25 +1267 y Fp(cl_boolean)28 b(oddp)h(\(const)f(cl_I&)h(x\))480 +1392 y Fr(Returns)g(true)i(if)f(the)h(least)g(signi\014can)m(t)g(bit)g +(of)f Fp(x)g Fr(is)h(1.)41 b(Equiv)-5 b(alen)m(t)31 b(to)g +Fp(mod\(x,2\))d(!=)i(0)p Fr(.)0 1578 y Fp(cl_boolean)e(evenp)h(\(const) +f(cl_I&)h(x\))480 1702 y Fr(Returns)g(true)i(if)f(the)h(least)g +(signi\014can)m(t)g(bit)g(of)f Fp(x)g Fr(is)h(0.)41 b(Equiv)-5 +b(alen)m(t)31 b(to)g Fp(mod\(x,2\))d(==)i(0)p Fr(.)0 +1888 y Fp(cl_I)f(operator)f(<<)i(\(const)f(cl_I&)g(x,)g(const)g(cl_I&)g +(n\))480 2013 y Fr(Shifts)h Fp(x)g Fr(b)m(y)g Fp(n)g +Fr(bits)g(to)h(the)g(left.)41 b Fp(n)30 b Fr(should)g(b)s(e)f +Fp(>)p Fr(=0.)41 b(Equiv)-5 b(alen)m(t)31 b(to)g Fp(x)f(*)g +(expt\(2,n\))p Fr(.)0 2199 y Fp(cl_I)f(operator)f(>>)i(\(const)f(cl_I&) +g(x,)g(const)g(cl_I&)g(n\))480 2323 y Fr(Shifts)24 b +Fp(x)g Fr(b)m(y)g Fp(n)g Fr(bits)g(to)h(the)g(righ)m(t.)39 +b Fp(n)24 b Fr(should)f(b)s(e)h Fp(>)p Fr(=0.)39 b(Bits)25 b(shifted)f(out)g(to)h(the)g(righ)m(t)g(are)f(thro)m(wn)480 2448 y(a)m(w)m(a)m(y)-8 b(.)43 b(Equiv)-5 b(alen)m(t)31 -b(to)g Fn(floor\(x)e(/)h(expt\(2,n\)\))p Fp(.)0 2634 -y Fn(cl_I)f(ash)h(\(const)e(cl_I&)h(x,)h(const)f(cl_I&)g(y\))480 -2759 y Fp(Shifts)34 b Fn(x)h Fp(b)m(y)g Fn(y)f Fp(bits)h(to)h(the)f -(left)h(\(if)f Fn(y>)p Fp(=0\))g(or)g(b)m(y)g Fn(-y)f -Fp(bits)h(to)h(the)f(righ)m(t)h(\(if)f Fn(y<)p Fp(=0\).)54 +b(to)g Fp(floor\(x)e(/)h(expt\(2,n\)\))p Fr(.)0 2634 +y Fp(cl_I)f(ash)h(\(const)e(cl_I&)h(x,)h(const)f(cl_I&)g(y\))480 +2759 y Fr(Shifts)34 b Fp(x)h Fr(b)m(y)g Fp(y)f Fr(bits)h(to)h(the)f +(left)h(\(if)f Fp(y>)p Fr(=0\))g(or)g(b)m(y)g Fp(-y)f +Fr(bits)h(to)h(the)f(righ)m(t)h(\(if)f Fp(y<)p Fr(=0\).)54 b(In)35 b(other)480 2883 y(w)m(ords,)30 b(this)g(returns)g -Fn(floor\(x)e(*)i(expt\(2,y\)\))p Fp(.)0 3069 y Fn(uintL)f -(integer_length)d(\(const)j(cl_I&)g(x\))480 3194 y Fp(Returns)40 +Fp(floor\(x)e(*)i(expt\(2,y\)\))p Fr(.)0 3069 y Fp(uintL)f +(integer_length)d(\(const)j(cl_I&)g(x\))480 3194 y Fr(Returns)40 b(the)h(n)m(um)m(b)s(er)e(of)j(bits)f(\(excluding)g(the)h(sign)f(bit\)) -g(needed)g(to)h(represen)m(t)f Fn(x)g Fp(in)f(t)m(w)m(o's)480 +g(needed)g(to)h(represen)m(t)f Fp(x)g Fr(in)f(t)m(w)m(o's)480 3318 y(complemen)m(t)28 b(notation.)41 b(This)27 b(is)i(the)f(smallest) -h(n)f Fn(>)p Fp(=)f(0)i(suc)m(h)f(that)h(-2)p Fn(^)p -Fp(n)f Fn(<)p Fp(=)g(x)g Fn(<)g Fp(2)p Fn(^)p Fp(n.)40 -b(If)28 b(x)g Fn(>)g Fp(0,)480 3443 y(this)i(is)h(the)f(unique)g(n)g -Fn(>)g Fp(0)g(suc)m(h)g(that)h(2)p Fn(^)p Fp(\(n-1\))h -Fn(<)p Fp(=)e(x)g Fn(<)g Fp(2)p Fn(^)p Fp(n.)0 3629 y -Fn(uintL)f(ord2)g(\(const)g(cl_I&)g(x\))480 3753 y(x)36 -b Fp(m)m(ust)g(b)s(e)g(non-zero.)61 b(This)36 b(function)g(returns)g +h(n)f Fp(>)p Fr(=)f(0)i(suc)m(h)f(that)h(-2)p Fp(^)p +Fr(n)f Fp(<)p Fr(=)g(x)g Fp(<)g Fr(2)p Fp(^)p Fr(n.)40 +b(If)28 b(x)g Fp(>)g Fr(0,)480 3443 y(this)i(is)h(the)f(unique)g(n)g +Fp(>)g Fr(0)g(suc)m(h)g(that)h(2)p Fp(^)p Fr(\(n-1\))h +Fp(<)p Fr(=)e(x)g Fp(<)g Fr(2)p Fp(^)p Fr(n.)0 3629 y +Fp(uintL)f(ord2)g(\(const)g(cl_I&)g(x\))480 3753 y(x)36 +b Fr(m)m(ust)g(b)s(e)g(non-zero.)61 b(This)36 b(function)g(returns)g (the)h(n)m(um)m(b)s(er)d(of)j(0)g(bits)g(at)h(the)f(righ)m(t)g(of)g -Fn(x)f Fp(in)480 3878 y(t)m(w)m(o's)c(complemen)m(t)d(notation.)42 -b(This)30 b(is)g(the)h(largest)h(n)d Fn(>)p Fp(=)h(0)h(suc)m(h)f(that)h -(2)p Fn(^)p Fp(n)f(divides)g Fn(x)p Fp(.)0 4064 y Fn(uintL)f(power2p)f -(\(const)h(cl_I&)g(x\))480 4188 y(x)24 b Fp(m)m(ust)g(b)s(e)g -Fn(>)g Fp(0.)40 b(This)23 b(function)i(c)m(hec)m(ks)h(whether)e -Fn(x)g Fp(is)h(a)g(p)s(o)m(w)m(er)g(of)g(2.)39 b(If)24 -b Fn(x)g Fp(=)h(2)p Fn(^)p Fp(\(n-1\),)i(it)e(returns)480 +Fp(x)f Fr(in)480 3878 y(t)m(w)m(o's)c(complemen)m(t)d(notation.)42 +b(This)30 b(is)g(the)h(largest)h(n)d Fp(>)p Fr(=)h(0)h(suc)m(h)f(that)h +(2)p Fp(^)p Fr(n)f(divides)g Fp(x)p Fr(.)0 4064 y Fp(uintL)f(power2p)f +(\(const)h(cl_I&)g(x\))480 4188 y(x)24 b Fr(m)m(ust)g(b)s(e)g +Fp(>)g Fr(0.)40 b(This)23 b(function)i(c)m(hec)m(ks)h(whether)e +Fp(x)g Fr(is)h(a)g(p)s(o)m(w)m(er)g(of)g(2.)39 b(If)24 +b Fp(x)g Fr(=)h(2)p Fp(^)p Fr(\(n-1\),)i(it)e(returns)480 4313 y(n.)40 b(Else)31 b(it)g(returns)e(0.)41 b(\(See)31 -b(also)g(the)g(function)f Fn(logp)p Fp(.\))0 4780 y Fk(4.9.2)63 -b(Num)m(b)s(er)30 b(theoretic)g(functions)0 5091 y Fn(uint32)f(gcd)g +b(also)g(the)g(function)f Fp(logp)p Fr(.\))0 4780 y Fm(4.9.2)63 +b(Num)m(b)s(er)30 b(theoretic)g(functions)0 5091 y Fp(uint32)f(gcd)g (\(uint32)g(a,)g(uint32)g(b\))0 5215 y(cl_I)g(gcd)h(\(const)e(cl_I&)h -(a,)h(const)f(cl_I&)g(b\))480 5340 y Fp(This)h(function)g(returns)f -(the)h(greatest)j(common)28 b(divisor)i(of)h Fn(a)f Fp(and)g -Fn(b)p Fp(,)g(normalized)g(to)h(b)s(e)f Fn(>)p Fp(=)f(0.)p +(a,)h(const)f(cl_I&)g(b\))480 5340 y Fr(This)h(function)g(returns)f +(the)h(greatest)j(common)28 b(divisor)i(of)h Fp(a)f Fr(and)g +Fp(b)p Fr(,)g(normalized)g(to)h(b)s(e)f Fp(>)p Fr(=)f(0.)p eop %%Page: 30 32 -30 31 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 -b(on)f(n)m(um)m(b)s(ers)2463 b(30)0 366 y Fn(cl_I)29 +30 31 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +b(on)f(n)m(um)m(b)s(ers)2463 b(30)0 366 y Fp(cl_I)29 b(xgcd)g(\(const)g(cl_I&)g(a,)h(const)f(cl_I&)g(b,)g(cl_I*)g(u,)h -(cl_I*)f(v\))480 491 y Fp(This)h(function)h(\(\\extended)g(gcd"\))h -(returns)e(the)h(greatest)h(common)d(divisor)i Fn(g)f -Fp(of)h Fn(a)g Fp(and)f Fn(b)h Fp(and)480 616 y(at)39 +(cl_I*)f(v\))480 491 y Fr(This)h(function)h(\(\\extended)g(gcd"\))h +(returns)e(the)h(greatest)h(common)d(divisor)i Fp(g)f +Fr(of)h Fp(a)g Fr(and)f Fp(b)h Fr(and)480 616 y(at)39 b(the)f(same)g(time)g(the)g(represen)m(tation)i(of)e -Fn(g)g Fp(as)g(an)g(in)m(tegral)i(linear)f(com)m(bination)f(of)h -Fn(a)f Fp(and)480 740 y Fn(b)p Fp(:)53 b Fn(u)36 b Fp(and)g -Fn(v)g Fp(with)h Fn(u*a+v*b)28 b(=)i(g)p Fp(,)38 b Fn(g)e(>)p -Fp(=)g(0.)60 b Fn(u)36 b Fp(and)g Fn(v)h Fp(will)g(b)s(e)f(normalized)g +Fp(g)g Fr(as)g(an)g(in)m(tegral)i(linear)f(com)m(bination)f(of)h +Fp(a)f Fr(and)480 740 y Fp(b)p Fr(:)53 b Fp(u)36 b Fr(and)g +Fp(v)g Fr(with)h Fp(u*a+v*b)28 b(=)i(g)p Fr(,)38 b Fp(g)e(>)p +Fr(=)g(0.)60 b Fp(u)36 b Fr(and)g Fp(v)h Fr(will)g(b)s(e)f(normalized)g (to)h(b)s(e)f(of)h(smallest)480 865 y(p)s(ossible)g(absolute)h(v)-5 b(alue,)40 b(in)e(the)f(follo)m(wing)i(sense:)55 b(If)37 -b Fn(a)h Fp(and)e Fn(b)i Fp(are)g(non-zero,)i(and)d Fn(abs\(a\))480 -989 y(!=)30 b(abs\(b\))p Fp(,)35 b Fn(u)g Fp(and)f Fn(v)h -Fp(will)h(satisfy)g(the)f(inequalities)i Fn(abs\(u\))29 -b(<=)g(abs\(b\)/\(2*g\))p Fp(,)34 b Fn(abs\(v\))29 b(<=)480 -1114 y(abs\(a\)/\(2*g\))p Fp(.)0 1275 y Fn(cl_I)g(lcm)h(\(const)e -(cl_I&)h(a,)h(const)f(cl_I&)g(b\))480 1400 y Fp(This)h(function)g +b Fp(a)h Fr(and)e Fp(b)i Fr(are)g(non-zero,)i(and)d Fp(abs\(a\))480 +989 y(!=)30 b(abs\(b\))p Fr(,)35 b Fp(u)g Fr(and)f Fp(v)h +Fr(will)h(satisfy)g(the)f(inequalities)i Fp(abs\(u\))29 +b(<=)g(abs\(b\)/\(2*g\))p Fr(,)34 b Fp(abs\(v\))29 b(<=)480 +1114 y(abs\(a\)/\(2*g\))p Fr(.)0 1275 y Fp(cl_I)g(lcm)h(\(const)e +(cl_I&)h(a,)h(const)f(cl_I&)g(b\))480 1400 y Fr(This)h(function)g (returns)f(the)h(least)i(common)d(m)m(ultiple)h(of)g -Fn(a)g Fp(and)g Fn(b)p Fp(,)g(normalized)g(to)h(b)s(e)f -Fn(>)p Fp(=)g(0.)0 1562 y Fn(cl_boolean)e(logp)h(\(const)f(cl_I&)h(a,)h +Fp(a)g Fr(and)g Fp(b)p Fr(,)g(normalized)g(to)h(b)s(e)f +Fp(>)p Fr(=)g(0.)0 1562 y Fp(cl_boolean)e(logp)h(\(const)f(cl_I&)h(a,)h (const)f(cl_I&)g(b,)h(cl_RA*)e(l\))0 1686 y(cl_boolean)g(logp)h (\(const)f(cl_RA&)h(a,)h(const)f(cl_RA&)f(b,)i(cl_RA*)f(l\))480 -1811 y(a)35 b Fp(m)m(ust)g(b)s(e)g Fn(>)h Fp(0.)57 b -Fn(b)36 b Fp(m)m(ust)e(b)s(e)h Fn(>)p Fp(0)h(and)f(!=)h(1.)57 +1811 y(a)35 b Fr(m)m(ust)g(b)s(e)g Fp(>)h Fr(0.)57 b +Fp(b)36 b Fr(m)m(ust)e(b)s(e)h Fp(>)p Fr(0)h(and)f(!=)h(1.)57 b(If)36 b(log\(a,b\))i(is)d(rational)i(n)m(um)m(b)s(er,)f(this)f (function)480 1935 y(returns)29 b(true)h(and)g(sets)h(*l)g(=)f (log\(a,b\),)j(else)e(it)g(returns)e(false.)0 2325 y -Fk(4.9.3)63 b(Com)m(binatorial)29 b(functions)0 2618 -y Fn(cl_I)g(factorial)f(\(uintL)h(n\))480 2742 y(n)h -Fp(m)m(ust)f(b)s(e)h(a)h(small)f(in)m(teger)h Fn(>)p -Fp(=)f(0.)41 b(This)30 b(function)g(returns)f(the)i(factorial)h -Fn(n)p Fp(!)40 b(=)30 b Fn(1*2*)p Fl(:)15 b(:)g(:)p Fn(*n)p -Fp(.)0 2904 y Fn(cl_I)29 b(doublefactorial)d(\(uintL)j(n\))480 -3028 y(n)44 b Fp(m)m(ust)g(b)s(e)g(a)h(small)f(in)m(teger)i -Fn(>)p Fp(=)e(0.)84 b(This)43 b(function)i(returns)e(the)i -(doublefactorial)h Fn(n)p Fp(!!)83 b(=)480 3153 y Fn(1*3*)p -Fl(:)15 b(:)g(:)p Fn(*n)30 b Fp(or)g Fn(n)p Fp(!!)41 -b(=)30 b Fn(2*4*)p Fl(:)15 b(:)g(:)p Fn(*n)p Fp(,)30 -b(resp)s(ectiv)m(ely)-8 b(.)0 3315 y Fn(cl_I)29 b(binomial)f(\(uintL)h -(n,)h(uintL)f(k\))480 3439 y(n)36 b Fp(and)h Fn(k)f Fp(m)m(ust)g(b)s(e) -g(small)g(in)m(tegers)i Fn(>)p Fp(=)e(0.)60 b(This)36 +Fm(4.9.3)63 b(Com)m(binatorial)29 b(functions)0 2618 +y Fp(cl_I)g(factorial)f(\(uintL)h(n\))480 2742 y(n)h +Fr(m)m(ust)f(b)s(e)h(a)h(small)f(in)m(teger)h Fp(>)p +Fr(=)f(0.)41 b(This)30 b(function)g(returns)f(the)i(factorial)h +Fp(n)p Fr(!)40 b(=)30 b Fp(1*2*)p Fn(:)15 b(:)g(:)p Fp(*n)p +Fr(.)0 2904 y Fp(cl_I)29 b(doublefactorial)d(\(uintL)j(n\))480 +3028 y(n)44 b Fr(m)m(ust)g(b)s(e)g(a)h(small)f(in)m(teger)i +Fp(>)p Fr(=)e(0.)84 b(This)43 b(function)i(returns)e(the)i +(doublefactorial)h Fp(n)p Fr(!!)83 b(=)480 3153 y Fp(1*3*)p +Fn(:)15 b(:)g(:)p Fp(*n)30 b Fr(or)g Fp(n)p Fr(!!)41 +b(=)30 b Fp(2*4*)p Fn(:)15 b(:)g(:)p Fp(*n)p Fr(,)30 +b(resp)s(ectiv)m(ely)-8 b(.)0 3315 y Fp(cl_I)29 b(binomial)f(\(uintL)h +(n,)h(uintL)f(k\))480 3439 y(n)36 b Fr(and)h Fp(k)f Fr(m)m(ust)g(b)s(e) +g(small)g(in)m(tegers)i Fp(>)p Fr(=)e(0.)60 b(This)36 b(function)h(returns)e(the)i(binomial)f(co)s(e\016cien)m(t)480 -3494 y Fh(\000)518 3523 y Fg(n)520 3595 y(k)559 3494 -y Fh(\001)622 3564 y Fp(=)828 3528 y Fg(n)p Ff(!)p 728 -3543 261 4 v 728 3595 a Fg(n)p Ff(!\()p Fg(n)p Fe(\000)p -Fg(k)q Ff(\)!)1029 3564 y Fp(for)30 b(0)h Fn(<)p Fp(=)e(k)i -Fn(<)p Fp(=)e(n,)h(0)h(else.)0 4001 y Fq(4.10)68 b(F)-11 +3494 y Fj(\000)518 3523 y Fi(n)520 3595 y(k)559 3494 +y Fj(\001)622 3564 y Fr(=)828 3528 y Fi(n)p Fh(!)p 728 +3543 261 4 v 728 3595 a Fi(n)p Fh(!\()p Fi(n)p Fg(\000)p +Fi(k)q Fh(\)!)1029 3564 y Fr(for)30 b(0)h Fp(<)p Fr(=)e(k)i +Fp(<)p Fr(=)e(n,)h(0)h(else.)0 4001 y Fs(4.10)68 b(F)-11 b(unctions)30 b(on)g(\015oating-p)t(oin)l(t)i(n)l(um)l(b)t(ers)0 -4275 y Fp(Recall)27 b(that)g(a)f(\015oating-p)s(oin)m(t)h(n)m(um)m(b)s -(er)d(consists)i(of)g(a)g(sign)g Fn(s)p Fp(,)g(an)g(exp)s(onen)m(t)g -Fn(e)f Fp(and)g(a)i(man)m(tissa)e Fn(m)p Fp(.)39 b(The)25 +4275 y Fr(Recall)27 b(that)g(a)f(\015oating-p)s(oin)m(t)h(n)m(um)m(b)s +(er)d(consists)i(of)g(a)g(sign)g Fp(s)p Fr(,)g(an)g(exp)s(onen)m(t)g +Fp(e)f Fr(and)g(a)i(man)m(tissa)e Fp(m)p Fr(.)39 b(The)25 b(v)-5 b(alue)0 4400 y(of)31 b(the)f(n)m(um)m(b)s(er)e(is)j -Fn(\(-1\)^s)d(*)i(2^e)g(*)g(m)p Fp(.)0 4674 y(Eac)m(h)h(of)g(the)f -(classes)i Fn(cl_F)p Fp(,)d Fn(cl_SF)p Fp(,)g Fn(cl_FF)p -Fp(,)g Fn(cl_DF)p Fp(,)h Fn(cl_LF)e Fp(de\014nes)i(the)h(follo)m(wing)g -(op)s(erations.)0 4966 y Fi(t)m(yp)s(e)36 b Fn(scale_float)27 -b(\(const)i Fi(t)m(yp)s(e)5 b Fn(&)30 b(x,)g(sintL)f(delta\))0 -5091 y Fi(t)m(yp)s(e)36 b Fn(scale_float)27 b(\(const)i -Fi(t)m(yp)s(e)5 b Fn(&)30 b(x,)g(const)f(cl_I&)g(delta\))480 -5215 y Fp(Returns)35 b Fn(x*2^delta)p Fp(.)57 b(This)35 +Fp(\(-1\)^s)d(*)i(2^e)g(*)g(m)p Fr(.)0 4674 y(Eac)m(h)h(of)g(the)f +(classes)i Fp(cl_F)p Fr(,)d Fp(cl_SF)p Fr(,)g Fp(cl_FF)p +Fr(,)g Fp(cl_DF)p Fr(,)h Fp(cl_LF)e Fr(de\014nes)i(the)h(follo)m(wing)g +(op)s(erations.)0 4966 y Fk(t)m(yp)s(e)36 b Fp(scale_float)27 +b(\(const)i Fk(t)m(yp)s(e)5 b Fp(&)30 b(x,)g(sintL)f(delta\))0 +5091 y Fk(t)m(yp)s(e)36 b Fp(scale_float)27 b(\(const)i +Fk(t)m(yp)s(e)5 b Fp(&)30 b(x,)g(const)f(cl_I&)g(delta\))480 +5215 y Fr(Returns)35 b Fp(x*2^delta)p Fr(.)57 b(This)35 b(is)h(more)g(e\016cien)m(t)i(than)e(an)g(explicit)i(m)m(ultiplication) -f(b)s(ecause)f(it)480 5340 y(copies)31 b Fn(x)f Fp(and)g(mo)s(di\014es) +f(b)s(ecause)f(it)480 5340 y(copies)31 b Fp(x)f Fr(and)g(mo)s(di\014es) f(the)h(exp)s(onen)m(t.)p eop %%Page: 31 33 -31 32 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +31 32 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 b(on)f(n)m(um)m(b)s(ers)2463 b(31)0 366 y(The)31 b(follo)m(wing)j (functions)d(pro)m(vide)h(an)g(abstract)h(in)m(terface)g(to)g(the)f (underlying)f(represen)m(tation)i(of)f(\015oating-)0 -491 y(p)s(oin)m(t)e(n)m(um)m(b)s(ers.)0 792 y Fn(sintL)f -(float_exponent)d(\(const)j Fi(t)m(yp)s(e)5 b Fn(&)30 -b(x\))480 916 y Fp(Returns)g(the)h(exp)s(onen)m(t)g Fn(e)f -Fp(of)h Fn(x)p Fp(.)41 b(F)-8 b(or)32 b Fn(x)e(=)g(0.0)p -Fp(,)g(this)h(is)g(0.)42 b(F)-8 b(or)31 b Fn(x)g Fp(non-zero,)g(this)g -(is)g(the)g(unique)480 1041 y(in)m(teger)h(with)e Fn(2^\(e-1\))e(<=)i -(abs\(x\))f(<)h(2^e)p Fp(.)0 1217 y Fn(sintL)f(float_radix)e(\(const)i -Fi(t)m(yp)s(e)5 b Fn(&)30 b(x\))480 1341 y Fp(Returns)f(the)i(base)g +491 y(p)s(oin)m(t)e(n)m(um)m(b)s(ers.)0 792 y Fp(sintL)f +(float_exponent)d(\(const)j Fk(t)m(yp)s(e)5 b Fp(&)30 +b(x\))480 916 y Fr(Returns)g(the)h(exp)s(onen)m(t)g Fp(e)f +Fr(of)h Fp(x)p Fr(.)41 b(F)-8 b(or)32 b Fp(x)e(=)g(0.0)p +Fr(,)g(this)h(is)g(0.)42 b(F)-8 b(or)31 b Fp(x)g Fr(non-zero,)g(this)g +(is)g(the)g(unique)480 1041 y(in)m(teger)h(with)e Fp(2^\(e-1\))e(<=)i +(abs\(x\))f(<)h(2^e)p Fr(.)0 1217 y Fp(sintL)f(float_radix)e(\(const)i +Fk(t)m(yp)s(e)5 b Fp(&)30 b(x\))480 1341 y Fr(Returns)f(the)i(base)g (of)f(the)h(\015oating-p)s(oin)m(t)g(represen)m(tation.)42 -b(This)30 b(is)g(alw)m(a)m(ys)i Fn(2)p Fp(.)0 1518 y -Fi(t)m(yp)s(e)k Fn(float_sign)27 b(\(const)i Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x\))480 1642 y Fp(Returns)f(the)i(sign)f -Fn(s)g Fp(of)h Fn(x)f Fp(as)h(a)f(\015oat.)42 b(The)30 -b(v)-5 b(alue)31 b(is)f(1)h(for)f Fn(x)g(>)p Fp(=)g(0,)h(-1)g(for)f -Fn(x)g(<)g Fp(0.)0 1818 y Fn(uintL)f(float_digits)e(\(const)i -Fi(t)m(yp)s(e)5 b Fn(&)30 b(x\))480 1943 y Fp(Returns)24 +b(This)30 b(is)g(alw)m(a)m(ys)i Fp(2)p Fr(.)0 1518 y +Fk(t)m(yp)s(e)k Fp(float_sign)27 b(\(const)i Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x\))480 1642 y Fr(Returns)f(the)i(sign)f +Fp(s)g Fr(of)h Fp(x)f Fr(as)h(a)f(\015oat.)42 b(The)30 +b(v)-5 b(alue)31 b(is)f(1)h(for)f Fp(x)g(>)p Fr(=)g(0,)h(-1)g(for)f +Fp(x)g(<)g Fr(0.)0 1818 y Fp(uintL)f(float_digits)e(\(const)i +Fk(t)m(yp)s(e)5 b Fp(&)30 b(x\))480 1943 y Fr(Returns)24 b(the)h(n)m(um)m(b)s(er)e(of)i(man)m(tissa)g(bits)f(in)h(the)g -(\015oating-p)s(oin)m(t)h(represen)m(tation)g(of)f Fn(x)p -Fp(,)h(including)480 2067 y(the)31 b(hidden)e(bit.)40 +(\015oating-p)s(oin)m(t)h(represen)m(tation)g(of)f Fp(x)p +Fr(,)h(including)480 2067 y(the)31 b(hidden)e(bit.)40 b(The)30 b(v)-5 b(alue)31 b(only)g(dep)s(ends)d(on)i(the)h(t)m(yp)s(e)f -(of)h Fn(x)p Fp(,)f(not)h(on)f(its)h(v)-5 b(alue.)0 2243 -y Fn(uintL)29 b(float_precision)d(\(const)j Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x\))480 2368 y Fp(Returns)21 b(the)h(n)m(um)m(b)s(er)d(of)j +(of)h Fp(x)p Fr(,)f(not)h(on)f(its)h(v)-5 b(alue.)0 2243 +y Fp(uintL)29 b(float_precision)d(\(const)j Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x\))480 2368 y Fr(Returns)21 b(the)h(n)m(um)m(b)s(er)d(of)j (signi\014can)m(t)h(man)m(tissa)f(bits)g(in)f(the)h(\015oating-p)s(oin) -m(t)h(represen)m(tation)g(of)f Fn(x)p Fp(.)480 2493 y(Since)32 +m(t)h(represen)m(tation)g(of)f Fp(x)p Fr(.)480 2493 y(Since)32 b(denormalized)f(n)m(um)m(b)s(ers)e(are)j(not)f(supp)s(orted,)g(this)g -(is)h(the)f(same)g(as)h Fn(float_digits\(x\))480 2617 -y Fp(if)e Fn(x)g Fp(is)h(non-zero,)g(and)f(0)g(if)h Fn(x)f -Fp(=)g(0.)0 2918 y(The)h(complete)h(in)m(ternal)h(represen)m(tation)g +(is)h(the)f(same)g(as)h Fp(float_digits\(x\))480 2617 +y Fr(if)e Fp(x)g Fr(is)h(non-zero,)g(and)f(0)g(if)h Fp(x)f +Fr(=)g(0.)0 2918 y(The)h(complete)h(in)m(ternal)h(represen)m(tation)g (of)f(a)g(\015oat)g(is)g(enco)s(ded)f(in)h(the)g(t)m(yp)s(e)f -Fn(cl_decoded_float)d Fp(\(or)k Fn(cl_)0 3042 y(decoded_sfloat)p -Fp(,)39 b Fn(cl_decoded_ffloat)p Fp(,)f Fn(cl_decoded_dfloat)p -Fp(,)h Fn(cl_decoded_lfloat)p Fp(,)f(resp)s(ectiv)m(ely\),)0 -3167 y(de\014ned)29 b(b)m(y)240 3421 y Fn(struct)46 b(cl_decoded_)p -Fi(t)m(yp)s(e)5 b Fn(float)44 b({)622 3525 y Fi(t)m(yp)s(e)53 -b Fn(mantissa;)45 b(cl_I)i(exponent;)e Fi(t)m(yp)s(e)53 -b Fn(sign;)240 3628 y(};)0 3903 y Fp(and)30 b(returned)f(b)m(y)h(the)h -(function)0 4204 y Fn(cl_decoded_)p Fi(t)m(yp)s(e)5 b -Fn(float)26 b(decode_float)h(\(const)i Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x\))480 4329 y Fp(F)-8 b(or)38 b Fn(x)f Fp(non-zero,)j -(this)d(returns)f Fn(\(-1\)^s)p Fp(,)h Fn(e)p Fp(,)i -Fn(m)e Fp(with)g Fn(x)30 b(=)g(\(-1\)^s)f(*)h(2^e)f(*)h(m)37 -b Fp(and)g Fn(0.5)29 b(<=)h(m)g(<)480 4453 y(1.0)p Fp(.)63 -b(F)-8 b(or)39 b Fn(x)f Fp(=)g(0,)i(it)f(returns)e Fn(\(-1\)^s)p -Fp(=1,)i Fn(e)p Fp(=0,)h Fn(m)p Fp(=0.)64 b Fn(e)37 b -Fp(is)i(the)f(same)f(as)i(returned)e(b)m(y)h(the)480 -4578 y(function)30 b Fn(float_exponent)p Fp(.)0 4878 +Fp(cl_decoded_float)d Fr(\(or)k Fp(cl_)0 3042 y(decoded_sfloat)p +Fr(,)39 b Fp(cl_decoded_ffloat)p Fr(,)f Fp(cl_decoded_dfloat)p +Fr(,)h Fp(cl_decoded_lfloat)p Fr(,)f(resp)s(ectiv)m(ely\),)0 +3167 y(de\014ned)29 b(b)m(y)240 3421 y Fp(struct)46 b(cl_decoded_)p +Fk(t)m(yp)s(e)5 b Fp(float)44 b({)622 3525 y Fk(t)m(yp)s(e)53 +b Fp(mantissa;)45 b(cl_I)i(exponent;)e Fk(t)m(yp)s(e)53 +b Fp(sign;)240 3628 y(};)0 3903 y Fr(and)30 b(returned)f(b)m(y)h(the)h +(function)0 4204 y Fp(cl_decoded_)p Fk(t)m(yp)s(e)5 b +Fp(float)26 b(decode_float)h(\(const)i Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x\))480 4329 y Fr(F)-8 b(or)38 b Fp(x)f Fr(non-zero,)j +(this)d(returns)f Fp(\(-1\)^s)p Fr(,)h Fp(e)p Fr(,)i +Fp(m)e Fr(with)g Fp(x)30 b(=)g(\(-1\)^s)f(*)h(2^e)f(*)h(m)37 +b Fr(and)g Fp(0.5)29 b(<=)h(m)g(<)480 4453 y(1.0)p Fr(.)63 +b(F)-8 b(or)39 b Fp(x)f Fr(=)g(0,)i(it)f(returns)e Fp(\(-1\)^s)p +Fr(=1,)i Fp(e)p Fr(=0,)h Fp(m)p Fr(=0.)64 b Fp(e)37 b +Fr(is)i(the)f(same)f(as)i(returned)e(b)m(y)h(the)480 +4578 y(function)30 b Fp(float_exponent)p Fr(.)0 4878 y(A)g(complete)h(deco)s(ding)g(in)f(terms)f(of)i(in)m(tegers)g(is)g -(pro)m(vided)f(as)g(t)m(yp)s(e)240 5132 y Fn(struct)46 +(pro)m(vided)f(as)g(t)m(yp)s(e)240 5132 y Fp(struct)46 b(cl_idecoded_float)d({)622 5236 y(cl_I)j(mantissa;)g(cl_I)g(exponent;) g(cl_I)g(sign;)240 5340 y(};)p eop %%Page: 32 34 -32 33 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +32 33 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 b(on)f(n)m(um)m(b)s(ers)2463 b(32)0 366 y(b)m(y)30 b(the)h(follo)m -(wing)h(function:)0 670 y Fn(cl_idecoded_float)26 b -(integer_decode_float)e(\(const)29 b Fi(t)m(yp)s(e)5 -b Fn(&)31 b(x\))480 794 y Fp(F)-8 b(or)33 b Fn(x)g Fp(non-zero,)h(this) -e(returns)g Fn(\(-1\)^s)p Fp(,)f Fn(e)p Fp(,)j Fn(m)e -Fp(with)g Fn(x)e(=)g(\(-1\)^s)f(*)h(2^e)f(*)h(m)j Fp(and)f -Fn(m)g Fp(an)h(in)m(teger)480 919 y(with)e Fn(float_digits\(x\))c -Fp(bits.)43 b(F)-8 b(or)32 b Fn(x)f Fp(=)g(0,)h(it)g(returns)e -Fn(\(-1\)^s)p Fp(=1,)g Fn(e)p Fp(=0,)i Fn(m)p Fp(=0.)43 +(wing)h(function:)0 670 y Fp(cl_idecoded_float)26 b +(integer_decode_float)e(\(const)29 b Fk(t)m(yp)s(e)5 +b Fp(&)31 b(x\))480 794 y Fr(F)-8 b(or)33 b Fp(x)g Fr(non-zero,)h(this) +e(returns)g Fp(\(-1\)^s)p Fr(,)f Fp(e)p Fr(,)j Fp(m)e +Fr(with)g Fp(x)e(=)g(\(-1\)^s)f(*)h(2^e)f(*)h(m)j Fr(and)f +Fp(m)g Fr(an)h(in)m(teger)480 919 y(with)e Fp(float_digits\(x\))c +Fr(bits.)43 b(F)-8 b(or)32 b Fp(x)f Fr(=)g(0,)h(it)g(returns)e +Fp(\(-1\)^s)p Fr(=1,)g Fp(e)p Fr(=0,)i Fp(m)p Fr(=0.)43 b(W)-10 b(ARNING:)480 1043 y(The)35 b(exp)s(onen)m(t)h -Fn(e)f Fp(is)h(not)g(the)g(same)f(as)h(the)g(one)g(returned)f(b)m(y)g -(the)h(functions)f Fn(decode_float)480 1168 y Fp(and)30 -b Fn(float_exponent)p Fp(.)0 1471 y(Some)f(other)i(function,)f -(implemen)m(ted)f(only)i(for)f(class)h Fn(cl_F)p Fp(:)0 -1774 y Fn(cl_F)e(float_sign)f(\(const)g(cl_F&)h(x,)h(const)f(cl_F&)g -(y\))480 1899 y Fp(This)34 b(returns)g(a)i(\015oating)g(p)s(oin)m(t)f +Fp(e)f Fr(is)h(not)g(the)g(same)f(as)h(the)g(one)g(returned)f(b)m(y)g +(the)h(functions)f Fp(decode_float)480 1168 y Fr(and)30 +b Fp(float_exponent)p Fr(.)0 1471 y(Some)f(other)i(function,)f +(implemen)m(ted)f(only)i(for)f(class)h Fp(cl_F)p Fr(:)0 +1774 y Fp(cl_F)e(float_sign)f(\(const)g(cl_F&)h(x,)h(const)f(cl_F&)g +(y\))480 1899 y Fr(This)34 b(returns)g(a)i(\015oating)g(p)s(oin)m(t)f (n)m(um)m(b)s(er)e(whose)i(precision)h(and)e(absolute)i(v)-5 -b(alue)36 b(is)f(that)h(of)f Fn(y)480 2023 y Fp(and)30 -b(whose)g(sign)g(is)h(that)g(of)f Fn(x)p Fp(.)41 b(If)30 -b Fn(x)g Fp(is)g(zero,)h(it)g(is)g(treated)g(as)g(p)s(ositiv)m(e.)41 -b(Same)30 b(for)g Fn(y)p Fp(.)0 2491 y Fq(4.11)68 b(Con)l(v)l(ersion)32 -b(functions)0 2925 y Fk(4.11.1)63 b(Con)m(v)m(ersion)31 +b(alue)36 b(is)f(that)h(of)f Fp(y)480 2023 y Fr(and)30 +b(whose)g(sign)g(is)h(that)g(of)f Fp(x)p Fr(.)41 b(If)30 +b Fp(x)g Fr(is)g(zero,)h(it)g(is)g(treated)g(as)g(p)s(ositiv)m(e.)41 +b(Same)30 b(for)g Fp(y)p Fr(.)0 2491 y Fs(4.11)68 b(Con)l(v)l(ersion)32 +b(functions)0 2925 y Fm(4.11.1)63 b(Con)m(v)m(ersion)31 b(to)f(\015oating-p)s(oin)m(t)h(n)m(um)m(b)s(ers)0 3201 -y Fp(The)f(t)m(yp)s(e)g Fn(cl_float_format_t)c Fp(describ)s(es)k(a)g -(\015oating-p)s(oin)m(t)i(format.)0 3505 y Fn(cl_float_format_t)26 -b(cl_float_format)g(\(uintL)j(n\))480 3629 y Fp(Returns)40 +y Fr(The)f(t)m(yp)s(e)g Fp(cl_float_format_t)c Fr(describ)s(es)k(a)g +(\015oating-p)s(oin)m(t)i(format.)0 3505 y Fp(cl_float_format_t)26 +b(cl_float_format)g(\(uintL)j(n\))480 3629 y Fr(Returns)40 b(the)h(smallest)g(\015oat)h(format)e(whic)m(h)h(guaran)m(tees)h(at)g -(least)g Fn(n)f Fp(decimal)g(digits)g(in)g(the)480 3754 +(least)g Fp(n)f Fr(decimal)g(digits)g(in)g(the)480 3754 y(man)m(tissa)30 b(\(after)i(the)e(decimal)g(p)s(oin)m(t\).)0 -3932 y Fn(cl_float_format_t)c(cl_float_format)g(\(const)j(cl_F&)f(x\)) -480 4057 y Fp(Returns)h(the)i(\015oating)g(p)s(oin)m(t)g(format)e(of)i -Fn(x)p Fp(.)0 4236 y Fn(cl_float_format_t)26 b(cl_default_float_format) -480 4360 y Fp(Global)41 b(v)-5 b(ariable:)60 b(the)40 +3932 y Fp(cl_float_format_t)c(cl_float_format)g(\(const)j(cl_F&)f(x\)) +480 4057 y Fr(Returns)h(the)i(\015oating)g(p)s(oin)m(t)g(format)e(of)i +Fp(x)p Fr(.)0 4236 y Fp(cl_float_format_t)26 b(cl_default_float_format) +480 4360 y Fr(Global)41 b(v)-5 b(ariable:)60 b(the)40 b(default)g(\015oat)g(format)f(used)g(when)g(con)m(v)m(erting)i (rational)g(n)m(um)m(b)s(ers)c(to)480 4485 y(\015oats.)0 4788 y(T)-8 b(o)37 b(con)m(v)m(ert)i(a)f(real)f(n)m(um)m(b)s(er)e(to)j -(a)f(\015oat,)j(eac)m(h)e(of)f(the)g(t)m(yp)s(es)g Fn(cl_R)p -Fp(,)h Fn(cl_F)p Fp(,)g Fn(cl_I)p Fp(,)g Fn(cl_RA)p Fp(,)f -Fn(int)p Fp(,)h Fn(unsigned)0 4912 y(int)p Fp(,)30 b -Fn(float)p Fp(,)f Fn(double)g Fp(de\014nes)g(the)i(follo)m(wing)g(op)s -(erations:)0 5215 y Fn(cl_F)e(cl_float)f(\(const)h Fi(t)m(yp)s(e)5 -b Fn(&x,)30 b(cl_float_format_t)25 b(f\))480 5340 y Fp(Returns)k -Fn(x)h Fp(as)h(a)g(\015oat)g(of)f(format)g Fn(f)p Fp(.)p +(a)f(\015oat,)j(eac)m(h)e(of)f(the)g(t)m(yp)s(es)g Fp(cl_R)p +Fr(,)h Fp(cl_F)p Fr(,)g Fp(cl_I)p Fr(,)g Fp(cl_RA)p Fr(,)f +Fp(int)p Fr(,)h Fp(unsigned)0 4912 y(int)p Fr(,)30 b +Fp(float)p Fr(,)f Fp(double)g Fr(de\014nes)g(the)i(follo)m(wing)g(op)s +(erations:)0 5215 y Fp(cl_F)e(cl_float)f(\(const)h Fk(t)m(yp)s(e)5 +b Fp(&x,)30 b(cl_float_format_t)25 b(f\))480 5340 y Fr(Returns)k +Fp(x)h Fr(as)h(a)g(\015oat)g(of)f(format)g Fp(f)p Fr(.)p eop %%Page: 33 35 -33 34 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 -b(on)f(n)m(um)m(b)s(ers)2463 b(33)0 366 y Fn(cl_F)29 -b(cl_float)f(\(const)h Fi(t)m(yp)s(e)5 b Fn(&x,)30 b(const)f(cl_F&)g -(y\))480 491 y Fp(Returns)g Fn(x)h Fp(in)h(the)f(\015oat)h(format)f(of) -g Fn(y)p Fp(.)0 667 y Fn(cl_F)f(cl_float)f(\(const)h -Fi(t)m(yp)s(e)5 b Fn(&x\))480 792 y Fp(Returns)30 b Fn(x)g -Fp(as)h(a)g(\015oat)h(of)f(format)f Fn(cl_default_float_format)24 -b Fp(if)31 b(it)g(is)g(an)g(exact)h(n)m(um)m(b)s(er,)d(or)480 -916 y Fn(x)h Fp(itself)h(if)g(it)f(is)h(already)g(a)g(\015oat.)0 +33 34 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +b(on)f(n)m(um)m(b)s(ers)2463 b(33)0 366 y Fp(cl_F)29 +b(cl_float)f(\(const)h Fk(t)m(yp)s(e)5 b Fp(&x,)30 b(const)f(cl_F&)g +(y\))480 491 y Fr(Returns)g Fp(x)h Fr(in)h(the)f(\015oat)h(format)f(of) +g Fp(y)p Fr(.)0 667 y Fp(cl_F)f(cl_float)f(\(const)h +Fk(t)m(yp)s(e)5 b Fp(&x\))480 792 y Fr(Returns)30 b Fp(x)g +Fr(as)h(a)g(\015oat)h(of)f(format)f Fp(cl_default_float_format)24 +b Fr(if)31 b(it)g(is)g(an)g(exact)h(n)m(um)m(b)s(er,)d(or)480 +916 y Fp(x)h Fr(itself)h(if)g(it)f(is)h(already)g(a)g(\015oat.)0 1217 y(Of)f(course,)h(con)m(v)m(erting)h(a)f(n)m(um)m(b)s(er)d(to)j(a)f (\015oat)i(can)e(lose)h(precision.)0 1491 y(Ev)m(ery)g(\015oating-p)s (oin)m(t)g(format)f(has)g(some)g(c)m(haracteristic)j(n)m(um)m(b)s(ers:) -0 1792 y Fn(cl_F)c(most_positive_float)c(\(cl_float_format_t)h(f\))480 -1916 y Fp(Returns)j(the)i(largest)h(\(most)e(p)s(ositiv)m(e\))i +0 1792 y Fp(cl_F)c(most_positive_float)c(\(cl_float_format_t)h(f\))480 +1916 y Fr(Returns)j(the)i(largest)h(\(most)e(p)s(ositiv)m(e\))i (\015oating)f(p)s(oin)m(t)f(n)m(um)m(b)s(er)e(in)i(\015oat)h(format)f -Fn(f)p Fp(.)0 2092 y Fn(cl_F)f(most_negative_float)c -(\(cl_float_format_t)h(f\))480 2217 y Fp(Returns)j(the)i(smallest)g +Fp(f)p Fr(.)0 2092 y Fp(cl_F)f(most_negative_float)c +(\(cl_float_format_t)h(f\))480 2217 y Fr(Returns)j(the)i(smallest)g (\(most)f(negativ)m(e\))j(\015oating)e(p)s(oin)m(t)f(n)m(um)m(b)s(er)e -(in)i(\015oat)h(format)f Fn(f)p Fp(.)0 2393 y Fn(cl_F)f +(in)i(\015oat)h(format)f Fp(f)p Fr(.)0 2393 y Fp(cl_F)f (least_positive_float)c(\(cl_float_format_t)g(f\))480 -2517 y Fp(Returns)39 b(the)i(least)g(p)s(ositiv)m(e)g(\015oating)g(p)s -(oin)m(t)f(n)m(um)m(b)s(er)e(\(i.e.)71 b Fn(>)40 b Fp(0)h(but)e +2517 y Fr(Returns)39 b(the)i(least)g(p)s(ositiv)m(e)g(\015oating)g(p)s +(oin)m(t)f(n)m(um)m(b)s(er)e(\(i.e.)71 b Fp(>)40 b Fr(0)h(but)e (closest)j(to)f(0\))f(in)g(\015oat)480 2642 y(format)30 -b Fn(f)p Fp(.)0 2818 y Fn(cl_F)f(least_negative_float)c -(\(cl_float_format_t)g(f\))480 2943 y Fp(Returns)38 b(the)h(least)h +b Fp(f)p Fr(.)0 2818 y Fp(cl_F)f(least_negative_float)c +(\(cl_float_format_t)g(f\))480 2943 y Fr(Returns)38 b(the)h(least)h (negativ)m(e)h(\015oating)f(p)s(oin)m(t)f(n)m(um)m(b)s(er)d(\(i.e.)67 -b Fn(<)39 b Fp(0)g(but)f(closest)j(to)e(0\))h(in)e(\015oat)480 -3067 y(format)30 b Fn(f)p Fp(.)0 3243 y Fn(cl_F)f(float_epsilon)e -(\(cl_float_format_t)e(f\))480 3368 y Fp(Returns)k(the)i(smallest)g -(\015oating)g(p)s(oin)m(t)f(n)m(um)m(b)s(er)e(e)j Fn(>)f -Fp(0)h(suc)m(h)f(that)h Fn(1+e)e(!=)h(1)p Fp(.)0 3544 -y Fn(cl_F)f(float_negative_epsilon)c(\(cl_float_format_t)g(f\))480 -3668 y Fp(Returns)k(the)i(smallest)g(\015oating)g(p)s(oin)m(t)f(n)m(um) -m(b)s(er)e(e)j Fn(>)f Fp(0)h(suc)m(h)f(that)h Fn(1-e)e(!=)h(1)p -Fp(.)0 4091 y Fk(4.11.2)63 b(Con)m(v)m(ersion)31 b(to)f(rational)g(n)m -(um)m(b)s(ers)0 4365 y Fp(Eac)m(h)h(of)g(the)f(classes)i -Fn(cl_R)p Fp(,)d Fn(cl_RA)p Fp(,)g Fn(cl_F)g Fp(de\014nes)h(the)g -(follo)m(wing)i(op)s(eration:)0 4666 y Fn(cl_RA)d(rational)f(\(const)h -Fi(t)m(yp)s(e)5 b Fn(&)30 b(x\))480 4790 y Fp(Returns)g(the)h(v)-5 -b(alue)32 b(of)f Fn(x)f Fp(as)i(an)e(exact)j(n)m(um)m(b)s(er.)40 -b(If)31 b Fn(x)f Fp(is)h(already)h(an)f(exact)h(n)m(um)m(b)s(er,)d -(this)i(is)g Fn(x)p Fp(.)480 4915 y(If)f Fn(x)g Fp(is)g(a)h +b Fp(<)39 b Fr(0)g(but)f(closest)j(to)e(0\))h(in)e(\015oat)480 +3067 y(format)30 b Fp(f)p Fr(.)0 3243 y Fp(cl_F)f(float_epsilon)e +(\(cl_float_format_t)e(f\))480 3368 y Fr(Returns)k(the)i(smallest)g +(\015oating)g(p)s(oin)m(t)f(n)m(um)m(b)s(er)e(e)j Fp(>)f +Fr(0)h(suc)m(h)f(that)h Fp(1+e)e(!=)h(1)p Fr(.)0 3544 +y Fp(cl_F)f(float_negative_epsilon)c(\(cl_float_format_t)g(f\))480 +3668 y Fr(Returns)k(the)i(smallest)g(\015oating)g(p)s(oin)m(t)f(n)m(um) +m(b)s(er)e(e)j Fp(>)f Fr(0)h(suc)m(h)f(that)h Fp(1-e)e(!=)h(1)p +Fr(.)0 4091 y Fm(4.11.2)63 b(Con)m(v)m(ersion)31 b(to)f(rational)g(n)m +(um)m(b)s(ers)0 4365 y Fr(Eac)m(h)h(of)g(the)f(classes)i +Fp(cl_R)p Fr(,)d Fp(cl_RA)p Fr(,)g Fp(cl_F)g Fr(de\014nes)h(the)g +(follo)m(wing)i(op)s(eration:)0 4666 y Fp(cl_RA)d(rational)f(\(const)h +Fk(t)m(yp)s(e)5 b Fp(&)30 b(x\))480 4790 y Fr(Returns)g(the)h(v)-5 +b(alue)32 b(of)f Fp(x)f Fr(as)i(an)e(exact)j(n)m(um)m(b)s(er.)40 +b(If)31 b Fp(x)f Fr(is)h(already)h(an)f(exact)h(n)m(um)m(b)s(er,)d +(this)i(is)g Fp(x)p Fr(.)480 4915 y(If)f Fp(x)g Fr(is)g(a)h (\015oating-p)s(oin)m(t)g(n)m(um)m(b)s(er,)d(the)j(v)-5 b(alue)30 b(is)h(a)f(rational)i(n)m(um)m(b)s(er)c(whose)i(denominator)f (is)i(a)480 5039 y(p)s(o)m(w)m(er)f(of)h(2.)0 5340 y(In)f(order)g(to)h -(con)m(v)m(ert)h(bac)m(k,)f(sa)m(y)-8 b(,)32 b Fn -(\(cl_F\)\(cl_R\)"1/3")25 b Fp(to)31 b Fn(1/3)p Fp(,)f(there)h(is)f +(con)m(v)m(ert)h(bac)m(k,)f(sa)m(y)-8 b(,)32 b Fp +(\(cl_F\)\(cl_R\)"1/3")25 b Fr(to)31 b Fp(1/3)p Fr(,)f(there)h(is)f (the)h(function)p eop %%Page: 34 36 -34 35 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 -b(on)f(n)m(um)m(b)s(ers)2463 b(34)0 366 y Fn(cl_RA)29 -b(rationalize)e(\(const)i(cl_R&)g(x\))480 491 y Fp(If)i -Fn(x)h Fp(is)g(a)g(\015oating-p)s(oin)m(t)i(n)m(um)m(b)s(er,)c(it)i +34 35 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +b(on)f(n)m(um)m(b)s(ers)2463 b(34)0 366 y Fp(cl_RA)29 +b(rationalize)e(\(const)i(cl_R&)g(x\))480 491 y Fr(If)i +Fp(x)h Fr(is)g(a)g(\015oating-p)s(oin)m(t)i(n)m(um)m(b)s(er,)c(it)i (actually)i(represen)m(ts)e(an)g(in)m(terv)-5 b(al)33 b(of)f(real)g(n)m(um)m(b)s(ers,)f(and)480 616 y(this)43 b(function)g(returns)f(the)h(rational)i(n)m(um)m(b)s(er)40 b(with)j(smallest)h(denominator)e(\(and)h(smallest)480 740 y(n)m(umerator,)31 b(in)h(magnitude\))f(whic)m(h)h(lies)g(in)g -(this)g(in)m(terv)-5 b(al.)46 b(If)31 b Fn(x)h Fp(is)g(already)g(an)g +(this)g(in)m(terv)-5 b(al.)46 b(If)31 b Fp(x)h Fr(is)g(already)g(an)g (exact)h(n)m(um)m(b)s(er,)480 865 y(this)d(function)g(returns)f -Fn(x)p Fp(.)0 1185 y(If)h Fn(x)g Fp(is)g(an)m(y)h(\015oat,)g(one)g(has) -180 1470 y Fn(cl_float\(rational\(x\),x\))24 b(=)30 b(x)180 +Fp(x)p Fr(.)0 1185 y(If)h Fp(x)g Fr(is)g(an)m(y)h(\015oat,)g(one)g(has) +180 1470 y Fp(cl_float\(rational\(x\),x\))24 b(=)30 b(x)180 1630 y(cl_float\(rationalize\(x\),)o(x\))24 b(=)30 b(x)0 -2175 y Fq(4.12)68 b(Random)31 b(n)l(um)l(b)t(er)f(generators)0 -2460 y Fp(A)c(random)f(generator)j(is)e(a)h(mac)m(hine)f(whic)m(h)g +2175 y Fs(4.12)68 b(Random)31 b(n)l(um)l(b)t(er)f(generators)0 +2460 y Fr(A)c(random)f(generator)j(is)e(a)h(mac)m(hine)f(whic)m(h)g (pro)s(duces)f(\(pseudo-\)random)g(n)m(um)m(b)s(ers.)37 -b(The)26 b(include)g(\014le)g Fn()34 -b Fp(de\014nes)i(a)i(class)f Fn(cl_random_state)c Fp(whic)m(h)j(con)m +b(The)26 b(include)g(\014le)g Fp()34 +b Fr(de\014nes)i(a)i(class)f Fp(cl_random_state)c Fr(whic)m(h)j(con)m (tains)i(the)g(state)g(of)f(a)g(random)e(generator.)61 b(If)0 2709 y(y)m(ou)31 b(mak)m(e)g(a)g(cop)m(y)h(of)f(the)g(random)e (n)m(um)m(b)s(er)f(generator,)k(the)f(original)h(one)f(and)f(the)h(cop) @@ -3106,216 +3380,216 @@ m(y)h(will)f(pro)s(duce)f(the)0 2834 y(same)g(sequence)h(of)f(random)f 39 b(Calling)28 b(one)g(of)f(these)0 3243 y(mo)s(di\014es)i(the)h (state)i(of)e(the)h(random)e(n)m(um)m(b)s(er)f(generator)j(in)f(a)h (complicated)g(but)f(deterministic)g(w)m(a)m(y)-8 b(.)0 -3528 y(The)30 b(global)i(v)-5 b(ariable)240 3792 y Fn(cl_random_state) -44 b(cl_default_random_state)0 4076 y Fp(con)m(tains)25 +3528 y(The)30 b(global)i(v)-5 b(ariable)240 3792 y Fp(cl_random_state) +44 b(cl_default_random_state)0 4076 y Fr(con)m(tains)25 b(a)e(default)h(random)d(n)m(um)m(b)s(er)g(generator.)40 b(It)23 b(is)h(used)e(when)h(the)g(functions)g(b)s(elo)m(w)h(are)f -(called)i(without)0 4201 y Fn(cl_random_state)h Fp(argumen)m(t.)0 -4521 y Fn(uint32)j(random32)f(\(cl_random_state&)d(randomstate\))0 -4646 y(uint32)k(random32)f(\(\))480 4770 y Fp(Returns)h(a)i(random)e +(called)i(without)0 4201 y Fp(cl_random_state)h Fr(argumen)m(t.)0 +4521 y Fp(uint32)j(random32)f(\(cl_random_state&)d(randomstate\))0 +4646 y(uint32)k(random32)f(\(\))480 4770 y Fr(Returns)h(a)i(random)e (unsigned)g(32-bit)j(n)m(um)m(b)s(er.)38 b(All)31 b(bits)f(are)h -(equally)g(random.)0 4966 y Fn(cl_I)e(random_I)f(\(cl_random_state&)e +(equally)g(random.)0 4966 y Fp(cl_I)e(random_I)f(\(cl_random_state&)e (randomstate,)h(const)i(cl_I&)g(n\))0 5091 y(cl_I)g(random_I)f(\(const) -h(cl_I&)g(n\))480 5215 y(n)i Fp(m)m(ust)g(b)s(e)g(an)h(in)m(teger)h -Fn(>)f Fp(0.)45 b(This)31 b(function)g(returns)g(a)h(random)e(in)m -(teger)j Fn(x)f Fp(in)f(the)h(range)h Fn(0)d(<=)480 5340 -y(x)g(<)g(n)p Fp(.)p eop +h(cl_I&)g(n\))480 5215 y(n)i Fr(m)m(ust)g(b)s(e)g(an)h(in)m(teger)h +Fp(>)f Fr(0.)45 b(This)31 b(function)g(returns)g(a)h(random)e(in)m +(teger)j Fp(x)f Fr(in)f(the)h(range)h Fp(0)d(<=)480 5340 +y(x)g(<)g(n)p Fr(.)p eop %%Page: 35 37 -35 36 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 -b(on)f(n)m(um)m(b)s(ers)2463 b(35)0 366 y Fn(cl_F)29 +35 36 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +b(on)f(n)m(um)m(b)s(ers)2463 b(35)0 366 y Fp(cl_F)29 b(random_F)f(\(cl_random_state&)e(randomstate,)h(const)i(cl_F&)g(n\))0 491 y(cl_F)g(random_F)f(\(const)h(cl_F&)g(n\))480 616 -y(n)36 b Fp(m)m(ust)g(b)s(e)g(a)h(\015oat)g Fn(>)g Fp(0.)60 +y(n)36 b Fr(m)m(ust)g(b)s(e)g(a)h(\015oat)g Fp(>)g Fr(0.)60 b(This)36 b(function)g(returns)g(a)h(random)e(\015oating-p)s(oin)m(t)j (n)m(um)m(b)s(er)c(of)j(the)480 740 y(same)30 b(format)f(as)i -Fn(n)f Fp(in)g(the)h(range)f Fn(0)h(<=)e(x)h(<)g(n)p -Fp(.)0 932 y Fn(cl_R)f(random_R)f(\(cl_random_state&)e(randomstate,)h +Fp(n)f Fr(in)g(the)h(range)f Fp(0)h(<=)e(x)h(<)g(n)p +Fr(.)0 932 y Fp(cl_R)f(random_R)f(\(cl_random_state&)e(randomstate,)h (const)i(cl_R&)g(n\))0 1057 y(cl_R)g(random_R)f(\(const)h(cl_R&)g(n\)) -480 1181 y Fp(Beha)m(v)m(es)j(lik)m(e)g Fn(random_I)c -Fp(if)i Fn(n)g Fp(is)h(an)f(in)m(teger)i(and)e(lik)m(e)h -Fn(random_F)d Fp(if)j Fn(n)f Fp(is)g(a)h(\015oat.)0 1709 -y Fq(4.13)68 b(Obfuscating)31 b(op)t(erators)0 1991 y -Fp(The)i(mo)s(difying)f(C/C)p Fn(++)h Fp(op)s(erators)h -Fn(+=)p Fp(,)g Fn(-=)p Fp(,)g Fn(*=)p Fp(,)h Fn(/=)p -Fp(,)f Fn(&=)p Fp(,)g Fn(|=)p Fp(,)g Fn(^=)p Fp(,)g Fn(<<=)p -Fp(,)g Fn(>>=)f Fp(are)h(not)g(a)m(v)-5 b(ailable)36 +480 1181 y Fr(Beha)m(v)m(es)j(lik)m(e)g Fp(random_I)c +Fr(if)i Fp(n)g Fr(is)h(an)f(in)m(teger)i(and)e(lik)m(e)h +Fp(random_F)d Fr(if)j Fp(n)f Fr(is)g(a)h(\015oat.)0 1709 +y Fs(4.13)68 b(Obfuscating)31 b(op)t(erators)0 1991 y +Fr(The)i(mo)s(difying)f(C/C)p Fp(++)h Fr(op)s(erators)h +Fp(+=)p Fr(,)g Fp(-=)p Fr(,)g Fp(*=)p Fr(,)h Fp(/=)p +Fr(,)f Fp(&=)p Fr(,)g Fp(|=)p Fr(,)g Fp(^=)p Fr(,)g Fp(<<=)p +Fr(,)g Fp(>>=)f Fr(are)h(not)g(a)m(v)-5 b(ailable)36 b(b)m(y)e(default)0 2116 y(b)s(ecause)41 b(their)g(use)g(tends)g(to)g (mak)m(e)g(programs)f(unreadable.)72 b(It)41 b(is)h(trivial)g(to)g(get) g(a)m(w)m(a)m(y)h(without)e(them.)0 2240 y(Ho)m(w)m(ev)m(er,)33 b(if)d(y)m(ou)h(feel)g(that)g(y)m(ou)g(absolutely)g(need)f(these)h(op)s (erators)f(to)h(get)h(happ)m(y)-8 b(,)30 b(then)g(add)240 -2502 y Fn(#define)46 b(WANT_OBFUSCATING_OPERATO)o(RS)0 -2785 y Fp(to)34 b(the)g(b)s(eginning)f(of)h(y)m(our)f(source)h +2502 y Fp(#define)46 b(WANT_OBFUSCATING_OPERATO)o(RS)0 +2785 y Fr(to)34 b(the)g(b)s(eginning)f(of)h(y)m(our)f(source)h (\014les,)h(b)s(efore)e(the)h(inclusion)f(of)h(an)m(y)g(CLN)f(include)g (\014les.)51 b(This)33 b(\015ag)h(will)0 2910 y(enable)d(the)f(follo)m (wing)i(op)s(erators:)0 3192 y(F)-8 b(or)31 b(the)g(classes)g -Fn(cl_N)p Fp(,)f Fn(cl_R)p Fp(,)f Fn(cl_RA)p Fp(,)g Fn(cl_F)p -Fp(,)h Fn(cl_SF)p Fp(,)f Fn(cl_FF)p Fp(,)g Fn(cl_DF)p -Fp(,)g Fn(cl_LF)p Fp(:)0 3509 y Fi(t)m(yp)s(e)5 b Fn(&)30 -b(operator)e(+=)i(\()p Fi(t)m(yp)s(e)5 b Fn(&,)30 b(const)f -Fi(t)m(yp)s(e)5 b Fn(&\))0 3633 y Fi(t)m(yp)s(e)g Fn(&)30 -b(operator)e(-=)i(\()p Fi(t)m(yp)s(e)5 b Fn(&,)30 b(const)f -Fi(t)m(yp)s(e)5 b Fn(&\))0 3758 y Fi(t)m(yp)s(e)g Fn(&)30 -b(operator)e(*=)i(\()p Fi(t)m(yp)s(e)5 b Fn(&,)30 b(const)f -Fi(t)m(yp)s(e)5 b Fn(&\))0 3883 y Fi(t)m(yp)s(e)g Fn(&)30 -b(operator)e(/=)i(\()p Fi(t)m(yp)s(e)5 b Fn(&,)30 b(const)f -Fi(t)m(yp)s(e)5 b Fn(&\))0 4165 y Fp(F)-8 b(or)31 b(the)g(class)g -Fn(cl_I)p Fp(:)0 4482 y Fi(t)m(yp)s(e)5 b Fn(&)30 b(operator)e(+=)i(\() -p Fi(t)m(yp)s(e)5 b Fn(&,)30 b(const)f Fi(t)m(yp)s(e)5 -b Fn(&\))0 4606 y Fi(t)m(yp)s(e)g Fn(&)30 b(operator)e(-=)i(\()p -Fi(t)m(yp)s(e)5 b Fn(&,)30 b(const)f Fi(t)m(yp)s(e)5 -b Fn(&\))0 4731 y Fi(t)m(yp)s(e)g Fn(&)30 b(operator)e(*=)i(\()p -Fi(t)m(yp)s(e)5 b Fn(&,)30 b(const)f Fi(t)m(yp)s(e)5 -b Fn(&\))0 4855 y Fi(t)m(yp)s(e)g Fn(&)30 b(operator)e(&=)i(\()p -Fi(t)m(yp)s(e)5 b Fn(&,)30 b(const)f Fi(t)m(yp)s(e)5 -b Fn(&\))0 4980 y Fi(t)m(yp)s(e)g Fn(&)30 b(operator)e(|=)i(\()p -Fi(t)m(yp)s(e)5 b Fn(&,)30 b(const)f Fi(t)m(yp)s(e)5 -b Fn(&\))0 5104 y Fi(t)m(yp)s(e)g Fn(&)30 b(operator)e(^=)i(\()p -Fi(t)m(yp)s(e)5 b Fn(&,)30 b(const)f Fi(t)m(yp)s(e)5 -b Fn(&\))0 5229 y Fi(t)m(yp)s(e)g Fn(&)30 b(operator)e(<<=)i(\()p -Fi(t)m(yp)s(e)5 b Fn(&,)30 b(const)f Fi(t)m(yp)s(e)5 -b Fn(&\))0 5353 y Fi(t)m(yp)s(e)g Fn(&)30 b(operator)e(>>=)i(\()p -Fi(t)m(yp)s(e)5 b Fn(&,)30 b(const)f Fi(t)m(yp)s(e)5 -b Fn(&\))p eop +Fp(cl_N)p Fr(,)f Fp(cl_R)p Fr(,)f Fp(cl_RA)p Fr(,)g Fp(cl_F)p +Fr(,)h Fp(cl_SF)p Fr(,)f Fp(cl_FF)p Fr(,)g Fp(cl_DF)p +Fr(,)g Fp(cl_LF)p Fr(:)0 3509 y Fk(t)m(yp)s(e)5 b Fp(&)30 +b(operator)e(+=)i(\()p Fk(t)m(yp)s(e)5 b Fp(&,)30 b(const)f +Fk(t)m(yp)s(e)5 b Fp(&\))0 3633 y Fk(t)m(yp)s(e)g Fp(&)30 +b(operator)e(-=)i(\()p Fk(t)m(yp)s(e)5 b Fp(&,)30 b(const)f +Fk(t)m(yp)s(e)5 b Fp(&\))0 3758 y Fk(t)m(yp)s(e)g Fp(&)30 +b(operator)e(*=)i(\()p Fk(t)m(yp)s(e)5 b Fp(&,)30 b(const)f +Fk(t)m(yp)s(e)5 b Fp(&\))0 3883 y Fk(t)m(yp)s(e)g Fp(&)30 +b(operator)e(/=)i(\()p Fk(t)m(yp)s(e)5 b Fp(&,)30 b(const)f +Fk(t)m(yp)s(e)5 b Fp(&\))0 4165 y Fr(F)-8 b(or)31 b(the)g(class)g +Fp(cl_I)p Fr(:)0 4482 y Fk(t)m(yp)s(e)5 b Fp(&)30 b(operator)e(+=)i(\() +p Fk(t)m(yp)s(e)5 b Fp(&,)30 b(const)f Fk(t)m(yp)s(e)5 +b Fp(&\))0 4606 y Fk(t)m(yp)s(e)g Fp(&)30 b(operator)e(-=)i(\()p +Fk(t)m(yp)s(e)5 b Fp(&,)30 b(const)f Fk(t)m(yp)s(e)5 +b Fp(&\))0 4731 y Fk(t)m(yp)s(e)g Fp(&)30 b(operator)e(*=)i(\()p +Fk(t)m(yp)s(e)5 b Fp(&,)30 b(const)f Fk(t)m(yp)s(e)5 +b Fp(&\))0 4855 y Fk(t)m(yp)s(e)g Fp(&)30 b(operator)e(&=)i(\()p +Fk(t)m(yp)s(e)5 b Fp(&,)30 b(const)f Fk(t)m(yp)s(e)5 +b Fp(&\))0 4980 y Fk(t)m(yp)s(e)g Fp(&)30 b(operator)e(|=)i(\()p +Fk(t)m(yp)s(e)5 b Fp(&,)30 b(const)f Fk(t)m(yp)s(e)5 +b Fp(&\))0 5104 y Fk(t)m(yp)s(e)g Fp(&)30 b(operator)e(^=)i(\()p +Fk(t)m(yp)s(e)5 b Fp(&,)30 b(const)f Fk(t)m(yp)s(e)5 +b Fp(&\))0 5229 y Fk(t)m(yp)s(e)g Fp(&)30 b(operator)e(<<=)i(\()p +Fk(t)m(yp)s(e)5 b Fp(&,)30 b(const)f Fk(t)m(yp)s(e)5 +b Fp(&\))0 5353 y Fk(t)m(yp)s(e)g Fp(&)30 b(operator)e(>>=)i(\()p +Fk(t)m(yp)s(e)5 b Fp(&,)30 b(const)f Fk(t)m(yp)s(e)5 +b Fp(&\))p eop %%Page: 36 38 -36 37 bop 0 -116 a Fp(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 +36 37 bop 0 -116 a Fr(Chapter)30 b(4:)41 b(F)-8 b(unctions)31 b(on)f(n)m(um)m(b)s(ers)2463 b(36)0 366 y(F)-8 b(or)31 -b(the)g(classes)g Fn(cl_N)p Fp(,)f Fn(cl_R)p Fp(,)f Fn(cl_RA)p -Fp(,)g Fn(cl_I)p Fp(,)h Fn(cl_F)p Fp(,)f Fn(cl_SF)p Fp(,)g -Fn(cl_FF)p Fp(,)h Fn(cl_DF)p Fp(,)f Fn(cl_LF)p Fp(:)0 -665 y Fi(t)m(yp)s(e)5 b Fn(&)30 b(operator)e(++)i(\()p -Fi(t)m(yp)s(e)5 b Fn(&)30 b(x\))480 790 y Fp(The)g(pre\014x)f(op)s -(erator)i Fn(++x)p Fp(.)0 964 y Fn(void)e(operator)f(++)i(\()p -Fi(t)m(yp)s(e)5 b Fn(&)30 b(x,)g(int\))480 1089 y Fp(The)g(p)s -(ost\014x)f(op)s(erator)i Fn(x++)p Fp(.)0 1263 y Fi(t)m(yp)s(e)5 -b Fn(&)30 b(operator)e(--)i(\()p Fi(t)m(yp)s(e)5 b Fn(&)30 -b(x\))480 1388 y Fp(The)g(pre\014x)f(op)s(erator)i Fn(--x)p -Fp(.)0 1562 y Fn(void)e(operator)f(--)i(\()p Fi(t)m(yp)s(e)5 -b Fn(&)30 b(x,)g(int\))480 1687 y Fp(The)g(p)s(ost\014x)f(op)s(erator)i -Fn(x--)p Fp(.)0 1985 y(Note)j(that)e(b)m(y)g(using)g(these)h +b(the)g(classes)g Fp(cl_N)p Fr(,)f Fp(cl_R)p Fr(,)f Fp(cl_RA)p +Fr(,)g Fp(cl_I)p Fr(,)h Fp(cl_F)p Fr(,)f Fp(cl_SF)p Fr(,)g +Fp(cl_FF)p Fr(,)h Fp(cl_DF)p Fr(,)f Fp(cl_LF)p Fr(:)0 +665 y Fk(t)m(yp)s(e)5 b Fp(&)30 b(operator)e(++)i(\()p +Fk(t)m(yp)s(e)5 b Fp(&)30 b(x\))480 790 y Fr(The)g(pre\014x)f(op)s +(erator)i Fp(++x)p Fr(.)0 964 y Fp(void)e(operator)f(++)i(\()p +Fk(t)m(yp)s(e)5 b Fp(&)30 b(x,)g(int\))480 1089 y Fr(The)g(p)s +(ost\014x)f(op)s(erator)i Fp(x++)p Fr(.)0 1263 y Fk(t)m(yp)s(e)5 +b Fp(&)30 b(operator)e(--)i(\()p Fk(t)m(yp)s(e)5 b Fp(&)30 +b(x\))480 1388 y Fr(The)g(pre\014x)f(op)s(erator)i Fp(--x)p +Fr(.)0 1562 y Fp(void)e(operator)f(--)i(\()p Fk(t)m(yp)s(e)5 +b Fp(&)30 b(x,)g(int\))480 1687 y Fr(The)g(p)s(ost\014x)f(op)s(erator)i +Fp(x--)p Fr(.)0 1985 y(Note)j(that)e(b)m(y)g(using)g(these)h (obfuscating)g(op)s(erators,)g(y)m(ou)f(w)m(ouldn't)g(gain)h -(e\016ciency:)46 b(In)31 b(CLN)h(`)p Fn(x)e(+=)g(y;)p -Fp(')i(is)0 2110 y(exactly)g(the)f(same)e(as)i(`)p Fn(x)f(=)g(x+y;)p -Fp(',)g(not)h(more)e(e\016cien)m(t.)p eop +(e\016ciency:)46 b(In)31 b(CLN)h(`)p Fp(x)e(+=)g(y;)p +Fr(')i(is)0 2110 y(exactly)g(the)f(same)e(as)i(`)p Fp(x)f(=)g(x+y;)p +Fr(',)g(not)h(more)e(e\016cien)m(t.)p eop %%Page: 37 39 -37 38 bop 0 -116 a Fp(Chapter)30 b(5:)41 b(Input/Output)2784 -b(37)0 366 y Fm(5)80 b(Input/Output)0 933 y Fq(5.1)68 +37 38 bop 0 -116 a Fr(Chapter)30 b(5:)41 b(Input/Output)2784 +b(37)0 366 y Fo(5)80 b(Input/Output)0 933 y Fs(5.1)68 b(In)l(ternal)32 b(and)e(prin)l(ted)g(represen)l(tation)0 -1209 y Fp(All)h(computations)f(deal)h(with)f(the)h(in)m(ternal)g +1209 y Fr(All)h(computations)f(deal)h(with)f(the)h(in)m(ternal)g (represen)m(tations)g(of)g(the)f(n)m(um)m(b)s(ers.)0 1484 y(Ev)m(ery)i(n)m(um)m(b)s(er)d(has)j(an)f(external)i(represen)m (tation)g(as)f(a)g(sequence)g(of)g(ASCI)s(I)e(c)m(haracters.)46 b(Sev)m(eral)33 b(external)0 1609 y(represen)m(tations)e(ma)m(y)f (denote)h(the)g(same)f(n)m(um)m(b)s(er,)e(for)i(example,)g -Fn(")p Fp(20.0)p Fn(")i Fp(and)d Fn(")p Fp(20.000)p Fn(")p -Fp(.)0 1884 y(Con)m(v)m(erting)38 b(an)g(in)m(ternal)g(to)g(an)f +Fp(")p Fr(20.0)p Fp(")i Fr(and)d Fp(")p Fr(20.000)p Fp(")p +Fr(.)0 1884 y(Con)m(v)m(erting)38 b(an)g(in)m(ternal)g(to)g(an)f (external)i(represen)m(tation)f(is)g(called)g(\\prin)m(ting",)j(con)m (v)m(erting)e(an)e(external)0 2009 y(to)43 b(an)e(in)m(ternal)i (represen)m(tation)g(is)f(called)h(\\reading".)76 b(In)41 -b(CLN,)h(is)g(it)g(alw)m(a)m(ys)i(true)d(that)i(con)m(v)m(ersion)g(of)0 +b(CLN,)h(it)g(is)g(alw)m(a)m(ys)i(true)d(that)i(con)m(v)m(ersion)g(of)0 2133 y(an)d(in)m(ternal)g(to)g(an)g(external)g(represen)m(tation)h(and) e(then)g(bac)m(k)i(to)f(an)g(in)m(ternal)g(represen)m(tation)h(will)f (yield)0 2258 y(the)34 b(same)e(in)m(ternal)j(represen)m(tation.)50 -b(Sym)m(b)s(olically:)d Fn(read\(print\(x\)\))27 b(==)i(x)p -Fp(.)50 b(This)33 b(is)g(called)i(\\prin)m(t-read)0 2382 +b(Sym)m(b)s(olically:)d Fp(read\(print\(x\)\))27 b(==)i(x)p +Fr(.)50 b(This)33 b(is)g(called)i(\\prin)m(t-read)0 2382 y(consistency".)0 2658 y(Di\013eren)m(t)d(t)m(yp)s(es)e(of)h(n)m(um)m (b)s(ers)d(ha)m(v)m(e)j(di\013eren)m(t)g(external)g(represen)m(tations) h(\(case)f(is)g(insigni\014can)m(t\):)0 2959 y(In)m(tegers)167 -b(External)30 b(represen)m(tation:)41 b Fi(sign)p Fn({)p -Fi(digit)r Fn(}+)p Fp(.)g(The)29 b(reader)g(also)i(accepts)g(the)e -(Common)e(Lisp)i(syn-)480 3084 y(taxes)39 b Fi(sign)p -Fn({)p Fi(digit)r Fn(}+.)f Fp(with)h(a)f(trailing)i(dot)e(for)h -(decimal)f(in)m(tegers)i(and)d(the)i Fn(#)p Fi(n)p Fn(R)p -Fp(,)g Fn(#b)p Fp(,)i Fn(#o)p Fp(,)f Fn(#x)480 3208 y -Fp(pre\014xes.)0 3386 y(Rational)32 b(n)m(um)m(b)s(ers)480 -3510 y(External)37 b(represen)m(tation:)56 b Fi(sign)p -Fn({)p Fi(digit)r Fn(}+/{)p Fi(digit)r Fn(}+)p Fp(.)k(The)37 -b Fn(#)p Fi(n)p Fn(R)p Fp(,)h Fn(#b)p Fp(,)g Fn(#o)p -Fp(,)h Fn(#x)d Fp(pre\014xes)g(are)i(al-)480 3635 y(lo)m(w)m(ed)32 +b(External)30 b(represen)m(tation:)41 b Fk(sign)p Fp({)p +Fk(digit)r Fp(}+)p Fr(.)g(The)29 b(reader)g(also)i(accepts)g(the)e +(Common)e(Lisp)i(syn-)480 3084 y(taxes)39 b Fk(sign)p +Fp({)p Fk(digit)r Fp(}+.)f Fr(with)h(a)f(trailing)i(dot)e(for)h +(decimal)f(in)m(tegers)i(and)d(the)i Fp(#)p Fk(n)p Fp(R)p +Fr(,)g Fp(#b)p Fr(,)i Fp(#o)p Fr(,)f Fp(#x)480 3208 y +Fr(pre\014xes.)0 3386 y(Rational)32 b(n)m(um)m(b)s(ers)480 +3510 y(External)37 b(represen)m(tation:)56 b Fk(sign)p +Fp({)p Fk(digit)r Fp(}+/{)p Fk(digit)r Fp(}+)p Fr(.)k(The)37 +b Fp(#)p Fk(n)p Fp(R)p Fr(,)h Fp(#b)p Fr(,)g Fp(#o)p +Fr(,)h Fp(#x)d Fr(pre\014xes)g(are)i(al-)480 3635 y(lo)m(w)m(ed)32 b(here)e(as)g(w)m(ell.)0 3812 y(Floating-p)s(oin)m(t)j(n)m(um)m(b)s (ers)480 3937 y(External)48 b(represen)m(tation:)76 b -Fi(sign)p Fn({)p Fi(digit)r Fn(})p Fp(*)p Fi(exp)s(onen)m(t)50 -b Fp(or)d Fi(sign)p Fn({)p Fi(digit)r Fn(})p Fp(*)p Fn(.{)p -Fi(digit)r Fn(})p Fp(*)p Fi(exp)s(onen)m(t)k Fp(or)480 -4061 y Fi(sign)p Fn({)p Fi(digit)r Fn(})p Fp(*)p Fn(.{)p -Fi(digit)r Fn(}+)p Fp(.)40 b(A)26 b(precision)g(sp)s(eci\014er)f(of)h -(the)h(form)p 2684 4061 28 4 v 57 w Fi(prec)k Fp(ma)m(y)26 +Fk(sign)p Fp({)p Fk(digit)r Fp(})p Fr(*)p Fk(exp)s(onen)m(t)50 +b Fr(or)d Fk(sign)p Fp({)p Fk(digit)r Fp(})p Fr(*)p Fp(.{)p +Fk(digit)r Fp(})p Fr(*)p Fk(exp)s(onen)m(t)k Fr(or)480 +4061 y Fk(sign)p Fp({)p Fk(digit)r Fp(})p Fr(*)p Fp(.{)p +Fk(digit)r Fp(}+)p Fr(.)40 b(A)26 b(precision)g(sp)s(eci\014er)f(of)h +(the)h(form)p 2684 4061 28 4 v 57 w Fk(prec)k Fr(ma)m(y)26 b(b)s(e)f(app)s(ended.)37 b(There)480 4186 y(m)m(ust)h(b)s(e)h(at)i (least)g(one)e(digit)i(in)e(the)h(non-exp)s(onen)m(t)f(part.)69 b(The)39 b(exp)s(onen)m(t)g(has)h(the)f(syn)m(tax)480 -4310 y Fi(expmark)m(er)d(expsign)30 b Fn({)p Fi(digit)r -Fn(}+)p Fp(.)41 b(The)30 b(exp)s(onen)m(t)g(mark)m(er)g(is)660 -4461 y(`)p Fn(s)p Fp(')h(for)f(short-\015oats,)660 4612 -y(`)p Fn(f)p Fp(')h(for)f(single-\015oats,)660 4763 y(`)p -Fn(d)p Fp(')h(for)f(double-\015oats,)660 4914 y(`)p Fn(L)p -Fp(')h(for)f(long-\015oats,)480 5091 y(or)25 b(`)p Fn(e)p -Fp(',)i(whic)m(h)e(denotes)h(a)g(default)f(\015oat)h(format.)39 +4310 y Fk(expmark)m(er)d(expsign)30 b Fp({)p Fk(digit)r +Fp(}+)p Fr(.)41 b(The)30 b(exp)s(onen)m(t)g(mark)m(er)g(is)660 +4461 y(`)p Fp(s)p Fr(')h(for)f(short-\015oats,)660 4612 +y(`)p Fp(f)p Fr(')h(for)f(single-\015oats,)660 4763 y(`)p +Fp(d)p Fr(')h(for)f(double-\015oats,)660 4914 y(`)p Fp(L)p +Fr(')h(for)f(long-\015oats,)480 5091 y(or)25 b(`)p Fp(e)p +Fr(',)i(whic)m(h)e(denotes)h(a)g(default)f(\015oat)h(format.)39 b(The)25 b(precision)g(sp)s(ecifying)g(su\016x)g(has)g(the)g(syn-)480 -5215 y(tax)p 638 5215 V 57 w Fi(prec)30 b Fp(where)23 -b Fi(prec)30 b Fp(denotes)24 b(the)g(n)m(um)m(b)s(er)e(of)i(v)-5 +5215 y(tax)p 638 5215 V 57 w Fk(prec)30 b Fr(where)23 +b Fk(prec)30 b Fr(denotes)24 b(the)g(n)m(um)m(b)s(er)e(of)i(v)-5 b(alid)25 b(man)m(tissa)f(digits)g(\(in)g(decimal,)i(excluding)480 5340 y(leading)31 b(zero)s(es\),)h(cf.)41 b(also)31 b(function)f(`)p -Fn(cl_float_format)p Fp('.)p eop +Fp(cl_float_format)p Fr('.)p eop %%Page: 38 40 -38 39 bop 0 -116 a Fp(Chapter)30 b(5:)41 b(Input/Output)2784 +38 39 bop 0 -116 a Fr(Chapter)30 b(5:)41 b(Input/Output)2784 b(38)0 366 y(Complex)29 b(n)m(um)m(b)s(ers)480 491 y(External)i (represen)m(tation:)660 646 y(In)h(algebraic)i(notation:)46 -b Fi(realpart)r Fn(+)p Fi(imagpart)r Fn(i)p Fp(.)g(Of)32 -b(course,)h(if)g Fi(imagpart)h Fp(is)e(negativ)m(e,)k(its)660 +b Fk(realpart)r Fp(+)p Fk(imagpart)r Fp(i)p Fr(.)g(Of)32 +b(course,)h(if)g Fk(imagpart)h Fr(is)e(negativ)m(e,)k(its)660 771 y(prin)m(ted)23 b(represen)m(tation)h(b)s(egins)f(with)g(a)h(`)p -Fn(-)p Fp(',)h(and)e(the)h(`)p Fn(+)p Fp(')f(b)s(et)m(w)m(een)h -Fi(realpart)i Fp(and)d Fi(imagpart)660 895 y Fp(ma)m(y)37 +Fp(-)p Fr(',)h(and)e(the)h(`)p Fp(+)p Fr(')f(b)s(et)m(w)m(een)h +Fk(realpart)i Fr(and)d Fk(imagpart)660 895 y Fr(ma)m(y)37 b(b)s(e)h(omitted.)63 b(Note)39 b(that)g(this)e(notation)j(cannot)e(b)s -(e)f(used)g(when)g(the)h Fi(imagpart)i Fp(is)660 1020 +(e)f(used)g(when)g(the)h Fk(imagpart)i Fr(is)660 1020 y(rational)c(and)f(the)g(rational)h(n)m(um)m(b)s(er's)d(base)i(is)g -Fn(>)p Fp(18,)i(b)s(ecause)e(the)g(`)p Fn(i)p Fp(')g(is)g(then)g(read)f +Fp(>)p Fr(18,)i(b)s(ecause)e(the)g(`)p Fp(i)p Fr(')g(is)g(then)g(read)f (as)i(a)660 1144 y(digit.)660 1299 y(In)30 b(Common)e(Lisp)h(notation:) -42 b Fn(#C\()p Fi(realpart)32 b(imagpart)r Fn(\))p Fp(.)0 -1799 y Fq(5.2)68 b(Input)30 b(functions)0 2078 y Fp(Including)24 -b Fn()e Fp(de\014nes)i(a)h(t)m(yp)s(e)g Fn(cl_istream)p -Fp(,)e(whic)m(h)h(is)h(the)g(t)m(yp)s(e)g(of)g(the)g(\014rst)f(argumen) +42 b Fp(#C\()p Fk(realpart)32 b(imagpart)r Fp(\))p Fr(.)0 +1799 y Fs(5.2)68 b(Input)30 b(functions)0 2078 y Fr(Including)24 +b Fp()e Fr(de\014nes)i(a)h(t)m(yp)s(e)g Fp(cl_istream)p +Fr(,)e(whic)m(h)h(is)h(the)g(t)m(yp)s(e)g(of)g(the)g(\014rst)f(argumen) m(t)g(to)h(all)h(input)0 2203 y(functions.)38 b(Unless)24 b(y)m(ou)g(build)f(and)g(use)g(CLN)g(with)h(the)g(macro)f(CL)p 2375 2203 28 4 v 32 w(IO)p 2511 2203 V 33 w(STDIO)f(b)s(eing)i -(de\014ned,)g Fn(cl_istream)0 2327 y Fp(is)30 b(the)h(same)f(as)g -Fn(istream&)p Fp(.)0 2607 y(The)g(v)-5 b(ariable)180 -2887 y Fn(cl_istream)28 b(cl_stdin)0 3197 y Fp(con)m(tains)k(the)e +(de\014ned,)g Fp(cl_istream)0 2327 y Fr(is)30 b(the)h(same)f(as)g +Fp(istream&)p Fr(.)0 2607 y(The)g(v)-5 b(ariable)180 +2887 y Fp(cl_istream)28 b(cl_stdin)0 3197 y Fr(con)m(tains)k(the)e (standard)g(input)f(stream.)0 3476 y(These)h(are)h(the)f(simple)g -(input)f(functions:)0 3787 y Fn(int)g(freadchar)f(\(cl_istream)g -(stream\))480 3911 y Fp(Reads)33 b(a)h(c)m(haracter)h(from)c -Fn(stream)p Fp(.)48 b(Returns)32 b Fn(cl_EOF)f Fp(\(not)j(a)g(`)p -Fn(char)p Fp('!\))48 b(if)33 b(the)h(end)e(of)i(stream)480 +(input)f(functions:)0 3787 y Fp(int)g(freadchar)f(\(cl_istream)g +(stream\))480 3911 y Fr(Reads)33 b(a)h(c)m(haracter)h(from)c +Fp(stream)p Fr(.)48 b(Returns)32 b Fp(cl_EOF)f Fr(\(not)j(a)g(`)p +Fp(char)p Fr('!\))48 b(if)33 b(the)h(end)e(of)i(stream)480 4036 y(w)m(as)d(encoun)m(tered)g(or)f(an)g(error)g(o)s(ccurred.)0 -4221 y Fn(int)f(funreadchar)f(\(cl_istream)f(stream,)h(int)i(c\))480 -4346 y Fp(Puts)37 b(bac)m(k)i Fn(c)f Fp(on)m(to)h Fn(stream)p -Fp(.)61 b Fn(c)38 b Fp(m)m(ust)e(b)s(e)i(the)g(result)g(of)g(the)g -(last)g Fn(freadchar)e Fp(op)s(eration)i(on)480 4471 -y Fn(stream)p Fp(.)0 4781 y(Eac)m(h)d(of)g(the)g(classes)g -Fn(cl_N)p Fp(,)g Fn(cl_R)p Fp(,)g Fn(cl_RA)p Fp(,)f Fn(cl_I)p -Fp(,)h Fn(cl_F)p Fp(,)f Fn(cl_SF)p Fp(,)h Fn(cl_FF)p -Fp(,)f Fn(cl_DF)p Fp(,)h Fn(cl_LF)e Fp(de\014nes,)i(in)f -Fn()p Fp(,)29 -b(the)i(follo)m(wing)h(input)d(function:)0 5215 y Fn(cl_istream)f -(operator>>)f(\(cl_istream)g(stream,)i Fi(t)m(yp)s(e)5 -b Fn(&)30 b(result\))480 5340 y Fp(Reads)g(a)h(n)m(um)m(b)s(er)d(from)h -Fn(stream)g Fp(and)h(stores)g(it)h(in)f(the)h Fn(result)p -Fp(.)p eop +4221 y Fp(int)f(funreadchar)f(\(cl_istream)f(stream,)h(int)i(c\))480 +4346 y Fr(Puts)37 b(bac)m(k)i Fp(c)f Fr(on)m(to)h Fp(stream)p +Fr(.)61 b Fp(c)38 b Fr(m)m(ust)e(b)s(e)i(the)g(result)g(of)g(the)g +(last)g Fp(freadchar)e Fr(op)s(eration)i(on)480 4471 +y Fp(stream)p Fr(.)0 4781 y(Eac)m(h)d(of)g(the)g(classes)g +Fp(cl_N)p Fr(,)g Fp(cl_R)p Fr(,)g Fp(cl_RA)p Fr(,)f Fp(cl_I)p +Fr(,)h Fp(cl_F)p Fr(,)f Fp(cl_SF)p Fr(,)h Fp(cl_FF)p +Fr(,)f Fp(cl_DF)p Fr(,)h Fp(cl_LF)e Fr(de\014nes,)i(in)f +Fp()p Fr(,)29 +b(the)i(follo)m(wing)h(input)d(function:)0 5215 y Fp(cl_istream)f +(operator>>)f(\(cl_istream)g(stream,)i Fk(t)m(yp)s(e)5 +b Fp(&)30 b(result\))480 5340 y Fr(Reads)g(a)h(n)m(um)m(b)s(er)d(from)h +Fp(stream)g Fr(and)h(stores)g(it)h(in)f(the)h Fp(result)p +Fr(.)p eop %%Page: 39 41 -39 40 bop 0 -116 a Fp(Chapter)30 b(5:)41 b(Input/Output)2784 +39 40 bop 0 -116 a Fr(Chapter)30 b(5:)41 b(Input/Output)2784 b(39)0 366 y(The)30 b(most)g(\015exible)g(input)g(functions,)g -(de\014ned)f(in)h Fn()p -Fp(,)28 b(are)j(the)f(follo)m(wing:)0 659 y Fn(cl_N)f(read_complex)e +(de\014ned)f(in)h Fp()p +Fr(,)28 b(are)j(the)f(follo)m(wing:)0 659 y Fp(cl_N)f(read_complex)e (\(cl_istream)h(stream,)g(const)h(cl_read_flags&)d(flags\))0 783 y(cl_R)j(read_real)f(\(cl_istream)f(stream,)i(const)g (cl_read_flags&)d(flags\))0 908 y(cl_F)j(read_float)f(\(cl_istream)f (stream,)h(const)h(cl_read_flags&)e(flags\))0 1033 y(cl_RA)i (read_rational)e(\(cl_istream)g(stream,)h(const)h(cl_read_flags&)e (flags\))0 1157 y(cl_I)i(read_integer)e(\(cl_istream)h(stream,)g(const) -h(cl_read_flags&)d(flags\))480 1282 y Fp(Reads)d(a)g(n)m(um)m(b)s(er)e -(from)h Fn(stream)p Fp(.)36 b(The)23 b Fn(flags)e Fp(are)i(parameters)g +h(cl_read_flags&)d(flags\))480 1282 y Fr(Reads)d(a)g(n)m(um)m(b)s(er)e +(from)h Fp(stream)p Fr(.)36 b(The)23 b Fp(flags)e Fr(are)i(parameters)g (whic)m(h)f(a\013ect)j(the)e(input)f(syn)m(tax.)480 1406 y(Whitespace)32 b(b)s(efore)e(the)g(n)m(um)m(b)s(er)e(is)j(silen)m(tly) -h(skipp)s(ed.)0 1568 y Fn(cl_N)d(read_complex)e(\(const)i +h(skipp)s(ed.)0 1568 y Fp(cl_N)d(read_complex)e(\(const)i (cl_read_flags&)d(flags,)j(const)g(char)g(*)h(string,)f(const)g(char)g (*)0 1692 y(string_limit,)e(const)i(char)g(*)h(*)g(end_of_parse\))0 1817 y(cl_R)f(read_real)f(\(const)h(cl_read_flags&)d(flags,)j(const)g @@ -3328,119 +3602,119 @@ h(skipp)s(ed.)0 1568 y Fn(cl_N)d(read_complex)e(\(const)i y(string_limit,)e(const)i(char)g(*)h(*)g(end_of_parse\))0 2564 y(cl_I)f(read_integer)e(\(const)i(cl_read_flags&)d(flags,)j(const) g(char)g(*)h(string,)f(const)g(char)g(*)0 2688 y(string_limit,)e(const) -i(char)g(*)h(*)g(end_of_parse\))480 2813 y Fp(Reads)g(a)h(n)m(um)m(b)s +i(char)g(*)h(*)g(end_of_parse\))480 2813 y Fr(Reads)g(a)h(n)m(um)m(b)s (er)d(from)h(a)i(string)f(in)g(memory)-8 b(.)39 b(The)30 -b Fn(flags)f Fp(are)i(parameters)f(whic)m(h)g(a\013ect)i(the)480 +b Fp(flags)f Fr(are)i(parameters)f(whic)m(h)g(a\013ect)i(the)480 2938 y(input)26 b(syn)m(tax.)40 b(The)27 b(string)g(starts)g(at)h -Fn(string)d Fp(and)h(ends)g(at)i Fn(string_limit)c Fp(\(exclusiv)m(e)29 -b(limit\).)480 3062 y Fn(string_limit)24 b Fp(ma)m(y)j(also)h(b)s(e)e -Fn(NULL)p Fp(,)h(denoting)h(the)f(en)m(tire)h(string,)g(i.e.)40 -b(equiv)-5 b(alen)m(t)29 b(to)f Fn(string_)480 3187 y(limit)h(=)h -(string)f(+)h(strlen\(string\))p Fp(.)57 b(If)37 b Fn(end_of_parse)d -Fp(is)j Fn(NULL)p Fp(,)h(the)g(string)f(in)g(memory)480 +Fp(string)d Fr(and)h(ends)g(at)i Fp(string_limit)c Fr(\(exclusiv)m(e)29 +b(limit\).)480 3062 y Fp(string_limit)24 b Fr(ma)m(y)j(also)h(b)s(e)e +Fp(NULL)p Fr(,)h(denoting)h(the)f(en)m(tire)h(string,)g(i.e.)40 +b(equiv)-5 b(alen)m(t)29 b(to)f Fp(string_)480 3187 y(limit)h(=)h +(string)f(+)h(strlen\(string\))p Fr(.)57 b(If)37 b Fp(end_of_parse)d +Fr(is)j Fp(NULL)p Fr(,)h(the)g(string)f(in)g(memory)480 3311 y(m)m(ust)26 b(con)m(tain)i(exactly)h(one)f(n)m(um)m(b)s(er)d(and) h(nothing)h(more,)g(else)h(a)g(fatal)g(error)f(will)g(b)s(e)g -(signalled.)480 3436 y(If)33 b Fn(end_of_parse)c Fp(is)k(not)h -Fn(NULL)p Fp(,)f Fn(*end_of_parse)c Fp(will)k(b)s(e)g(assigned)g(a)h(p) +(signalled.)480 3436 y(If)33 b Fp(end_of_parse)c Fr(is)k(not)h +Fp(NULL)p Fr(,)f Fp(*end_of_parse)c Fr(will)k(b)s(e)g(assigned)g(a)h(p) s(oin)m(ter)f(past)g(the)g(last)480 3560 y(parsed)h(c)m(haracter)i -(\(i.e.)55 b Fn(string_limit)31 b Fp(if)k(nothing)f(came)h(after)g(the) +(\(i.e.)55 b Fp(string_limit)31 b Fr(if)k(nothing)f(came)h(after)g(the) g(n)m(um)m(b)s(er\).)51 b(Whitespace)480 3685 y(is)30 -b(not)h(allo)m(w)m(ed.)0 3977 y(The)f(structure)g Fn(cl_read_flags)d -Fp(con)m(tains)k(the)g(follo)m(wing)g(\014elds:)0 4270 -y Fn(cl_read_syntax_t)26 b(syntax)480 4394 y Fp(The)c(p)s(ossible)f +b(not)h(allo)m(w)m(ed.)0 3977 y(The)f(structure)g Fp(cl_read_flags)d +Fr(con)m(tains)k(the)g(follo)m(wing)g(\014elds:)0 4270 +y Fp(cl_read_syntax_t)26 b(syntax)480 4394 y Fr(The)c(p)s(ossible)f (results)h(of)h(the)f(read)g(op)s(eration.)38 b(P)m(ossible)23 -b(v)-5 b(alues)23 b(are)f Fn(syntax_number)p Fp(,)f Fn(syntax_)480 -4519 y(real)p Fp(,)37 b Fn(syntax_rational)p Fp(,)e Fn(syntax_integer)p -Fp(,)g Fn(syntax_float)p Fp(,)g Fn(syntax_sfloat)p Fp(,)g -Fn(syntax_)480 4643 y(ffloat)p Fp(,)29 b Fn(syntax_dfloat)p -Fp(,)e Fn(syntax_lfloat)p Fp(.)0 4805 y Fn(cl_read_lsyntax_t)f(lsyntax) -480 4929 y Fp(Sp)s(eci\014es)e(the)i(language-dep)s(enden)m(t)g(syn)m +b(v)-5 b(alues)23 b(are)f Fp(syntax_number)p Fr(,)f Fp(syntax_)480 +4519 y(real)p Fr(,)37 b Fp(syntax_rational)p Fr(,)e Fp(syntax_integer)p +Fr(,)g Fp(syntax_float)p Fr(,)g Fp(syntax_sfloat)p Fr(,)g +Fp(syntax_)480 4643 y(ffloat)p Fr(,)29 b Fp(syntax_dfloat)p +Fr(,)e Fp(syntax_lfloat)p Fr(.)0 4805 y Fp(cl_read_lsyntax_t)f(lsyntax) +480 4929 y Fr(Sp)s(eci\014es)e(the)i(language-dep)s(enden)m(t)g(syn)m (tax)f(v)-5 b(arian)m(t)26 b(for)f(the)g(read)g(op)s(eration.)40 b(P)m(ossible)26 b(v)-5 b(alues)480 5054 y(are)480 5215 -y Fn(lsyntax_standard)960 5340 y Fp(accept)32 b(standard)d(algebraic)j +y Fp(lsyntax_standard)960 5340 y Fr(accept)32 b(standard)d(algebraic)j (notation)g(only)-8 b(,)31 b(no)g(complex)f(n)m(um)m(b)s(ers,)p eop %%Page: 40 42 -40 41 bop 0 -116 a Fp(Chapter)30 b(5:)41 b(Input/Output)2784 -b(40)480 366 y Fn(lsyntax_algebraic)960 491 y Fp(accept)32 -b(the)e(algebraic)i(notation)g Fi(x)6 b Fn(+)p Fi(y)i -Fn(i)30 b Fp(for)g(complex)g(n)m(um)m(b)s(ers,)480 679 -y Fn(lsyntax_commonlisp)960 804 y Fp(accept)44 b(the)f -Fn(#b)p Fp(,)i Fn(#o)p Fp(,)g Fn(#x)d Fp(syn)m(taxes)h(for)g(binary)-8 +40 41 bop 0 -116 a Fr(Chapter)30 b(5:)41 b(Input/Output)2784 +b(40)480 366 y Fp(lsyntax_algebraic)960 491 y Fr(accept)32 +b(the)e(algebraic)i(notation)g Fk(x)6 b Fp(+)p Fk(y)i +Fp(i)30 b Fr(for)g(complex)g(n)m(um)m(b)s(ers,)480 679 +y Fp(lsyntax_commonlisp)960 804 y Fr(accept)44 b(the)f +Fp(#b)p Fr(,)i Fp(#o)p Fr(,)g Fp(#x)d Fr(syn)m(taxes)h(for)g(binary)-8 b(,)45 b(o)s(ctal,)i(hexadecimal)c(n)m(um)m(b)s(ers,)960 -928 y Fn(#)p Fi(base)5 b Fn(R)42 b Fp(for)g(rational)h(n)m(um)m(b)s -(ers)d(in)h(a)i(giv)m(en)g(base,)i Fn(#c\()p Fi(realpart)33 -b(imagpart)r Fn(\))41 b Fp(for)960 1053 y(complex)30 -b(n)m(um)m(b)s(ers,)480 1241 y Fn(lsyntax_all)960 1365 -y Fp(accept)i(all)f(of)g(these)f(extensions.)0 1553 y -Fn(unsigned)e(int)i(rational_base)480 1678 y Fp(The)g(base)g(in)g(whic) +928 y Fp(#)p Fk(base)5 b Fp(R)42 b Fr(for)g(rational)h(n)m(um)m(b)s +(ers)d(in)h(a)i(giv)m(en)g(base,)i Fp(#c\()p Fk(realpart)33 +b(imagpart)r Fp(\))41 b Fr(for)960 1053 y(complex)30 +b(n)m(um)m(b)s(ers,)480 1241 y Fp(lsyntax_all)960 1365 +y Fr(accept)i(all)f(of)g(these)f(extensions.)0 1553 y +Fp(unsigned)e(int)i(rational_base)480 1678 y Fr(The)g(base)g(in)g(whic) m(h)h(rational)g(n)m(um)m(b)s(ers)d(are)j(read.)0 1866 -y Fn(cl_float_format_t)26 b(float_flags.default_flo)o(at_f)o(orm)o(at) -480 1990 y Fp(The)k(\015oat)h(format)f(used)f(when)h(reading)g -(\015oats)h(with)f(exp)s(onen)m(t)g(mark)m(er)g(`)p Fn(e)p -Fp('.)0 2178 y Fn(cl_float_format_t)c(float_flags.default_lfl)o(oat_)o -(for)o(mat)480 2303 y Fp(The)k(\015oat)h(format)f(used)f(when)h +y Fp(cl_float_format_t)26 b(float_flags.default_flo)o(at_f)o(orm)o(at) +480 1990 y Fr(The)k(\015oat)h(format)f(used)f(when)h(reading)g +(\015oats)h(with)f(exp)s(onen)m(t)g(mark)m(er)g(`)p Fp(e)p +Fr('.)0 2178 y Fp(cl_float_format_t)c(float_flags.default_lfl)o(oat_)o +(for)o(mat)480 2303 y Fr(The)k(\015oat)h(format)f(used)f(when)h (reading)g(\015oats)h(with)f(exp)s(onen)m(t)g(mark)m(er)g(`)p -Fn(l)p Fp('.)0 2491 y Fn(cl_boolean)e(float_flags.mantissa_de)o(pen)o -(dent)o(_flo)o(at_)o(form)o(at)480 2615 y Fp(When)k(this)g(\015ag)g(is) +Fp(l)p Fr('.)0 2491 y Fp(cl_boolean)e(float_flags.mantissa_de)o(pen)o +(dent)o(_flo)o(at_)o(form)o(at)480 2615 y Fr(When)k(this)g(\015ag)g(is) g(true,)g(\015oats)h(sp)s(eci\014ed)e(with)g(more)g(digits)i(than)f (corresp)s(onding)f(to)h(the)g(ex-)480 2740 y(p)s(onen)m(t)25 b(mark)m(er)f(they)i(con)m(tain,)h(but)e(without)p 2123 -2740 28 4 v 58 w Fi(nnn)f Fp(su\016x,)h(will)h(get)g(a)g(precision)f +2740 28 4 v 58 w Fk(nnn)f Fr(su\016x,)h(will)h(get)g(a)g(precision)f (corresp)s(onding)480 2864 y(to)31 b(their)g(n)m(um)m(b)s(er)d(of)i -(signi\014can)m(t)h(digits.)0 3374 y Fq(5.3)68 b(Output)30 -b(functions)0 3655 y Fp(Including)40 b Fn()d -Fp(de\014nes)j(a)h(t)m(yp)s(e)f Fn(cl_ostream)p Fp(,)h(whic)m(h)f(is)g +(signi\014can)m(t)h(digits.)0 3374 y Fs(5.3)68 b(Output)30 +b(functions)0 3655 y Fr(Including)40 b Fp()d +Fr(de\014nes)j(a)h(t)m(yp)s(e)f Fp(cl_ostream)p Fr(,)h(whic)m(h)f(is)g (the)h(t)m(yp)s(e)f(of)h(the)f(\014rst)g(argumen)m(t)g(to)h(all)0 3780 y(output)e(functions.)66 b(Unless)39 b(y)m(ou)g(build)f(and)g(use) h(CLN)f(with)h(the)g(macro)g(CL)p 2847 3780 V 32 w(IO)p 2983 3780 V 32 w(STDIO)f(b)s(eing)h(de\014ned,)0 3904 -y Fn(cl_ostream)28 b Fp(is)i(the)h(same)e(as)i Fn(ostream&)p -Fp(.)0 4185 y(The)f(v)-5 b(ariable)180 4466 y Fn(cl_ostream)28 -b(cl_stdout)0 4778 y Fp(con)m(tains)k(the)e(standard)g(output)g -(stream.)0 5059 y(The)g(v)-5 b(ariable)180 5340 y Fn(cl_ostream)28 +y Fp(cl_ostream)28 b Fr(is)i(the)h(same)e(as)i Fp(ostream&)p +Fr(.)0 4185 y(The)f(v)-5 b(ariable)180 4466 y Fp(cl_ostream)28 +b(cl_stdout)0 4778 y Fr(con)m(tains)k(the)e(standard)g(output)g +(stream.)0 5059 y(The)g(v)-5 b(ariable)180 5340 y Fp(cl_ostream)28 b(cl_stderr)p eop %%Page: 41 43 -41 42 bop 0 -116 a Fp(Chapter)30 b(5:)41 b(Input/Output)2784 +41 42 bop 0 -116 a Fr(Chapter)30 b(5:)41 b(Input/Output)2784 b(41)0 366 y(con)m(tains)32 b(the)e(standard)g(error)g(output)g (stream.)0 643 y(These)g(are)h(the)f(simple)g(output)g(functions:)0 -948 y Fn(void)f(fprintchar)f(\(cl_ostream)f(stream,)h(char)i(c\))480 -1072 y Fp(Prin)m(ts)g(the)h(c)m(haracter)h Fn(x)e Fp(literally)i(on)e -(the)h Fn(stream)p Fp(.)0 1252 y Fn(void)e(fprint)g(\(cl_ostream)e -(stream,)i(const)f(char)i(*)g(string\))480 1376 y Fp(Prin)m(ts)g(the)h -Fn(string)d Fp(literally)33 b(on)d(the)g Fn(stream)p -Fp(.)0 1556 y Fn(void)f(fprintdecimal)e(\(cl_ostream)g(stream,)i(int)g +948 y Fp(void)f(fprintchar)f(\(cl_ostream)f(stream,)h(char)i(c\))480 +1072 y Fr(Prin)m(ts)g(the)h(c)m(haracter)h Fp(x)e Fr(literally)i(on)e +(the)h Fp(stream)p Fr(.)0 1252 y Fp(void)e(fprint)g(\(cl_ostream)e +(stream,)i(const)f(char)i(*)g(string\))480 1376 y Fr(Prin)m(ts)g(the)h +Fp(string)d Fr(literally)33 b(on)d(the)g Fp(stream)p +Fr(.)0 1556 y Fp(void)f(fprintdecimal)e(\(cl_ostream)g(stream,)i(int)g (x\))0 1681 y(void)g(fprintdecimal)e(\(cl_ostream)g(stream,)i(const)g -(cl_I&)g(x\))480 1805 y Fp(Prin)m(ts)h(the)h(in)m(teger)h -Fn(x)e Fp(in)g(decimal)g(on)g(the)h Fn(stream)p Fp(.)0 -1985 y Fn(void)e(fprintbinary)e(\(cl_ostream)h(stream,)g(const)h(cl_I&) -g(x\))480 2110 y Fp(Prin)m(ts)h(the)h(in)m(teger)h Fn(x)e -Fp(in)g(binary)f(\(base)i(2,)g(without)g(pre\014x\))e(on)h(the)h -Fn(stream)p Fp(.)0 2289 y Fn(void)e(fprintoctal)f(\(cl_ostream)f -(stream,)h(const)h(cl_I&)g(x\))480 2414 y Fp(Prin)m(ts)h(the)h(in)m -(teger)h Fn(x)e Fp(in)g(o)s(ctal)h(\(base)g(8,)g(without)g(pre\014x\))e -(on)i(the)f Fn(stream)p Fp(.)0 2594 y Fn(void)f(fprinthexadecimal)d +(cl_I&)g(x\))480 1805 y Fr(Prin)m(ts)h(the)h(in)m(teger)h +Fp(x)e Fr(in)g(decimal)g(on)g(the)h Fp(stream)p Fr(.)0 +1985 y Fp(void)e(fprintbinary)e(\(cl_ostream)h(stream,)g(const)h(cl_I&) +g(x\))480 2110 y Fr(Prin)m(ts)h(the)h(in)m(teger)h Fp(x)e +Fr(in)g(binary)f(\(base)i(2,)g(without)g(pre\014x\))e(on)h(the)h +Fp(stream)p Fr(.)0 2289 y Fp(void)e(fprintoctal)f(\(cl_ostream)f +(stream,)h(const)h(cl_I&)g(x\))480 2414 y Fr(Prin)m(ts)h(the)h(in)m +(teger)h Fp(x)e Fr(in)g(o)s(ctal)h(\(base)g(8,)g(without)g(pre\014x\))e +(on)i(the)f Fp(stream)p Fr(.)0 2594 y Fp(void)f(fprinthexadecimal)d (\(cl_ostream)h(stream,)i(const)f(cl_I&)h(x\))480 2718 -y Fp(Prin)m(ts)h(the)h(in)m(teger)h Fn(x)e Fp(in)g(hexadecimal)g -(\(base)h(16,)h(without)e(pre\014x\))g(on)g(the)h Fn(stream)p -Fp(.)0 3023 y(Eac)m(h)k(of)g(the)g(classes)g Fn(cl_N)p -Fp(,)g Fn(cl_R)p Fp(,)g Fn(cl_RA)p Fp(,)f Fn(cl_I)p Fp(,)h -Fn(cl_F)p Fp(,)f Fn(cl_SF)p Fp(,)h Fn(cl_FF)p Fp(,)f -Fn(cl_DF)p Fp(,)h Fn(cl_LF)e Fp(de\014nes,)i(in)f Fn()p Fp(,)29 b(the)i(follo)m(wing)h -(output)e(functions:)0 3451 y Fn(void)f(fprint)g(\(cl_ostream)e -(stream,)i(const)f Fi(t)m(yp)s(e)5 b Fn(&)31 b(x\))0 +y Fr(Prin)m(ts)h(the)h(in)m(teger)h Fp(x)e Fr(in)g(hexadecimal)g +(\(base)h(16,)h(without)e(pre\014x\))g(on)g(the)h Fp(stream)p +Fr(.)0 3023 y(Eac)m(h)k(of)g(the)g(classes)g Fp(cl_N)p +Fr(,)g Fp(cl_R)p Fr(,)g Fp(cl_RA)p Fr(,)f Fp(cl_I)p Fr(,)h +Fp(cl_F)p Fr(,)f Fp(cl_SF)p Fr(,)h Fp(cl_FF)p Fr(,)f +Fp(cl_DF)p Fr(,)h Fp(cl_LF)e Fr(de\014nes,)i(in)f Fp()p Fr(,)29 b(the)i(follo)m(wing)h +(output)e(functions:)0 3451 y Fp(void)f(fprint)g(\(cl_ostream)e +(stream,)i(const)f Fk(t)m(yp)s(e)5 b Fp(&)31 b(x\))0 3576 y(cl_ostream)d(operator<<)f(\(cl_ostream)g(stream,)i(const)g -Fi(t)m(yp)s(e)5 b Fn(&)30 b(x\))480 3700 y Fp(Prin)m(ts)38 -b(the)h(n)m(um)m(b)s(er)d Fn(x)i Fp(on)g(the)h Fn(stream)p -Fp(.)63 b(The)38 b(output)g(ma)m(y)g(dep)s(end)f(on)h(the)h(global)g +Fk(t)m(yp)s(e)5 b Fp(&)30 b(x\))480 3700 y Fr(Prin)m(ts)38 +b(the)h(n)m(um)m(b)s(er)d Fp(x)i Fr(on)g(the)h Fp(stream)p +Fr(.)63 b(The)38 b(output)g(ma)m(y)g(dep)s(end)f(on)h(the)h(global)g (prin)m(ter)480 3825 y(settings)k(in)e(the)h(v)-5 b(ariable)43 -b Fn(cl_default_print_flags)p Fp(.)69 b(The)42 b Fn(ostream)e -Fp(\015ags)i(and)f(settings)480 3950 y(\(\015ags,)31 +b Fp(cl_default_print_flags)p Fr(.)69 b(The)42 b Fp(ostream)e +Fr(\015ags)i(and)f(settings)480 3950 y(\(\015ags,)31 b(width)f(and)g(lo)s(cale\))i(are)f(ignored.)0 4254 y(The)f(most)g -(\015exible)g(output)g(function,)g(de\014ned)g(in)g Fn()p Fp(,)28 b(are)j(the)f(follo)m(wing:)240 -4510 y Fn(void)47 b(print_complex)92 b(\(cl_ostream)44 +(\015exible)g(output)g(function,)g(de\014ned)g(in)g Fp()p Fr(,)28 b(are)j(the)f(follo)m(wing:)240 +4510 y Fp(void)47 b(print_complex)92 b(\(cl_ostream)44 b(stream,)i(const)g(cl_print_flags&)e(flags,)1242 4614 y(const)j(cl_N&)f(z\);)240 4717 y(void)h(print_real)236 b(\(cl_ostream)44 b(stream,)i(const)g(cl_print_flags&)e(flags,)1242 @@ -3452,51 +3726,51 @@ b(\(cl_ostream)44 b(stream,)i(const)g(cl_print_flags&)e(flags,)1242 b(\(cl_ostream)44 b(stream,)i(const)g(cl_print_flags&)e(flags,)p eop %%Page: 42 44 -42 43 bop 0 -116 a Fp(Chapter)30 b(5:)41 b(Input/Output)2784 -b(42)1242 366 y Fn(const)47 b(cl_I&)f(z\);)0 640 y Fp(Prin)m(ts)30 -b(the)h(n)m(um)m(b)s(er)d Fn(x)i Fp(on)g(the)h Fn(stream)p -Fp(.)39 b(The)30 b Fn(flags)f Fp(are)h(parameters)g(whic)m(h)g +42 43 bop 0 -116 a Fr(Chapter)30 b(5:)41 b(Input/Output)2784 +b(42)1242 366 y Fp(const)47 b(cl_I&)f(z\);)0 640 y Fr(Prin)m(ts)30 +b(the)h(n)m(um)m(b)s(er)d Fp(x)i Fr(on)g(the)h Fp(stream)p +Fr(.)39 b(The)30 b Fp(flags)f Fr(are)h(parameters)g(whic)m(h)g (a\013ect)i(the)f(output.)0 914 y(The)f(structure)g(t)m(yp)s(e)g -Fn(cl_print_flags)d Fp(con)m(tains)k(the)g(follo)m(wing)h(\014elds:)0 -1213 y Fn(unsigned)c(int)i(rational_base)480 1338 y Fp(The)g(base)g(in) +Fp(cl_print_flags)d Fr(con)m(tains)k(the)g(follo)m(wing)h(\014elds:)0 +1213 y Fp(unsigned)c(int)i(rational_base)480 1338 y Fr(The)g(base)g(in) g(whic)m(h)h(rational)g(n)m(um)m(b)s(ers)d(are)j(prin)m(ted.)40 -b(Default)32 b(is)e Fn(10)p Fp(.)0 1512 y Fn(cl_boolean)e -(rational_readably)480 1637 y Fp(If)i(this)h(\015ag)g(is)g(true,)g +b(Default)32 b(is)e Fp(10)p Fr(.)0 1512 y Fp(cl_boolean)e +(rational_readably)480 1637 y Fr(If)i(this)h(\015ag)g(is)g(true,)g (rational)h(n)m(um)m(b)s(ers)c(are)j(prin)m(ted)f(with)h(radix)f(sp)s (eci\014ers)g(in)g(Common)f(Lisp)480 1761 y(syn)m(tax)i(\()p -Fn(#)p Fi(n)p Fn(R)f Fp(or)g Fn(#b)g Fp(or)g Fn(#o)g -Fp(or)g Fn(#x)g Fp(pre\014xes,)g(trailing)h(dot\).)41 -b(Default)32 b(is)e(false.)0 1936 y Fn(cl_boolean)e(float_readably)480 -2060 y Fp(If)i(this)g(\015ag)g(is)g(true,)h(t)m(yp)s(e)f(sp)s(eci\014c) +Fp(#)p Fk(n)p Fp(R)f Fr(or)g Fp(#b)g Fr(or)g Fp(#o)g +Fr(or)g Fp(#x)g Fr(pre\014xes,)g(trailing)h(dot\).)41 +b(Default)32 b(is)e(false.)0 1936 y Fp(cl_boolean)e(float_readably)480 +2060 y Fr(If)i(this)g(\015ag)g(is)g(true,)h(t)m(yp)s(e)f(sp)s(eci\014c) g(exp)s(onen)m(t)g(mark)m(ers)f(ha)m(v)m(e)j(precedence)e(o)m(v)m(er)i -('E'.)f(Default)g(is)480 2185 y(false.)0 2359 y Fn(cl_float_format_t)26 -b(default_float_format)480 2484 y Fp(Floating)35 b(p)s(oin)m(t)e(n)m +('E'.)f(Default)g(is)480 2185 y(false.)0 2359 y Fp(cl_float_format_t)26 +b(default_float_format)480 2484 y Fr(Floating)35 b(p)s(oin)m(t)e(n)m (um)m(b)s(ers)d(of)j(this)g(format)g(will)g(b)s(e)f(prin)m(ted)h(using) f(the)h('E')g(exp)s(onen)m(t)g(mark)m(er.)480 2608 y(Default)e(is)g -Fn(cl_float_format_ffloat)p Fp(.)0 2782 y Fn(cl_boolean)d -(complex_readably)480 2907 y Fp(If)37 b(this)f(\015ag)i(is)f(true,)h +Fp(cl_float_format_ffloat)p Fr(.)0 2782 y Fp(cl_boolean)d +(complex_readably)480 2907 y Fr(If)37 b(this)f(\015ag)i(is)f(true,)h (complex)f(n)m(um)m(b)s(ers)e(will)i(b)s(e)f(prin)m(ted)h(using)f(the)i -(Common)c(Lisp)i(syn)m(tax)480 3031 y Fn(#C\()p Fi(realpart)c(imagpart) -r Fn(\))p Fp(.)40 b(Default)32 b(is)e(false.)0 3206 y -Fn(cl_string)e(univpoly_varname)480 3330 y Fp(Univ)-5 +(Common)c(Lisp)i(syn)m(tax)480 3031 y Fp(#C\()p Fk(realpart)c(imagpart) +r Fp(\))p Fr(.)40 b(Default)32 b(is)e(false.)0 3206 y +Fp(cl_string)e(univpoly_varname)480 3330 y Fr(Univ)-5 b(ariate)31 b(p)s(olynomials)f(with)f(no)h(explicit)h(indeterminate)f (name)f(will)i(b)s(e)e(prin)m(ted)h(using)f(this)480 3455 y(v)-5 b(ariable)31 b(name.)40 b(Default)31 b(is)g -Fn("x")p Fp(.)0 3754 y(The)38 b(global)i(v)-5 b(ariable)40 -b Fn(cl_default_print_flags)32 b Fp(con)m(tains)40 b(the)f(default)g(v) +Fp("x")p Fr(.)0 3754 y(The)38 b(global)i(v)-5 b(ariable)40 +b Fp(cl_default_print_flags)32 b Fr(con)m(tains)40 b(the)f(default)g(v) -5 b(alues,)41 b(used)d(b)m(y)g(the)h(function)0 3878 -y Fn(fprint)p Fp(,)p eop +y Fp(fprint)p Fr(.)p eop %%Page: 43 45 -43 44 bop 0 -116 a Fp(Chapter)30 b(6:)41 b(Rings)3120 -b(43)0 366 y Fm(6)80 b(Rings)0 754 y Fp(CLN)30 b(has)g(a)h(class)g(of)g -(abstract)g(rings.)1433 1010 y Fn(Ring)1338 1113 y(cl_ring)1290 -1217 y()0 1494 y Fp(Rings)f(can)h(b)s(e)f(compared)f(for)h -(equalit)m(y:)0 1798 y Fn(bool)f(operator==)f(\(const)g(cl_ring&,)g +43 44 bop 0 -116 a Fr(Chapter)30 b(6:)41 b(Rings)3120 +b(43)0 366 y Fo(6)80 b(Rings)0 754 y Fr(CLN)30 b(has)g(a)h(class)g(of)g +(abstract)g(rings.)1433 1010 y Fp(Ring)1338 1113 y(cl_ring)1290 +1217 y()0 1494 y Fr(Rings)f(can)h(b)s(e)f(compared)f(for)h +(equalit)m(y:)0 1798 y Fp(bool)f(operator==)f(\(const)g(cl_ring&,)g (const)h(cl_ring&\))0 1923 y(bool)g(operator!=)f(\(const)g(cl_ring&,)g -(const)h(cl_ring&\))480 2047 y Fp(These)h(compare)g(t)m(w)m(o)i(rings)e +(const)h(cl_ring&\))480 2047 y Fr(These)h(compare)g(t)m(w)m(o)i(rings)e (for)g(equalit)m(y)-8 b(.)0 2352 y(Giv)m(en)31 b(a)g(ring)f -Fn(R)p Fp(,)g(the)h(follo)m(wing)h(mem)m(b)s(ers)27 b(can)k(b)s(e)f -(used.)0 2656 y Fn(void)f(R->fprint)f(\(cl_ostream)f(stream,)i(const)g +Fp(R)p Fr(,)g(the)h(follo)m(wing)h(mem)m(b)s(ers)27 b(can)k(b)s(e)f +(used.)0 2656 y Fp(void)f(R->fprint)f(\(cl_ostream)f(stream,)i(const)g (cl_ring_element&)d(x\))0 2780 y(cl_boolean)i(R->equal)g(\(const)g (cl_ring_element&)e(x,)k(const)f(cl_ring_element&)d(y\))0 2905 y(cl_ring_element)g(R->zero)j(\(\))0 3030 y(cl_boolean)f(R->zerop) @@ -3510,193 +3784,193 @@ g(\(const)g(cl_ring_element&)e(x\))0 3154 y(cl_ring_element)g(R->plus)j b(const)f(cl_ring_element&)d(y\))0 3901 y(cl_ring_element)g(R->square)i (\(const)h(cl_ring_element&)d(x\))0 4026 y(cl_ring_element)g (R->expt_pos)i(\(const)g(cl_ring_element&)e(x,)k(const)f(cl_I&)g(y\))0 -4302 y Fp(The)h(follo)m(wing)i(rings)e(are)g(built-in.)0 -4607 y Fn(cl_null_ring)d(cl_0_ring)480 4731 y Fp(The)j(n)m(ull)g(ring,) -h(con)m(taining)g(only)g(zero.)0 4911 y Fn(cl_complex_ring)26 -b(cl_C_ring)480 5036 y Fp(The)k(ring)g(of)h(complex)f(n)m(um)m(b)s +4302 y Fr(The)h(follo)m(wing)i(rings)e(are)g(built-in.)0 +4607 y Fp(cl_null_ring)d(cl_0_ring)480 4731 y Fr(The)j(n)m(ull)g(ring,) +h(con)m(taining)g(only)g(zero.)0 4911 y Fp(cl_complex_ring)26 +b(cl_C_ring)480 5036 y Fr(The)k(ring)g(of)h(complex)f(n)m(um)m(b)s (ers.)38 b(This)29 b(corresp)s(onds)g(to)j(the)e(t)m(yp)s(e)h -Fn(cl_N)p Fp(.)0 5215 y Fn(cl_real_ring)c(cl_R_ring)480 -5340 y Fp(The)j(ring)g(of)h(real)g(n)m(um)m(b)s(ers.)38 +Fp(cl_N)p Fr(.)0 5215 y Fp(cl_real_ring)c(cl_R_ring)480 +5340 y Fr(The)j(ring)g(of)h(real)g(n)m(um)m(b)s(ers.)38 b(This)29 b(corresp)s(onds)g(to)i(the)g(t)m(yp)s(e)g -Fn(cl_R)p Fp(.)p eop +Fp(cl_R)p Fr(.)p eop %%Page: 44 46 -44 45 bop 0 -116 a Fp(Chapter)30 b(6:)41 b(Rings)3120 -b(44)0 366 y Fn(cl_rational_ring)26 b(cl_RA_ring)480 -491 y Fp(The)k(ring)g(of)h(rational)g(n)m(um)m(b)s(ers.)38 +44 45 bop 0 -116 a Fr(Chapter)30 b(6:)41 b(Rings)3120 +b(44)0 366 y Fp(cl_rational_ring)26 b(cl_RA_ring)480 +491 y Fr(The)k(ring)g(of)h(rational)g(n)m(um)m(b)s(ers.)38 b(This)30 b(corresp)s(onds)f(to)i(the)g(t)m(yp)s(e)f -Fn(cl_RA)p Fp(.)0 665 y Fn(cl_integer_ring)c(cl_I_ring)480 -790 y Fp(The)k(ring)g(of)h(in)m(tegers.)41 b(This)30 -b(corresp)s(onds)f(to)i(the)g(t)m(yp)s(e)f Fn(cl_I)p -Fp(.)0 1089 y(T)m(yp)s(e)g(tests)h(can)g(b)s(e)e(p)s(erformed)f(for)i -(an)m(y)h(of)g Fn(cl_C_ring)p Fp(,)d Fn(cl_R_ring)p Fp(,)g -Fn(cl_RA_ring)p Fp(,)g Fn(cl_I_ring)p Fp(:)0 1388 y Fn(cl_boolean)g +Fp(cl_RA)p Fr(.)0 665 y Fp(cl_integer_ring)c(cl_I_ring)480 +790 y Fr(The)k(ring)g(of)h(in)m(tegers.)41 b(This)30 +b(corresp)s(onds)f(to)i(the)g(t)m(yp)s(e)f Fp(cl_I)p +Fr(.)0 1089 y(T)m(yp)s(e)g(tests)h(can)g(b)s(e)e(p)s(erformed)f(for)i +(an)m(y)h(of)g Fp(cl_C_ring)p Fr(,)d Fp(cl_R_ring)p Fr(,)g +Fp(cl_RA_ring)p Fr(,)g Fp(cl_I_ring)p Fr(:)0 1388 y Fp(cl_boolean)g (instanceof)f(\(const)i(cl_number&)e(x,)j(const)f(cl_number_ring&)d -(R\))480 1512 y Fp(T)-8 b(ests)31 b(whether)f(the)g(giv)m(en)i(n)m(um)m +(R\))480 1512 y Fr(T)-8 b(ests)31 b(whether)f(the)g(giv)m(en)i(n)m(um)m (b)s(er)c(is)i(an)g(elemen)m(t)h(of)g(the)f(n)m(um)m(b)s(er)e(ring)i (R.)p eop %%Page: 45 47 -45 46 bop 0 -116 a Fp(Chapter)30 b(7:)41 b(Mo)s(dular)30 -b(in)m(tegers)2670 b(45)0 366 y Fm(7)80 b(Mo)t(dular)32 -b(in)l(tegers)0 1011 y Fq(7.1)68 b(Mo)t(dular)30 b(in)l(teger)i(rings)0 -1292 y Fp(CLN)24 b(implemen)m(ts)f(mo)s(dular)g(in)m(tegers,)k(i.e.)40 +45 46 bop 0 -116 a Fr(Chapter)30 b(7:)41 b(Mo)s(dular)30 +b(in)m(tegers)2670 b(45)0 366 y Fo(7)80 b(Mo)t(dular)32 +b(in)l(tegers)0 1011 y Fs(7.1)68 b(Mo)t(dular)30 b(in)l(teger)i(rings)0 +1292 y Fr(CLN)24 b(implemen)m(ts)f(mo)s(dular)g(in)m(tegers,)k(i.e.)40 b(in)m(tegers)26 b(mo)s(dulo)d(a)i(\014xed)f(in)m(teger)i(N.)f(The)g (mo)s(dulus)d(is)i(explicitly)0 1417 y(part)34 b(of)f(ev)m(ery)i(mo)s (dular)d(in)m(teger.)52 b(CLN)33 b(do)s(esn't)g(allo)m(w)i(y)m(ou)g(to) f(\(acciden)m(tally\))j(mix)c(elemen)m(ts)h(of)f(di\013eren)m(t)0 -1541 y(mo)s(dular)20 b(rings,)k(e.g.)39 b Fn(\(3)30 b(mod)f(4\))h(+)g -(\(2)g(mod)f(5\))22 b Fp(will)g(result)g(in)g(a)h(run)m(time)e(error.) +1541 y(mo)s(dular)20 b(rings,)k(e.g.)39 b Fp(\(3)30 b(mod)f(4\))h(+)g +(\(2)g(mod)f(5\))22 b Fr(will)g(result)g(in)g(a)h(run)m(time)e(error.) 37 b(\(Ideally)23 b(one)g(w)m(ould)f(imagine)0 1666 y(a)28 -b(generic)g(data)g(t)m(yp)s(e)f Fn(cl_MI\(N\))p Fp(,)f(but)g(C)p -Fn(++)g Fp(do)s(esn't)h(ha)m(v)m(e)i(generic)f(t)m(yp)s(es.)39 +b(generic)g(data)g(t)m(yp)s(e)f Fp(cl_MI\(N\))p Fr(,)f(but)g(C)p +Fp(++)g Fr(do)s(esn't)h(ha)m(v)m(e)i(generic)f(t)m(yp)s(es.)39 b(So)28 b(one)f(has)g(to)h(liv)m(e)g(with)f(run)m(time)0 1790 y(c)m(hec)m(ks.\))0 2072 y(The)j(class)h(of)g(mo)s(dular)d(in)m -(teger)k(rings)e(is)1433 2332 y Fn(Ring)1338 2436 y(cl_ring)1290 +(teger)k(rings)e(is)1433 2332 y Fp(Ring)1338 2436 y(cl_ring)1290 2540 y()1481 2644 y(|)1481 2748 y(|)1051 2851 y(Modular)46 b(integer)g(ring)1195 2955 y(cl_modint_ring)1147 -3059 y()0 3340 y Fp(and)30 b(the)g(class)h(of)g(all)g +3059 y()0 3340 y Fr(and)30 b(the)g(class)h(of)g(all)g (mo)s(dular)e(in)m(tegers)i(\(elemen)m(ts)g(of)g(mo)s(dular)d(in)m -(teger)k(rings\))e(is)1195 3601 y Fn(Modular)45 b(integer)1433 -3705 y(cl_MI)1147 3808 y()0 4090 y Fp(Mo)s(dular)30 +(teger)k(rings\))e(is)1195 3601 y Fp(Modular)45 b(integer)1433 +3705 y(cl_MI)1147 3808 y()0 4090 y Fr(Mo)s(dular)30 b(in)m(teger)i(rings)e(are)g(constructed)h(using)f(the)h(function)0 -4404 y Fn(cl_modint_ring)26 b(cl_find_modint_ring)g(\(const)i(cl_I&)h -(N\))480 4528 y Fp(This)23 b(function)h(returns)e(the)i(mo)s(dular)e -(ring)i(`)p Fn(Z/NZ)p Fp('.)37 b(It)24 b(tak)m(es)i(care)e(of)g +4404 y Fp(cl_modint_ring)26 b(cl_find_modint_ring)g(\(const)i(cl_I&)h +(N\))480 4528 y Fr(This)23 b(function)h(returns)e(the)i(mo)s(dular)e +(ring)i(`)p Fp(Z/NZ)p Fr('.)37 b(It)24 b(tak)m(es)i(care)e(of)g (\014nding)f(out)h(ab)s(out)f(sp)s(ecial)480 4653 y(cases)34 -b(of)f Fn(N)p Fp(,)g(lik)m(e)h(p)s(o)m(w)m(ers)f(of)g(t)m(w)m(o)i(and)d +b(of)f Fp(N)p Fr(,)g(lik)m(e)h(p)s(o)m(w)m(ers)f(of)g(t)m(w)m(o)i(and)d (o)s(dd)g(n)m(um)m(b)s(ers)e(for)j(whic)m(h)f(Mon)m(tgomery)i(m)m (ultiplication)480 4777 y(will)39 b(b)s(e)f(a)h(win,)h(and)e (precomputes)f(an)m(y)h(necessary)h(auxiliary)h(data)f(for)f(computing) -g(mo)s(dulo)480 4902 y Fn(N)p Fp(.)45 b(There)32 b(is)f(a)i(cac)m(he)g -(table)g(of)f(rings,)g(indexed)g(b)m(y)g Fn(N)f Fp(\(or,)i(more)e -(precisely)-8 b(,)34 b(b)m(y)e Fn(abs\(N\))p Fp(\).)44 +g(mo)s(dulo)480 4902 y Fp(N)p Fr(.)45 b(There)32 b(is)f(a)i(cac)m(he)g +(table)g(of)f(rings,)g(indexed)g(b)m(y)g Fp(N)f Fr(\(or,)i(more)e +(precisely)-8 b(,)34 b(b)m(y)e Fp(abs\(N\))p Fr(\).)44 b(This)480 5026 y(ensures)29 b(that)i(the)g(precomputation)f(costs)h (are)g(reduced)e(to)j(a)e(minim)m(um.)0 5340 y(Mo)s(dular)g(in)m(teger) i(rings)e(can)g(b)s(e)g(compared)f(for)i(equalit)m(y:)p eop %%Page: 46 48 -46 47 bop 0 -116 a Fp(Chapter)30 b(7:)41 b(Mo)s(dular)30 -b(in)m(tegers)2670 b(46)0 366 y Fn(bool)29 b(operator==)f(\(const)g +46 47 bop 0 -116 a Fr(Chapter)30 b(7:)41 b(Mo)s(dular)30 +b(in)m(tegers)2670 b(46)0 366 y Fp(bool)29 b(operator==)f(\(const)g (cl_modint_ring&,)e(const)j(cl_modint_ring&\))0 491 y(bool)g (operator!=)f(\(const)g(cl_modint_ring&,)e(const)j(cl_modint_ring&\)) -480 616 y Fp(These)e(compare)g(t)m(w)m(o)h(mo)s(dular)e(in)m(teger)i +480 616 y Fr(These)e(compare)g(t)m(w)m(o)h(mo)s(dular)e(in)m(teger)i (rings)f(for)g(equalit)m(y)-8 b(.)42 b(Tw)m(o)27 b(di\013eren)m(t)h -(calls)g(to)g Fn(cl_find_)480 740 y(modint_ring)34 b -Fp(with)i(the)h(same)f(argumen)m(t)g(necessarily)h(return)f(the)h(same) +(calls)g(to)g Fp(cl_find_)480 740 y(modint_ring)34 b +Fr(with)i(the)h(same)f(argumen)m(t)g(necessarily)h(return)f(the)h(same) f(ring)g(b)s(ecause)h(it)g(is)480 865 y(memoized)29 b(in)h(the)h(cac)m -(he)h(table.)0 1318 y Fq(7.2)68 b(F)-11 b(unctions)30 -b(on)g(mo)t(dular)g(in)l(tegers)0 1593 y Fp(Giv)m(en)h(a)g(mo)s(dular)d -(in)m(teger)k(ring)e Fn(R)p Fp(,)h(the)f(follo)m(wing)i(mem)m(b)s(ers)c -(can)i(b)s(e)g(used.)0 1893 y Fn(cl_I)f(R->modulus)480 -2017 y Fp(This)h(is)g(the)h(ring's)f(mo)s(dulus,)e(normalized)i(to)h(b) -s(e)e(nonnegativ)m(e:)43 b Fn(abs\(N\))p Fp(.)0 2193 -y Fn(cl_MI)29 b(R->zero\(\))480 2317 y Fp(This)h(returns)f -Fn(0)h(mod)f(N)p Fp(.)0 2493 y Fn(cl_MI)g(R->one\(\))480 -2617 y Fp(This)h(returns)f Fn(1)h(mod)f(N)p Fp(.)0 2793 -y Fn(cl_MI)g(R->canonhom)e(\(const)i(cl_I&)g(x\))480 -2917 y Fp(This)h(returns)f Fn(x)h(mod)f(N)p Fp(.)0 3093 -y Fn(cl_I)g(R->retract)f(\(const)g(cl_MI&)h(x\))480 3217 -y Fp(This)20 b(is)h(a)g(partial)g(in)m(v)m(erse)h(function)e(to)i -Fn(R->canonhom)p Fp(.)34 b(It)21 b(returns)e(the)i(standard)f(represen) -m(tativ)m(e)480 3342 y(\()p Fn(>=0)p Fp(,)30 b Fn(random\(cl_random_stat) +(he)h(table.)0 1318 y Fs(7.2)68 b(F)-11 b(unctions)30 +b(on)g(mo)t(dular)g(in)l(tegers)0 1593 y Fr(Giv)m(en)h(a)g(mo)s(dular)d +(in)m(teger)k(ring)e Fp(R)p Fr(,)h(the)f(follo)m(wing)i(mem)m(b)s(ers)c +(can)i(b)s(e)g(used.)0 1893 y Fp(cl_I)f(R->modulus)480 +2017 y Fr(This)h(is)g(the)h(ring's)f(mo)s(dulus,)e(normalized)i(to)h(b) +s(e)e(nonnegativ)m(e:)43 b Fp(abs\(N\))p Fr(.)0 2193 +y Fp(cl_MI)29 b(R->zero\(\))480 2317 y Fr(This)h(returns)f +Fp(0)h(mod)f(N)p Fr(.)0 2493 y Fp(cl_MI)g(R->one\(\))480 +2617 y Fr(This)h(returns)f Fp(1)h(mod)f(N)p Fr(.)0 2793 +y Fp(cl_MI)g(R->canonhom)e(\(const)i(cl_I&)g(x\))480 +2917 y Fr(This)h(returns)f Fp(x)h(mod)f(N)p Fr(.)0 3093 +y Fp(cl_I)g(R->retract)f(\(const)g(cl_MI&)h(x\))480 3217 +y Fr(This)20 b(is)h(a)g(partial)g(in)m(v)m(erse)h(function)e(to)i +Fp(R->canonhom)p Fr(.)34 b(It)21 b(returns)e(the)i(standard)f(represen) +m(tativ)m(e)480 3342 y(\()p Fp(>=0)p Fr(,)30 b Fp(random\(cl_random_stat) o(e&)24 b(randomstate\))0 3642 y(cl_MI)29 b(R->random\(\))480 -3766 y Fp(This)h(returns)f(a)h(random)f(in)m(teger)j(mo)s(dulo)d -Fn(N)p Fp(.)0 4066 y(The)h(follo)m(wing)i(op)s(erations)e(are)h +3766 y Fr(This)h(returns)f(a)h(random)f(in)m(teger)j(mo)s(dulo)d +Fp(N)p Fr(.)0 4066 y(The)h(follo)m(wing)i(op)s(erations)e(are)h (de\014ned)e(on)i(mo)s(dular)d(in)m(tegers.)0 4366 y -Fn(cl_modint_ring)e(x.ring)j(\(\))480 4491 y Fp(Returns)g(the)i(ring)f -(to)h(whic)m(h)f(the)h(mo)s(dular)d(in)m(teger)k Fn(x)e -Fp(b)s(elongs.)0 4666 y Fn(cl_MI)f(operator+)f(\(const)g(cl_MI&,)h -(const)g(cl_MI&\))480 4791 y Fp(Returns)j(the)h(sum)f(of)h(t)m(w)m(o)h +Fp(cl_modint_ring)e(x.ring)j(\(\))480 4491 y Fr(Returns)g(the)i(ring)f +(to)h(whic)m(h)f(the)h(mo)s(dular)d(in)m(teger)k Fp(x)e +Fr(b)s(elongs.)0 4666 y Fp(cl_MI)f(operator+)f(\(const)g(cl_MI&,)h +(const)g(cl_MI&\))480 4791 y Fr(Returns)j(the)h(sum)f(of)h(t)m(w)m(o)h (mo)s(dular)d(in)m(tegers.)51 b(One)32 b(of)i(the)f(argumen)m(ts)f(ma)m (y)h(also)h(b)s(e)f(a)g(plain)480 4915 y(in)m(teger.)0 -5091 y Fn(cl_MI)c(operator-)f(\(const)g(cl_MI&,)h(const)g(cl_MI&\))480 -5215 y Fp(Returns)k(the)h(di\013erence)h(of)f(t)m(w)m(o)i(mo)s(dular)c +5091 y Fp(cl_MI)c(operator-)f(\(const)g(cl_MI&,)h(const)g(cl_MI&\))480 +5215 y Fr(Returns)k(the)h(di\013erence)h(of)f(t)m(w)m(o)i(mo)s(dular)c (in)m(tegers.)53 b(One)33 b(of)i(the)f(argumen)m(ts)f(ma)m(y)h(also)h (b)s(e)f(a)480 5340 y(plain)c(in)m(teger.)p eop %%Page: 47 49 -47 48 bop 0 -116 a Fp(Chapter)30 b(7:)41 b(Mo)s(dular)30 -b(in)m(tegers)2670 b(47)0 366 y Fn(cl_MI)29 b(operator-)f(\(const)g -(cl_MI&\))480 491 y Fp(Returns)h(the)i(negativ)m(e)i(of)d(a)h(mo)s -(dular)d(in)m(teger.)0 663 y Fn(cl_MI)h(operator*)f(\(const)g(cl_MI&,)h -(const)g(cl_MI&\))480 787 y Fp(Returns)37 b(the)i(pro)s(duct)e(of)h(t)m +47 48 bop 0 -116 a Fr(Chapter)30 b(7:)41 b(Mo)s(dular)30 +b(in)m(tegers)2670 b(47)0 366 y Fp(cl_MI)29 b(operator-)f(\(const)g +(cl_MI&\))480 491 y Fr(Returns)h(the)i(negativ)m(e)i(of)d(a)h(mo)s +(dular)d(in)m(teger.)0 663 y Fp(cl_MI)h(operator*)f(\(const)g(cl_MI&,)h +(const)g(cl_MI&\))480 787 y Fr(Returns)37 b(the)i(pro)s(duct)e(of)h(t)m (w)m(o)i(mo)s(dular)c(in)m(tegers.)65 b(One)38 b(of)g(the)h(argumen)m (ts)e(ma)m(y)h(also)h(b)s(e)f(a)480 912 y(plain)30 b(in)m(teger.)0 -1084 y Fn(cl_MI)f(square)g(\(const)f(cl_MI&\))480 1208 -y Fp(Returns)h(the)i(square)f(of)h(a)f(mo)s(dular)f(in)m(teger.)0 -1380 y Fn(cl_MI)g(recip)g(\(const)g(cl_MI&)f(x\))480 -1505 y Fp(Returns)c(the)i(recipro)s(cal)f Fn(x^-1)f Fp(of)i(a)f(mo)s -(dular)e(in)m(teger)k Fn(x)p Fp(.)38 b Fn(x)25 b Fp(m)m(ust)f(b)s(e)h +1084 y Fp(cl_MI)f(square)g(\(const)f(cl_MI&\))480 1208 +y Fr(Returns)h(the)i(square)f(of)h(a)f(mo)s(dular)f(in)m(teger.)0 +1380 y Fp(cl_MI)g(recip)g(\(const)g(cl_MI&)f(x\))480 +1505 y Fr(Returns)c(the)i(recipro)s(cal)f Fp(x^-1)f Fr(of)i(a)f(mo)s +(dular)e(in)m(teger)k Fp(x)p Fr(.)38 b Fp(x)25 b Fr(m)m(ust)f(b)s(e)h (coprime)f(to)i(the)f(mo)s(dulus,)480 1629 y(otherwise)31 -b(an)f(error)g(message)h(is)f(issued.)0 1801 y Fn(cl_MI)f(div)g +b(an)f(error)g(message)h(is)f(issued.)0 1801 y Fp(cl_MI)f(div)g (\(const)g(cl_MI&)g(x,)h(const)e(cl_MI&)h(y\))480 1926 -y Fp(Returns)j(the)h(quotien)m(t)h Fn(x*y^-1)e Fp(of)h(t)m(w)m(o)h(mo)s -(dular)d(in)m(tegers)j Fn(x)p Fp(,)g Fn(y)p Fp(.)48 b -Fn(y)33 b Fp(m)m(ust)e(b)s(e)i(coprime)f(to)i(the)480 +y Fr(Returns)j(the)h(quotien)m(t)h Fp(x*y^-1)e Fr(of)h(t)m(w)m(o)h(mo)s +(dular)d(in)m(tegers)j Fp(x)p Fr(,)g Fp(y)p Fr(.)48 b +Fp(y)33 b Fr(m)m(ust)e(b)s(e)i(coprime)f(to)i(the)480 2050 y(mo)s(dulus,)28 b(otherwise)j(an)f(error)g(message)g(is)h -(issued.)0 2222 y Fn(cl_MI)e(expt_pos)f(\(const)h(cl_MI&)f(x,)i(const)f -(cl_I&)g(y\))480 2347 y(y)h Fp(m)m(ust)f(b)s(e)h Fn(>)g -Fp(0.)41 b(Returns)30 b Fn(x^y)p Fp(.)0 2519 y Fn(cl_MI)f(expt)g +(issued.)0 2222 y Fp(cl_MI)e(expt_pos)f(\(const)h(cl_MI&)f(x,)i(const)f +(cl_I&)g(y\))480 2347 y(y)h Fr(m)m(ust)f(b)s(e)h Fp(>)g +Fr(0.)41 b(Returns)30 b Fp(x^y)p Fr(.)0 2519 y Fp(cl_MI)f(expt)g (\(const)g(cl_MI&)f(x,)i(const)f(cl_I&)g(y\))480 2643 -y Fp(Returns)d Fn(x^y)p Fp(.)39 b(If)26 b Fn(y)h Fp(is)g(negativ)m(e,)j -Fn(x)d Fp(m)m(ust)f(b)s(e)h(coprime)f(to)i(the)f(mo)s(dulus,)e(else)j +y Fr(Returns)d Fp(x^y)p Fr(.)39 b(If)26 b Fp(y)h Fr(is)g(negativ)m(e,)j +Fp(x)d Fr(m)m(ust)f(b)s(e)h(coprime)f(to)i(the)f(mo)s(dulus,)e(else)j (an)f(error)g(message)480 2768 y(is)j(issued.)0 2940 -y Fn(cl_MI)f(operator<<)f(\(const)g(cl_MI&)h(x,)h(const)f(cl_I&)f(y\)) -480 3064 y Fp(Returns)h Fn(x*2^y)p Fp(.)0 3236 y Fn(cl_MI)g(operator>>) +y Fp(cl_MI)f(operator<<)f(\(const)g(cl_MI&)h(x,)h(const)f(cl_I&)f(y\)) +480 3064 y Fr(Returns)h Fp(x*2^y)p Fr(.)0 3236 y Fp(cl_MI)g(operator>>) f(\(const)g(cl_MI&)h(x,)h(const)f(cl_I&)f(y\))480 3361 -y Fp(Returns)g Fn(x*2^-y)p Fp(.)38 b(When)29 b Fn(y)f -Fp(is)h(p)s(ositiv)m(e,)i(the)e(mo)s(dulus)d(m)m(ust)i(b)s(e)g(o)s(dd,) +y Fr(Returns)g Fp(x*2^-y)p Fr(.)38 b(When)29 b Fp(y)f +Fr(is)h(p)s(ositiv)m(e,)i(the)e(mo)s(dulus)d(m)m(ust)i(b)s(e)g(o)s(dd,) g(or)h(an)g(error)f(message)h(is)480 3485 y(issued.)0 -3657 y Fn(bool)g(operator==)f(\(const)g(cl_MI&,)h(const)g(cl_MI&\))0 +3657 y Fp(bool)g(operator==)f(\(const)g(cl_MI&,)h(const)g(cl_MI&\))0 3782 y(bool)g(operator!=)f(\(const)g(cl_MI&,)h(const)g(cl_MI&\))480 -3906 y Fp(Compares)24 b(t)m(w)m(o)i(mo)s(dular)d(in)m(tegers,)28 +3906 y Fr(Compares)24 b(t)m(w)m(o)i(mo)s(dular)d(in)m(tegers,)28 b(b)s(elonging)e(to)f(the)h(same)e(mo)s(dular)f(in)m(teger)k(ring,)f -(for)f(equal-)480 4031 y(it)m(y)-8 b(.)0 4203 y Fn(cl_boolean)28 -b(zerop)h(\(const)f(cl_MI&)h(x\))480 4327 y Fp(Returns)g(true)i(if)f -Fn(x)g Fp(is)g Fn(0)g(mod)g(N)p Fp(.)0 4625 y(The)g(follo)m(wing)i +(for)f(equal-)480 4031 y(it)m(y)-8 b(.)0 4203 y Fp(cl_boolean)28 +b(zerop)h(\(const)f(cl_MI&)h(x\))480 4327 y Fr(Returns)g(true)i(if)f +Fp(x)g Fr(is)g Fp(0)g(mod)g(N)p Fr(.)0 4625 y(The)g(follo)m(wing)i (output)e(functions)g(are)g(de\014ned)g(\(see)h(also)g(the)g(c)m -(hapter)g(on)f(input/output\).)0 4923 y Fn(void)f(fprint)g +(hapter)g(on)f(input/output\).)0 4923 y Fp(void)f(fprint)g (\(cl_ostream)e(stream,)i(const)f(cl_MI&)h(x\))0 5047 y(cl_ostream)f(operator<<)f(\(cl_ostream)g(stream,)i(const)g(cl_MI&)f -(x\))480 5172 y Fp(Prin)m(ts)36 b(the)h(mo)s(dular)e(in)m(teger)j -Fn(x)e Fp(on)g(the)h Fn(stream)p Fp(.)57 b(The)36 b(output)h(ma)m(y)f +(x\))480 5172 y Fr(Prin)m(ts)36 b(the)h(mo)s(dular)e(in)m(teger)j +Fp(x)e Fr(on)g(the)h Fp(stream)p Fr(.)57 b(The)36 b(output)h(ma)m(y)f (dep)s(end)e(on)j(the)g(global)480 5296 y(prin)m(ter)30 -b(settings)h(in)f(the)h(v)-5 b(ariable)31 b Fn(cl_default_print_flags)p -Fp(.)p eop +b(settings)h(in)f(the)h(v)-5 b(ariable)31 b Fp(cl_default_print_flags)p +Fr(.)p eop %%Page: 48 50 -48 49 bop 0 -116 a Fp(Chapter)30 b(8:)41 b(Sym)m(b)s(olic)29 -b(data)i(t)m(yp)s(es)2536 b(48)0 366 y Fm(8)80 b(Sym)l(b)t(olic)31 -b(data)f(t)l(yp)t(es)0 784 y Fp(CLN)g(implemen)m(ts)f(t)m(w)m(o)j(sym)m +48 49 bop 0 -116 a Fr(Chapter)30 b(8:)41 b(Sym)m(b)s(olic)29 +b(data)i(t)m(yp)s(es)2536 b(48)0 366 y Fo(8)80 b(Sym)l(b)t(olic)31 +b(data)f(t)l(yp)t(es)0 784 y Fr(CLN)g(implemen)m(ts)f(t)m(w)m(o)j(sym)m (b)s(olic)d(\(non-n)m(umeric\))h(data)h(t)m(yp)s(es:)41 -b(strings)30 b(and)g(sym)m(b)s(ols.)0 1310 y Fq(8.1)68 -b(Strings)0 1593 y Fp(The)30 b(class)1290 1855 y Fn(String)1242 -1959 y(cl_string)1195 2062 y()0 2345 y Fp(implemen)m(ts)f +b(strings)30 b(and)g(sym)m(b)s(ols.)0 1310 y Fs(8.1)68 +b(Strings)0 1593 y Fr(The)30 b(class)1290 1855 y Fp(String)1242 +1959 y(cl_string)1195 2062 y()0 2345 y Fr(implemen)m(ts)f (imm)m(utable)g(strings.)0 2628 y(Strings)h(are)h(constructed)f (through)g(the)h(follo)m(wing)g(constructors:)0 2944 -y Fn(cl_string)d(\(const)h(char)g(*)h(s\))480 3069 y -Fp(Returns)f(an)i(imm)m(utable)e(cop)m(y)i(of)f(the)h -(\(zero-terminated\))h(C)e(string)g Fn(s)p Fp(.)0 3260 -y Fn(cl_string)e(\(const)h(char)g(*)h(ptr,)f(unsigned)f(long)h(len\)) -480 3385 y Fp(Returns)34 b(an)h(imm)m(utable)f(cop)m(y)h(of)g(the)h -Fn(len)e Fp(c)m(haracters)i(at)g Fn(ptr[0])p Fp(,)f Fl(:)15 -b(:)g(:)q Fp(,)36 b Fn(ptr[len-1])p Fp(.)52 b(NUL)480 +y Fp(cl_string)d(\(const)h(char)g(*)h(s\))480 3069 y +Fr(Returns)f(an)i(imm)m(utable)e(cop)m(y)i(of)f(the)h +(\(zero-terminated\))h(C)e(string)g Fp(s)p Fr(.)0 3260 +y Fp(cl_string)e(\(const)h(char)g(*)h(ptr,)f(unsigned)f(long)h(len\)) +480 3385 y Fr(Returns)34 b(an)h(imm)m(utable)f(cop)m(y)h(of)g(the)h +Fp(len)e Fr(c)m(haracters)i(at)g Fp(ptr[0])p Fr(,)f Fn(:)15 +b(:)g(:)q Fr(,)36 b Fp(ptr[len-1])p Fr(.)52 b(NUL)480 3509 y(c)m(haracters)32 b(are)f(allo)m(w)m(ed.)0 3826 y(The)f(follo)m(wing)i(functions)e(are)g(a)m(v)-5 b(ailable)33 -b(on)d(strings:)0 4142 y Fn(operator)e(=)480 4267 y Fp(Assignmen)m(t)i -(from)f Fn(cl_string)f Fp(and)h Fn(const)g(char)h(*)p -Fp(.)0 4458 y Fn(s.length\(\))0 4583 y(strlen\(s\))480 -4707 y Fp(Returns)f(the)i(length)g(of)f(the)h(string)f -Fn(s)p Fp(.)0 4899 y Fn(s[i])288 b Fp(Returns)24 b(the)h -Fn(i)p Fp(th)f(c)m(haracter)j(of)e(the)f(string)h Fn(s)p -Fp(.)39 b Fn(i)24 b Fp(m)m(ust)g(b)s(e)g(in)h(the)f(range)i -Fn(0)k(<=)f(i)h(<)g(s.length\(\))p Fp(.)0 5091 y Fn(bool)f(equal)g +b(on)d(strings:)0 4142 y Fp(operator)e(=)480 4267 y Fr(Assignmen)m(t)i +(from)f Fp(cl_string)f Fr(and)h Fp(const)g(char)h(*)p +Fr(.)0 4458 y Fp(s.length\(\))0 4583 y(strlen\(s\))480 +4707 y Fr(Returns)f(the)i(length)g(of)f(the)h(string)f +Fp(s)p Fr(.)0 4899 y Fp(s[i])288 b Fr(Returns)24 b(the)h +Fp(i)p Fr(th)f(c)m(haracter)j(of)e(the)f(string)h Fp(s)p +Fr(.)39 b Fp(i)24 b Fr(m)m(ust)g(b)s(e)g(in)h(the)f(range)i +Fp(0)k(<=)f(i)h(<)g(s.length\(\))p Fr(.)0 5091 y Fp(bool)f(equal)g (\(const)g(cl_string&)e(s1,)j(const)f(cl_string&)e(s2\))480 -5215 y Fp(Compares)34 b(t)m(w)m(o)i(strings)f(for)g(equalit)m(y)-8 +5215 y Fr(Compares)34 b(t)m(w)m(o)i(strings)f(for)g(equalit)m(y)-8 b(.)57 b(One)35 b(of)g(the)h(argumen)m(ts)e(ma)m(y)h(also)h(b)s(e)f(a)g -(plain)g Fn(const)480 5340 y(char)29 b(*)p Fp(.)p eop +(plain)g Fp(const)480 5340 y(char)29 b(*)p Fr(.)p eop %%Page: 49 51 -49 50 bop 0 -116 a Fp(Chapter)30 b(8:)41 b(Sym)m(b)s(olic)29 -b(data)i(t)m(yp)s(es)2536 b(49)0 366 y Fq(8.2)68 b(Sym)l(b)t(ols)0 -640 y Fp(Sym)m(b)s(ols)40 b(are)j(uniqui\014ed)d(strings:)64 +49 50 bop 0 -116 a Fr(Chapter)30 b(8:)41 b(Sym)m(b)s(olic)29 +b(data)i(t)m(yp)s(es)2536 b(49)0 366 y Fs(8.2)68 b(Sym)l(b)t(ols)0 +640 y Fr(Sym)m(b)s(ols)40 b(are)j(uniqui\014ed)d(strings:)64 b(all)43 b(sym)m(b)s(ols)e(with)h(the)g(same)g(name)f(are)i(shared.)75 b(This)41 b(means)g(that)0 765 y(comparison)34 b(of)i(t)m(w)m(o)g(sym)m (b)s(ols)e(is)h(fast)h(\(e\013ectiv)m(ely)i(just)d(a)g(p)s(oin)m(ter)g @@ -3706,39 +3980,39 @@ b(strings)f(m)m(ust)f(in)g(the)h(w)m(orst)h(case)g(w)m(alk)f(b)s(oth)f b(are)h(used,)g(for)g(example,)0 1014 y(as)31 b(tags)g(for)f(prop)s (erties,)g(as)h(names)e(of)i(v)-5 b(ariables)31 b(in)f(p)s(olynomial)f (rings,)i(etc.)0 1288 y(Sym)m(b)s(ols)e(are)h(constructed)h(through)f -(the)g(follo)m(wing)i(constructor:)0 1587 y Fn(cl_symbol)c(\(const)h -(cl_string&)e(s\))480 1711 y Fp(Lo)s(oks)j(up)g(or)g(creates)i(a)f(new) +(the)g(follo)m(wing)i(constructor:)0 1587 y Fp(cl_symbol)c(\(const)h +(cl_string&)e(s\))480 1711 y Fr(Lo)s(oks)j(up)g(or)g(creates)i(a)f(new) e(sym)m(b)s(ol)h(with)g(a)g(giv)m(en)i(name.)0 2010 y(The)e(follo)m (wing)i(op)s(erations)e(are)h(a)m(v)-5 b(ailable)33 b(on)d(sym)m(b)s -(ols:)0 2309 y Fn(cl_string)e(\(const)h(cl_symbol&)e(sym\))480 -2434 y Fp(Con)m(v)m(ersion)k(to)g Fn(cl_string)p Fp(:)38 +(ols:)0 2309 y Fp(cl_string)e(\(const)h(cl_symbol&)e(sym\))480 +2434 y Fr(Con)m(v)m(ersion)k(to)g Fp(cl_string)p Fr(:)38 b(Returns)30 b(the)g(string)h(whic)m(h)f(names)f(the)i(sym)m(b)s(ol)e -Fn(sym)p Fp(.)0 2608 y Fn(bool)g(equal)g(\(const)g(cl_symbol&)e(sym1,)i -(const)g(cl_symbol&)f(sym2\))480 2733 y Fp(Compares)h(t)m(w)m(o)j(sym)m +Fp(sym)p Fr(.)0 2608 y Fp(bool)g(equal)g(\(const)g(cl_symbol&)e(sym1,)i +(const)g(cl_symbol&)f(sym2\))480 2733 y Fr(Compares)h(t)m(w)m(o)j(sym)m (b)s(ols)d(for)h(equalit)m(y)-8 b(.)43 b(This)29 b(is)i(v)m(ery)f (fast.)p eop %%Page: 50 52 -50 51 bop 0 -116 a Fp(Chapter)30 b(9:)41 b(Univ)-5 b(ariate)32 -b(p)s(olynomials)2423 b(50)0 366 y Fm(9)80 b(Univ)-9 -b(ariate)33 b(p)t(olynomials)0 907 y Fq(9.1)68 b(Univ)-7 -b(ariate)32 b(p)t(olynomial)g(rings)0 1181 y Fp(CLN)d(implemen)m(ts)e +50 51 bop 0 -116 a Fr(Chapter)30 b(9:)41 b(Univ)-5 b(ariate)32 +b(p)s(olynomials)2423 b(50)0 366 y Fo(9)80 b(Univ)-9 +b(ariate)33 b(p)t(olynomials)0 907 y Fs(9.1)68 b(Univ)-7 +b(ariate)32 b(p)t(olynomial)g(rings)0 1181 y Fr(CLN)d(implemen)m(ts)e (univ)-5 b(ariate)30 b(p)s(olynomials)f(\(p)s(olynomials)f(in)h(one)h (v)-5 b(ariable\))30 b(o)m(v)m(er)g(an)f(arbitrary)g(ring.)40 b(The)0 1305 y(indeterminate)h(v)-5 b(ariable)43 b(ma)m(y)e(b)s(e)g (either)i(unnamed)c(\(and)i(will)h(b)s(e)g(prin)m(ted)f(according)i(to) -f Fn(cl_default_)0 1430 y(print_flags.univpoly_var)o(name)o -Fp(,)23 b(whic)m(h)28 b(defaults)g(to)g(`)p Fn(x)p Fp('\))h(or)f(carry) +f Fp(cl_default_)0 1430 y(print_flags.univpoly_var)o(name)o +Fr(,)23 b(whic)m(h)28 b(defaults)g(to)g(`)p Fp(x)p Fr('\))h(or)f(carry) g(a)g(giv)m(en)h(name.)39 b(The)28 b(base)g(ring)g(and)0 1554 y(the)h(indeterminate)f(are)g(explicitly)i(part)f(of)f(ev)m(ery)h (p)s(olynomial.)40 b(CLN)28 b(do)s(esn't)g(allo)m(w)i(y)m(ou)e(to)i (\(acciden)m(tally\))0 1679 y(mix)h(elemen)m(ts)h(of)f(di\013eren)m(t)h -(p)s(olynomial)f(rings,)h(e.g.)46 b Fn(\(a^2+1\))28 b(*)i(\(b^3-1\))g -Fp(will)i(result)f(in)h(a)g(run)m(time)e(error.)0 1803 +(p)s(olynomial)f(rings,)h(e.g.)46 b Fp(\(a^2+1\))28 b(*)i(\(b^3-1\))g +Fr(will)i(result)f(in)h(a)g(run)m(time)e(error.)0 1803 y(\(Ideally)h(this)g(should)e(return)g(a)i(m)m(ultiv)-5 b(ariate)31 b(p)s(olynomial,)f(but)g(they)h(are)f(not)h(y)m(et)g (implemen)m(ted)e(in)h(CLN.\))0 2077 y(The)g(classes)h(of)g(univ)-5 b(ariate)31 b(p)s(olynomial)f(rings)f(are)1529 2330 y -Fn(Ring)1433 2434 y(cl_ring)1385 2538 y()1576 +Fp(Ring)1433 2434 y(cl_ring)1385 2538 y()1576 2642 y(|)1576 2746 y(|)1051 2849 y(Univariate)45 b(polynomial)g(ring) 1290 2953 y(cl_univpoly_ring)1290 3057 y()1576 3161 y(|)765 3264 y(+----------------+------)o(----)o(----)o(---)o(--+) @@ -3757,11 +4031,11 @@ y(Rational)45 b(polynomial)g(ring)142 b(|)288 4821 y y(+----------------+)765 5236 y(|)288 5340 y(Integer)46 b(polynomial)f(ring)p eop %%Page: 51 53 -51 52 bop 0 -116 a Fp(Chapter)30 b(9:)41 b(Univ)-5 b(ariate)32 -b(p)s(olynomials)2423 b(51)288 366 y Fn(cl_univpoly_integer_rin)o(g)335 -470 y()0 784 y Fp(and)30 b(the)g(corresp)s +51 52 bop 0 -116 a Fr(Chapter)30 b(9:)41 b(Univ)-5 b(ariate)32 +b(p)s(olynomials)2423 b(51)288 366 y Fp(cl_univpoly_integer_rin)o(g)335 +470 y()0 784 y Fr(and)30 b(the)g(corresp)s (onding)g(classes)h(of)g(univ)-5 b(ariate)31 b(p)s(olynomials)e(are) -1147 1077 y Fn(Univariate)45 b(polynomial)1481 1181 y(cl_UP)1290 +1147 1077 y Fp(Univariate)45 b(polynomial)1481 1181 y(cl_UP)1290 1285 y()1576 1389 y(|)765 1492 y (+----------------+------)o(----)o(----)o(---)o(--+)765 1596 y(|)763 b(|)907 b(|)383 1700 y(Complex)46 b(polynomial)331 @@ -3776,27 +4050,27 @@ b(polynomial)283 b(|)622 3049 y(cl_UP_RA)570 b(|)335 3153 y()89 b(|)1576 3257 y(|)765 3360 y(+----------------+)765 3464 y(|)383 3568 y(Integer)46 b(polynomial)622 3672 y(cl_UP_I)335 3776 y()0 -4089 y Fp(Univ)-5 b(ariate)32 b(p)s(olynomial)d(rings)h(are)h -(constructed)g(using)f(the)g(functions)0 4468 y Fn(cl_univpoly_ring)c +4089 y Fr(Univ)-5 b(ariate)32 b(p)s(olynomial)d(rings)h(are)h +(constructed)g(using)f(the)g(functions)0 4468 y Fp(cl_univpoly_ring)c (cl_find_univpoly_ring)e(\(const)29 b(cl_ring&)f(R\))0 4593 y(cl_univpoly_ring)e(cl_find_univpoly_ring)e(\(const)29 b(cl_ring&)f(R,)i(const)f(cl_symbol&)f(varname\))480 -4717 y Fp(This)36 b(function)h(returns)f(the)i(p)s(olynomial)e(ring)h -(`)p Fn(R[X])p Fp(',)h(unnamed)d(or)i(named.)60 b Fn(R)37 -b Fp(ma)m(y)g(b)s(e)f(an)480 4842 y(arbitrary)g(ring.)56 +4717 y Fr(This)36 b(function)h(returns)f(the)i(p)s(olynomial)e(ring)h +(`)p Fp(R[X])p Fr(',)h(unnamed)d(or)i(named.)60 b Fp(R)37 +b Fr(ma)m(y)g(b)s(e)f(an)480 4842 y(arbitrary)g(ring.)56 b(This)35 b(function)h(tak)m(es)h(care)f(of)g(\014nding)f(out)h(ab)s -(out)f(sp)s(ecial)i(cases)f(of)g Fn(R)p Fp(,)h(suc)m(h)480 +(out)f(sp)s(ecial)i(cases)f(of)g Fp(R)p Fr(,)h(suc)m(h)480 4966 y(as)28 b(the)g(rings)g(of)g(complex)g(n)m(um)m(b)s(ers,)e(real)i (n)m(um)m(b)s(ers,)f(rational)i(n)m(um)m(b)s(ers,)d(in)m(tegers,)k(or)e (mo)s(dular)480 5091 y(in)m(teger)j(rings.)40 b(There)30 b(is)g(a)g(cac)m(he)i(table)e(of)g(rings,)g(indexed)g(b)m(y)f -Fn(R)h Fp(and)f Fn(varname)p Fp(.)39 b(This)29 b(ensures)480 +Fp(R)h Fr(and)f Fp(varname)p Fr(.)39 b(This)29 b(ensures)480 5215 y(that)24 b(t)m(w)m(o)h(calls)g(of)e(this)h(function)f(with)g(the) h(same)f(argumen)m(ts)g(will)h(return)e(the)i(same)f(p)s(olynomial)480 5340 y(ring.)p eop %%Page: 52 54 -52 53 bop 0 -116 a Fp(Chapter)30 b(9:)41 b(Univ)-5 b(ariate)32 -b(p)s(olynomials)2423 b(52)0 366 y Fn(cl_univpoly_complex_ring)24 +52 53 bop 0 -116 a Fr(Chapter)30 b(9:)41 b(Univ)-5 b(ariate)32 +b(p)s(olynomials)2423 b(52)0 366 y Fp(cl_univpoly_complex_ring)24 b(cl_find_univpoly_ring)g(\(const)29 b(cl_complex_ring&)d(R\))0 491 y(cl_univpoly_complex_ring)e(cl_find_univpoly_ring)g(\(const)29 b(cl_complex_ring&)d(R,)k(const)0 616 y(cl_symbol&)e(varname\))0 @@ -3814,48 +4088,48 @@ b(cl_integer_ring&)d(R\))0 1612 y(cl_univpoly_integer_ring)e (cl_find_univpoly_ring)h(\(const)j(cl_modint_ring&)e(R\))0 1985 y(cl_univpoly_modint_ring)e(cl_find_univpoly_ring)h(\(const)j (cl_modint_ring&)e(R,)k(const)0 2110 y(cl_symbol&)e(varname\))480 -2234 y Fp(These)c(functions)f(are)i(equiv)-5 b(alen)m(t)26 -b(to)e(the)h(general)g Fn(cl_find_univpoly_ring)p Fp(,)20 +2234 y Fr(These)c(functions)f(are)i(equiv)-5 b(alen)m(t)26 +b(to)e(the)h(general)g Fp(cl_find_univpoly_ring)p Fr(,)20 b(only)k(the)g(return)480 2359 y(t)m(yp)s(e)31 b(is)f(more)f(sp)s (eci\014c,)i(according)g(to)g(the)g(base)f(ring's)h(t)m(yp)s(e.)0 -2845 y Fq(9.2)68 b(F)-11 b(unctions)30 b(on)g(univ)-7 -b(ariate)31 b(p)t(olynomials)0 3123 y Fp(Giv)m(en)g(a)g(univ)-5 -b(ariate)31 b(p)s(olynomial)f(ring)g Fn(R)p Fp(,)g(the)h(follo)m(wing)h -(mem)m(b)s(ers)27 b(can)k(b)s(e)f(used.)0 3430 y Fn(cl_ring)e -(R->basering\(\))480 3555 y Fp(This)i(returns)f(the)h(base)h(ring,)f -(as)h(passed)f(to)h(`)p Fn(cl_find_univpoly_ring)p Fp('.)0 -3737 y Fn(cl_UP)e(R->zero\(\))480 3862 y Fp(This)h(returns)f -Fn(0)h(in)g(R)p Fp(,)g(a)h(p)s(olynomial)e(of)i(degree)g(-1.)0 -4045 y Fn(cl_UP)e(R->one\(\))480 4169 y Fp(This)h(returns)f -Fn(1)h(in)g(R)p Fp(,)g(a)h(p)s(olynomial)e(of)i(degree)g -Fn(<)p Fp(=)f(0.)0 4352 y Fn(cl_UP)f(R->canonhom)e(\(const)i(cl_I&)g -(x\))480 4476 y Fp(This)h(returns)f Fn(x)h(in)g(R)p Fp(,)g(a)h(p)s -(olynomial)e(of)i(degree)g Fn(<)p Fp(=)f(0.)0 4659 y -Fn(cl_UP)f(R->monomial)e(\(const)i(cl_ring_element&)d(x,)k(uintL)f(e\)) -480 4784 y Fp(This)h(returns)f(a)h(sparse)g(p)s(olynomial:)41 -b Fn(x)30 b(*)g(X^e)p Fp(,)f(where)h Fn(X)g Fp(is)h(the)f -(indeterminate.)0 4966 y Fn(cl_UP)f(R->create)f(\(sintL)g(degree\))480 -5091 y Fp(Creates)38 b(a)g(new)f(p)s(olynomial)f(with)i(a)f(giv)m(en)i +2845 y Fs(9.2)68 b(F)-11 b(unctions)30 b(on)g(univ)-7 +b(ariate)31 b(p)t(olynomials)0 3123 y Fr(Giv)m(en)g(a)g(univ)-5 +b(ariate)31 b(p)s(olynomial)f(ring)g Fp(R)p Fr(,)g(the)h(follo)m(wing)h +(mem)m(b)s(ers)27 b(can)k(b)s(e)f(used.)0 3430 y Fp(cl_ring)e +(R->basering\(\))480 3555 y Fr(This)i(returns)f(the)h(base)h(ring,)f +(as)h(passed)f(to)h(`)p Fp(cl_find_univpoly_ring)p Fr('.)0 +3737 y Fp(cl_UP)e(R->zero\(\))480 3862 y Fr(This)h(returns)f +Fp(0)h(in)g(R)p Fr(,)g(a)h(p)s(olynomial)e(of)i(degree)g(-1.)0 +4045 y Fp(cl_UP)e(R->one\(\))480 4169 y Fr(This)h(returns)f +Fp(1)h(in)g(R)p Fr(,)g(a)h(p)s(olynomial)e(of)i(degree)g +Fp(<)p Fr(=)f(0.)0 4352 y Fp(cl_UP)f(R->canonhom)e(\(const)i(cl_I&)g +(x\))480 4476 y Fr(This)h(returns)f Fp(x)h(in)g(R)p Fr(,)g(a)h(p)s +(olynomial)e(of)i(degree)g Fp(<)p Fr(=)f(0.)0 4659 y +Fp(cl_UP)f(R->monomial)e(\(const)i(cl_ring_element&)d(x,)k(uintL)f(e\)) +480 4784 y Fr(This)h(returns)f(a)h(sparse)g(p)s(olynomial:)41 +b Fp(x)30 b(*)g(X^e)p Fr(,)f(where)h Fp(X)g Fr(is)h(the)f +(indeterminate.)0 4966 y Fp(cl_UP)f(R->create)f(\(sintL)g(degree\))480 +5091 y Fr(Creates)38 b(a)g(new)f(p)s(olynomial)f(with)i(a)f(giv)m(en)i (degree.)62 b(The)37 b(zero)h(p)s(olynomial)f(has)g(degree)h -Fn(-1)p Fp(.)480 5215 y(After)29 b(creating)i(the)e(p)s(olynomial,)f(y) +Fp(-1)p Fr(.)480 5215 y(After)29 b(creating)i(the)e(p)s(olynomial,)f(y) m(ou)i(should)e(put)g(in)h(the)g(co)s(e\016cien)m(ts,)i(using)d(the)h -Fn(set_coeff)480 5340 y Fp(mem)m(b)s(er)f(function,)i(and)g(then)g -(call)i(the)e Fn(finalize)e Fp(mem)m(b)s(er)g(function.)p +Fp(set_coeff)480 5340 y Fr(mem)m(b)s(er)f(function,)i(and)g(then)g +(call)i(the)e Fp(finalize)e Fr(mem)m(b)s(er)g(function.)p eop %%Page: 53 55 -53 54 bop 0 -116 a Fp(Chapter)30 b(9:)41 b(Univ)-5 b(ariate)32 +53 54 bop 0 -116 a Fr(Chapter)30 b(9:)41 b(Univ)-5 b(ariate)32 b(p)s(olynomials)2423 b(53)0 366 y(The)30 b(follo)m(wing)i(are)e(the)h (only)g(destructiv)m(e)g(op)s(erations)g(on)f(univ)-5 -b(ariate)31 b(p)s(olynomials.)0 677 y Fn(void)e(set_coeff)f(\(cl_UP&)g +b(ariate)31 b(p)s(olynomials.)0 677 y Fp(void)e(set_coeff)f(\(cl_UP&)g (x,)i(uintL)f(index,)g(const)g(cl_ring_element&)d(y\))480 -802 y Fp(This)i(c)m(hanges)j(the)e(co)s(e\016cien)m(t)i(of)f -Fn(X^index)d Fp(in)i Fn(x)g Fp(to)h(b)s(e)f Fn(y)p Fp(.)40 +802 y Fr(This)i(c)m(hanges)j(the)e(co)s(e\016cien)m(t)i(of)f +Fp(X^index)d Fr(in)i Fp(x)g Fr(to)h(b)s(e)f Fp(y)p Fr(.)40 b(After)29 b(c)m(hanging)h(a)g(p)s(olynomial)f(and)480 -926 y(b)s(efore)35 b(applying)h(an)m(y)g Fn(")p Fp(normal)p -Fn(")f Fp(op)s(eration)h(on)g(it,)i(y)m(ou)e(should)f(call)i(its)f -Fn(finalize)e Fp(mem)m(b)s(er)480 1051 y(function.)0 -1237 y Fn(void)29 b(finalize)f(\(cl_UP&)h(x\))480 1361 -y Fp(This)f(function)g(marks)f(the)h(endp)s(oin)m(t)g(of)h(destructiv)m +926 y(b)s(efore)35 b(applying)h(an)m(y)g Fp(")p Fr(normal)p +Fp(")f Fr(op)s(eration)h(on)g(it,)i(y)m(ou)e(should)f(call)i(its)f +Fp(finalize)e Fr(mem)m(b)s(er)480 1051 y(function.)0 +1237 y Fp(void)29 b(finalize)f(\(cl_UP&)h(x\))480 1361 +y Fr(This)f(function)g(marks)f(the)h(endp)s(oin)m(t)g(of)h(destructiv)m (e)g(mo)s(di\014cations)f(of)g(a)h(p)s(olynomial.)40 b(It)28 b(nor-)480 1486 y(malizes)23 b(the)f(in)m(ternal)h(represen)m (tation)h(so)e(that)h(subsequen)m(t)f(computations)g(ha)m(v)m(e)i(less) @@ -3863,105 +4137,105 @@ e(o)m(v)m(erhead.)480 1611 y(Doing)32 b(normal)e(computations)h(on)g (unnormalized)f(p)s(olynomials)g(ma)m(y)h(pro)s(duce)e(wrong)i(results) 480 1735 y(or)f(crash)g(the)h(program.)0 2046 y(The)f(follo)m(wing)i (op)s(erations)e(are)h(de\014ned)e(on)i(univ)-5 b(ariate)31 -b(p)s(olynomials.)0 2356 y Fn(cl_univpoly_ring)26 b(x.ring)j(\(\))480 -2481 y Fp(Returns)g(the)i(ring)f(to)h(whic)m(h)f(the)h(univ)-5 -b(ariate)31 b(p)s(olynomial)f Fn(x)g Fp(b)s(elongs.)0 -2667 y Fn(cl_UP)f(operator+)f(\(const)g(cl_UP&,)h(const)g(cl_UP&\))480 -2792 y Fp(Returns)g(the)i(sum)d(of)j(t)m(w)m(o)h(univ)-5 -b(ariate)31 b(p)s(olynomials.)0 2978 y Fn(cl_UP)e(operator-)f(\(const)g -(cl_UP&,)h(const)g(cl_UP&\))480 3102 y Fp(Returns)g(the)i(di\013erence) +b(p)s(olynomials.)0 2356 y Fp(cl_univpoly_ring)26 b(x.ring)j(\(\))480 +2481 y Fr(Returns)g(the)i(ring)f(to)h(whic)m(h)f(the)h(univ)-5 +b(ariate)31 b(p)s(olynomial)f Fp(x)g Fr(b)s(elongs.)0 +2667 y Fp(cl_UP)f(operator+)f(\(const)g(cl_UP&,)h(const)g(cl_UP&\))480 +2792 y Fr(Returns)g(the)i(sum)d(of)j(t)m(w)m(o)h(univ)-5 +b(ariate)31 b(p)s(olynomials.)0 2978 y Fp(cl_UP)e(operator-)f(\(const)g +(cl_UP&,)h(const)g(cl_UP&\))480 3102 y Fr(Returns)g(the)i(di\013erence) g(of)f(t)m(w)m(o)i(univ)-5 b(ariate)31 b(p)s(olynomials.)0 -3288 y Fn(cl_UP)e(operator-)f(\(const)g(cl_UP&\))480 -3413 y Fp(Returns)h(the)i(negativ)m(e)i(of)d(a)h(univ)-5 -b(ariate)31 b(p)s(olynomial.)0 3599 y Fn(cl_UP)e(operator*)f(\(const)g -(cl_UP&,)h(const)g(cl_UP&\))480 3724 y Fp(Returns)e(the)h(pro)s(duct)e +3288 y Fp(cl_UP)e(operator-)f(\(const)g(cl_UP&\))480 +3413 y Fr(Returns)h(the)i(negativ)m(e)i(of)d(a)h(univ)-5 +b(ariate)31 b(p)s(olynomial.)0 3599 y Fp(cl_UP)e(operator*)f(\(const)g +(cl_UP&,)h(const)g(cl_UP&\))480 3724 y Fr(Returns)e(the)h(pro)s(duct)e (of)i(t)m(w)m(o)h(univ)-5 b(ariate)28 b(p)s(olynomials.)39 b(One)27 b(of)h(the)g(argumen)m(ts)f(ma)m(y)g(also)i(b)s(e)480 3848 y(a)i(plain)f(in)m(teger)i(or)e(an)g(elemen)m(t)h(of)g(the)f(base) -h(ring.)0 4034 y Fn(cl_UP)e(square)g(\(const)f(cl_UP&\))480 -4159 y Fp(Returns)h(the)i(square)f(of)h(a)f(univ)-5 b(ariate)31 -b(p)s(olynomial.)0 4345 y Fn(cl_UP)e(expt_pos)f(\(const)h(cl_UP&)f(x,)i -(const)f(cl_I&)g(y\))480 4470 y(y)h Fp(m)m(ust)f(b)s(e)h -Fn(>)g Fp(0.)41 b(Returns)30 b Fn(x^y)p Fp(.)0 4656 y -Fn(bool)f(operator==)f(\(const)g(cl_UP&,)h(const)g(cl_UP&\))0 +h(ring.)0 4034 y Fp(cl_UP)e(square)g(\(const)f(cl_UP&\))480 +4159 y Fr(Returns)h(the)i(square)f(of)h(a)f(univ)-5 b(ariate)31 +b(p)s(olynomial.)0 4345 y Fp(cl_UP)e(expt_pos)f(\(const)h(cl_UP&)f(x,)i +(const)f(cl_I&)g(y\))480 4470 y(y)h Fr(m)m(ust)f(b)s(e)h +Fp(>)g Fr(0.)41 b(Returns)30 b Fp(x^y)p Fr(.)0 4656 y +Fp(bool)f(operator==)f(\(const)g(cl_UP&,)h(const)g(cl_UP&\))0 4780 y(bool)g(operator!=)f(\(const)g(cl_UP&,)h(const)g(cl_UP&\))480 -4905 y Fp(Compares)39 b(t)m(w)m(o)j(univ)-5 b(ariate)41 +4905 y Fr(Compares)39 b(t)m(w)m(o)j(univ)-5 b(ariate)41 b(p)s(olynomials,)h(b)s(elonging)e(to)h(the)g(same)f(univ)-5 b(ariate)41 b(p)s(olynomial)480 5029 y(ring,)30 b(for)h(equalit)m(y)-8 -b(.)0 5215 y Fn(cl_boolean)28 b(zerop)h(\(const)f(cl_UP&)h(x\))480 -5340 y Fp(Returns)g(true)i(if)f Fn(x)g Fp(is)g Fn(0)g(in)g(R)p -Fp(.)p eop +b(.)0 5215 y Fp(cl_boolean)28 b(zerop)h(\(const)f(cl_UP&)h(x\))480 +5340 y Fr(Returns)g(true)i(if)f Fp(x)g Fr(is)g Fp(0)g(in)g(R)p +Fr(.)p eop %%Page: 54 56 -54 55 bop 0 -116 a Fp(Chapter)30 b(9:)41 b(Univ)-5 b(ariate)32 -b(p)s(olynomials)2423 b(54)0 366 y Fn(sintL)29 b(degree)g(\(const)f -(cl_UP&)h(x\))480 491 y Fp(Returns)g(the)i(degree)g(of)g(the)f(p)s +54 55 bop 0 -116 a Fr(Chapter)30 b(9:)41 b(Univ)-5 b(ariate)32 +b(p)s(olynomials)2423 b(54)0 366 y Fp(sintL)29 b(degree)g(\(const)f +(cl_UP&)h(x\))480 491 y Fr(Returns)g(the)i(degree)g(of)g(the)f(p)s (olynomial.)40 b(The)30 b(zero)h(p)s(olynomial)f(has)g(degree)h -Fn(-1)p Fp(.)0 665 y Fn(cl_ring_element)26 b(coeff)j(\(const)g(cl_UP&)f -(x,)i(uintL)f(index\))480 790 y Fp(Returns)g(the)i(co)s(e\016cien)m(t)h -(of)f Fn(X^index)d Fp(in)i(the)h(p)s(olynomial)f Fn(x)p -Fp(.)0 964 y Fn(cl_ring_element)c(x)k(\(const)f(cl_ring_element&)d(y\)) -480 1089 y Fp(Ev)-5 b(aluation:)40 b(If)25 b Fn(x)h Fp(is)h(a)f(p)s -(olynomial)g(and)g Fn(y)g Fp(b)s(elongs)g(to)h(the)f(base)h(ring,)g -(then)f(`)p Fn(x\(y\))p Fp(')g(returns)f(the)480 1213 -y(v)-5 b(alue)31 b(of)f(the)h(substitution)f(of)h Fn(y)f -Fp(in)m(to)h Fn(x)p Fp(.)0 1388 y Fn(cl_UP)e(deriv)g(\(const)g(cl_UP&)f -(x\))480 1512 y Fp(Returns)h(the)i(deriv)-5 b(ativ)m(e)32 -b(of)e(the)h(p)s(olynomial)f Fn(x)g Fp(with)g(resp)s(ect)g(to)h(the)g -(indeterminate)f Fn(X)p Fp(.)0 1811 y(The)g(follo)m(wing)i(output)e +Fp(-1)p Fr(.)0 665 y Fp(cl_ring_element)26 b(coeff)j(\(const)g(cl_UP&)f +(x,)i(uintL)f(index\))480 790 y Fr(Returns)g(the)i(co)s(e\016cien)m(t)h +(of)f Fp(X^index)d Fr(in)i(the)h(p)s(olynomial)f Fp(x)p +Fr(.)0 964 y Fp(cl_ring_element)c(x)k(\(const)f(cl_ring_element&)d(y\)) +480 1089 y Fr(Ev)-5 b(aluation:)40 b(If)25 b Fp(x)h Fr(is)h(a)f(p)s +(olynomial)g(and)g Fp(y)g Fr(b)s(elongs)g(to)h(the)f(base)h(ring,)g +(then)f(`)p Fp(x\(y\))p Fr(')g(returns)f(the)480 1213 +y(v)-5 b(alue)31 b(of)f(the)h(substitution)f(of)h Fp(y)f +Fr(in)m(to)h Fp(x)p Fr(.)0 1388 y Fp(cl_UP)e(deriv)g(\(const)g(cl_UP&)f +(x\))480 1512 y Fr(Returns)h(the)i(deriv)-5 b(ativ)m(e)32 +b(of)e(the)h(p)s(olynomial)f Fp(x)g Fr(with)g(resp)s(ect)g(to)h(the)g +(indeterminate)f Fp(X)p Fr(.)0 1811 y(The)g(follo)m(wing)i(output)e (functions)g(are)g(de\014ned)g(\(see)h(also)g(the)g(c)m(hapter)g(on)f -(input/output\).)0 2110 y Fn(void)f(fprint)g(\(cl_ostream)e(stream,)i +(input/output\).)0 2110 y Fp(void)f(fprint)g(\(cl_ostream)e(stream,)i (const)f(cl_UP&)h(x\))0 2234 y(cl_ostream)f(operator<<)f(\(cl_ostream)g -(stream,)i(const)g(cl_UP&)f(x\))480 2359 y Fp(Prin)m(ts)39 -b(the)g(univ)-5 b(ariate)40 b(p)s(olynomial)f Fn(x)f -Fp(on)h(the)h Fn(stream)p Fp(.)65 b(The)39 b(output)g(ma)m(y)f(dep)s +(stream,)i(const)g(cl_UP&)f(x\))480 2359 y Fr(Prin)m(ts)39 +b(the)g(univ)-5 b(ariate)40 b(p)s(olynomial)f Fp(x)f +Fr(on)h(the)h Fp(stream)p Fr(.)65 b(The)39 b(output)g(ma)m(y)f(dep)s (end)g(on)h(the)480 2484 y(global)32 b(prin)m(ter)e(settings)h(in)f -(the)h(v)-5 b(ariable)31 b Fn(cl_default_print_flags)p -Fp(.)0 2932 y Fq(9.3)68 b(Sp)t(ecial)31 b(p)t(olynomials)0 -3206 y Fp(The)f(follo)m(wing)i(functions)e(return)f(sp)s(ecial)i(p)s -(olynomials.)0 3505 y Fn(cl_UP_I)d(cl_tschebychev)f(\(sintL)i(n\))480 -3629 y Fp(Returns)g(the)i(n-th)f(Tc)m(heb)m(yc)m(hev)h(p)s(olynomial)f -(\(n)g Fn(>)p Fp(=)g(0\).)0 3804 y Fn(cl_UP_I)e(cl_hermite)g(\(sintL)h -(n\))480 3928 y Fp(Returns)g(the)i(n-th)f(Hermite)g(p)s(olynomial)g -(\(n)g Fn(>)p Fp(=)g(0\).)0 4102 y Fn(cl_UP_RA)e(cl_legendre)f(\(sintL) -i(n\))480 4227 y Fp(Returns)g(the)i(n-th)f(Legendre)g(p)s(olynomial)g -(\(n)g Fn(>)p Fp(=)g(0\).)0 4401 y Fn(cl_UP_I)e(cl_laguerre)g(\(sintL)g -(n\))480 4526 y Fp(Returns)h(the)i(n-th)f(Laguerre)h(p)s(olynomial)e -(\(n)h Fn(>)p Fp(=)g(0\).)0 4825 y(Information)24 b(ho)m(w)h(to)h +(the)h(v)-5 b(ariable)31 b Fp(cl_default_print_flags)p +Fr(.)0 2932 y Fs(9.3)68 b(Sp)t(ecial)31 b(p)t(olynomials)0 +3206 y Fr(The)f(follo)m(wing)i(functions)e(return)f(sp)s(ecial)i(p)s +(olynomials.)0 3505 y Fp(cl_UP_I)d(cl_tschebychev)f(\(sintL)i(n\))480 +3629 y Fr(Returns)g(the)i(n-th)f(Tc)m(heb)m(yc)m(hev)h(p)s(olynomial)f +(\(n)g Fp(>)p Fr(=)g(0\).)0 3804 y Fp(cl_UP_I)e(cl_hermite)g(\(sintL)h +(n\))480 3928 y Fr(Returns)g(the)i(n-th)f(Hermite)g(p)s(olynomial)g +(\(n)g Fp(>)p Fr(=)g(0\).)0 4102 y Fp(cl_UP_RA)e(cl_legendre)f(\(sintL) +i(n\))480 4227 y Fr(Returns)g(the)i(n-th)f(Legendre)g(p)s(olynomial)g +(\(n)g Fp(>)p Fr(=)g(0\).)0 4401 y Fp(cl_UP_I)e(cl_laguerre)g(\(sintL)g +(n\))480 4526 y Fr(Returns)h(the)i(n-th)f(Laguerre)h(p)s(olynomial)e +(\(n)h Fp(>)p Fr(=)g(0\).)0 4825 y(Information)24 b(ho)m(w)h(to)h (deriv)m(e)f(the)g(di\013eren)m(tial)i(equation)f(satis\014ed)f(b)m(y)f (eac)m(h)j(of)e(these)g(p)s(olynomials)f(from)g(their)0 4949 y(de\014nition)30 b(can)h(b)s(e)e(found)g(in)i(the)f -Fn(doc/polynomial/)c Fp(directory)-8 b(.)p eop +Fp(doc/polynomial/)c Fr(directory)-8 b(.)p eop %%Page: 55 57 -55 56 bop 0 -116 a Fp(Chapter)30 b(10:)41 b(In)m(ternals)2950 -b(55)0 366 y Fm(10)80 b(In)l(ternals)0 944 y Fq(10.1)68 -b(Wh)l(y)31 b(C)p Fd(++)e Fq(?)0 1220 y Fp(Using)i(C)p -Fn(++)e Fp(as)i(an)f(implemen)m(tation)g(language)i(pro)m(vides)75 -1496 y Fo(\017)60 b Fp(E\016ciency:)41 b(It)31 b(compiles)f(to)h(mac)m -(hine)f(co)s(de.)75 1648 y Fo(\017)60 b Fp(P)m(ortabilit)m(y:)43 +55 56 bop 0 -116 a Fr(Chapter)30 b(10:)41 b(In)m(ternals)2950 +b(55)0 366 y Fo(10)80 b(In)l(ternals)0 944 y Fs(10.1)68 +b(Wh)l(y)31 b(C)p Ff(++)e Fs(?)0 1220 y Fr(Using)i(C)p +Fp(++)e Fr(as)i(an)f(implemen)m(tation)g(language)i(pro)m(vides)75 +1496 y Fq(\017)60 b Fr(E\016ciency:)41 b(It)31 b(compiles)f(to)h(mac)m +(hine)f(co)s(de.)75 1648 y Fq(\017)60 b Fr(P)m(ortabilit)m(y:)43 b(It)29 b(runs)f(on)i(all)g(platforms)f(supp)s(orting)f(a)i(C)p -Fn(++)e Fp(compiler.)40 b(Because)31 b(of)f(the)g(a)m(v)-5 -b(ailabilit)m(y)33 b(of)180 1772 y(GNU)j(C)p Fn(++)p -Fp(,)f(this)g(includes)g(all)h(curren)m(tly)f(used)f(32-bit)i(and)f +Fp(++)e Fr(compiler.)40 b(Because)31 b(of)f(the)g(a)m(v)-5 +b(ailabilit)m(y)33 b(of)180 1772 y(GNU)j(C)p Fp(++)p +Fr(,)f(this)g(includes)g(all)h(curren)m(tly)f(used)f(32-bit)i(and)f (64-bit)h(platforms,)f(indep)s(enden)m(tly)g(of)g(the)180 -1897 y(qualit)m(y)d(of)e(the)h(v)m(endor's)f(C)p Fn(++)f -Fp(compiler.)75 2049 y Fo(\017)60 b Fp(T)m(yp)s(e)26 -b(safet)m(y:)40 b(The)25 b(C)p Fn(++)g Fp(compilers)h(kno)m(ws)g(ab)s +1897 y(qualit)m(y)d(of)e(the)h(v)m(endor's)f(C)p Fp(++)f +Fr(compiler.)75 2049 y Fq(\017)60 b Fr(T)m(yp)s(e)26 +b(safet)m(y:)40 b(The)25 b(C)p Fp(++)g Fr(compilers)h(kno)m(ws)g(ab)s (out)g(the)g(n)m(um)m(b)s(er)e(t)m(yp)s(es)j(and)e(complains)h(if,)h (for)f(example,)180 2173 y(y)m(ou)41 b(try)f(to)h(assign)g(a)f(\015oat) h(to)g(an)g(in)m(teger)g(v)-5 b(ariable.)72 b(Ho)m(w)m(ev)m(er,)45 -b(a)c(dra)m(wbac)m(k)f(is)h(that)g(C)p Fn(++)e Fp(do)s(esn't)180 -2298 y(kno)m(w)i(ab)s(out)f(generic)h(t)m(yp)s(es,)j(hence)c(a)h -(restriction)h(lik)m(e)g(that)f Fn(operation+)27 b(\(const)i(cl_MI&,)f -(const)180 2422 y(cl_MI&\))i Fp(requires)i(that)h(b)s(oth)f(argumen)m -(ts)g(b)s(elong)g(to)h(the)g(same)e(mo)s(dular)g(ring)h(cannot)h(b)s(e) -e(expressed)180 2547 y(as)g(a)f(compile-time)h(information.)75 -2698 y Fo(\017)60 b Fp(Algebraic)34 b(syn)m(tax:)46 b(The)32 -b(elemen)m(tary)h(op)s(erations)g Fn(+)p Fp(,)g Fn(-)p -Fp(,)g Fn(*)p Fp(,)g Fn(=)p Fp(,)g Fn(==)p Fp(,)g(...)48 +b(a)c(dra)m(wbac)m(k)f(is)h(that)g(C)p Fp(++)e Fr(do)s(esn't)180 +2298 y(kno)m(w)27 b(ab)s(out)f(generic)i(t)m(yp)s(es,)g(hence)f(a)g +(restriction)h(lik)m(e)g(that)f Fp(operator+)h(\(const)g(cl_MI&,)h +(const)g(cl_)180 2422 y(MI&\))f Fr(requires)h(that)g(b)s(oth)g(argumen) +m(ts)f(b)s(elong)h(to)h(the)g(same)e(mo)s(dular)f(ring)i(cannot)h(b)s +(e)f(expressed)f(as)i(a)180 2547 y(compile-time)g(information.)75 +2698 y Fq(\017)60 b Fr(Algebraic)34 b(syn)m(tax:)46 b(The)32 +b(elemen)m(tary)h(op)s(erations)g Fp(+)p Fr(,)g Fp(-)p +Fr(,)g Fp(*)p Fr(,)g Fp(=)p Fr(,)g Fp(==)p Fr(,)g(...)48 b(can)33 b(b)s(e)f(used)f(in)i(in\014x)e(notation,)180 2823 y(whic)m(h)f(is)h(more)e(con)m(v)m(enien)m(t)k(than)d(Lisp)f -(notation)j(`)p Fn(\(+)e(x)g(y\))p Fp(')g(or)g(C)g(notation)i(`)p -Fn(add\(x,y,&z\))p Fp('.)0 3126 y(With)c(these)g(language)h(features,)g +(notation)j(`)p Fp(\(+)e(x)g(y\))p Fr(')g(or)g(C)g(notation)i(`)p +Fp(add\(x,y,&z\))p Fr('.)0 3126 y(With)c(these)g(language)h(features,)g (there)f(is)f(no)h(need)f(for)g(t)m(w)m(o)i(separate)g(languages,)h (one)d(for)h(the)g(implemen)m(ta-)0 3251 y(tion)i(of)h(the)f(library)f (and)h(one)g(in)g(whic)m(h)g(the)g(library's)f(users)h(can)g(program.) @@ -3971,219 +4245,220 @@ y(implemen)m(tation)36 b(of)g(an)f(algorithm)h(can)h(b)s(e)e(in)m (b)s(een)0 3500 y(tested)g(and)f(debugged.)55 b(No)36 b(need)g(to)g(rewrite)f(it)h(in)f(a)h(lo)m(w-lev)m(el)i(language)f (after)f(ha)m(ving)g(protot)m(yp)s(ed)f(in)h(a)0 3624 -y(high-lev)m(el)c(language.)0 4093 y Fq(10.2)68 b(Memory)31 -b(e\016ciency)0 4369 y Fp(In)f(order)g(to)h(sa)m(v)m(e)h(memory)c(allo) -s(cations,)33 b(CLN)d(implemen)m(ts:)75 4645 y Fo(\017)60 -b Fp(Ob)5 b(ject)31 b(sharing:)40 b(An)30 b(op)s(eration)h(lik)m(e)g -Fn(x+0)f Fp(returns)f Fn(x)h Fp(without)g(cop)m(ying)i(it.)75 -4797 y Fo(\017)60 b Fp(Garbage)42 b(collection:)64 b(A)41 +y(high-lev)m(el)c(language.)0 4093 y Fs(10.2)68 b(Memory)31 +b(e\016ciency)0 4369 y Fr(In)f(order)g(to)h(sa)m(v)m(e)h(memory)c(allo) +s(cations,)33 b(CLN)d(implemen)m(ts:)75 4645 y Fq(\017)60 +b Fr(Ob)5 b(ject)31 b(sharing:)40 b(An)30 b(op)s(eration)h(lik)m(e)g +Fp(x+0)f Fr(returns)f Fp(x)h Fr(without)g(cop)m(ying)i(it.)75 +4797 y Fq(\017)60 b Fr(Garbage)42 b(collection:)64 b(A)41 b(reference)g(coun)m(ting)h(mec)m(hanism)d(mak)m(es)i(sure)f(that)h(an) m(y)g(n)m(um)m(b)s(er)e(ob)5 b(ject's)180 4922 y(storage)32 b(is)e(freed)g(immediately)g(when)f(the)i(last)g(reference)g(to)g(the)g -(ob)5 b(ject)31 b(is)f(gone.)75 5073 y Fo(\017)60 b Fp(Small)20 +(ob)5 b(ject)31 b(is)f(gone.)75 5073 y Fq(\017)60 b Fr(Small)20 b(in)m(tegers)j(are)e(represen)m(ted)g(as)g(immediate)f(v)-5 b(alues)22 b(instead)f(of)g(p)s(oin)m(ters)g(to)h(heap)f(allo)s(cated)i (storage.)180 5198 y(This)44 b(means)g(that)i(in)m(tegers)g -Fn(>)30 b(-2^29)p Fp(,)48 b Fn(<)30 b(2^29)44 b Fp(don't)h(consume)f +Fp(>)30 b(-2^29)p Fr(,)48 b Fp(<)30 b(2^29)44 b Fr(don't)h(consume)f (heap)h(memory)-8 b(,)47 b(unless)d(they)h(w)m(ere)180 5322 y(explicitly)32 b(allo)s(cated)g(on)f(the)f(heap.)p eop %%Page: 56 58 -56 57 bop 0 -116 a Fp(Chapter)30 b(10:)41 b(In)m(ternals)2950 -b(56)0 366 y Fq(10.3)68 b(Sp)t(eed)30 b(e\016ciency)0 -640 y Fp(Sp)s(eed)f(e\016ciency)j(is)e(obtained)h(b)m(y)f(the)h(com)m +56 57 bop 0 -116 a Fr(Chapter)30 b(10:)41 b(In)m(ternals)2950 +b(56)0 366 y Fs(10.3)68 b(Sp)t(eed)30 b(e\016ciency)0 +640 y Fr(Sp)s(eed)f(e\016ciency)j(is)e(obtained)h(b)m(y)f(the)h(com)m (bination)f(of)h(the)f(follo)m(wing)i(tric)m(ks)f(and)f(algorithms:)75 -914 y Fo(\017)60 b Fp(Small)38 b(in)m(tegers,)43 b(b)s(eing)c(represen) +914 y Fq(\017)60 b Fr(Small)38 b(in)m(tegers,)43 b(b)s(eing)c(represen) m(ted)g(as)g(immediate)f(v)-5 b(alues,)42 b(don't)d(require)g(memory)e (access,)43 b(just)c(a)180 1039 y(couple)31 b(of)f(instructions)h(for)f -(eac)m(h)h(elemen)m(tary)g(op)s(eration.)75 1188 y Fo(\017)60 -b Fp(The)27 b(k)m(ernel)h(of)f(CLN)g(has)g(b)s(een)g(written)g(in)g -(assem)m(bly)g(language)h(for)f(some)g(CPUs)g(\()p Fn(i386)p -Fp(,)g Fn(m68k)p Fp(,)g Fn(sparc)p Fp(,)180 1313 y Fn(mips)p -Fp(,)i Fn(arm)p Fp(\).)75 1462 y Fo(\017)60 b Fp(On)30 -b(all)h(CPUs,)f(CLN)g(uses)g(the)g(sup)s(ere\016cien)m(t)h(lo)m(w-lev)m -(el)i(routines)d(from)f(GNU)i(GMP)g(v)m(ersion)g(2.)75 -1612 y Fo(\017)60 b Fp(F)-8 b(or)32 b(large)g(n)m(um)m(b)s(ers,)e(CLN)h -(uses,)g(instead)g(of)h(the)f(standard)g Fn(O\(N^2\))e -Fp(algorithm,)j(the)g(Karatsuba)f(m)m(ul-)180 1736 y(tiplication,)i -(whic)m(h)d(is)g(an)91 b Fl(O)s Fp(\()p Fl(N)1368 1703 -y Ff(1)p Fg(:)p Ff(6)1458 1736 y Fp(\))31 b(algorithm.)75 -1886 y Fo(\017)60 b Fp(F)-8 b(or)31 b(v)m(ery)f(large)h(n)m(um)m(b)s -(ers)c(\(more)i(than)h(12000)i(decimal)e(digits\),)h(CLN)e(uses)g(Sc)m -(h\177)-45 b(onhage-Strassen)31 b(m)m(ul-)180 2010 y(tiplication,)i -(whic)m(h)d(is)g(an)g(asymptotically)i(optimal)e(m)m(ultiplication)i -(algorithm.)75 2160 y Fo(\017)60 b Fp(These)27 b(fast)h(m)m -(ultiplication)h(algorithms)e(also)i(giv)m(e)g(impro)m(v)m(emen)m(ts)d -(in)i(the)f(sp)s(eed)g(of)h(division)f(and)g(radix)180 -2284 y(con)m(v)m(ersion.)0 2733 y Fq(10.4)68 b(Garbage)31 -b(collection)0 3007 y Fp(All)39 b(the)f(n)m(um)m(b)s(er)e(classes)j -(are)g(reference)g(coun)m(t)f(classes:)58 b(They)37 b(only)i(con)m -(tain)g(a)g(p)s(oin)m(ter)f(to)h(an)f(ob)5 b(ject)39 -b(in)0 3131 y(the)h(heap.)71 b(Up)s(on)39 b(construction,)44 -b(assignmen)m(t)c(and)f(destruction)i(of)f(n)m(um)m(b)s(er)e(ob)5 -b(jects,)44 b(only)c(the)h(ob)5 b(jects')0 3256 y(reference)31 -b(coun)m(t)g(are)g(manipulated.)0 3530 y(Memory)g(o)s(ccupied)g(b)m(y)g -(n)m(um)m(b)s(er)d(ob)5 b(jects)32 b(are)g(automatically)h(reclaimed)e -(as)g(so)s(on)g(as)h(their)f(reference)g(coun)m(t)0 3654 -y(drops)e(to)i(zero.)0 3928 y(F)-8 b(or)31 b(n)m(um)m(b)s(er)d(rings,)i -(another)g(strategy)h(is)f(implemen)m(ted:)39 b(There)30 -b(is)g(a)h(cac)m(he)g(of,)g(for)f(example,)g(the)g(mo)s(dular)0 -4053 y(in)m(teger)k(rings.)49 b(A)33 b(mo)s(dular)e(in)m(teger)j(ring)f -(is)g(destro)m(y)m(ed)h(only)f(if)g(its)g(reference)h(coun)m(t)f(dropp) -s(ed)e(to)j(zero)g(and)0 4177 y(the)40 b(cac)m(he)i(is)e(ab)s(out)g(to) -g(b)s(e)g(resized.)70 b(The)39 b(e\013ect)j(of)e(this)g(strategy)h(is)f -(that)h(recen)m(tly)g(used)e(rings)h(remain)0 4302 y(cac)m(hed,)32 -b(whereas)e(undue)f(memory)f(consumption)h(through)g(cac)m(hed)j(rings) -e(is)g(a)m(v)m(oided.)p eop +(eac)m(h)h(elemen)m(tary)g(op)s(eration.)75 1188 y Fq(\017)60 +b Fr(The)27 b(k)m(ernel)h(of)f(CLN)g(has)g(b)s(een)g(written)g(in)g +(assem)m(bly)g(language)h(for)f(some)g(CPUs)g(\()p Fp(i386)p +Fr(,)g Fp(m68k)p Fr(,)g Fp(sparc)p Fr(,)180 1313 y Fp(mips)p +Fr(,)i Fp(arm)p Fr(\).)75 1462 y Fq(\017)60 b Fr(On)33 +b(all)i(CPUs,)g(CLN)f(ma)m(y)g(b)s(e)g(con\014gured)f(to)i(use)f(the)g +(sup)s(ere\016cien)m(t)g(lo)m(w-lev)m(el)j(routines)e(from)d(GNU)180 +1587 y(GMP)f(v)m(ersion)g(3.)75 1736 y Fq(\017)60 b Fr(F)-8 +b(or)32 b(large)g(n)m(um)m(b)s(ers,)e(CLN)h(uses,)g(instead)g(of)h(the) +f(standard)g Fp(O\(N^2\))e Fr(algorithm,)j(the)g(Karatsuba)f(m)m(ul-) +180 1861 y(tiplication,)i(whic)m(h)d(is)g(an)91 b Fn(O)s +Fr(\()p Fn(N)1368 1828 y Fh(1)p Fi(:)p Fh(6)1458 1861 +y Fr(\))31 b(algorithm.)75 2010 y Fq(\017)60 b Fr(F)-8 +b(or)45 b(v)m(ery)g(large)h(n)m(um)m(b)s(ers)c(\(more)i(than)g(12000)i +(decimal)f(digits\),)k(CLN)44 b(uses)g(Sc)m(h\177)-45 +b(onhage-Strassen)180 2135 y(m)m(ultiplication,)32 b(whic)m(h)e(is)g +(an)g(asymptotically)i(optimal)e(m)m(ultiplication)i(algorithm.)75 +2284 y Fq(\017)60 b Fr(These)27 b(fast)h(m)m(ultiplication)h +(algorithms)e(also)i(giv)m(e)g(impro)m(v)m(emen)m(ts)d(in)i(the)f(sp)s +(eed)g(of)h(division)f(and)g(radix)180 2409 y(con)m(v)m(ersion.)0 +2857 y Fs(10.4)68 b(Garbage)31 b(collection)0 3131 y +Fr(All)39 b(the)f(n)m(um)m(b)s(er)e(classes)j(are)g(reference)g(coun)m +(t)f(classes:)58 b(They)37 b(only)i(con)m(tain)g(a)g(p)s(oin)m(ter)f +(to)h(an)f(ob)5 b(ject)39 b(in)0 3256 y(the)h(heap.)71 +b(Up)s(on)39 b(construction,)44 b(assignmen)m(t)c(and)f(destruction)i +(of)f(n)m(um)m(b)s(er)e(ob)5 b(jects,)44 b(only)c(the)h(ob)5 +b(jects')0 3380 y(reference)31 b(coun)m(t)g(are)g(manipulated.)0 +3654 y(Memory)g(o)s(ccupied)g(b)m(y)g(n)m(um)m(b)s(er)d(ob)5 +b(jects)32 b(are)g(automatically)h(reclaimed)e(as)g(so)s(on)g(as)h +(their)f(reference)g(coun)m(t)0 3779 y(drops)e(to)i(zero.)0 +4053 y(F)-8 b(or)31 b(n)m(um)m(b)s(er)d(rings,)i(another)g(strategy)h +(is)f(implemen)m(ted:)39 b(There)30 b(is)g(a)h(cac)m(he)g(of,)g(for)f +(example,)g(the)g(mo)s(dular)0 4177 y(in)m(teger)k(rings.)49 +b(A)33 b(mo)s(dular)e(in)m(teger)j(ring)f(is)g(destro)m(y)m(ed)h(only)f +(if)g(its)g(reference)h(coun)m(t)f(dropp)s(ed)e(to)j(zero)g(and)0 +4302 y(the)40 b(cac)m(he)i(is)e(ab)s(out)g(to)g(b)s(e)g(resized.)70 +b(The)39 b(e\013ect)j(of)e(this)g(strategy)h(is)f(that)h(recen)m(tly)g +(used)e(rings)h(remain)0 4426 y(cac)m(hed,)32 b(whereas)e(undue)f +(memory)f(consumption)h(through)g(cac)m(hed)j(rings)e(is)g(a)m(v)m +(oided.)p eop %%Page: 57 59 -57 58 bop 0 -116 a Fp(Chapter)30 b(11:)41 b(Using)31 -b(the)f(library)2621 b(57)0 366 y Fm(11)80 b(Using)30 -b(the)g(library)0 729 y Fp(F)-8 b(or)43 b(the)g(follo)m(wing)g +57 58 bop 0 -116 a Fr(Chapter)30 b(11:)41 b(Using)31 +b(the)f(library)2621 b(57)0 366 y Fo(11)80 b(Using)30 +b(the)g(library)0 729 y Fr(F)-8 b(or)43 b(the)g(follo)m(wing)g (discussion,)i(w)m(e)e(will)g(assume)e(that)i(y)m(ou)g(ha)m(v)m(e)g -(installed)g(the)g(CLN)f(source)g(in)g Fn($CLN_)0 854 -y(DIR)37 b Fp(and)g(built)h(it)g(in)g Fn($CLN_TARGETDIR)p -Fp(.)60 b(F)-8 b(or)38 b(example,)i(for)e(me)f(it's)h -Fn(CLN_DIR="$HOME/cln")33 b Fp(and)k Fn(CLN_)0 978 y -(TARGETDIR="$HOME/cln/lin)o(uxel)o(f")p Fp(.)g(Y)-8 b(ou)32 +(installed)g(the)g(CLN)f(source)g(in)g Fp($CLN_)0 854 +y(DIR)37 b Fr(and)g(built)h(it)g(in)g Fp($CLN_TARGETDIR)p +Fr(.)60 b(F)-8 b(or)38 b(example,)i(for)e(me)f(it's)h +Fp(CLN_DIR="$HOME/cln")33 b Fr(and)k Fp(CLN_)0 978 y +(TARGETDIR="$HOME/cln/lin)o(uxel)o(f")p Fr(.)g(Y)-8 b(ou)32 b(migh)m(t)f(de\014ne)g(these)h(as)f(en)m(vironmen)m(t)g(v)-5 b(ariables,)33 b(or)e(directly)0 1103 y(substitute)f(the)h(appropriate) -f(v)-5 b(alues.)0 1540 y Fq(11.1)68 b(Compiler)32 b(options)0 -1814 y Fp(Un)m(til)f(y)m(ou)g(ha)m(v)m(e)h(installed)f(CLN)f(in)g(a)h +f(v)-5 b(alues.)0 1540 y Fs(11.1)68 b(Compiler)32 b(options)0 +1814 y Fr(Un)m(til)f(y)m(ou)g(ha)m(v)m(e)h(installed)f(CLN)f(in)g(a)h (public)e(place,)j(the)e(follo)m(wing)i(options)f(are)g(needed:)0 2088 y(When)f(y)m(ou)h(compile)f(CLN)g(application)i(co)s(de,)f(add)e -(the)i(\015ags)383 2341 y Fn(-I$CLN_DIR/include)43 b -(-I$CLN_TARGETDIR/include)0 2615 y Fp(to)25 b(the)f(C)p -Fn(++)f Fp(compiler's)h(command)e(line)j(\()p Fn(make)e -Fp(v)-5 b(ariable)25 b(CFLA)m(GS)f(or)g(CXXFLA)m(GS\).)i(When)e(y)m(ou) +(the)i(\015ags)383 2341 y Fp(-I$CLN_DIR/include)43 b +(-I$CLN_TARGETDIR/include)0 2615 y Fr(to)25 b(the)f(C)p +Fp(++)f Fr(compiler's)h(command)e(line)j(\()p Fp(make)e +Fr(v)-5 b(ariable)25 b(CFLA)m(GS)f(or)g(CXXFLA)m(GS\).)i(When)e(y)m(ou) g(link)g(CLN)0 2740 y(application)32 b(co)s(de)e(to)h(form)e(an)i -(executable,)h(add)e(the)g(\015ags)383 2993 y Fn -($CLN_TARGETDIR/src/libcln)o(.a)0 3267 y Fp(to)h(the)g(C/C)p -Fn(++)e Fp(compiler's)h(command)e(line)j(\()p Fn(make)f -Fp(v)-5 b(ariable)31 b(LIBS\).)0 3541 y(If)20 b(y)m(ou)g(did)g(a)h -Fn(make)29 b(install)p Fp(,)20 b(the)h(include)f(\014les)g(are)h +(executable,)h(add)e(the)g(\015ags)383 2993 y Fp +($CLN_TARGETDIR/src/libcln)o(.a)0 3267 y Fr(to)h(the)g(C/C)p +Fp(++)e Fr(compiler's)h(command)e(line)j(\()p Fp(make)f +Fr(v)-5 b(ariable)31 b(LIBS\).)0 3541 y(If)20 b(y)m(ou)g(did)g(a)h +Fp(make)29 b(install)p Fr(,)20 b(the)h(include)f(\014les)g(are)h (installed)g(in)f(a)g(public)g(directory)h(\(normally)f -Fn(/usr/local/include)p Fp(\),)0 3665 y(hence)k(y)m(ou)f(don't)h(need)f +Fp(/usr/local/include)p Fr(\),)0 3665 y(hence)k(y)m(ou)f(don't)h(need)f (sp)s(ecial)h(\015ags)g(for)f(compiling.)38 b(The)23 b(library)g(has)h(b)s(een)e(installed)j(to)f(a)g(public)e(directory)0 -3790 y(as)33 b(w)m(ell)h(\(normally)f Fn(/usr/local/lib)p -Fp(\),)e(hence)i(when)f(linking)h(a)h(CLN)f(application)h(it)g(is)f +3790 y(as)33 b(w)m(ell)h(\(normally)f Fp(/usr/local/lib)p +Fr(\),)e(hence)i(when)f(linking)h(a)h(CLN)f(application)h(it)g(is)f (su\016cien)m(t)h(to)f(giv)m(e)0 3915 y(the)e(\015ag)f -Fn(-lcln)p Fp(.)0 4352 y Fq(11.2)68 b(Include)30 b(\014les)0 -4626 y Fp(Here)h(is)f(a)h(summary)c(of)k(the)f(include)h(\014les)f(and) -g(their)g(con)m(ten)m(ts.)0 4922 y Fn()480 -5047 y Fp(General)h(de\014nitions,)f(reference)h(coun)m(ting,)h -(garbage)f(collection.)0 5215 y Fn()480 -5340 y Fp(The)f(class)h(cl)p 950 5340 28 4 v 33 w(n)m(um)m(b)s(er.)p +Fp(-lcln)p Fr(.)0 4352 y Fs(11.2)68 b(Include)30 b(\014les)0 +4626 y Fr(Here)h(is)f(a)h(summary)c(of)k(the)f(include)h(\014les)f(and) +g(their)g(con)m(ten)m(ts.)0 4922 y Fp()480 +5047 y Fr(General)h(de\014nitions,)f(reference)h(coun)m(ting,)h +(garbage)f(collection.)0 5215 y Fp()480 +5340 y Fr(The)f(class)h(cl)p 950 5340 28 4 v 33 w(n)m(um)m(b)s(er.)p eop %%Page: 58 60 -58 59 bop 0 -116 a Fp(Chapter)30 b(11:)41 b(Using)31 -b(the)f(library)2621 b(58)0 366 y Fn()480 -491 y Fp(F)-8 b(unctions)31 b(for)f(class)h(cl)p 1318 +58 59 bop 0 -116 a Fr(Chapter)30 b(11:)41 b(Using)31 +b(the)f(library)2621 b(58)0 366 y Fp()480 +491 y Fr(F)-8 b(unctions)31 b(for)f(class)h(cl)p 1318 491 28 4 v 34 w(N,)f(the)h(complex)f(n)m(um)m(b)s(ers.)0 -670 y Fn()480 794 y Fp(F)-8 b(unctions)31 +670 y Fp()480 794 y Fr(F)-8 b(unctions)31 b(for)f(class)h(cl)p 1318 794 V 34 w(R,)f(the)h(real)g(n)m(um)m(b)s -(ers.)0 973 y Fn()480 1097 y Fp(F)-8 b(unctions)31 +(ers.)0 973 y Fp()480 1097 y Fr(F)-8 b(unctions)31 b(for)f(class)h(cl)p 1318 1097 V 34 w(F,)f(the)h(\015oats.)0 -1276 y Fn()480 1400 y Fp(F)-8 b(unctions)31 +1276 y Fp()480 1400 y Fr(F)-8 b(unctions)31 b(for)f(class)h(cl)p 1318 1400 V 34 w(SF,)f(the)h(short-\015oats.)0 -1579 y Fn()480 1703 y Fp(F)-8 b(unctions)31 +1579 y Fp()480 1703 y Fr(F)-8 b(unctions)31 b(for)f(class)h(cl)p 1318 1703 V 34 w(FF,)g(the)f(single-\015oats.)0 -1882 y Fn()480 2006 y Fp(F)-8 b(unctions)31 +1882 y Fp()480 2006 y Fr(F)-8 b(unctions)31 b(for)f(class)h(cl)p 1318 2006 V 34 w(DF,)g(the)f(double-\015oats.)0 -2185 y Fn()480 2309 y Fp(F)-8 b(unctions)31 +2185 y Fp()480 2309 y Fr(F)-8 b(unctions)31 b(for)f(class)h(cl)p 1318 2309 V 34 w(LF,)f(the)h(long-\015oats.)0 -2488 y Fn()480 2612 y Fp(F)-8 b(unctions)31 +2488 y Fp()480 2612 y Fr(F)-8 b(unctions)31 b(for)f(class)h(cl)p 1318 2612 V 34 w(RA,)f(the)h(rational)g(n)m(um)m -(b)s(ers.)0 2791 y Fn()480 2916 y Fp(F)-8 +(b)s(ers.)0 2791 y Fp()480 2916 y Fr(F)-8 b(unctions)31 b(for)f(class)h(cl)p 1318 2916 V 34 w(I,)f(the)h(in)m -(tegers.)0 3094 y Fn()480 3219 y Fp(Input/Output.)0 -3397 y Fn()480 3522 y Fp(Input/Output)d(for)j(class)g +(tegers.)0 3094 y Fp()480 3219 y Fr(Input/Output.)0 +3397 y Fp()480 3522 y Fr(Input/Output)d(for)j(class)g (cl)p 1491 3522 V 33 w(N,)g(the)f(complex)g(n)m(um)m(b)s(ers.)0 -3700 y Fn()480 3825 y Fp(Input/Output)e(for)j(class)g(cl) +3700 y Fp()480 3825 y Fr(Input/Output)e(for)j(class)g(cl) p 1491 3825 V 33 w(R,)g(the)f(real)h(n)m(um)m(b)s(ers.)0 -4003 y Fn()480 4128 y Fp(Input/Output)d(for)j(class)g +4003 y Fp()480 4128 y Fr(Input/Output)d(for)j(class)g (cl)p 1491 4128 V 33 w(F,)g(the)g(\015oats.)0 4306 y -Fn()480 4431 y Fp(Input/Output)d(for)j(class)g(cl)p +Fp()480 4431 y Fr(Input/Output)d(for)j(class)g(cl)p 1491 4431 V 33 w(SF,)f(the)h(short-\015oats.)0 4609 y -Fn()480 4734 y Fp(Input/Output)d(for)j(class)g(cl)p +Fp()480 4734 y Fr(Input/Output)d(for)j(class)g(cl)p 1491 4734 V 33 w(FF,)g(the)g(single-\015oats.)0 4912 -y Fn()480 5037 y Fp(Input/Output)d(for)j(class)g(cl)p +y Fp()480 5037 y Fr(Input/Output)d(for)j(class)g(cl)p 1491 5037 V 33 w(DF,)g(the)g(double-\015oats.)0 5215 -y Fn()480 5340 y Fp(Input/Output)d(for)j(class)g(cl)p +y Fp()480 5340 y Fr(Input/Output)d(for)j(class)g(cl)p 1491 5340 V 33 w(LF,)g(the)f(long-\015oats.)p eop %%Page: 59 61 -59 60 bop 0 -116 a Fp(Chapter)30 b(11:)41 b(Using)31 -b(the)f(library)2621 b(59)0 366 y Fn()480 -491 y Fp(Input/Output)28 b(for)j(class)g(cl)p 1491 491 +59 60 bop 0 -116 a Fr(Chapter)30 b(11:)41 b(Using)31 +b(the)f(library)2621 b(59)0 366 y Fp()480 +491 y Fr(Input/Output)28 b(for)j(class)g(cl)p 1491 491 28 4 v 33 w(RA,)g(the)f(rational)i(n)m(um)m(b)s(ers.)0 -670 y Fn()480 794 y Fp(Input/Output)c(for)j(class)g +670 y Fp()480 794 y Fr(Input/Output)c(for)j(class)g (cl)p 1491 794 V 33 w(I,)f(the)h(in)m(tegers.)0 973 y -Fn()480 1097 y Fp(Flags)h(for)e(customizing)g(input)g(op)s -(erations.)0 1276 y Fn()480 1400 y Fp(Flags)i(for)e -(customizing)g(output)g(op)s(erations.)0 1579 y Fn()480 -1703 y(cl_malloc_hook)p Fp(,)d Fn(cl_free_hook)p Fp(.)0 -1882 y Fn()480 2006 y(cl_abort)p Fp(.)0 2185 -y Fn()480 2309 y Fp(Conditions/exceptions.)0 -2488 y Fn()480 2612 y Fp(Strings.)0 2791 -y Fn()480 2916 y Fp(Sym)m(b)s(ols.)0 3094 -y Fn()480 3219 y Fp(Prop)s(ert)m(y)j(lists.)0 -3397 y Fn()480 3522 y Fp(General)h(rings.)0 -3700 y Fn()480 3825 y Fp(The)f(n)m(ull)g(ring.)0 -4003 y Fn()480 4128 y Fp(The)g(ring)g(of)h(complex)f -(n)m(um)m(b)s(ers.)0 4306 y Fn()480 4431 -y Fp(The)g(ring)g(of)h(real)g(n)m(um)m(b)s(ers.)0 4609 -y Fn()480 4734 y Fp(The)f(ring)g(of)h(rational)g(n) -m(um)m(b)s(ers.)0 4912 y Fn()480 5037 -y Fp(The)f(ring)g(of)h(in)m(tegers.)0 5215 y Fn()480 -5340 y Fp(Num)m(b)s(er)d(threory)i(functions.)p eop +Fp()480 1097 y Fr(Flags)h(for)e(customizing)g(input)g(op)s +(erations.)0 1276 y Fp()480 1400 y Fr(Flags)i(for)e +(customizing)g(output)g(op)s(erations.)0 1579 y Fp()480 +1703 y(cl_malloc_hook)p Fr(,)d Fp(cl_free_hook)p Fr(.)0 +1882 y Fp()480 2006 y(cl_abort)p Fr(.)0 2185 +y Fp()480 2309 y Fr(Conditions/exceptions.)0 +2488 y Fp()480 2612 y Fr(Strings.)0 2791 +y Fp()480 2916 y Fr(Sym)m(b)s(ols.)0 3094 +y Fp()480 3219 y Fr(Prop)s(ert)m(y)j(lists.)0 +3397 y Fp()480 3522 y Fr(General)h(rings.)0 +3700 y Fp()480 3825 y Fr(The)f(n)m(ull)g(ring.)0 +4003 y Fp()480 4128 y Fr(The)g(ring)g(of)h(complex)f +(n)m(um)m(b)s(ers.)0 4306 y Fp()480 4431 +y Fr(The)g(ring)g(of)h(real)g(n)m(um)m(b)s(ers.)0 4609 +y Fp()480 4734 y Fr(The)f(ring)g(of)h(rational)g(n) +m(um)m(b)s(ers.)0 4912 y Fp()480 5037 +y Fr(The)f(ring)g(of)h(in)m(tegers.)0 5215 y Fp()480 +5340 y Fr(Num)m(b)s(er)d(threory)i(functions.)p eop %%Page: 60 62 -60 61 bop 0 -116 a Fp(Chapter)30 b(11:)41 b(Using)31 -b(the)f(library)2621 b(60)0 366 y Fn()480 -491 y Fp(Mo)s(dular)30 b(in)m(tegers.)0 659 y Fn()96 -b Fp(V)-8 b(ectors.)0 827 y Fn()480 952 y Fp(General)31 -b(v)m(ectors.)0 1120 y Fn()480 1244 y -Fp(General)g(v)m(ectors)h(o)m(v)m(er)g(cl)p 1393 1244 -28 4 v 33 w(n)m(um)m(b)s(er.)0 1412 y Fn()480 -1537 y Fp(General)f(v)m(ectors)h(o)m(v)m(er)g(cl)p 1393 -1537 V 33 w(N.)0 1705 y Fn()480 1829 y -Fp(General)f(v)m(ectors)h(o)m(v)m(er)g(cl)p 1393 1829 -V 33 w(R.)0 1997 y Fn()480 2122 y Fp(General)f(v)m +60 61 bop 0 -116 a Fr(Chapter)30 b(11:)41 b(Using)31 +b(the)f(library)2621 b(60)0 366 y Fp()480 +491 y Fr(Mo)s(dular)30 b(in)m(tegers.)0 659 y Fp()96 +b Fr(V)-8 b(ectors.)0 827 y Fp()480 952 y Fr(General)31 +b(v)m(ectors.)0 1120 y Fp()480 1244 y +Fr(General)g(v)m(ectors)h(o)m(v)m(er)g(cl)p 1393 1244 +28 4 v 33 w(n)m(um)m(b)s(er.)0 1412 y Fp()480 +1537 y Fr(General)f(v)m(ectors)h(o)m(v)m(er)g(cl)p 1393 +1537 V 33 w(N.)0 1705 y Fp()480 1829 y +Fr(General)f(v)m(ectors)h(o)m(v)m(er)g(cl)p 1393 1829 +V 33 w(R.)0 1997 y Fp()480 2122 y Fr(General)f(v)m (ectors)h(o)m(v)m(er)g(cl)p 1393 2122 V 33 w(RA.)0 2290 -y Fn()480 2414 y Fp(General)f(v)m(ectors)h(o)m(v)m(er) -g(cl)p 1393 2414 V 33 w(I.)0 2582 y Fn()480 -2707 y Fp(General)f(v)m(ectors)h(of)f(mo)s(dular)d(in)m(tegers.)0 -2875 y Fn()480 3000 y Fp(Simple)h(v)m(ectors.)0 -3168 y Fn()480 3292 y Fp(Simple)g(v)m(ectors)j(o)m(v)m +y Fp()480 2414 y Fr(General)f(v)m(ectors)h(o)m(v)m(er) +g(cl)p 1393 2414 V 33 w(I.)0 2582 y Fp()480 +2707 y Fr(General)f(v)m(ectors)h(of)f(mo)s(dular)d(in)m(tegers.)0 +2875 y Fp()480 3000 y Fr(Simple)h(v)m(ectors.)0 +3168 y Fp()480 3292 y Fr(Simple)g(v)m(ectors)j(o)m(v)m (er)g(cl)p 1352 3292 V 33 w(n)m(um)m(b)s(er.)0 3460 y -Fn()480 3585 y Fp(Simple)d(v)m(ectors)j(o)m(v)m(er)g -(cl)p 1352 3585 V 33 w(N.)0 3753 y Fn()480 -3877 y Fp(Simple)d(v)m(ectors)j(o)m(v)m(er)g(cl)p 1352 -3877 V 33 w(R.)0 4045 y Fn()480 4170 -y Fp(Simple)d(v)m(ectors)j(o)m(v)m(er)g(cl)p 1352 4170 -V 33 w(RA.)0 4338 y Fn()480 4462 y Fp(Simple)d(v)m +Fp()480 3585 y Fr(Simple)d(v)m(ectors)j(o)m(v)m(er)g +(cl)p 1352 3585 V 33 w(N.)0 3753 y Fp()480 +3877 y Fr(Simple)d(v)m(ectors)j(o)m(v)m(er)g(cl)p 1352 +3877 V 33 w(R.)0 4045 y Fp()480 4170 +y Fr(Simple)d(v)m(ectors)j(o)m(v)m(er)g(cl)p 1352 4170 +V 33 w(RA.)0 4338 y Fp()480 4462 y Fr(Simple)d(v)m (ectors)j(o)m(v)m(er)g(cl)p 1352 4462 V 33 w(I.)0 4630 -y Fn()480 4755 y Fp(Simple)d(v)m(ectors)j(of)e -(general)i(ring)e(elemen)m(ts.)0 4923 y Fn()480 -5047 y Fp(Univ)-5 b(ariate)32 b(p)s(olynomials.)0 5215 -y Fn()480 5340 y Fp(Univ)-5 b(ariate)32 +y Fp()480 4755 y Fr(Simple)d(v)m(ectors)j(of)e +(general)i(ring)e(elemen)m(ts.)0 4923 y Fp()480 +5047 y Fr(Univ)-5 b(ariate)32 b(p)s(olynomials.)0 5215 +y Fp()480 5340 y Fr(Univ)-5 b(ariate)32 b(p)s(olynomials)d(o)m(v)m(er)j(the)f(in)m(tegers.)p eop %%Page: 61 63 -61 62 bop 0 -116 a Fp(Chapter)30 b(11:)41 b(Using)31 -b(the)f(library)2621 b(61)0 366 y Fn()480 -491 y Fp(Univ)-5 b(ariate)32 b(p)s(olynomials)d(o)m(v)m(er)j(the)f -(rational)g(n)m(um)m(b)s(ers.)0 671 y Fn()480 -795 y Fp(Univ)-5 b(ariate)32 b(p)s(olynomials)d(o)m(v)m(er)j(the)f -(real)g(n)m(um)m(b)s(ers.)0 975 y Fn()480 -1099 y Fp(Univ)-5 b(ariate)32 b(p)s(olynomials)d(o)m(v)m(er)j(the)f -(complex)f(n)m(um)m(b)s(ers.)0 1279 y Fn()480 -1403 y Fp(Univ)-5 b(ariate)32 b(p)s(olynomials)d(o)m(v)m(er)j(mo)s -(dular)c(in)m(teger)k(rings.)0 1583 y Fn()480 -1707 y Fp(Timing)d(facilities.)0 1887 y Fn()144 -b Fp(Includes)30 b(all)h(of)f(the)h(ab)s(o)m(v)m(e.)0 -2359 y Fq(11.3)68 b(An)30 b(Example)0 2635 y Fp(A)g(function)h(whic)m +61 62 bop 0 -116 a Fr(Chapter)30 b(11:)41 b(Using)31 +b(the)f(library)2621 b(61)0 366 y Fp()480 +491 y Fr(Univ)-5 b(ariate)32 b(p)s(olynomials)d(o)m(v)m(er)j(the)f +(rational)g(n)m(um)m(b)s(ers.)0 671 y Fp()480 +795 y Fr(Univ)-5 b(ariate)32 b(p)s(olynomials)d(o)m(v)m(er)j(the)f +(real)g(n)m(um)m(b)s(ers.)0 975 y Fp()480 +1099 y Fr(Univ)-5 b(ariate)32 b(p)s(olynomials)d(o)m(v)m(er)j(the)f +(complex)f(n)m(um)m(b)s(ers.)0 1279 y Fp()480 +1403 y Fr(Univ)-5 b(ariate)32 b(p)s(olynomials)d(o)m(v)m(er)j(mo)s +(dular)c(in)m(teger)k(rings.)0 1583 y Fp()480 +1707 y Fr(Timing)d(facilities.)0 1887 y Fp()144 +b Fr(Includes)30 b(all)h(of)f(the)h(ab)s(o)m(v)m(e.)0 +2359 y Fs(11.3)68 b(An)30 b(Example)0 2635 y Fr(A)g(function)h(whic)m (h)f(computes)f(the)i(n)m(th)f(Fib)s(onacci)h(n)m(um)m(b)s(er)d(can)j -(b)s(e)f(written)g(as)h(follo)m(ws.)240 2891 y Fn(#include)46 +(b)s(e)f(written)g(as)h(follo)m(ws.)240 2891 y Fp(#include)46 b()240 2995 y(#include)g()240 3203 y(//)h(Returns)f(F_n,)h(computed)e(as)i(the)g(nearest)f(integer)g (to)240 3306 y(//)h(\(\(1+sqrt\(5\)\)/2\)^n/sqrt\(5\))o(.)42 @@ -4193,30 +4468,30 @@ b(Assume)k(n>=0.)240 3410 y(const)g(cl_I)h(fibonacci)e(\(int)i(n\))240 b(prec)k(=)g(cl_float_format\(\(int\)\(0.)o(2089)o(8764)o(1*n)o(+5\)\)) o(;)622 3825 y(cl_R)f(sqrt5)h(=)g(sqrt\(cl_float\(5,prec\)\);)622 3929 y(cl_R)f(phi)h(=)h(\(1+sqrt5\)/2;)622 4033 y(return)e(round1\()g -(expt\(phi,n\)/sqrt5)d(\);)240 4137 y(})0 4413 y Fp(Let's)31 +(expt\(phi,n\)/sqrt5)d(\);)240 4137 y(})0 4413 y Fr(Let's)31 b(explain)g(what)f(is)g(going)i(on)e(in)g(detail.)0 4690 -y(The)j(include)h(\014le)g Fn()c Fp(is)k(necessary)g(b)s -(ecause)g(the)g(t)m(yp)s(e)g Fn(cl_I)e Fp(is)i(used)f(in)h(the)g +y(The)j(include)h(\014le)g Fp()c Fr(is)k(necessary)g(b)s +(ecause)g(the)g(t)m(yp)s(e)g Fp(cl_I)e Fr(is)i(used)f(in)h(the)g (function,)h(and)0 4814 y(the)30 b(include)g(\014le)g -Fn()d Fp(is)j(needed)g(for)g(the)g(t)m(yp)s(e)h -Fn(cl_R)e Fp(and)g(the)h(\015oating)h(p)s(oin)m(t)f(n)m(um)m(b)s(er)e +Fp()d Fr(is)j(needed)g(for)g(the)g(t)m(yp)s(e)h +Fp(cl_R)e Fr(and)g(the)h(\015oating)h(p)s(oin)m(t)f(n)m(um)m(b)s(er)e (functions.)0 4939 y(The)i(order)g(of)g(the)h(include)f(\014les)g(do)s (es)g(not)h(matter.)0 5215 y(Then)h(comes)i(the)f(function)h -(declaration.)51 b(The)33 b(argumen)m(t)g(is)g(an)h Fn(int)p -Fp(,)f(the)h(result)f(an)h(in)m(teger.)51 b(The)33 b(return)0 -5340 y(t)m(yp)s(e)26 b(is)g(de\014ned)f(as)h(`)p Fn(const)j(cl_I)p -Fp(',)d(not)h(simply)d(`)p Fn(cl_I)p Fp(',)i(b)s(ecause)g(that)h(allo)m +(declaration.)51 b(The)33 b(argumen)m(t)g(is)g(an)h Fp(int)p +Fr(,)f(the)h(result)f(an)h(in)m(teger.)51 b(The)33 b(return)0 +5340 y(t)m(yp)s(e)26 b(is)g(de\014ned)f(as)h(`)p Fp(const)j(cl_I)p +Fr(',)d(not)h(simply)d(`)p Fp(cl_I)p Fr(',)i(b)s(ecause)g(that)h(allo)m (ws)g(the)f(compiler)g(to)h(detect)g(t)m(yp)s(os)p eop %%Page: 62 64 -62 63 bop 0 -116 a Fp(Chapter)30 b(11:)41 b(Using)31 -b(the)f(library)2621 b(62)0 366 y(lik)m(e)40 b(`)p Fn(fibonacci\(n\))27 -b(=)j(100)p Fp('.)64 b(It)39 b(w)m(ould)f(b)s(e)g(p)s(ossible)g(to)h -(declare)g(the)g(return)e(t)m(yp)s(e)i(as)g Fn(const)29 -b(cl_R)37 b Fp(\(real)0 491 y(n)m(um)m(b)s(er\))28 b(or)h(ev)m(en)i -Fn(const)e(cl_N)f Fp(\(complex)i(n)m(um)m(b)s(er\).)39 +62 63 bop 0 -116 a Fr(Chapter)30 b(11:)41 b(Using)31 +b(the)f(library)2621 b(62)0 366 y(lik)m(e)40 b(`)p Fp(fibonacci\(n\))27 +b(=)j(100)p Fr('.)64 b(It)39 b(w)m(ould)f(b)s(e)g(p)s(ossible)g(to)h +(declare)g(the)g(return)e(t)m(yp)s(e)i(as)g Fp(const)29 +b(cl_R)37 b Fr(\(real)0 491 y(n)m(um)m(b)s(er\))28 b(or)h(ev)m(en)i +Fp(const)e(cl_N)f Fr(\(complex)i(n)m(um)m(b)s(er\).)39 b(W)-8 b(e)31 b(use)e(the)h(most)f(sp)s(ecialized)i(p)s(ossible)e (return)g(t)m(yp)s(e)0 616 y(b)s(ecause)34 b(functions)f(whic)m(h)g -(call)i(`)p Fn(fibonacci)p Fp(')d(will)i(b)s(e)f(able)h(to)g(pro\014t)f +(call)i(`)p Fp(fibonacci)p Fr(')d(will)i(b)s(e)f(able)h(to)g(pro\014t)f (from)f(the)i(compiler's)f(t)m(yp)s(e)h(analysis:)0 740 y(Adding)j(t)m(w)m(o)h(in)m(tegers)h(is)e(sligh)m(tly)h(more)f (e\016cien)m(t)h(than)f(adding)g(the)h(same)e(ob)5 b(jects)38 @@ -4224,415 +4499,1345 @@ b(declared)g(as)f(complex)0 865 y(n)m(um)m(b)s(ers,)30 b(b)s(ecause)i(it)g(needs)g(less)g(t)m(yp)s(e)g(dispatc)m(h.)46 b(Also,)33 b(when)e(linking)h(to)h(CLN)e(as)h(a)h(non-shared)e(library) -8 b(,)0 989 y(this)30 b(minimizes)f(the)i(size)g(of)f(the)h(resulting) -f(executable)i(program.)0 1269 y(The)37 b(result)g(will)g(b)s(e)g +f(executable)i(program.)0 1263 y(The)37 b(result)g(will)g(b)s(e)g (computed)f(as)h(expt\(phi,n\)/sqrt\(5\),)k(rounded)35 b(to)j(the)g(nearest)f(in)m(teger.)63 b(In)36 b(order)h(to)0 -1394 y(get)h(a)f(correct)h(result,)h(the)e(absolute)h(error)e(should)g +1388 y(get)h(a)f(correct)h(result,)h(the)e(absolute)h(error)e(should)g (b)s(e)g(less)h(than)g(1/2,)j(i.e.)61 b(the)37 b(relativ)m(e)i(error)e -(should)f(b)s(e)0 1518 y(less)28 b(than)g +(should)f(b)s(e)0 1512 y(less)28 b(than)g (sqrt\(5\)/\(2*expt\(phi,n\)\).)43 b(T)-8 b(o)29 b(this)f(end,)g(the)h (\014rst)e(line)i(computes)e(a)i(\015oating)g(p)s(oin)m(t)f(precision)g -(for)0 1643 y(sqrt\(5\))j(and)f(phi.)0 1923 y(Then)37 +(for)0 1637 y(sqrt\(5\))j(and)f(phi.)0 1911 y(Then)37 b(sqrt\(5\))i(is)e(computed)g(b)m(y)h(\014rst)f(con)m(v)m(erting)j(the) e(in)m(teger)h(5)f(to)h(a)f(\015oating)h(p)s(oin)m(t)e(n)m(um)m(b)s(er) -f(and)h(than)0 2047 y(taking)j(the)f(square)f(ro)s(ot.)67 +f(and)h(than)0 2035 y(taking)j(the)f(square)f(ro)s(ot.)67 b(The)38 b(con)m(v)m(erse,)43 b(\014rst)38 b(taking)i(the)f(square)f (ro)s(ot)h(of)g(5,)j(and)c(then)h(con)m(v)m(erting)h(to)0 -2172 y(the)c(desired)g(precision,)h(w)m(ould)f(not)g(w)m(ork)g(in)g +2160 y(the)c(desired)g(precision,)h(w)m(ould)f(not)g(w)m(ork)g(in)g (CLN:)g(The)f(square)h(ro)s(ot)g(w)m(ould)g(b)s(e)f(computed)g(to)h(a)h -(default)0 2296 y(precision)e(\(normally)g(single-\015oat)h +(default)0 2284 y(precision)e(\(normally)g(single-\015oat)h (precision\),)h(and)e(the)g(follo)m(wing)h(con)m(v)m(ersion)g(could)f -(not)h(help)e(ab)s(out)h(the)0 2421 y(lac)m(king)i(accuracy)-8 +(not)h(help)e(ab)s(out)h(the)0 2409 y(lac)m(king)i(accuracy)-8 b(.)58 b(This)35 b(is)h(b)s(ecause)f(CLN)g(is)h(not)g(a)g(sym)m(b)s (olic)f(computer)f(algebra)j(system)d(and)h(do)s(es)h(not)0 -2545 y(represen)m(t)30 b(sqrt\(5\))i(in)e(a)h(non-n)m(umeric)d(w)m(a)m -(y)-8 b(.)0 2825 y(The)38 b(t)m(yp)s(e)h Fn(cl_R)f Fp(for)h(sqrt5)g +2533 y(represen)m(t)30 b(sqrt\(5\))i(in)e(a)h(non-n)m(umeric)d(w)m(a)m +(y)-8 b(.)0 2807 y(The)38 b(t)m(yp)s(e)h Fp(cl_R)f Fr(for)h(sqrt5)g (and,)i(in)d(the)h(follo)m(wing)i(line,)g(phi)d(is)h(the)g(only)g(p)s -(ossible)g(c)m(hoice.)68 b(Y)-8 b(ou)39 b(cannot)0 2950 -y(write)28 b Fn(cl_F)e Fp(b)s(ecause)i(the)f(C)p Fn(++)g -Fp(compiler)g(can)h(only)f(infer)g(that)h Fn(cl_float\(5,prec\))23 -b Fp(is)28 b(a)g(real)g(n)m(um)m(b)s(er.)37 b(Y)-8 b(ou)0 -3074 y(cannot)31 b(write)g Fn(cl_N)e Fp(b)s(ecause)h(a)h(`)p -Fn(round1)p Fp(')e(do)s(es)h(not)h(exist)g(for)f(general)h(complex)f(n) -m(um)m(b)s(ers.)0 3354 y(When)44 b(the)h(function)f(returns,)j(all)e +(ossible)g(c)m(hoice.)68 b(Y)-8 b(ou)39 b(cannot)0 2932 +y(write)28 b Fp(cl_F)e Fr(b)s(ecause)i(the)f(C)p Fp(++)g +Fr(compiler)g(can)h(only)f(infer)g(that)h Fp(cl_float\(5,prec\))23 +b Fr(is)28 b(a)g(real)g(n)m(um)m(b)s(er.)37 b(Y)-8 b(ou)0 +3056 y(cannot)31 b(write)g Fp(cl_N)e Fr(b)s(ecause)h(a)h(`)p +Fp(round1)p Fr(')e(do)s(es)h(not)h(exist)g(for)f(general)h(complex)f(n) +m(um)m(b)s(ers.)0 3330 y(When)44 b(the)h(function)f(returns,)j(all)e (the)g(lo)s(cal)g(v)-5 b(ariables)45 b(in)f(the)h(function)f(are)h -(automatically)h(reclaimed)0 3479 y(\(garbage)32 b(collected\).)43 +(automatically)h(reclaimed)0 3455 y(\(garbage)32 b(collected\).)43 b(Only)30 b(the)h(result)f(surviv)m(es)g(and)g(gets)h(passed)f(to)h -(the)g(caller.)0 3982 y Fq(11.4)68 b(Debugging)31 b(supp)t(ort)0 -4262 y Fp(When)f(debugging)g(a)h(CLN)f(application)i(with)e(GNU)h -Fn(gdb)p Fp(,)f(t)m(w)m(o)h(facilities)i(are)e(a)m(v)-5 -b(ailable)33 b(from)28 b(the)j(library:)75 4542 y Fo(\017)60 -b Fp(The)32 b(library)h(do)s(es)f(t)m(yp)s(e)h(c)m(hec)m(ks,)j(range)d +(the)g(caller.)0 3729 y(The)j(\014le)g Fp(fibonacci.cc)d +Fr(in)j(the)h(sub)s(directory)e Fp(examples)f Fr(con)m(tains)k(this)e +(implemen)m(tation)g(together)i(with)0 3853 y(an)30 b(ev)m(en)h(faster) +g(algorithm.)0 4292 y Fs(11.4)68 b(Debugging)31 b(supp)t(ort)0 +4566 y Fr(When)f(debugging)g(a)h(CLN)f(application)i(with)e(GNU)h +Fp(gdb)p Fr(,)f(t)m(w)m(o)h(facilities)i(are)e(a)m(v)-5 +b(ailable)33 b(from)28 b(the)j(library:)75 4840 y Fq(\017)60 +b Fr(The)32 b(library)h(do)s(es)f(t)m(yp)s(e)h(c)m(hec)m(ks,)j(range)d (c)m(hec)m(ks,)i(consistency)f(c)m(hec)m(ks)g(at)g(man)m(y)e(places.)49 -b(When)33 b(one)g(of)180 4666 y(these)40 b(fails,)i(the)e(function)f -Fn(cl_abort\(\))d Fp(is)j(called.)69 b(Its)39 b(default)h(implemen)m -(tation)f(is)g(to)h(p)s(erform)d(an)180 4791 y Fn(exit\(1\))p -Fp(,)29 b(so)i(y)m(ou)f(w)m(on't)i(ha)m(v)m(e)f(a)g(core)h(dump.)38 +b(When)33 b(one)g(of)180 4965 y(these)40 b(fails,)i(the)e(function)f +Fp(cl_abort\(\))d Fr(is)j(called.)69 b(Its)39 b(default)h(implemen)m +(tation)f(is)g(to)h(p)s(erform)d(an)180 5089 y Fp(exit\(1\))p +Fr(,)29 b(so)i(y)m(ou)f(w)m(on't)i(ha)m(v)m(e)f(a)g(core)h(dump.)38 b(But)31 b(for)f(debugging,)h(it)g(is)f(b)s(est)g(to)i(set)f(a)g -(breakp)s(oin)m(t)f(at)180 4915 y(this)g(function:)420 -5050 y Fn(\(gdb\))46 b(break)h(cl_abort)180 5205 y Fp(When)30 -b(this)g(breakp)s(oin)m(t)h(is)f(hit,)h(lo)s(ok)g(at)g(the)f(stac)m -(k's)i(bac)m(ktrace:)420 5340 y Fn(\(gdb\))46 b(where)p -eop +(breakp)s(oin)m(t)f(at)180 5214 y(this)g(function:)420 +5340 y Fp(\(gdb\))46 b(break)h(cl_abort)p eop %%Page: 63 65 -63 64 bop 0 -116 a Fp(Chapter)30 b(11:)41 b(Using)31 -b(the)f(library)2621 b(63)75 366 y Fo(\017)60 b Fp(The)27 -b(debugger's)g(normal)g Fn(print)f Fp(command)f(do)s(esn't)j(kno)m(w)f +63 64 bop 0 -116 a Fr(Chapter)30 b(11:)41 b(Using)31 +b(the)f(library)2621 b(63)180 366 y(When)30 b(this)g(breakp)s(oin)m(t)h +(is)f(hit,)h(lo)s(ok)g(at)g(the)f(stac)m(k's)i(bac)m(ktrace:)420 +495 y Fp(\(gdb\))46 b(where)75 645 y Fq(\017)60 b Fr(The)27 +b(debugger's)g(normal)g Fp(print)f Fr(command)f(do)s(esn't)j(kno)m(w)f (ab)s(out)h(CLN's)f(t)m(yp)s(es)g(and)g(therefore)h(prin)m(ts)180 -491 y(mostly)43 b(useless)h(hexadecimal)g(addresses.)80 -b(CLN)43 b(o\013ers)h(a)g(function)f Fn(cl_print)p Fp(,)i(callable)h -(from)c(the)180 616 y(debugger,)37 b(for)e(prin)m(ting)g(n)m(um)m(b)s +769 y(mostly)43 b(useless)h(hexadecimal)g(addresses.)80 +b(CLN)43 b(o\013ers)h(a)g(function)f Fp(cl_print)p Fr(,)i(callable)h +(from)c(the)180 894 y(debugger,)37 b(for)e(prin)m(ting)g(n)m(um)m(b)s (er)e(ob)5 b(jects.)57 b(In)35 b(order)g(to)h(get)g(this)g(function,)g -(y)m(ou)g(ha)m(v)m(e)h(to)f(de\014ne)f(the)180 740 y(macro)24 -b(`)p Fn(CL_DEBUG)p Fp(')f(and)h(then)h(include)f(all)h(the)g(header)g -(\014les)f(for)h(whic)m(h)f(y)m(ou)h(w)m(an)m(t)h Fn(cl_print)c -Fp(debugging)180 865 y(supp)s(ort.)39 b(F)-8 b(or)31 -b(example:)420 993 y Fn(#define)46 b(CL_DEBUG)420 1097 -y(#include)g()180 1247 y Fp(No)m(w,)26 b(if)f(y)m(ou)f(ha) +(y)m(ou)g(ha)m(v)m(e)h(to)f(de\014ne)f(the)180 1018 y(macro)24 +b(`)p Fp(CL_DEBUG)p Fr(')f(and)h(then)h(include)f(all)h(the)g(header)g +(\014les)f(for)h(whic)m(h)f(y)m(ou)h(w)m(an)m(t)h Fp(cl_print)c +Fr(debugging)180 1143 y(supp)s(ort.)39 b(F)-8 b(or)31 +b(example:)420 1271 y Fp(#define)46 b(CL_DEBUG)420 1375 +y(#include)g()180 1525 y Fr(No)m(w,)26 b(if)f(y)m(ou)f(ha) m(v)m(e)i(in)e(y)m(our)g(program)f(a)i(v)-5 b(ariable)25 -b Fn(cl_string)i(s)p Fp(,)f(and)e(insp)s(ect)g(it)g(under)f -Fn(gdb)p Fp(,)i(the)f(output)180 1371 y(ma)m(y)30 b(lo)s(ok)h(lik)m(e)h -(this:)420 1500 y Fn(\(gdb\))46 b(print)h(s)420 1604 +b Fp(cl_string)i(s)p Fr(,)f(and)e(insp)s(ect)g(it)g(under)f +Fp(gdb)p Fr(,)i(the)f(output)180 1649 y(ma)m(y)30 b(lo)s(ok)h(lik)m(e)h +(this:)420 1778 y Fp(\(gdb\))46 b(print)h(s)420 1882 y($7)g(=)h({)43 b(=)48 b({)f(=)h({pointer)d(=)j -(0x8055b60,)d(heappointer)f(=)k(0x8055b60,)515 1707 y(word)f(=)h -(134568800}},)c(})420 1811 y(\(gdb\))i(call)h(cl_print\(s\))420 -1915 y(\(cl_string\))e("")420 2019 y($8)i(=)h(134568800)180 -2168 y Fp(Note)34 b(that)f(the)g(output)f(of)h Fn(cl_print)d -Fp(go)s(es)k(to)f(the)g(program's)e(error)h(output,)h(not)g(to)h(gdb's) -e(standard)180 2293 y(output.)180 2442 y(Note,)38 b(ho)m(w)m(ev)m(er,)g +(0x8055b60,)d(heappointer)f(=)k(0x8055b60,)515 1985 y(word)f(=)h +(134568800}},)c(})420 2089 y(\(gdb\))i(call)h(cl_print\(s\))420 +2193 y(\(cl_string\))e("")420 2297 y($8)i(=)h(134568800)180 +2446 y Fr(Note)34 b(that)f(the)g(output)f(of)h Fp(cl_print)d +Fr(go)s(es)k(to)f(the)g(program's)e(error)h(output,)h(not)g(to)h(gdb's) +e(standard)180 2571 y(output.)180 2720 y(Note,)38 b(ho)m(w)m(ev)m(er,)g (that)d(the)g(ab)s(o)m(v)m(e)i(facilit)m(y)g(do)s(es)d(not)i(w)m(ork)f (with)f(all)i(CLN)f(t)m(yp)s(es,)h(only)g(with)e(n)m(um)m(b)s(er)180 -2567 y(ob)5 b(jects)42 b(and)e(similar.)72 b(Therefore)41 -b(CLN)g(o\013ers)g(a)h(mem)m(b)s(er)c(function)j Fn(debug_print\(\))c -Fp(on)k(all)h(CLN)180 2691 y(t)m(yp)s(es.)63 b(The)37 -b(same)g(macro)h(`)p Fn(CL_DEBUG)p Fp(')e(is)h(needed)h(for)f(this)h +2845 y(ob)5 b(jects)42 b(and)e(similar.)72 b(Therefore)41 +b(CLN)g(o\013ers)g(a)h(mem)m(b)s(er)c(function)j Fp(debug_print\(\))c +Fr(on)k(all)h(CLN)180 2969 y(t)m(yp)s(es.)63 b(The)37 +b(same)g(macro)h(`)p Fp(CL_DEBUG)p Fr(')e(is)h(needed)h(for)f(this)h (mem)m(b)s(er)d(function)j(to)g(b)s(e)f(implemen)m(ted.)180 -2816 y(Under)30 b Fn(gdb)p Fp(,)f(y)m(ou)i(call)h(it)f(lik)m(e)g(this:) -420 2944 y Fn(\(gdb\))46 b(print)h(s)420 3048 y($7)g(=)h +3094 y(Under)30 b Fp(gdb)p Fr(,)f(y)m(ou)i(call)h(it)f(lik)m(e)g(this:) +420 3222 y Fp(\(gdb\))46 b(print)h(s)420 3326 y($7)g(=)h ({)43 b(=)48 b({)f(=)h({pointer)d(=)j(0x8055b60,)d -(heappointer)f(=)k(0x8055b60,)515 3152 y(word)f(=)h(134568800}},)c(}) -420 3256 y(\(gdb\))i(call)h(s.debug_print\(\))420 3359 -y(\(cl_string\))e("")420 3463 y(\(gdb\))h(define)g(cprint)420 -3567 y(>call)g(\($1\).debug_print\(\))420 3671 y(>end)420 -3775 y(\(gdb\))g(cprint)g(s)420 3878 y(\(cl_string\))f("")180 -4028 y Fp(Unfortunately)-8 b(,)31 b(this)g(feature)f(do)s(es)g(not)h +(heappointer)f(=)k(0x8055b60,)515 3430 y(word)f(=)h(134568800}},)c(}) +420 3534 y(\(gdb\))i(call)h(s.debug_print\(\))420 3638 +y(\(cl_string\))e("")420 3741 y(\(gdb\))h(define)g(cprint)420 +3845 y(>call)g(\($1\).debug_print\(\))420 3949 y(>end)420 +4053 y(\(gdb\))g(cprint)g(s)420 4156 y(\(cl_string\))f("")180 +4306 y Fr(Unfortunately)-8 b(,)31 b(this)g(feature)f(do)s(es)g(not)h (seem)f(to)h(w)m(ork)f(under)f(all)i(circumstances.)p eop %%Page: 64 66 -64 65 bop 0 -116 a Fp(Chapter)30 b(12:)41 b(Customizing)2803 -b(64)0 366 y Fm(12)80 b(Customizing)0 1146 y Fq(12.1)68 -b(Error)31 b(handling)0 1438 y Fp(When)36 b(a)g(fatal)h(error)f(o)s +64 65 bop 0 -116 a Fr(Chapter)30 b(12:)41 b(Customizing)2803 +b(64)0 366 y Fo(12)80 b(Customizing)0 1146 y Fs(12.1)68 +b(Error)31 b(handling)0 1438 y Fr(When)36 b(a)g(fatal)h(error)f(o)s (ccurs,)i(an)d(error)h(message)g(is)g(output)g(to)h(the)f(standard)f (error)h(output)f(stream,)j(and)0 1562 y(the)k(function)f -Fn(cl_abort)e Fp(is)j(called.)76 b(The)41 b(default)h(v)m(ersion)g(of)f +Fp(cl_abort)e Fr(is)j(called.)76 b(The)41 b(default)h(v)m(ersion)g(of)f (this)h(function)f(\(pro)m(vided)h(in)f(the)h(library\))0 1687 y(terminates)32 b(the)g(application.)46 b(T)-8 b(o)32 b(catc)m(h)h(suc)m(h)f(a)g(fatal)h(error,)f(y)m(ou)g(need)f(to)i -(de\014ne)e(the)h(function)f Fn(cl_abort)0 1811 y Fp(y)m(ourself,)g -(with)f(the)h(protot)m(yp)s(e)240 2083 y Fn(#include)46 +(de\014ne)e(the)h(function)f Fp(cl_abort)0 1811 y Fr(y)m(ourself,)g +(with)f(the)h(protot)m(yp)s(e)240 2083 y Fp(#include)46 b()240 2186 y(void)h(cl_abort)e(\(void\);)0 -2478 y Fp(This)30 b(function)g(m)m(ust)f(not)i(return)e(con)m(trol)j -(to)f(its)f(caller.)0 3087 y Fq(12.2)68 b(Floating-p)t(oin)l(t)32 -b(under\015o)l(w)0 3379 y Fp(Floating)c(p)s(oin)m(t)d(under\015o)m(w)g +2478 y Fr(This)30 b(function)g(m)m(ust)f(not)i(return)e(con)m(trol)j +(to)f(its)f(caller.)0 3087 y Fs(12.2)68 b(Floating-p)t(oin)l(t)32 +b(under\015o)l(w)0 3379 y Fr(Floating)c(p)s(oin)m(t)d(under\015o)m(w)g (denotes)h(the)g(situation)g(when)f(a)h(\015oating-p)s(oin)m(t)h(n)m (um)m(b)s(er)c(is)j(to)g(b)s(e)f(created)i(whic)m(h)0 -3503 y(is)32 b(so)g(close)h(to)f Fn(0)g Fp(that)g(its)g(exp)s(onen)m(t) +3503 y(is)32 b(so)g(close)h(to)f Fp(0)g Fr(that)g(its)g(exp)s(onen)m(t) g(is)g(to)s(o)h(lo)m(w)f(to)h(b)s(e)e(represen)m(ted)h(in)m(ternally)-8 b(.)46 b(By)32 b(default,)h(this)e(causes)i(a)0 3628 y(fatal)f(error.)40 b(If)30 b(y)m(ou)h(set)f(the)h(global)h(v)-5 -b(ariable)240 3899 y Fn(cl_boolean)45 b(cl_inhibit_floating_poin)o -(t_un)o(derf)o(low)0 4190 y Fp(to)36 b Fn(cl_true)p Fp(,)f(the)h(error) +b(ariable)240 3899 y Fp(cl_boolean)45 b(cl_inhibit_floating_poin)o +(t_un)o(derf)o(low)0 4190 y Fr(to)36 b Fp(cl_true)p Fr(,)f(the)h(error) f(will)h(b)s(e)f(inhibited,)h(and)f(a)h(\015oating-p)s(oin)m(t)h(zero)f (will)g(b)s(e)f(generated)h(instead.)56 b(The)0 4315 -y(default)31 b(v)-5 b(alue)30 b(of)h Fn(cl_inhibit_floating_poin)o -(t_un)o(der)o(flow)24 b Fp(is)30 b Fn(cl_false)p Fp(.)0 -4924 y Fq(12.3)68 b(Customizing)32 b(I/O)0 5215 y Fp(The)27 -b(output)g(of)h(the)f(function)h Fn(fprint)d Fp(ma)m(y)i(b)s(e)g +y(default)31 b(v)-5 b(alue)30 b(of)h Fp(cl_inhibit_floating_poin)o +(t_un)o(der)o(flow)24 b Fr(is)30 b Fp(cl_false)p Fr(.)0 +4924 y Fs(12.3)68 b(Customizing)32 b(I/O)0 5215 y Fr(The)27 +b(output)g(of)h(the)f(function)h Fp(fprint)d Fr(ma)m(y)i(b)s(e)g (customized)h(b)m(y)f(c)m(hanging)h(the)g(v)-5 b(alue)28 -b(of)g(the)f(global)i(v)-5 b(ariable)0 5340 y Fn -(cl_default_print_flags)p Fp(.)p eop +b(of)g(the)f(global)i(v)-5 b(ariable)0 5340 y Fp +(cl_default_print_flags)p Fr(.)p eop %%Page: 65 67 -65 66 bop 0 -116 a Fp(Chapter)30 b(12:)41 b(Customizing)2803 -b(65)0 366 y Fq(12.4)68 b(Customizing)32 b(the)e(memory)h(allo)t(cator) -0 640 y Fp(Ev)m(ery)j(memory)d(allo)s(cation)36 b(of)e(CLN)f(is)h(done) -f(through)g(the)g(function)h(p)s(oin)m(ter)f Fn(cl_malloc_hook)p -Fp(.)47 b(F)-8 b(reeing)0 765 y(of)31 b(this)g(memory)e(is)i(done)f -(through)g(the)h(function)g(p)s(oin)m(ter)g Fn(cl_free_hook)p -Fp(.)39 b(The)30 b(default)h(v)m(ersions)g(of)g(these)0 +65 66 bop 0 -116 a Fr(Chapter)30 b(12:)41 b(Customizing)2803 +b(65)0 366 y Fs(12.4)68 b(Customizing)32 b(the)e(memory)h(allo)t(cator) +0 640 y Fr(Ev)m(ery)j(memory)d(allo)s(cation)36 b(of)e(CLN)f(is)h(done) +f(through)g(the)g(function)h(p)s(oin)m(ter)f Fp(cl_malloc_hook)p +Fr(.)47 b(F)-8 b(reeing)0 765 y(of)31 b(this)g(memory)e(is)i(done)f +(through)g(the)h(function)g(p)s(oin)m(ter)g Fp(cl_free_hook)p +Fr(.)39 b(The)30 b(default)h(v)m(ersions)g(of)g(these)0 890 y(functions,)e(pro)m(vided)f(in)g(the)h(library)-8 -b(,)29 b(call)h Fn(malloc)d Fp(and)h Fn(free)f Fp(and)h(c)m(hec)m(k)i -(the)f Fn(malloc)e Fp(result)h(against)i Fn(NULL)p Fp(.)0 +b(,)29 b(call)h Fp(malloc)d Fr(and)h Fp(free)f Fr(and)h(c)m(hec)m(k)i +(the)f Fp(malloc)e Fr(result)h(against)i Fp(NULL)p Fr(.)0 1014 y(If)25 b(y)m(ou)h(w)m(an)m(t)h(to)f(pro)m(vide)g(another)g (memory)d(allo)s(cator,)29 b(y)m(ou)d(need)f(to)i(de\014ne)e(the)h(v)-5 -b(ariables)26 b Fn(cl_malloc_hook)0 1139 y Fp(and)k Fn(cl_free_hook)d -Fp(y)m(ourself,)k(lik)m(e)g(this:)240 1392 y Fn(#include)46 +b(ariables)26 b Fp(cl_malloc_hook)0 1139 y Fr(and)k Fp(cl_free_hook)d +Fr(y)m(ourself,)k(lik)m(e)g(this:)240 1392 y Fp(#include)46 b()240 1496 y(void*)g(\(*cl_malloc_hook\))d(\(size_t)j -(size\))h(=)g Fl(:)15 b(:)g(:)q Fn(;)240 1599 y(void)47 -b(\(*cl_free_hook\))c(\(void*)j(ptr\))286 b(=)47 b Fl(:)15 -b(:)g(:)q Fn(;)0 1873 y Fp(The)30 b Fn(cl_malloc_hook)c -Fp(function)k(m)m(ust)g(not)g(return)g(a)g Fn(NULL)g -Fp(p)s(oin)m(ter.)0 2147 y(It)24 b(is)g(not)g(p)s(ossible)f(to)i(c)m +(size\))h(=)g Fn(:)15 b(:)g(:)q Fp(;)240 1599 y(void)47 +b(\(*cl_free_hook\))c(\(void*)j(ptr\))286 b(=)47 b Fn(:)15 +b(:)g(:)q Fp(;)0 1873 y Fr(The)30 b Fp(cl_malloc_hook)c +Fr(function)k(m)m(ust)g(not)g(return)g(a)g Fp(NULL)g +Fr(p)s(oin)m(ter.)0 2147 y(It)24 b(is)g(not)g(p)s(ossible)f(to)i(c)m (hange)g(the)f(memory)e(allo)s(cator)k(at)f(run)m(time,)f(b)s(ecause)g (it)g(is)g(already)g(called)i(at)e(program)0 2272 y(startup)30 b(b)m(y)g(the)h(constructors)f(of)h(some)f(global)h(v)-5 b(ariables.)p eop %%Page: 66 68 -66 67 bop 0 -116 a Fp(Index)3586 b(66)0 366 y Fm(Index)0 -831 y Fc(\(Index)24 b(is)i(nonexisten)n(t\))p eop -%%Page: -1 69 --1 68 bop 3875 -116 a Fp(i)0 366 y Fm(T)-13 b(able)31 -b(of)f(Con)l(ten)l(ts)0 715 y Fq(1)135 b(In)l(tro)t(duction)40 +66 67 bop 0 -116 a Fr(Index)3586 b(66)0 366 y Fo(Index)0 +848 y Fs(A)0 981 y Fe(abs)26 b(\(\))10 b Fd(.)k(.)f(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)37 b Fc(14)0 1097 y(abstract)26 b(class)16 +b Fd(.)f(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)43 b Fc(7)0 1213 y Fe(acos)27 b(\(\))8 +b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)34 b Fc(23)0 +1330 y Fe(acosh)27 b(\(\))c Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)49 +b Fc(25)0 1446 y(adv)n(o)r(cacy)19 b Fd(.)13 b(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)45 +b Fc(55)0 1562 y(Arc)n(himedes')25 b(constan)n(t)17 b +Fd(.)c(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)44 +b Fc(24)0 1678 y Fe(As\(\))27 b(\(\))8 b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)h(.)34 b Fc(11)0 1794 y Fe(ash)26 b(\(\))10 b +Fd(.)k(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)37 b Fc(29)0 +1911 y Fe(asin)9 b Fd(.)14 b(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +35 b Fc(23)0 2027 y Fe(asin)27 b(\(\))8 b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)h(.)34 b Fc(23)0 2143 y Fe(asinh)27 b(\(\))c Fd(.)13 +b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)49 b Fc(25)0 2259 y Fe(atan)9 +b Fd(.)14 b(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)35 +b Fc(24)0 2376 y Fe(atan)27 b(\(\))8 b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)h(.)34 b Fc(24)0 2492 y Fe(atanh)27 b(\(\))c Fd(.)13 +b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)49 b Fc(25)0 2745 y Fs(B)0 2878 +y Fe(basering)27 b(\(\))15 b Fd(.)f(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)41 b Fc(52)0 +2994 y Fe(binomial)27 b(\(\))15 b Fd(.)f(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)41 +b Fc(30)0 3111 y Fe(boole)27 b(\(\))c Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)49 +b Fc(27)0 3227 y Fe(boole)p 200 3227 24 4 v 29 w(1)7 +b Fd(.)13 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)33 b Fc(27)0 +3343 y Fe(boole)p 200 3343 V 29 w(2)7 b Fd(.)13 b(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)33 b Fc(27)0 3459 y Fe(boole)p 200 3459 V +29 w(and)20 b Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)45 b Fc(27)0 +3576 y Fe(boole)p 200 3576 V 29 w(andc1)13 b Fd(.)i(.)e(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)40 +b Fc(27)0 3692 y Fe(boole)p 200 3692 V 29 w(andc2)13 +b Fd(.)i(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)40 b Fc(27)0 3808 y Fe(boole)p 200 +3808 V 29 w(c1)22 b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)48 +b Fc(27)0 3924 y Fe(boole)p 200 3924 V 29 w(c2)22 b Fd(.)13 +b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)48 b Fc(27)0 4040 y Fe(boole)p +200 4040 V 29 w(clr)20 b Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)45 +b Fc(27)0 4157 y Fe(boole)p 200 4157 V 29 w(eqv)20 b +Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)45 b Fc(27)0 4273 y Fe(boole)p +200 4273 V 29 w(nand)16 b Fd(.)e(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)43 b Fc(27)0 +4389 y Fe(boole)p 200 4389 V 29 w(nor)20 b Fd(.)13 b(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +45 b Fc(27)0 4505 y Fe(boole)p 200 4505 V 29 w(orc1)16 +b Fd(.)e(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)43 b Fc(27)0 4622 y Fe(boole)p +200 4622 V 29 w(orc2)16 b Fd(.)e(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)43 b Fc(27)0 +4738 y Fe(boole)p 200 4738 V 29 w(set)20 b Fd(.)13 b(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +45 b Fc(27)0 4854 y Fe(boole)p 200 4854 V 29 w(xor)20 +b Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)45 b Fc(27)0 5108 y Fs(C)0 +5240 y Fe(canonhom)27 b(\(\))22 b Fd(.)13 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)47 b Fc(46,)27 b(52)0 +5357 y(Catalan's)h(constan)n(t)13 b Fd(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)40 b Fc(26)2031 848 y Fe(ceiling1)27 +b(\(\))15 b Fd(.)f(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)41 b Fc(18)2031 964 y Fe(ceiling2)27 +b(\(\))15 b Fd(.)f(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)41 b Fc(19)2031 1080 y Fe(cis)26 +b(\(\))10 b Fd(.)k(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)37 +b Fc(23)2031 1197 y Fe(cl_idecoded_float)10 b Fd(.)17 +b(.)c(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)36 +b Fc(31)2031 1313 y Fe(cl)p 2114 1313 V 29 w(abort)26 +b(\(\))21 b Fd(.)13 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)47 b Fc(64)2031 1429 +y Fe(cl)p 2114 1429 V 29 w(byte)7 b Fd(.)13 b(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)33 b Fc(28)2031 1545 y Fe(cl)p 2114 1545 V 29 +w(catalanconst)28 b(\(\))20 b Fd(.)13 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)46 b Fc(26)2031 1662 y Fe(cl)p 2114 1662 +V 29 w(compare)27 b(\(\))15 b Fd(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)42 b Fc(16)2031 +1778 y Fe(cl)p 2114 1778 V 29 w(cos)p 2260 1778 V 29 +w(sin)26 b(\(\))21 b Fd(.)13 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)47 b Fc(23)2031 1894 +y Fe(cl)p 2114 1894 V 29 w(cos)p 2260 1894 V 29 w(sin)p +2406 1894 V 29 w(t)22 b Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)48 b Fc(23)2031 +2010 y Fe(cl)p 2114 2010 V 29 w(cosh)p 2299 2010 V 29 +w(sinh)26 b(\(\))16 b Fd(.)e(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)42 b Fc(25)2031 2127 y Fe(cl)p +2114 2127 V 29 w(cosh)p 2299 2127 V 29 w(sinh)p 2484 +2127 V 29 w(t)17 b Fd(.)c(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)43 b Fc(25)2031 2243 y Fe(CL)p +2114 2243 V 29 w(DEBUG)22 b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)48 +b Fc(63)2031 2359 y Fe(cl)p 2114 2359 V 29 w(decoded)p +2416 2359 V 30 w(dfloat)22 b Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)47 b Fc(31)2031 2475 y Fe(cl)p 2114 +2475 V 29 w(decoded)p 2416 2475 V 30 w(ffloat)22 b Fd(.)13 +b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)47 +b Fc(31)2031 2591 y Fe(cl)p 2114 2591 V 29 w(decoded)p +2416 2591 V 30 w(float)6 b Fd(.)14 b(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)33 b Fc(31)2031 2708 y Fe(cl)p +2114 2708 V 29 w(decoded)p 2416 2708 V 30 w(lfloat)22 +b Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)47 +b Fc(31)2031 2824 y Fe(cl)p 2114 2824 V 29 w(decoded)p +2416 2824 V 30 w(sfloat)22 b Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)47 b Fc(31)2031 2940 y Fe(cl)p 2114 +2940 V 29 w(default)p 2416 2940 V 30 w(float)p 2641 2940 +V 29 w(format)11 b Fd(.)j(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)37 +b Fc(32)2031 3056 y Fe(cl)p 2114 3056 V 29 w(default)p +2416 3056 V 30 w(print)p 2641 3056 V 29 w(flags)14 b +Fd(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)40 b Fc(64)2031 +3173 y Fe(cl)p 2114 3173 V 29 w(default)p 2416 3173 V +30 w(random)p 2680 3173 V 29 w(state)11 b Fd(.)j(.)f(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)h(.)37 b Fc(34)2031 3289 y Fe(cl)p 2114 3289 V 29 +w(DF)14 b Fd(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)41 +b Fc(9)2031 3405 y Fe(cl)p 2114 3405 V 29 w(double)p +2377 3405 V 29 w(approx)27 b(\(\))c Fd(.)13 b(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)49 b Fc(11)2031 3521 y Fe(cl)p 2114 +3521 V 29 w(equal)p 2338 3521 V 29 w(hashcode)27 b(\(\))21 +b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)46 +b Fc(16)2031 3638 y Fe(cl)p 2114 3638 V 29 w(eulerconst)28 +b(\(\))8 b Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)34 b Fc(25)2031 3754 y Fe(cl)p 2114 3754 V +29 w(F)8 b Fd(.)13 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)34 +b Fc(7,)27 b(9)2031 3870 y Fe(cl)p 2114 3870 V 29 w(FF)14 +b Fd(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)41 +b Fc(9)2031 3986 y Fe(cl)p 2114 3986 V 29 w(find)p 2299 +3986 V 29 w(modint)p 2562 3986 V 29 w(ring)27 b(\(\))21 +b Fd(.)13 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)47 b Fc(45)2031 +4102 y Fe(cl)p 2114 4102 V 29 w(find)p 2299 4102 V 29 +w(univpoly)p 2640 4102 V 30 w(ring)26 b(\(\))15 b Fd(.)f(.)f(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)42 b Fc(52)2031 4219 y Fe(cl)p 2114 4219 V +29 w(float)22 b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)48 b +Fc(32)2031 4335 y Fe(cl)p 2114 4335 V 29 w(float)p 2338 +4335 V 29 w(approx)27 b(\(\))8 b Fd(.)14 b(.)f(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)h(.)34 b Fc(11)2031 4451 y Fe(cl)p +2114 4451 V 29 w(float)p 2338 4451 V 29 w(format)27 b(\(\))8 +b Fd(.)14 b(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)34 +b Fc(32)2031 4567 y Fe(cl)p 2114 4567 V 29 w(free)p 2299 +4567 V 29 w(hook)26 b(\(\))16 b Fd(.)e(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)42 b Fc(65)2031 4684 +y Fe(cl)p 2114 4684 V 29 w(hermite)27 b(\(\))15 b Fd(.)f(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)42 +b Fc(54)2031 4800 y Fe(cl)p 2114 4800 V 29 w(I)p 2182 +4800 V 28 w(to)p 2288 4800 V 29 w(int)26 b(\(\))7 b Fd(.)13 +b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)33 b Fc(11)2031 4916 y Fe(cl)p 2114 4916 V 29 w(I)p +2182 4916 V 28 w(to)p 2288 4916 V 29 w(long)26 b(\(\))c +Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)48 b Fc(11)2031 5032 y Fe(cl)p 2114 5032 V 29 w(I)p +2182 5032 V 28 w(to)p 2288 5032 V 29 w(uint)26 b(\(\))c +Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)48 b Fc(11)2031 5149 y Fe(cl)p 2114 5149 V 29 w(I)p +2182 5149 V 28 w(to)p 2288 5149 V 29 w(ulong)27 b(\(\))19 +b Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +45 b Fc(11)2031 5265 y Fe(cl)p 2114 5265 V 29 w(laguerre)27 +b(\(\))13 b Fd(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)39 b Fc(54)p eop +%%Page: 67 69 +67 68 bop 0 -116 a Fr(Index)3586 b(67)0 366 y Fe(cl)p +83 366 24 4 v 29 w(legendre)27 b(\(\))13 b Fd(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)39 b +Fc(54)0 483 y Fe(cl)p 83 483 V 29 w(LF)14 b Fd(.)f(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)41 b Fc(9)0 599 y Fe(cl)p 83 599 +V 29 w(malloc)p 346 599 V 29 w(hook)27 b(\(\))11 b Fd(.)i(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)37 b Fc(65)0 +715 y Fe(cl)p 83 715 V 29 w(N)16 b Fd(.)d(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)44 b Fc(7)0 831 y Fe(cl)p 83 831 V +29 w(number)22 b Fd(.)13 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)48 b +Fc(7)0 948 y Fe(cl)p 83 948 V 29 w(pi)12 b Fd(.)h(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)38 b Fc(24)0 1064 y Fe(cl)p 83 1064 +V 29 w(R)16 b Fd(.)d(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)44 +b Fc(7)0 1180 y Fe(cl)p 83 1180 V 29 w(RA)14 b Fd(.)f(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)41 b Fc(7)0 1296 y Fe(cl)p +83 1296 V 29 w(SF)14 b Fd(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)41 b Fc(9)0 1413 y Fe(cl)p 83 1413 V 29 w(string)27 +b(\(\))18 b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)44 b Fc(48)0 1529 y Fe(cl)p +83 1529 V 29 w(symbol)27 b(\(\))18 b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)44 +b Fc(49)0 1645 y Fe(cl)p 83 1645 V 29 w(tschebychev)28 +b(\(\))22 b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)49 b Fc(54)0 1761 y Fe(cl)p 83 1761 V 29 w(zeta)26 +b(\(\))e Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)49 b Fc(26)0 1877 y Fe(coeff)27 +b(\(\))c Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)49 b Fc(54)0 +1994 y(comparison)17 b Fd(.)c(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)43 b Fc(16)0 +2110 y(compiler)26 b(options)14 b Fd(.)g(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)41 b Fc(57)0 2226 +y Fe(complex)27 b(\(\))17 b Fd(.)d(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)44 b +Fc(15)0 2342 y(complex)25 b(n)n(um)n(b)r(er)6 b Fd(.)11 +b(.)i(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)33 +b Fc(7,)26 b(10)0 2459 y Fe(conjugate)i(\(\))12 b Fd(.)h(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)39 +b Fc(16)0 2575 y(con)n(v)n(ersion)22 b Fd(.)13 b(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)48 +b Fc(10,)27 b(32)0 2691 y Fe(cos)f(\(\))10 b Fd(.)k(.)f(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)37 b Fc(23)0 2807 y Fe(cosh)27 b(\(\))8 +b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)34 b Fc(24)0 +2924 y Fe(create)27 b(\(\))20 b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)46 +b Fc(52)0 3040 y(customizing)8 b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)35 +b Fc(64)0 3302 y Fs(D)0 3434 y Fe(debug)p 200 3434 V +29 w(print)27 b(\(\))13 b Fd(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)39 b Fc(63)0 3551 y(debugging)19 +b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)h(.)45 b Fc(62)0 3667 y Fe(decode)p +239 3667 V 30 w(float)26 b(\(\))10 b Fd(.)k(.)f(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)37 b Fc(31)0 3783 +y Fe(degree)27 b(\(\))20 b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)46 +b Fc(54)0 3899 y Fe(denominator)28 b(\(\))7 b Fd(.)14 +b(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +34 b Fc(15)0 4016 y Fe(deposit)p 278 4016 V 30 w(field)27 +b(\(\))8 b Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)34 b Fc(28)0 4132 y Fe(deriv)27 b(\(\))c Fd(.)13 +b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)49 b Fc(54)0 4248 y Fe(div)26 +b(\(\))10 b Fd(.)k(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)37 +b Fc(47)0 4364 y Fe(doublefactorial)29 b(\(\))14 b Fd(.)g(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)41 b Fc(30)0 4480 +y Fe(dpb)26 b(\(\))10 b Fd(.)k(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)37 +b Fc(28)0 4742 y Fs(E)0 4875 y Fe(equal)27 b(\(\))12 +b Fd(.)h(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)38 b Fc(48,)27 b(49)0 4991 y Fe(etract)g(\(\))20 +b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)46 b Fc(46)0 5108 y(Euler's)27 +b(constan)n(t)21 b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)48 b Fc(25)0 5224 y Fe(evenp)27 +b(\(\))c Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)49 b Fc(29)0 +5340 y(exact)26 b(n)n(um)n(b)r(er)15 b Fd(.)10 b(.)k(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)42 +b Fc(8)2031 366 y Fe(exp)26 b(\(\))10 b Fd(.)k(.)f(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)37 b Fc(22)2031 483 y Fe(exp1)27 b(\(\))8 +b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)34 b Fc(23)2031 +599 y Fe(expt)27 b(\(\))21 b Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)48 b Fc(14,)26 b(22,)h(47)2031 +715 y Fe(expt)p 2192 715 V 29 w(pos)f(\(\))16 b Fd(.)e(.)f(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)43 b Fc(14,)26 b(47,)h(53)2031 +831 y Fe(exquo)g(\(\))c Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)49 +b Fc(14)2031 1070 y Fs(F)2031 1203 y Fe(factorial)28 +b(\(\))12 b Fd(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)39 b Fc(30)2031 1319 y Fe(fceiling)27 +b(\(\))15 b Fd(.)f(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)41 b Fc(19)2031 1436 y Fe(fceiling2)28 +b(\(\))12 b Fd(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)39 b Fc(20)2031 1552 y Fe(ffloor)27 +b(\(\))20 b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)46 b Fc(19)2031 +1668 y Fe(ffloor2)27 b(\(\))17 b Fd(.)d(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)44 +b Fc(20)2031 1784 y(Fib)r(onacci)27 b(n)n(um)n(b)r(er)7 +b Fd(.)k(.)i(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)33 +b Fc(61)2031 1900 y Fe(finalize)27 b(\(\))15 b Fd(.)f(.)f(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)41 +b Fc(53)2031 2017 y Fe(float)p 2231 2017 V 29 w(digits)27 +b(\(\))10 b Fd(.)k(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)37 b Fc(31)2031 2133 y Fe(float)p 2231 2133 +V 29 w(epsilon)28 b(\(\))8 b Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)34 b Fc(33)2031 2249 y Fe(float)p +2231 2249 V 29 w(exponent)28 b(\(\))22 b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)49 b Fc(31)2031 2365 +y Fe(float)p 2231 2365 V 29 w(negative)p 2572 2365 V +30 w(epsilon)28 b(\(\))7 b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)34 +b Fc(33)2031 2482 y Fe(float)p 2231 2482 V 29 w(precision)28 +b(\(\))20 b Fd(.)13 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +46 b Fc(31)2031 2598 y Fe(float)p 2231 2598 V 29 w(radix)27 +b(\(\))13 b Fd(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)39 b Fc(31)2031 2714 y Fe(float)p 2231 +2714 V 29 w(sign)27 b(\(\))22 b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)48 b Fc(31,)27 b(32)2031 +2830 y(\015oating-p)r(oin)n(t)f(n)n(um)n(b)r(er)14 b +Fd(.)d(.)i(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)41 +b Fc(8)2031 2947 y Fe(floor1)27 b(\(\))20 b Fd(.)13 b(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)46 b Fc(18)2031 3063 y Fe(floor2)27 b(\(\))20 b Fd(.)13 +b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)g(.)h(.)46 b Fc(19)2031 3179 y Fe(fprint)27 +b(\(\))9 b Fd(.)14 b(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)h(.)35 b Fc(47,)27 b(54)2031 3295 +y Fe(fround)g(\(\))20 b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)46 +b Fc(19)2031 3411 y Fe(fround2)27 b(\(\))17 b Fd(.)d(.)f(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)44 +b Fc(20)2031 3528 y Fe(ftruncate)28 b(\(\))12 b Fd(.)h(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)39 +b Fc(19)2031 3644 y Fe(ftruncate2)28 b(\(\))10 b Fd(.)j(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)36 +b Fc(20)2031 3883 y Fs(G)2031 4016 y Fc(garbage)27 b(collection)15 +b Fd(.)f(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)41 +b Fc(55,)27 b(56)2031 4132 y Fe(gcd)f(\(\))10 b Fd(.)k(.)f(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)37 b Fc(29)2031 4248 y(GMP)15 b Fd(.)f(.)f(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)42 b Fc(2)2031 4487 y +Fs(H)2031 4620 y Fc(header)26 b(\014les)19 b Fd(.)13 +b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)45 b Fc(57)2031 4736 y(Hermite)25 b(p)r(olynomial)9 +b Fd(.)k(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)36 +b Fc(54)2031 4975 y Fs(I)2031 5108 y Fe(imagpart)27 b(\(\))15 +b Fd(.)f(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)41 b Fc(15)2031 5224 y(include)26 +b(\014les)10 b Fd(.)j(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)37 b Fc(57)2031 5340 +y(Input/Output)20 b Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)49 b Fc(37)p eop +%%Page: 68 70 +68 69 bop 0 -116 a Fr(Index)3586 b(68)0 366 y Fc(installation)23 +b Fd(.)13 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)48 b Fc(5)0 483 y(in)n(teger)9 +b Fd(.)14 b(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)36 b +Fc(7)0 599 y Fe(integer)p 278 599 24 4 v 30 w(decode)p +542 599 V 29 w(float)27 b(\(\))12 b Fd(.)i(.)f(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +39 b Fc(32)0 715 y Fe(integer)p 278 715 V 30 w(length)27 +b(\(\))22 b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)49 b Fc(29)0 831 y Fe(isqrt)27 b(\(\))c Fd(.)13 b(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)49 b Fc(21)0 1093 y Fs(L)0 1226 y Fc(Laguerre)26 +b(p)r(olynomial)14 b Fd(.)g(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +h(.)40 b Fc(54)0 1342 y Fe(lcm)26 b(\(\))10 b Fd(.)k(.)f(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)37 b Fc(30)0 1458 y Fe(ldb)26 b(\(\))10 +b Fd(.)k(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)37 b Fc(28)0 +1575 y Fe(ldb)p 122 1575 V 29 w(test)26 b(\(\))21 b Fd(.)13 +b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)47 b Fc(28)0 1691 y Fe(least)p 200 1691 V +29 w(negative)p 541 1691 V 30 w(float)27 b(\(\))12 b +Fd(.)i(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)39 b Fc(33)0 1807 +y Fe(least)p 200 1807 V 29 w(positive)p 541 1807 V 30 +w(float)27 b(\(\))12 b Fd(.)i(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)39 +b Fc(33)0 1923 y(Legende)26 b(p)r(olynomial)8 b Fd(.)13 +b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)34 +b Fc(54)0 2040 y Fe(length)27 b(\(\))20 b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)46 +b Fc(48)0 2156 y Fe(ln)26 b(\(\))13 b Fd(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)40 b Fc(22)0 2272 y Fe(log)26 b(\(\))10 b +Fd(.)k(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)37 b Fc(22)0 +2388 y Fe(logand)27 b(\(\))20 b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)46 +b Fc(27)0 2505 y Fe(logandc1)27 b(\(\))15 b Fd(.)f(.)f(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)41 +b Fc(27)0 2621 y Fe(logandc2)27 b(\(\))15 b Fd(.)f(.)f(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)41 +b Fc(27)0 2737 y Fe(logbitp)27 b(\(\))17 b Fd(.)d(.)f(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)44 +b Fc(28)0 2853 y Fe(logcount)27 b(\(\))15 b Fd(.)f(.)f(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)41 +b Fc(28)0 2969 y Fe(logeqv)27 b(\(\))20 b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)46 +b Fc(27)0 3086 y Fe(logior)27 b(\(\))20 b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)46 +b Fc(27)0 3202 y Fe(lognand)27 b(\(\))17 b Fd(.)d(.)f(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)44 +b Fc(27)0 3318 y Fe(lognor)27 b(\(\))20 b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)46 +b Fc(27)0 3434 y Fe(lognot)27 b(\(\))20 b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)46 +b Fc(27)0 3551 y Fe(logorc1)27 b(\(\))17 b Fd(.)d(.)f(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)44 +b Fc(27)0 3667 y Fe(logorc2)27 b(\(\))17 b Fd(.)d(.)f(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)44 +b Fc(27)0 3783 y Fe(logp)27 b(\(\))8 b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)h(.)34 b Fc(30)0 3899 y Fe(logtest)27 b(\(\))17 b +Fd(.)d(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)44 b Fc(28)0 4016 y Fe(logxor)27 +b(\(\))20 b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)46 b Fc(27)0 +4277 y Fs(M)0 4410 y Fe(make)11 b Fd(.)j(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)38 b Fc(3)0 4526 y Fe(mask)p 161 4526 +V 29 w(field)27 b(\(\))15 b Fd(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)42 b Fc(28)0 4643 +y Fe(max)26 b(\(\))10 b Fd(.)k(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)37 +b Fc(17)0 4759 y Fe(min)26 b(\(\))10 b Fd(.)k(.)f(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)37 b Fc(17)0 4875 y Fe(minus1)27 b(\(\))20 +b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)46 b Fc(13)0 4991 y Fe(minusp)27 +b(\(\))20 b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)46 b Fc(16)0 +5108 y Fe(mod)26 b(\(\))10 b Fd(.)k(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)37 +b Fc(21)0 5224 y(mo)r(difying)26 b(op)r(erators)e Fd(.)13 +b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)49 +b Fc(35)0 5340 y(mo)r(dular)25 b(in)n(teger)8 b Fd(.)14 +b(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +35 b Fc(45)2031 366 y Fe(modulus)18 b Fd(.)d(.)e(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +45 b Fc(46)2031 483 y Fe(monomial)27 b(\(\))15 b Fd(.)f(.)f(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)41 +b Fc(52)2031 599 y(Mon)n(tgomery)25 b(m)n(ultiplication)c +Fd(.)14 b(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)48 b Fc(45)2031 715 y +Fe(most)p 2192 715 V 29 w(negative)p 2533 715 V 30 w(float)27 +b(\(\))15 b Fd(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)41 +b Fc(33)2031 831 y Fe(most)p 2192 831 V 29 w(positive)p +2533 831 V 30 w(float)27 b(\(\))15 b Fd(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)41 b Fc(33)2031 1151 y Fs(N)2031 1284 y Fe(numerator)28 +b(\(\))12 b Fd(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)39 b Fc(15)2031 1604 y Fs(O)2031 +1737 y Fe(oddp)27 b(\(\))8 b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)34 +b Fc(29)2031 1853 y Fe(one)26 b(\(\))17 b Fd(.)d(.)f(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)43 +b Fc(46,)27 b(52)2031 1969 y Fe(operator)g(!=)f(\(\))16 +b Fd(.)e(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)43 b Fc(16,)27 b(46,)f(47,)h(53)2031 +2086 y Fe(operator)g(&)f(\(\))17 b Fd(.)c(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)43 b Fc(27)2031 +2202 y Fe(operator)27 b(&=)f(\(\))14 b Fd(.)g(.)f(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)41 b Fc(35)2031 +2318 y Fe(operator)27 b(\(\))f(\(\))14 b Fd(.)g(.)f(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)41 b Fc(54)2031 +2434 y Fe(operator)27 b(*)f(\(\))12 b Fd(.)i(.)f(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)39 b Fc(13,)26 b(47,)h(53)2031 2550 +y Fe(operator)g(*=)f(\(\))14 b Fd(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)41 b Fc(35)2031 2667 +y Fe(operator)27 b(-)f(\(\))12 b Fd(.)i(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)39 b Fc(13,)26 b(46,)h(53)2031 2783 y Fe(operator)g(--)f +(\(\))14 b Fd(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)g(.)41 b Fc(36)2031 2899 y Fe(operator)27 +b(-=)f(\(\))14 b Fd(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)g(.)41 b Fc(35)2031 3015 y Fe(operator)27 +b(/)f(\(\))17 b Fd(.)c(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)43 b Fc(14)2031 3132 y Fe(operator)27 +b(/=)f(\(\))14 b Fd(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)g(.)41 b Fc(35)2031 3248 y Fe(operator)27 +b(==)f(\(\))16 b Fd(.)e(.)f(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)43 b Fc(16,)27 +b(46,)f(47,)h(53)2031 3364 y Fe(operator)g([])f(\(\))14 +b Fd(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)41 b Fc(48)2031 3480 y Fe(operator)27 b(|)f(\(\))17 +b Fd(.)c(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)43 b Fc(27)2031 3597 y Fe(operator)27 b(|=)f(\(\))14 +b Fd(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)41 b Fc(35)2031 3713 y Fe(operator)27 b(~)f(\(\))17 +b Fd(.)c(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)43 b Fc(27)2031 3829 y Fe(operator)27 b(+)f(\(\))12 +b Fd(.)i(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)39 +b Fc(13,)26 b(46,)h(53)2031 3945 y Fe(operator)g(+=)f(\(\))14 +b Fd(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)41 b Fc(35)2031 4061 y Fe(operator)27 b(++)f(\(\))14 +b Fd(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)41 b Fc(36)2031 4178 y Fe(operator)27 b(>)f(\(\))17 +b Fd(.)c(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)43 b Fc(16)2031 4294 y Fe(operator)27 b(>=)f(\(\))14 +b Fd(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)41 b Fc(16)2031 4410 y Fe(operator)27 b(>>)f(\(\))21 +b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)47 +b Fc(29,)27 b(47)2031 4526 y Fe(operator)g(>>=)g(\(\))11 +b Fd(.)j(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)38 b Fc(35)2031 4643 y Fe(operator)27 b(^)f(\(\))17 +b Fd(.)c(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)43 b Fc(27)2031 4759 y Fe(operator)27 b(^=)f(\(\))14 +b Fd(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)41 b Fc(35)2031 4875 y Fe(operator)27 b(<)f(\(\))17 +b Fd(.)c(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)43 b Fc(16)2031 4991 y Fe(operator)27 b(<=)f(\(\))14 +b Fd(.)g(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)41 b Fc(16)2031 5108 y Fe(operator)27 b(<<)f(\(\))10 +b Fd(.)k(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)37 b +Fc(29,)26 b(47,)h(54)2031 5224 y Fe(operator)g(<<=)g(\(\))11 +b Fd(.)j(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)38 b Fc(35)2031 5340 y Fe(ord2)27 b(\(\))8 b Fd(.)13 +b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)34 b Fc(29)p eop +%%Page: 69 71 +69 70 bop 0 -116 a Fr(Index)3586 b(69)0 366 y Fs(P)0 +499 y Fe(phase)27 b(\(\))c Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)49 +b Fc(22)0 616 y(pi)21 b Fd(.)13 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)48 b Fc(24)0 732 y Fe(plus1)27 b(\(\))c +Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)49 b Fc(13)0 848 y Fe(plusp)27 +b(\(\))c Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)49 b Fc(17)0 +964 y(p)r(olynomial)21 b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)48 b +Fc(50)0 1080 y(p)r(ortabilit)n(y)11 b Fd(.)j(.)f(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)38 +b Fc(55)0 1197 y Fe(power2p)27 b(\(\))17 b Fd(.)d(.)f(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)44 +b Fc(29)0 1313 y(prin)n(ting)22 b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)49 +b Fc(37)0 1529 y Fs(R)0 1662 y Fe(random)27 b(\(\))20 +b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)46 b Fc(46)0 1778 y Fe(random)p +239 1778 24 4 v 30 w(F)25 b(\(\))c Fd(.)13 b(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)47 +b Fc(35)0 1894 y Fe(random)p 239 1894 V 30 w(I)25 b(\(\))c +Fd(.)13 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)47 b Fc(34)0 2010 y Fe(random)p 239 +2010 V 30 w(R)25 b(\(\))c Fd(.)13 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)47 b Fc(35)0 +2127 y Fe(random32)27 b(\(\))15 b Fd(.)f(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)41 +b Fc(34)0 2243 y Fe(rational)27 b(\(\))15 b Fd(.)f(.)f(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)41 +b Fc(33)0 2359 y(rational)27 b(n)n(um)n(b)r(er)7 b Fd(.)k(.)i(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)34 +b Fc(7)0 2475 y Fe(rationalize)28 b(\(\))7 b Fd(.)14 +b(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +34 b Fc(34)0 2591 y(reading)15 b Fd(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)41 +b Fc(37)0 2708 y(real)27 b(n)n(um)n(b)r(er)7 b Fd(.)k(.)i(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)34 b Fc(7)0 2824 y Fe(realpart)27 b(\(\))15 b Fd(.)f(.)f(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)41 +b Fc(15)0 2940 y Fe(recip)27 b(\(\))12 b Fd(.)h(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)38 +b Fc(14,)27 b(47)0 3056 y(reference)g(coun)n(ting)20 +b Fd(.)14 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)47 +b Fc(55)0 3173 y Fe(rem)26 b(\(\))10 b Fd(.)k(.)f(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)37 b Fc(21)0 3289 y(represen)n(tation)20 b +Fd(.)13 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)46 b Fc(37)0 3405 y(Riemann's)25 b(zeta)18 +b Fd(.)c(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)45 b Fc(26)0 3521 y(ring)21 b Fd(.)14 b(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)48 b Fc(45)0 3638 y Fe(ring)27 b(\(\))8 +b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)34 b Fc(53)0 +3754 y Fe(ring\(\))22 b Fd(.)13 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)47 +b Fc(46)0 3870 y Fe(rootp)27 b(\(\))c Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)49 +b Fc(21)0 3986 y Fe(round1)27 b(\(\))20 b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)46 +b Fc(18)0 4102 y Fe(round2)27 b(\(\))20 b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)46 +b Fc(19)0 4219 y(rounding)6 b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)33 +b Fc(17)0 4335 y(rounding)25 b(error)16 b Fd(.)f(.)e(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)44 +b Fc(8)0 4451 y(Rubik's)25 b(cub)r(e)d Fd(.)13 b(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)49 +b Fc(11)0 4667 y Fs(S)0 4800 y Fe(scale)p 200 4800 V +29 w(float)27 b(\(\))13 b Fd(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)39 b Fc(30)2031 366 y(Sc)n(h\177)-38 +b(onhage-Strassen)15 b Fd(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)42 b Fc(56)2031 483 y(Sc)n(h\177)-38 b(onhage-Strassen)26 +b(m)n(ultiplication)10 b Fd(.)j(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)37 b Fc(2)2031 599 y Fe(sed)13 +b Fd(.)h(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)41 +b Fc(3)2031 715 y Fe(set)p 2153 715 V 29 w(coeff)27 b(\(\))18 +b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)44 b Fc(53)2031 831 y Fe(signum)27 b(\(\))20 +b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)46 b Fc(15)2031 948 y Fe(sin)26 +b(\(\))10 b Fd(.)k(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)37 +b Fc(23)2031 1064 y Fe(sinh)27 b(\(\))8 b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)h(.)34 b Fc(24)2031 1180 y Fe(sqrt)27 b(\(\))8 +b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)34 b Fc(21)2031 +1296 y Fe(sqrtp)27 b(\(\))c Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)49 +b Fc(21)2031 1413 y Fe(square)27 b(\(\))16 b Fd(.)d(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)43 b Fc(13,)26 +b(47,)h(53)2031 1529 y(string)8 b Fd(.)14 b(.)f(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)g(.)35 b Fc(48)2031 1645 y Fe(strlen)27 b(\(\))20 +b Fd(.)13 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)46 b Fc(48)2031 1761 y(sym)n(b)r(ol)19 +b Fd(.)13 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)46 b Fc(49)2031 +1877 y(sym)n(b)r(olic)25 b(t)n(yp)r(e)8 b Fd(.)13 b(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)35 +b Fc(48)2031 2143 y Fs(T)2031 2276 y Fe(tan)26 b(\(\))10 +b Fd(.)k(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)37 b Fc(23)2031 +2392 y Fe(tanh)27 b(\(\))8 b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)34 +b Fc(25)2031 2508 y Fe(The\(\))27 b(\(\))c Fd(.)13 b(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)49 b Fc(11)2031 2625 y(transcenden)n(tal)26 b(functions)18 +b Fd(.)c(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)45 b Fc(22)2031 +2741 y Fe(truncate1)28 b(\(\))12 b Fd(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)39 b +Fc(18)2031 2857 y Fe(truncate2)28 b(\(\))12 b Fd(.)h(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)39 +b Fc(19)2031 2973 y(Tsc)n(heb)n(yc)n(hev)25 b(p)r(olynomial)18 +b Fd(.)13 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)44 b Fc(54)2031 +3239 y Fs(U)2031 3372 y Fc(under\015o)n(w)9 b Fd(.)k(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)36 b Fc(64)2031 3488 y(univ)l(ariate)26 b(p)r(olynomial)11 +b Fd(.)i(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)38 +b Fc(50)2031 3754 y Fs(W)2031 3887 y Fe(WANT)p 2192 3887 +V 29 w(OBFUSCATING)p 2650 3887 V 31 w(OPERATORS)15 b +Fd(.)g(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)41 b Fc(35)2031 4152 y Fs(X)2031 4285 +y Fe(xgcd)27 b(\(\))8 b Fd(.)13 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)34 +b Fc(30)2031 4551 y Fs(Z)2031 4684 y Fe(zero)27 b(\(\))14 +b Fd(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)41 b Fc(46,)27 b(52)2031 4800 +y Fe(zerop)g(\(\))18 b Fd(.)c(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)45 b Fc(16,)26 b(47,)h(53)p eop +%%Page: -1 72 +-1 71 bop 3875 -116 a Fr(i)0 366 y Fo(T)-13 b(able)31 +b(of)f(Con)l(ten)l(ts)0 715 y Fs(1)135 b(In)l(tro)t(duction)40 b Fb(.)20 b(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f (.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.) -f(.)85 b Fq(1)0 995 y(2)135 b(Installation)14 b Fb(.)22 +f(.)85 b Fs(1)0 995 y(2)135 b(Installation)14 b Fb(.)22 b(.)d(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f (.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.) -f(.)59 b Fq(3)299 1151 y Fp(2.1)92 b(Prerequisites)15 +f(.)59 b Fs(3)299 1151 y Fr(2.1)92 b(Prerequisites)15 b Fa(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)44 -b Fp(3)598 1276 y(2.1.1)93 b(C)p Fn(++)29 b Fp(compiler)14 +b Fr(3)598 1276 y(2.1.1)93 b(C)p Fp(++)29 b Fr(compiler)14 b Fa(.)g(.)h(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)43 b Fp(3)598 1400 y(2.1.2)93 +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)43 b Fr(3)598 1400 y(2.1.2)93 b(Mak)m(e)31 b(utilit)m(y)14 b Fa(.)i(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)43 -b Fp(3)598 1525 y(2.1.3)93 b(Sed)29 b(utilit)m(y)h Fa(.)15 +b Fr(3)598 1525 y(2.1.3)93 b(Sed)29 b(utilit)m(y)h Fa(.)15 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)58 b Fp(3)299 1649 y(2.2)92 +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)58 b Fr(3)299 1649 y(2.2)92 b(Building)30 b(the)h(library)25 b Fa(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.) h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) -f(.)55 b Fp(4)299 1774 y(2.3)92 b(Installing)31 b(the)g(library)8 +f(.)55 b Fr(4)299 1774 y(2.3)92 b(Installing)31 b(the)g(library)8 b Fa(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)38 b Fp(5)299 +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)38 b Fr(5)299 1898 y(2.4)92 b(Cleaning)31 b(up)8 b Fa(.)14 b(.)h(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)38 b Fp(6)0 2147 -y Fq(3)135 b(Ordinary)45 b(n)l(um)l(b)t(er)f(t)l(yp)t(es)31 +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)38 b Fr(6)0 2147 +y Fs(3)135 b(Ordinary)45 b(n)l(um)l(b)t(er)f(t)l(yp)t(es)31 b Fb(.)19 b(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h -(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)75 b Fq(7)299 2303 -y Fp(3.1)92 b(Exact)31 b(n)m(um)m(b)s(ers)14 b Fa(.)f(.)i(.)g(.)g(.)g +(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)75 b Fs(7)299 2303 +y Fr(3.1)92 b(Exact)31 b(n)m(um)m(b)s(ers)14 b Fa(.)f(.)i(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)44 b Fp(8)299 2428 +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)44 b Fr(8)299 2428 y(3.2)92 b(Floating-p)s(oin)m(t)33 b(n)m(um)m(b)s(ers)17 b Fa(.)12 b(.)j(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)47 b Fp(8)299 2552 y(3.3)92 +g(.)g(.)g(.)g(.)g(.)g(.)g(.)47 b Fr(8)299 2552 y(3.3)92 b(Complex)29 b(n)m(um)m(b)s(ers)17 b Fa(.)c(.)i(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)47 b Fp(10)299 2677 y(3.4)92 b(Con)m(v)m(ersions)10 +(.)g(.)47 b Fr(10)299 2677 y(3.4)92 b(Con)m(v)m(ersions)10 b Fa(.)16 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)40 -b Fp(10)0 2926 y Fq(4)135 b(F)-11 b(unctions)44 b(on)h(n)l(um)l(b)t +b Fr(10)0 2926 y Fs(4)135 b(F)-11 b(unctions)44 b(on)h(n)l(um)l(b)t (ers)38 b Fb(.)20 b(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f -(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)83 b Fq(12)299 -3081 y Fp(4.1)92 b(Constructing)30 b(n)m(um)m(b)s(ers)21 +(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)83 b Fs(12)299 +3081 y Fr(4.1)92 b(Constructing)30 b(n)m(um)m(b)s(ers)21 b Fa(.)13 b(.)i(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)50 b Fp(12)598 3206 y(4.1.1)93 +g(.)g(.)g(.)g(.)g(.)g(.)g(.)50 b Fr(12)598 3206 y(4.1.1)93 b(Constructing)30 b(in)m(tegers)24 b Fa(.)15 b(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)53 b Fp(12)598 3330 y(4.1.2)93 +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)53 b Fr(12)598 3330 y(4.1.2)93 b(Constructing)30 b(rational)h(n)m(um)m(b)s(ers)11 b Fa(.)i(.)i(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h -(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)40 b Fp(12)598 3455 y(4.1.3)93 +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)40 b Fr(12)598 3455 y(4.1.3)93 b(Constructing)30 b(\015oating-p)s(oin)m(t)h(n)m(um)m(b)s(ers)25 b Fa(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)56 b Fp(12)598 3579 y(4.1.4)93 b(Constructing)30 +(.)g(.)g(.)56 b Fr(12)598 3579 y(4.1.4)93 b(Constructing)30 b(complex)g(n)m(um)m(b)s(ers)21 b Fa(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)53 -b Fp(13)299 3704 y(4.2)92 b(Elemen)m(tary)30 b(functions)17 +b Fr(13)299 3704 y(4.2)92 b(Elemen)m(tary)30 b(functions)17 b Fa(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)46 b Fp(13)299 3829 y(4.3)92 +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)46 b Fr(13)299 3829 y(4.3)92 b(Elemen)m(tary)30 b(rational)i(functions)20 b Fa(.)14 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)49 -b Fp(15)299 3953 y(4.4)92 b(Elemen)m(tary)30 b(complex)g(functions)11 +b Fr(15)299 3953 y(4.4)92 b(Elemen)m(tary)30 b(complex)g(functions)11 b Fa(.)k(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)40 -b Fp(15)299 4078 y(4.5)92 b(Comparisons)13 b Fa(.)g(.)i(.)g(.)g(.)g(.)g +b Fr(15)299 4078 y(4.5)92 b(Comparisons)13 b Fa(.)g(.)i(.)g(.)g(.)g(.)g (.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h -(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)42 b Fp(16)299 4202 +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)42 b Fr(16)299 4202 y(4.6)92 b(Rounding)29 b(functions)9 b Fa(.)15 b(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)h(.)38 b Fp(17)299 4327 y(4.7)92 b(Ro)s(ots)24 b +g(.)h(.)38 b Fr(17)299 4327 y(4.7)92 b(Ro)s(ots)24 b Fa(.)15 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)53 b Fp(21)299 4451 y(4.8)92 b(T)-8 +(.)g(.)g(.)g(.)g(.)53 b Fr(21)299 4451 y(4.8)92 b(T)-8 b(ranscenden)m(tal)31 b(functions)8 b Fa(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)38 -b Fp(22)598 4576 y(4.8.1)93 b(Exp)s(onen)m(tial)30 b(and)g(logarithmic) +b Fr(22)598 4576 y(4.8.1)93 b(Exp)s(onen)m(tial)30 b(and)g(logarithmic) h(functions)9 b Fa(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)38 b Fp(22)598 4700 y(4.8.2)93 +(.)g(.)g(.)g(.)g(.)g(.)38 b Fr(22)598 4700 y(4.8.2)93 b(T)-8 b(rigonometric)30 b(functions)17 b Fa(.)e(.)h(.)f(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)47 b Fp(23)598 4825 y(4.8.3)93 +(.)g(.)g(.)g(.)g(.)g(.)g(.)47 b Fr(23)598 4825 y(4.8.3)93 b(Hyp)s(erb)s(olic)29 b(functions)15 b Fa(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)44 b Fp(24)598 4949 +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)44 b Fr(24)598 4949 y(4.8.4)93 b(Euler)29 b(gamma)12 b Fa(.)i(.)h(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)41 -b Fp(25)598 5074 y(4.8.5)93 b(Riemann)29 b(zeta)e Fa(.)15 +b Fr(25)598 5074 y(4.8.5)93 b(Riemann)29 b(zeta)e Fa(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)55 b Fp(26)299 5198 y(4.9)92 b(F)-8 b(unctions)31 +g(.)g(.)g(.)g(.)55 b Fr(26)299 5198 y(4.9)92 b(F)-8 b(unctions)31 b(on)f(in)m(tegers)17 b Fa(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)46 -b Fp(26)598 5323 y(4.9.1)93 b(Logical)32 b(functions)25 +b Fr(26)598 5323 y(4.9.1)93 b(Logical)32 b(functions)25 b Fa(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)55 b Fp(26)p eop -%%Page: -2 70 --2 69 bop 3849 -116 a Fp(ii)598 83 y(4.9.2)93 b(Num)m(b)s(er)28 +g(.)g(.)g(.)55 b Fr(26)p eop +%%Page: -2 73 +-2 72 bop 3849 -116 a Fr(ii)598 83 y(4.9.2)93 b(Num)m(b)s(er)28 b(theoretic)k(functions)11 b Fa(.)k(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) -40 b Fp(29)598 208 y(4.9.3)93 b(Com)m(binatorial)30 b(functions)12 +40 b Fr(29)598 208 y(4.9.3)93 b(Com)m(binatorial)30 b(functions)12 b Fa(.)j(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)42 -b Fp(30)299 332 y(4.10)92 b(F)-8 b(unctions)31 b(on)g(\015oating-p)s +b Fr(30)299 332 y(4.10)92 b(F)-8 b(unctions)31 b(on)g(\015oating-p)s (oin)m(t)g(n)m(um)m(b)s(ers)19 b Fa(.)12 b(.)j(.)h(.)f(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)48 b Fp(30)299 457 y(4.11)92 b(Con)m(v)m(ersion)31 +g(.)48 b Fr(30)299 457 y(4.11)92 b(Con)m(v)m(ersion)31 b(functions)25 b Fa(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)54 b Fp(32)598 +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)54 b Fr(32)598 581 y(4.11.1)93 b(Con)m(v)m(ersion)31 b(to)g(\015oating-p)s(oin)m(t)h (n)m(um)m(b)s(ers)9 b Fa(.)j(.)j(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)38 b Fp(32)598 706 y(4.11.2)93 +g(.)g(.)g(.)g(.)g(.)g(.)38 b Fr(32)598 706 y(4.11.2)93 b(Con)m(v)m(ersion)31 b(to)g(rational)h(n)m(um)m(b)s(ers)15 b Fa(.)d(.)j(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)44 b Fp(33)299 830 y(4.12)92 +g(.)g(.)g(.)g(.)g(.)g(.)44 b Fr(33)299 830 y(4.12)92 b(Random)29 b(n)m(um)m(b)s(er)f(generators)16 b Fa(.)g(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)45 b -Fp(34)299 955 y(4.13)92 b(Obfuscating)30 b(op)s(erators)21 +Fr(34)299 955 y(4.13)92 b(Obfuscating)30 b(op)s(erators)21 b Fa(.)16 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)50 b Fp(35)0 1204 y Fq(5)135 +g(.)g(.)g(.)g(.)g(.)g(.)50 b Fr(35)0 1204 y Fs(5)135 b(Input/Output)28 b Fb(.)18 b(.)i(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h (.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.) -g(.)h(.)f(.)h(.)72 b Fq(37)299 1359 y Fp(5.1)92 b(In)m(ternal)31 +g(.)h(.)f(.)h(.)72 b Fs(37)299 1359 y Fr(5.1)92 b(In)m(ternal)31 b(and)e(prin)m(ted)h(represen)m(tation)20 b Fa(.)d(.)e(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)h(.)49 b Fp(37)299 1484 y(5.2)92 b(Input)29 +g(.)g(.)g(.)g(.)h(.)49 b Fr(37)299 1484 y(5.2)92 b(Input)29 b(functions)e Fa(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)57 -b Fp(38)299 1609 y(5.3)92 b(Output)29 b(functions)12 +b Fr(38)299 1609 y(5.3)92 b(Output)29 b(functions)12 b Fa(.)j(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)42 b Fp(40)0 -1858 y Fq(6)135 b(Rings)23 b Fb(.)d(.)g(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)42 b Fr(40)0 +1858 y Fs(6)135 b(Rings)23 b Fb(.)d(.)g(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f (.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.) h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)68 -b Fq(43)0 2138 y(7)135 b(Mo)t(dular)44 b(in)l(tegers)28 +b Fs(43)0 2138 y(7)135 b(Mo)t(dular)44 b(in)l(tegers)28 b Fb(.)22 b(.)d(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f (.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)73 -b Fq(45)299 2293 y Fp(7.1)92 b(Mo)s(dular)30 b(in)m(teger)i(rings)10 +b Fs(45)299 2293 y Fr(7.1)92 b(Mo)s(dular)30 b(in)m(teger)i(rings)10 b Fa(.)k(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)39 b Fp(45)299 2418 y(7.2)92 +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)39 b Fr(45)299 2418 y(7.2)92 b(F)-8 b(unctions)31 b(on)f(mo)s(dular)e(in)m(tegers)j Fa(.)15 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)59 -b Fp(46)0 2667 y Fq(8)135 b(Sym)l(b)t(olic)45 b(data)g(t)l(yp)t(es)30 +b Fr(46)0 2667 y Fs(8)135 b(Sym)l(b)t(olic)45 b(data)g(t)l(yp)t(es)30 b Fb(.)20 b(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f -(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)74 b Fq(48)299 -2823 y Fp(8.1)92 b(Strings)22 b Fa(.)14 b(.)h(.)g(.)g(.)g(.)g(.)h(.)f +(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)74 b Fs(48)299 +2823 y Fr(8.1)92 b(Strings)22 b Fa(.)14 b(.)h(.)g(.)g(.)g(.)g(.)h(.)f (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)51 b Fp(48)299 +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)51 b Fr(48)299 2947 y(8.2)92 b(Sym)m(b)s(ols)17 b Fa(.)c(.)i(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h -(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)46 b Fp(49)0 -3196 y Fq(9)135 b(Univ)-7 b(ariate)46 b(p)t(olynomials)41 +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)46 b Fr(49)0 +3196 y Fs(9)135 b(Univ)-7 b(ariate)46 b(p)t(olynomials)41 b Fb(.)19 b(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h -(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)84 b Fq(50)299 3352 y -Fp(9.1)92 b(Univ)-5 b(ariate)32 b(p)s(olynomial)d(rings)16 +(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)84 b Fs(50)299 3352 y +Fr(9.1)92 b(Univ)-5 b(ariate)32 b(p)s(olynomial)d(rings)16 b Fa(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)46 b Fp(50)299 3477 y(9.2)92 b(F)-8 b(unctions)31 +(.)g(.)46 b Fr(50)299 3477 y(9.2)92 b(F)-8 b(unctions)31 b(on)f(univ)-5 b(ariate)31 b(p)s(olynomials)20 b Fa(.)14 b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)49 b Fp(52)299 +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)49 b Fr(52)299 3601 y(9.3)92 b(Sp)s(ecial)31 b(p)s(olynomials)25 b Fa(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)56 b Fp(54)0 3850 y Fq(10)135 +g(.)g(.)g(.)g(.)g(.)g(.)g(.)56 b Fr(54)0 3850 y Fs(10)135 b(In)l(ternals)21 b Fb(.)f(.)g(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f (.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.) -h(.)f(.)h(.)f(.)h(.)f(.)g(.)66 b Fq(55)299 4006 y Fp(10.1)92 -b(Wh)m(y)31 b(C)p Fn(++)f Fp(?)19 b Fa(.)14 b(.)h(.)g(.)g(.)h(.)f(.)g +h(.)f(.)h(.)f(.)h(.)f(.)g(.)66 b Fs(55)299 4006 y Fr(10.1)92 +b(Wh)m(y)31 b(C)p Fp(++)f Fr(?)19 b Fa(.)14 b(.)h(.)g(.)g(.)h(.)f(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)48 b Fp(55)299 4130 y(10.2)92 +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)48 b Fr(55)299 4130 y(10.2)92 b(Memory)30 b(e\016ciency)15 b Fa(.)h(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)44 -b Fp(55)299 4255 y(10.3)92 b(Sp)s(eed)30 b(e\016ciency)19 +b Fr(55)299 4255 y(10.3)92 b(Sp)s(eed)30 b(e\016ciency)19 b Fa(.)d(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)48 b Fp(56)299 +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)48 b Fr(56)299 4379 y(10.4)92 b(Garbage)32 b(collection)e Fa(.)15 b(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)57 b Fp(56)0 4628 y Fq(11)135 b(Using)46 b(the)f(library)26 +g(.)g(.)57 b Fr(56)0 4628 y Fs(11)135 b(Using)46 b(the)f(library)26 b Fb(.)20 b(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f (.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)71 -b Fq(57)299 4784 y Fp(11.1)92 b(Compiler)30 b(options)12 +b Fs(57)299 4784 y Fr(11.1)92 b(Compiler)30 b(options)12 b Fa(.)j(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)41 b Fp(57)299 +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)41 b Fr(57)299 4909 y(11.2)92 b(Include)30 b(\014les)10 b Fa(.)15 b(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) -g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)39 b Fp(57)299 5033 +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)39 b Fr(57)299 5033 y(11.3)92 b(An)30 b(Example)19 b Fa(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)g(.)49 b Fp(61)299 5158 y(11.4)92 b(Debugging)32 +(.)g(.)g(.)g(.)g(.)49 b Fr(61)299 5158 y(11.4)92 b(Debugging)32 b(supp)s(ort)17 b Fa(.)c(.)i(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)46 -b Fp(62)p eop -%%Page: -3 71 --3 70 bop 3824 -116 a Fp(iii)0 83 y Fq(12)135 b(Customizing)40 +b Fr(62)p eop +%%Page: -3 74 +-3 73 bop 3824 -116 a Fr(iii)0 83 y Fs(12)135 b(Customizing)40 b Fb(.)20 b(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f (.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)84 -b Fq(64)299 239 y Fp(12.1)92 b(Error)30 b(handling)17 +b Fs(64)299 239 y Fr(12.1)92 b(Error)30 b(handling)17 b Fa(.)d(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)46 -b Fp(64)299 363 y(12.2)92 b(Floating-p)s(oin)m(t)33 b(under\015o)m(w)11 +b Fr(64)299 363 y(12.2)92 b(Floating-p)s(oin)m(t)33 b(under\015o)m(w)11 b Fa(.)j(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g -(.)g(.)g(.)g(.)40 b Fp(64)299 488 y(12.3)92 b(Customizing)30 +(.)g(.)g(.)g(.)40 b Fr(64)299 488 y(12.3)92 b(Customizing)30 b(I/O)16 b Fa(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)45 -b Fp(64)299 612 y(12.4)92 b(Customizing)30 b(the)h(memory)d(allo)s +b Fr(64)299 612 y(12.4)92 b(Customizing)30 b(the)h(memory)d(allo)s (cator)k Fa(.)15 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g (.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)59 -b Fp(65)0 861 y Fq(Index)31 b Fb(.)19 b(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h +b Fr(65)0 861 y Fs(Index)31 b Fb(.)19 b(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h (.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.) g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)g(.)h(.)f(.)76 -b Fq(66)p eop +b Fs(66)p eop %%Trailer end userdict /end-hook known{end-hook}if diff --git a/doc/cln.tex b/doc/cln.tex index b83dfa8..21f263e 100644 --- a/doc/cln.tex +++ b/doc/cln.tex @@ -191,8 +191,9 @@ CLN is speed efficient: The kernel of CLN has been written in assembly language for some CPUs (@code{i386}, @code{m68k}, @code{sparc}, @code{mips}, @code{arm}). @item -On all CPUs, CLN uses the superefficient low-level routines from GNU -GMP version 2. +@cindex GMP +On all CPUs, CLN may be configured to use the superefficient low-level +routines from GNU GMP version 3. @item It uses Karatsuba multiplication, which is significantly faster for large numbers than the standard multiplication algorithm. @@ -200,13 +201,14 @@ for large numbers than the standard multiplication algorithm. For very large numbers (more than 12000 decimal digits), it uses @iftex Sch{@"o}nhage-Strassen +@cindex Sch{@"o}nhage-Strassen multiplication @end iftex @ifinfo Schönhage-Strassen +@cindex Schönhage-Strassen multiplication @end ifinfo -multiplication, which is an asymptotically -optimal multiplication algorithm, for multiplication, division and -radix conversion. +multiplication, which is an asymptotically optimal multiplication +algorithm, for multiplication, division and radix conversion. @end itemize @noindent @@ -232,7 +234,7 @@ This section describes how to install the CLN package on your system. To build CLN, you need a C++ compiler. Actually, you need GNU @code{g++ 2.7.0} or newer. On HPPA, you need GNU @code{g++ 2.8.0} or newer. -I recommend GNU @code{egcs 1.1} or newer. +I recommend GNU @code{g++ 2.95} or newer. The following C++ features are used: classes, member functions, @@ -281,10 +283,12 @@ initializations will not work. @end itemize @end ignore +@cindex @code{make} @subsection Make utility To build CLN, you also need to have GNU @code{make} installed. +@cindex @code{sed} @subsection Sed utility To build CLN on HP-UX, you also need to have GNU @code{sed} installed. @@ -397,9 +401,6 @@ add either @samp{-O} or @samp{-O2 -fno-schedule-insns} to the CXXFLAGS. With full @samp{-O2}, @code{g++} miscompiles the division routines. Also, for --enable-shared to work, you need egcs-1.1.2 or newer. -On MIPS (SGI Irix 6), pass option @code{--without-gmp} to configure. gmp does -not work when compiled in @samp{n32} binary format on Irix. - By default, only a static library is built. You can build CLN as a shared library too, by calling @code{configure} with the option @samp{--enable-shared}. To get it built as a shared library only, call @code{configure} with the options @@ -411,6 +412,7 @@ library. @section Installing the library +@cindex installation As with any autoconfiguring GNU software, installation is as easy as this: @@ -477,28 +479,39 @@ Rational number Floating-point number @end example +@cindex @code{cl_number} +@cindex abstract class The base class @code{cl_number} is an abstract base class. It is not useful to declare a variable of this type except if you want to completely disable compile-time type checking and use run-time type checking instead. +@cindex @code{cl_N} +@cindex real number +@cindex complex number The class @code{cl_N} comprises real and complex numbers. There is no special class for complex numbers since complex numbers with imaginary part @code{0} are automatically converted to real numbers. +@cindex @code{cl_R} The class @code{cl_R} comprises real numbers of different kinds. It is an abstract class. +@cindex @code{cl_RA} +@cindex rational number +@cindex integer The class @code{cl_RA} comprises exact real numbers: rational numbers, including integers. There is no special class for non-integral rational numbers since rational numbers with denominator @code{1} are automatically converted to integers. +@cindex @code{cl_F} The class @code{cl_F} implements floating-point approximations to real numbers. It is an abstract class. @section Exact numbers +@cindex exact number Some numbers are represented as exact numbers: there is no loss of information when such a number is converted from its mathematical value to its internal @@ -528,6 +541,7 @@ is completely transparent. @section Floating-point numbers +@cindex floating-point number Not all real numbers can be represented exactly. (There is an easy mathematical proof for this: Only a countable set of numbers can be stored exactly in @@ -535,6 +549,7 @@ a computer, even if one assumes that it has unlimited storage. But there are uncountably many real numbers.) So some approximation is needed. CLN implements ordinary floating-point numbers, with mantissa and exponent. +@cindex rounding error The elementary operations (@code{+}, @code{-}, @code{*}, @code{/}, @dots{}) only return approximate results. For example, the value of the expression @code{(cl_F) 0.3 + (cl_F) 0.4} prints as @samp{0.70000005}, not as @@ -556,12 +571,14 @@ Floating point numbers come in four flavors: @itemize @bullet @item +@cindex @code{cl_SF} Short floats, type @code{cl_SF}. They have 1 sign bit, 8 exponent bits (including the exponent's sign), and 17 mantissa bits (including the ``hidden'' bit). They don't consume heap allocation. @item +@cindex @code{cl_FF} Single floats, type @code{cl_FF}. They have 1 sign bit, 8 exponent bits (including the exponent's sign), and 24 mantissa bits (including the ``hidden'' bit). @@ -569,6 +586,7 @@ In CLN, they are represented as IEEE single-precision floating point numbers. This corresponds closely to the C/C++ type @samp{float}. @item +@cindex @code{cl_DF} Double floats, type @code{cl_DF}. They have 1 sign bit, 11 exponent bits (including the exponent's sign), and 53 mantissa bits (including the ``hidden'' bit). @@ -576,6 +594,7 @@ In CLN, they are represented as IEEE double-precision floating point numbers. This corresponds closely to the C/C++ type @samp{double}. @item +@cindex @code{cl_LF} Long floats, type @code{cl_LF}. They have 1 sign bit, 32 exponent bits (including the exponent's sign), and n mantissa bits (including the ``hidden'' bit), where n >= 64. @@ -591,6 +610,7 @@ gradual underflow. If the exponent range of some floating-point type is too limited for your application, choose another floating-point type with larger exponent range. +@cindex @code{cl_F} As a user of CLN, you can forget about the differences between the four floating-point types and just declare all your floating-point variables as being of type @code{cl_F}. This has the advantage that @@ -604,6 +624,7 @@ the floating point contagion rule happened to change in the future.) @section Complex numbers +@cindex complex number Complex numbers, as implemented by the class @code{cl_N}, have a real part and an imaginary part, both real numbers. A complex number whose @@ -615,6 +636,7 @@ through application of @code{sqrt} or transcendental functions. @section Conversions +@cindex conversion Conversions from any class to any its superclasses (``base classes'' in C++ terminology) is done automatically. @@ -656,6 +678,7 @@ Conversions from @samp{const char *} are provided for the classes @code{cl_R}, @code{cl_N}. The easiest way to specify a value which is outside of the range of the C++ built-in types is therefore to specify it as a string, like this: +@cindex Rubik's cube @example cl_I order_of_rubiks_cube_group = "43252003274489856000"; @end example @@ -667,9 +690,13 @@ the functions @table @code @item int cl_I_to_int (const cl_I& x) +@cindex @code{cl_I_to_int ()} @itemx unsigned int cl_I_to_uint (const cl_I& x) +@cindex @code{cl_I_to_uint ()} @itemx long cl_I_to_long (const cl_I& x) +@cindex @code{cl_I_to_long ()} @itemx unsigned long cl_I_to_ulong (const cl_I& x) +@cindex @code{cl_I_to_ulong ()} Returns @code{x} as element of the C type @var{ctype}. If @code{x} is not representable in the range of @var{ctype}, a runtime error occurs. @end table @@ -682,7 +709,9 @@ the functions @table @code @item float cl_float_approx (const @var{type}& x) +@cindex @code{cl_float_approx ()} @itemx double cl_double_approx (const @var{type}& x) +@cindex @code{cl_double_approx ()} Returns an approximation of @code{x} of C type @var{ctype}. If @code{abs(x)} is too close to 0 (underflow), 0 is returned. If @code{abs(x)} is too large (overflow), an IEEE infinity is returned. @@ -692,8 +721,10 @@ Conversions from any class to any of its subclasses (``derived classes'' in C++ terminology) are not provided. Instead, you can assert and check that a value belongs to a certain subclass, and return it as element of that class, using the @samp{As} and @samp{The} macros. +@cindex @code{As() ()} @code{As(@var{type})(@var{value})} checks that @var{value} belongs to @var{type} and returns it as such. +@cindex @code{The() ()} @code{The(@var{type})(@var{value})} assumes that @var{value} belongs to @var{type} and returns it as such. It is your responsibility to ensure that this assumption is valid. @@ -777,24 +808,30 @@ defines the following operations: @table @code @item @var{type} operator + (const @var{type}&, const @var{type}&) +@cindex @code{operator + ()} Addition. @item @var{type} operator - (const @var{type}&, const @var{type}&) +@cindex @code{operator - ()} Subtraction. @item @var{type} operator - (const @var{type}&) Returns the negative of the argument. @item @var{type} plus1 (const @var{type}& x) +@cindex @code{plus1 ()} Returns @code{x + 1}. @item @var{type} minus1 (const @var{type}& x) +@cindex @code{minus1 ()} Returns @code{x - 1}. @item @var{type} operator * (const @var{type}&, const @var{type}&) +@cindex @code{operator * ()} Multiplication. @item @var{type} square (const @var{type}& x) +@cindex @code{square ()} Returns @code{x * x}. @end table @@ -804,9 +841,11 @@ defines the following operations: @table @code @item @var{type} operator / (const @var{type}&, const @var{type}&) +@cindex @code{operator / ()} Division. @item @var{type} recip (const @var{type}&) +@cindex @code{recip ()} Returns the reciprocal of the argument. @end table @@ -818,6 +857,7 @@ Instead, @code{cl_I} defines an ``exact quotient'' function: @table @code @item cl_I exquo (const cl_I& x, const cl_I& y) +@cindex @code{exquo ()} Checks that @code{y} divides @code{x}, and returns the quotient @code{x}/@code{y}. @end table @@ -825,10 +865,12 @@ The following exponentiation functions are defined: @table @code @item cl_I expt_pos (const cl_I& x, const cl_I& y) +@cindex @code{expt_pos ()} @itemx cl_RA expt_pos (const cl_RA& x, const cl_I& y) @code{y} must be > 0. Returns @code{x^y}. @item cl_RA expt (const cl_RA& x, const cl_I& y) +@cindex @code{expt ()} @itemx cl_R expt (const cl_R& x, const cl_I& y) @itemx cl_N expt (const cl_N& x, const cl_I& y) Returns @code{x^y}. @@ -840,6 +882,7 @@ defines the following operation: @table @code @item @var{type} abs (const @var{type}& x) +@cindex @code{abs ()} Returns the absolute value of @code{x}. This is @code{x} if @code{x >= 0}, and @code{-x} if @code{x <= 0}. @end table @@ -857,6 +900,7 @@ defines the following operation: @table @code @item @var{type} signum (const @var{type}& x) +@cindex @code{signum ()} Returns the sign of @code{x}, in the same number format as @code{x}. This is defined as @code{x / abs(x)} if @code{x} is non-zero, and @code{x} if @code{x} is zero. If @code{x} is real, the value is either @@ -870,9 +914,11 @@ Each of the classes @code{cl_RA}, @code{cl_I} defines the following operations: @table @code @item cl_I numerator (const @var{type}& x) +@cindex @code{numerator ()} Returns the numerator of @code{x}. @item cl_I denominator (const @var{type}& x) +@cindex @code{denominator ()} Returns the denominator of @code{x}. @end table @@ -886,6 +932,7 @@ The class @code{cl_N} defines the following operation: @table @code @item cl_N complex (const cl_R& a, const cl_R& b) +@cindex @code{complex ()} Returns the complex number @code{a+bi}, that is, the complex number with real part @code{a} and imaginary part @code{b}. @end table @@ -894,12 +941,15 @@ Each of the classes @code{cl_N}, @code{cl_R} defines the following operations: @table @code @item cl_R realpart (const @var{type}& x) +@cindex @code{realpart ()} Returns the real part of @code{x}. @item cl_R imagpart (const @var{type}& x) +@cindex @code{imagpart ()} Returns the imaginary part of @code{x}. @item @var{type} conjugate (const @var{type}& x) +@cindex @code{conjugate ()} Returns the complex conjugate of @code{x}. @end table @@ -914,6 +964,7 @@ We have the relations @section Comparisons +@cindex comparison Each of the classes @code{cl_N}, @code{cl_R}, @code{cl_RA}, @code{cl_I}, @code{cl_F}, @code{cl_SF}, @code{cl_FF}, @code{cl_DF}, @code{cl_LF} @@ -921,15 +972,19 @@ defines the following operations: @table @code @item bool operator == (const @var{type}&, const @var{type}&) +@cindex @code{operator == ()} @itemx bool operator != (const @var{type}&, const @var{type}&) +@cindex @code{operator != ()} Comparison, as in C and C++. @item uint32 cl_equal_hashcode (const @var{type}&) +@cindex @code{cl_equal_hashcode ()} Returns a 32-bit hash code that is the same for any two numbers which are the same according to @code{==}. This hash code depends on the number's value, not its type or precision. @item cl_boolean zerop (const @var{type}& x) +@cindex @code{zerop ()} Compare against zero: @code{x == 0} @end table @@ -939,25 +994,34 @@ defines the following operations: @table @code @item cl_signean cl_compare (const @var{type}& x, const @var{type}& y) +@cindex @code{cl_compare ()} Compares @code{x} and @code{y}. Returns +1 if @code{x}>@code{y}, -1 if @code{x}<@code{y}, 0 if @code{x}=@code{y}. @item bool operator <= (const @var{type}&, const @var{type}&) +@cindex @code{operator <= ()} @itemx bool operator < (const @var{type}&, const @var{type}&) +@cindex @code{operator < ()} @itemx bool operator >= (const @var{type}&, const @var{type}&) +@cindex @code{operator >= ()} @itemx bool operator > (const @var{type}&, const @var{type}&) +@cindex @code{operator > ()} Comparison, as in C and C++. @item cl_boolean minusp (const @var{type}& x) +@cindex @code{minusp ()} Compare against zero: @code{x < 0} @item cl_boolean plusp (const @var{type}& x) +@cindex @code{plusp ()} Compare against zero: @code{x > 0} @item @var{type} max (const @var{type}& x, const @var{type}& y) +@cindex @code{max ()} Return the maximum of @code{x} and @code{y}. @item @var{type} min (const @var{type}& x, const @var{type}& y) +@cindex @code{min ()} Return the minimum of @code{x} and @code{y}. @end table @@ -970,6 +1034,7 @@ there is no floating point number whose value is exactly @code{1/3}. @section Rounding functions +@cindex rounding When a real number is to be converted to an integer, there is no ``best'' rounding. The desired rounding function depends on the application. @@ -1017,12 +1082,16 @@ defines the following operations: @table @code @item cl_I floor1 (const @var{type}& x) +@cindex @code{floor1 ()} Returns @code{floor(x)}. @item cl_I ceiling1 (const @var{type}& x) +@cindex @code{ceiling1 ()} Returns @code{ceiling(x)}. @item cl_I truncate1 (const @var{type}& x) +@cindex @code{truncate1 ()} Returns @code{truncate(x)}. @item cl_I round1 (const @var{type}& x) +@cindex @code{round1 ()} Returns @code{round(x)}. @end table @@ -1082,9 +1151,13 @@ defines the following operations: @table @code @item struct @var{type}_div_t @{ cl_I quotient; @var{type} remainder; @}; @itemx @var{type}_div_t floor2 (const @var{type}& x, const @var{type}& y) +@cindex @code{floor2 ()} @itemx @var{type}_div_t ceiling2 (const @var{type}& x, const @var{type}& y) +@cindex @code{ceiling2 ()} @itemx @var{type}_div_t truncate2 (const @var{type}& x, const @var{type}& y) +@cindex @code{truncate2 ()} @itemx @var{type}_div_t round2 (const @var{type}& x, const @var{type}& y) +@cindex @code{round2 ()} @end table Sometimes, one wants the quotient as a floating-point number (of the @@ -1097,9 +1170,13 @@ defines the following operations: @table @code @item @var{type} ffloor (const @var{type}& x) +@cindex @code{ffloor ()} @itemx @var{type} fceiling (const @var{type}& x) +@cindex @code{fceiling ()} @itemx @var{type} ftruncate (const @var{type}& x) +@cindex @code{ftruncate ()} @itemx @var{type} fround (const @var{type}& x) +@cindex @code{fround ()} @end table and similarly for class @code{cl_R}, but with return type @code{cl_F}. @@ -1123,9 +1200,13 @@ defines the following operations: @table @code @item struct @var{type}_fdiv_t @{ @var{type} quotient; @var{type} remainder; @}; @itemx @var{type}_fdiv_t ffloor2 (const @var{type}& x) +@cindex @code{ffloor2 ()} @itemx @var{type}_fdiv_t fceiling2 (const @var{type}& x) +@cindex @code{fceiling2 ()} @itemx @var{type}_fdiv_t ftruncate2 (const @var{type}& x) +@cindex @code{ftruncate2 ()} @itemx @var{type}_fdiv_t fround2 (const @var{type}& x) +@cindex @code{fround2 ()} @end table and similarly for class @code{cl_R}, but with quotient type @code{cl_F}. @@ -1159,7 +1240,9 @@ The classes @code{cl_R}, @code{cl_I} define the following operations: @table @code @item @var{type} mod (const @var{type}& x, const @var{type}& y) +@cindex @code{mod ()} @itemx @var{type} rem (const @var{type}& x, const @var{type}& y) +@cindex @code{rem ()} @end table @@ -1171,6 +1254,7 @@ defines the following operation: @table @code @item @var{type} sqrt (const @var{type}& x) +@cindex @code{sqrt ()} @code{x} must be >= 0. This function returns the square root of @code{x}, normalized to be >= 0. If @code{x} is the square of a rational number, @code{sqrt(x)} will be a rational number, else it will return a @@ -1181,6 +1265,7 @@ The classes @code{cl_RA}, @code{cl_I} define the following operation: @table @code @item cl_boolean sqrtp (const @var{type}& x, @var{type}* root) +@cindex @code{sqrtp ()} This tests whether @code{x} is a perfect square. If so, it returns true and the exact square root in @code{*root}, else it returns false. @end table @@ -1189,6 +1274,7 @@ Furthermore, for integers, similarly: @table @code @item cl_boolean isqrt (const @var{type}& x, @var{type}* root) +@cindex @code{isqrt ()} @code{x} should be >= 0. This function sets @code{*root} to @code{floor(sqrt(x))} and returns the same value as @code{sqrtp}: the boolean value @code{(expt(*root,2) == x)}. @@ -1199,6 +1285,7 @@ define the following operation: @table @code @item cl_boolean rootp (const @var{type}& x, const cl_I& n, @var{type}* root) +@cindex @code{rootp ()} @code{x} must be >= 0. @code{n} must be > 0. This tests whether @code{x} is an @code{n}th power of a rational number. If so, it returns true and the exact root in @code{*root}, else it returns @@ -1210,6 +1297,7 @@ for class @code{cl_N}: @table @code @item cl_N sqrt (const cl_N& z) +@cindex @code{sqrt ()} Returns the square root of @code{z}, as defined by the formula @code{sqrt(z) = exp(log(z)/2)}. Conversion to a floating-point type or to a complex number are done if necessary. The range of the result is the @@ -1221,7 +1309,7 @@ The result is an exact number only if @code{z} is an exact number. @section Transcendental functions - +@cindex transcendental functions The transcendental functions return an exact result if the argument is exact and the result is exact as well. Otherwise they must return @@ -1233,21 +1321,25 @@ For example, @code{cos(0) = 1} returns the rational number @code{1}. @table @code @item cl_R exp (const cl_R& x) +@cindex @code{exp ()} @itemx cl_N exp (const cl_N& x) Returns the exponential function of @code{x}. This is @code{e^x} where @code{e} is the base of the natural logarithms. The range of the result is the entire complex plane excluding 0. @item cl_R ln (const cl_R& x) +@cindex @code{ln ()} @code{x} must be > 0. Returns the (natural) logarithm of x. @item cl_N log (const cl_N& x) +@cindex @code{log ()} Returns the (natural) logarithm of x. If @code{x} is real and positive, this is @code{ln(x)}. In general, @code{log(x) = log(abs(x)) + i*phase(x)}. The range of the result is the strip in the complex plane @code{-pi < imagpart(log(x)) <= pi}. @item cl_R phase (const cl_N& x) +@cindex @code{phase ()} Returns the angle part of @code{x} in its polar representation as a complex number. That is, @code{phase(x) = atan(realpart(x),imagpart(x))}. This is also the imaginary part of @code{log(x)}. @@ -1266,6 +1358,7 @@ Returns the logarithm of @code{a} with respect to base @code{b}. @code{log(a,b) = log(a)/log(b)}. @item cl_N expt (const cl_N& x, const cl_N& y) +@cindex @code{expt ()} Exponentiation: Returns @code{x^y = exp(y*log(x))}. @end table @@ -1273,6 +1366,7 @@ The constant e = exp(1) = 2.71828@dots{} is returned by the following functions: @table @code @item cl_F cl_exp1 (cl_float_format_t f) +@cindex @code{exp1 ()} Returns e as a float of format @code{f}. @item cl_F cl_exp1 (const cl_F& y) @@ -1287,6 +1381,7 @@ Returns e as a float of format @code{cl_default_float_format}. @table @code @item cl_R sin (const cl_R& x) +@cindex @code{sin ()} Returns @code{sin(x)}. The range of the result is the interval @code{-1 <= sin(x) <= 1}. @@ -1294,6 +1389,7 @@ Returns @code{sin(x)}. The range of the result is the interval Returns @code{sin(z)}. The range of the result is the entire complex plane. @item cl_R cos (const cl_R& x) +@cindex @code{cos ()} Returns @code{cos(x)}. The range of the result is the interval @code{-1 <= cos(x) <= 1}. @@ -1301,20 +1397,26 @@ Returns @code{cos(x)}. The range of the result is the interval Returns @code{cos(z)}. The range of the result is the entire complex plane. @item struct cl_cos_sin_t @{ cl_R cos; cl_R sin; @}; +@cindex @code{cl_cos_sin_t} @itemx cl_cos_sin_t cl_cos_sin (const cl_R& x) Returns both @code{sin(x)} and @code{cos(x)}. This is more efficient than +@cindex @code{cl_cos_sin ()} computing them separately. The relation @code{cos^2 + sin^2 = 1} will hold only approximately. @item cl_R tan (const cl_R& x) +@cindex @code{tan ()} @itemx cl_N tan (const cl_N& x) Returns @code{tan(x) = sin(x)/cos(x)}. @item cl_N cis (const cl_R& x) +@cindex @code{cis ()} @itemx cl_N cis (const cl_N& x) Returns @code{exp(i*x)}. The name @samp{cis} means ``cos + i sin'', because @code{e^(i*x) = cos(x) + i*sin(x)}. +@cindex @code{asin} +@cindex @code{asin ()} @item cl_N asin (const cl_N& z) Returns @code{arcsin(z)}. This is defined as @code{arcsin(z) = log(iz+sqrt(1-z^2))/i} and satisfies @@ -1329,6 +1431,7 @@ results for arsinh. @end ignore @item cl_N acos (const cl_N& z) +@cindex @code{acos ()} Returns @code{arccos(z)}. This is defined as @code{arccos(z) = pi/2 - arcsin(z) = log(z+i*sqrt(1-z^2))/i} @ignore @@ -1344,6 +1447,8 @@ with @code{realpart = pi} and @code{imagpart > 0}. Proof: This follows from the results about arcsin. @end ignore +@cindex @code{atan} +@cindex @code{atan ()} @item cl_R atan (const cl_R& x, const cl_R& y) Returns the angle of the polar representation of the complex number @code{x+iy}. This is @code{atan(y/x)} if @code{x>0}. The range of @@ -1371,10 +1476,13 @@ Proof: arctan(z) = artanh(iz)/i, we know the range of the artanh function. @end table -The constant pi = 3.14@dots{} is returned by the following functions: +@cindex pi +@cindex Archimedes' constant +Archimedes' constant pi = 3.14@dots{} is returned by the following functions: @table @code @item cl_F cl_pi (cl_float_format_t f) +@cindex @code{cl_pi} Returns pi as a float of format @code{f}. @item cl_F cl_pi (const cl_F& y) @@ -1389,12 +1497,14 @@ Returns pi as a float of format @code{cl_default_float_format}. @table @code @item cl_R sinh (const cl_R& x) +@cindex @code{sinh ()} Returns @code{sinh(x)}. @item cl_N sinh (const cl_N& z) Returns @code{sinh(z)}. The range of the result is the entire complex plane. @item cl_R cosh (const cl_R& x) +@cindex @code{cosh ()} Returns @code{cosh(x)}. The range of the result is the interval @code{cosh(x) >= 1}. @@ -1402,16 +1512,20 @@ Returns @code{cosh(x)}. The range of the result is the interval Returns @code{cosh(z)}. The range of the result is the entire complex plane. @item struct cl_cosh_sinh_t @{ cl_R cosh; cl_R sinh; @}; +@cindex @code{cl_cosh_sinh_t} @itemx cl_cosh_sinh_t cl_cosh_sinh (const cl_R& x) +@cindex @code{cl_cosh_sinh ()} Returns both @code{sinh(x)} and @code{cosh(x)}. This is more efficient than computing them separately. The relation @code{cosh^2 - sinh^2 = 1} will hold only approximately. @item cl_R tanh (const cl_R& x) +@cindex @code{tanh ()} @itemx cl_N tanh (const cl_N& x) Returns @code{tanh(x) = sinh(x)/cosh(x)}. @item cl_N asinh (const cl_N& z) +@cindex @code{asinh ()} Returns @code{arsinh(z)}. This is defined as @code{arsinh(z) = log(z+sqrt(1+z^2))} and satisfies @code{arsinh(-z) = -arsinh(z)}. @@ -1443,6 +1557,7 @@ log(sqrt(1+z^2)+z) = 2 artanh(z/(1+sqrt(1+z^2))) @end ignore @item cl_N acosh (const cl_N& z) +@cindex @code{acosh ()} Returns @code{arcosh(z)}. This is defined as @code{arcosh(z) = 2*log(sqrt((z+1)/2)+sqrt((z-1)/2))}. The range of the result is the half-strip in the complex domain @@ -1488,6 +1603,7 @@ Otherwise, -z is in Range(sqrt). @end ignore @item cl_N atanh (const cl_N& z) +@cindex @code{atanh ()} Returns @code{artanh(z)}. This is defined as @code{artanh(z) = (log(1+z)-log(1-z)) / 2} and satisfies @code{artanh(-z) = -artanh(z)}. The range of the result is @@ -1519,11 +1635,13 @@ Proof: Write z = x+iy. Examine @subsection Euler gamma +@cindex Euler's constant Euler's constant C = 0.577@dots{} is returned by the following functions: @table @code @item cl_F cl_eulerconst (cl_float_format_t f) +@cindex @code{cl_eulerconst ()} Returns Euler's constant as a float of format @code{f}. @item cl_F cl_eulerconst (const cl_F& y) @@ -1534,9 +1652,11 @@ Returns Euler's constant as a float of format @code{cl_default_float_format}. @end table Catalan's constant G = 0.915@dots{} is returned by the following functions: +@cindex Catalan's constant @table @code @item cl_F cl_catalanconst (cl_float_format_t f) +@cindex @code{cl_catalanconst ()} Returns Catalan's constant as a float of format @code{f}. @item cl_F cl_catalanconst (const cl_F& y) @@ -1548,12 +1668,14 @@ Returns Catalan's constant as a float of format @code{cl_default_float_format}. @subsection Riemann zeta +@cindex Riemann's zeta Riemann's zeta function at an integral point @code{s>1} is returned by the following functions: @table @code @item cl_F cl_zeta (int s, cl_float_format_t f) +@cindex @code{cl_zeta ()} Returns Riemann's zeta function at @code{s} as a float of format @code{f}. @item cl_F cl_zeta (int s, const cl_F& y) @@ -1582,46 +1704,62 @@ on each of the bit positions in parallel. @table @code @item cl_I lognot (const cl_I& x) +@cindex @code{lognot ()} @itemx cl_I operator ~ (const cl_I& x) +@cindex @code{operator ~ ()} Logical not, like @code{~x} in C. This is the same as @code{-1-x}. @item cl_I logand (const cl_I& x, const cl_I& y) +@cindex @code{logand ()} @itemx cl_I operator & (const cl_I& x, const cl_I& y) +@cindex @code{operator & ()} Logical and, like @code{x & y} in C. @item cl_I logior (const cl_I& x, const cl_I& y) +@cindex @code{logior ()} @itemx cl_I operator | (const cl_I& x, const cl_I& y) +@cindex @code{operator | ()} Logical (inclusive) or, like @code{x | y} in C. @item cl_I logxor (const cl_I& x, const cl_I& y) +@cindex @code{logxor ()} @itemx cl_I operator ^ (const cl_I& x, const cl_I& y) +@cindex @code{operator ^ ()} Exclusive or, like @code{x ^ y} in C. @item cl_I logeqv (const cl_I& x, const cl_I& y) +@cindex @code{logeqv ()} Bitwise equivalence, like @code{~(x ^ y)} in C. @item cl_I lognand (const cl_I& x, const cl_I& y) +@cindex @code{lognand ()} Bitwise not and, like @code{~(x & y)} in C. @item cl_I lognor (const cl_I& x, const cl_I& y) +@cindex @code{lognor ()} Bitwise not or, like @code{~(x | y)} in C. @item cl_I logandc1 (const cl_I& x, const cl_I& y) +@cindex @code{logandc1 ()} Logical and, complementing the first argument, like @code{~x & y} in C. @item cl_I logandc2 (const cl_I& x, const cl_I& y) +@cindex @code{logandc2 ()} Logical and, complementing the second argument, like @code{x & ~y} in C. @item cl_I logorc1 (const cl_I& x, const cl_I& y) +@cindex @code{logorc1 ()} Logical or, complementing the first argument, like @code{~x | y} in C. @item cl_I logorc2 (const cl_I& x, const cl_I& y) +@cindex @code{logorc2 ()} Logical or, complementing the second argument, like @code{x | ~y} in C. @end table These operations are all available though the function @table @code @item cl_I boole (cl_boole op, const cl_I& x, const cl_I& y) +@cindex @code{boole ()} @end table where @code{op} must have one of the 16 values (each one stands for a function which combines two bits into one bit): @code{boole_clr}, @code{boole_set}, @@ -1629,19 +1767,38 @@ which combines two bits into one bit): @code{boole_clr}, @code{boole_set}, @code{boole_and}, @code{boole_ior}, @code{boole_xor}, @code{boole_eqv}, @code{boole_nand}, @code{boole_nor}, @code{boole_andc1}, @code{boole_andc2}, @code{boole_orc1}, @code{boole_orc2}. +@cindex @code{boole_clr} +@cindex @code{boole_set} +@cindex @code{boole_1} +@cindex @code{boole_2} +@cindex @code{boole_c1} +@cindex @code{boole_c2} +@cindex @code{boole_and} +@cindex @code{boole_xor} +@cindex @code{boole_eqv} +@cindex @code{boole_nand} +@cindex @code{boole_nor} +@cindex @code{boole_andc1} +@cindex @code{boole_andc2} +@cindex @code{boole_orc1} +@cindex @code{boole_orc2} + Other functions that view integers as bit strings: @table @code @item cl_boolean logtest (const cl_I& x, const cl_I& y) +@cindex @code{logtest ()} Returns true if some bit is set in both @code{x} and @code{y}, i.e. if @code{logand(x,y) != 0}. @item cl_boolean logbitp (const cl_I& n, const cl_I& x) +@cindex @code{logbitp ()} Returns true if the @code{n}th bit (from the right) of @code{x} is set. Bit 0 is the least significant bit. @item uintL logcount (const cl_I& x) +@cindex @code{logcount ()} Returns the number of one bits in @code{x}, if @code{x} >= 0, or the number of zero bits in @code{x}, if @code{x} < 0. @end table @@ -1651,20 +1808,24 @@ The type @example struct cl_byte @{ uintL size; uintL position; @}; @end example +@cindex @code{cl_byte} represents the bit interval containing the bits @code{position}@dots{}@code{position+size-1} of an integer. The constructor @code{cl_byte(size,position)} constructs a @code{cl_byte}. @table @code @item cl_I ldb (const cl_I& n, const cl_byte& b) +@cindex @code{ldb ()} extracts the bits of @code{n} described by the bit interval @code{b} and returns them as a nonnegative integer with @code{b.size} bits. @item cl_boolean ldb_test (const cl_I& n, const cl_byte& b) +@cindex @code{ldb_test ()} Returns true if some bit described by the bit interval @code{b} is set in @code{n}. @item cl_I dpb (const cl_I& newbyte, const cl_I& n, const cl_byte& b) +@cindex @code{dpb ()} Returns @code{n}, with the bits described by the bit interval @code{b} replaced by @code{newbyte}. Only the lowest @code{b.size} bits of @code{newbyte} are relevant. @@ -1675,10 +1836,12 @@ functions are their counterparts without shifting: @table @code @item cl_I mask_field (const cl_I& n, const cl_byte& b) +@cindex @code{mask_field ()} returns an integer with the bits described by the bit interval @code{b} copied from the corresponding bits in @code{n}, the other bits zero. @item cl_I deposit_field (const cl_I& newbyte, const cl_I& n, const cl_byte& b) +@cindex @code{deposit_field ()} returns an integer where the bits described by the bit interval @code{b} come from @code{newbyte} and the other bits come from @code{n}. @end table @@ -1699,39 +1862,47 @@ for common arithmetic operations: @table @code @item cl_boolean oddp (const cl_I& x) +@cindex @code{oddp ()} Returns true if the least significant bit of @code{x} is 1. Equivalent to @code{mod(x,2) != 0}. @item cl_boolean evenp (const cl_I& x) +@cindex @code{evenp ()} Returns true if the least significant bit of @code{x} is 0. Equivalent to @code{mod(x,2) == 0}. @item cl_I operator << (const cl_I& x, const cl_I& n) +@cindex @code{operator << ()} Shifts @code{x} by @code{n} bits to the left. @code{n} should be >=0. Equivalent to @code{x * expt(2,n)}. @item cl_I operator >> (const cl_I& x, const cl_I& n) +@cindex @code{operator >> ()} Shifts @code{x} by @code{n} bits to the right. @code{n} should be >=0. Bits shifted out to the right are thrown away. Equivalent to @code{floor(x / expt(2,n))}. @item cl_I ash (const cl_I& x, const cl_I& y) +@cindex @code{ash ()} Shifts @code{x} by @code{y} bits to the left (if @code{y}>=0) or by @code{-y} bits to the right (if @code{y}<=0). In other words, this returns @code{floor(x * expt(2,y))}. @item uintL integer_length (const cl_I& x) +@cindex @code{integer_length ()} Returns the number of bits (excluding the sign bit) needed to represent @code{x} in two's complement notation. This is the smallest n >= 0 such that -2^n <= x < 2^n. If x > 0, this is the unique n > 0 such that 2^(n-1) <= x < 2^n. @item uintL ord2 (const cl_I& x) +@cindex @code{ord2 ()} @code{x} must be non-zero. This function returns the number of 0 bits at the right of @code{x} in two's complement notation. This is the largest n >= 0 such that 2^n divides @code{x}. @item uintL power2p (const cl_I& x) +@cindex @code{power2p ()} @code{x} must be > 0. This function checks whether @code{x} is a power of 2. If @code{x} = 2^(n-1), it returns n. Else it returns 0. (See also the function @code{logp}.) @@ -1742,11 +1913,13 @@ If @code{x} = 2^(n-1), it returns n. Else it returns 0. @table @code @item uint32 gcd (uint32 a, uint32 b) +@cindex @code{gcd ()} @itemx cl_I gcd (const cl_I& a, const cl_I& b) This function returns the greatest common divisor of @code{a} and @code{b}, normalized to be >= 0. @item cl_I xgcd (const cl_I& a, const cl_I& b, cl_I* u, cl_I* v) +@cindex @code{xgcd ()} This function (``extended gcd'') returns the greatest common divisor @code{g} of @code{a} and @code{b} and at the same time the representation of @code{g} as an integral linear combination of @code{a} and @code{b}: @@ -1757,10 +1930,12 @@ value, in the following sense: If @code{a} and @code{b} are non-zero, and @code{abs(u) <= abs(b)/(2*g)}, @code{abs(v) <= abs(a)/(2*g)}. @item cl_I lcm (const cl_I& a, const cl_I& b) +@cindex @code{lcm ()} This function returns the least common multiple of @code{a} and @code{b}, normalized to be >= 0. @item cl_boolean logp (const cl_I& a, const cl_I& b, cl_RA* l) +@cindex @code{logp ()} @itemx cl_boolean logp (const cl_RA& a, const cl_RA& b, cl_RA* l) @code{a} must be > 0. @code{b} must be >0 and != 1. If log(a,b) is rational number, this function returns true and sets *l = log(a,b), else @@ -1772,15 +1947,18 @@ it returns false. @table @code @item cl_I factorial (uintL n) +@cindex @code{factorial ()} @code{n} must be a small integer >= 0. This function returns the factorial @code{n}! = @code{1*2*@dots{}*n}. @item cl_I doublefactorial (uintL n) +@cindex @code{doublefactorial ()} @code{n} must be a small integer >= 0. This function returns the doublefactorial @code{n}!! = @code{1*3*@dots{}*n} or @code{n}!! = @code{2*4*@dots{}*n}, respectively. @item cl_I binomial (uintL n, uintL k) +@cindex @code{binomial ()} @code{n} and @code{k} must be small integers >= 0. This function returns the binomial coefficient @tex @@ -1805,6 +1983,7 @@ defines the following operations. @table @code @item @var{type} scale_float (const @var{type}& x, sintL delta) +@cindex @code{scale_float ()} @itemx @var{type} scale_float (const @var{type}& x, const cl_I& delta) Returns @code{x*2^delta}. This is more efficient than an explicit multiplication because it copies @code{x} and modifies the exponent. @@ -1815,23 +1994,28 @@ representation of floating-point numbers. @table @code @item sintL float_exponent (const @var{type}& x) +@cindex @code{float_exponent ()} Returns the exponent @code{e} of @code{x}. For @code{x = 0.0}, this is 0. For @code{x} non-zero, this is the unique integer with @code{2^(e-1) <= abs(x) < 2^e}. @item sintL float_radix (const @var{type}& x) +@cindex @code{float_radix ()} Returns the base of the floating-point representation. This is always @code{2}. @item @var{type} float_sign (const @var{type}& x) +@cindex @code{float_sign ()} Returns the sign @code{s} of @code{x} as a float. The value is 1 for @code{x} >= 0, -1 for @code{x} < 0. @item uintL float_digits (const @var{type}& x) +@cindex @code{float_digits ()} Returns the number of mantissa bits in the floating-point representation of @code{x}, including the hidden bit. The value only depends on the type of @code{x}, not on its value. @item uintL float_precision (const @var{type}& x) +@cindex @code{float_precision ()} Returns the number of significant mantissa bits in the floating-point representation of @code{x}. Since denormalized numbers are not supported, this is the same as @code{float_digits(x)} if @code{x} is non-zero, and @@ -1839,6 +2023,11 @@ this is the same as @code{float_digits(x)} if @code{x} is non-zero, and @end table The complete internal representation of a float is encoded in the type +@cindex @code{cl_decoded_float} +@cindex @code{cl_decoded_sfloat} +@cindex @code{cl_decoded_ffloat} +@cindex @code{cl_decoded_dfloat} +@cindex @code{cl_decoded_lfloat} @code{cl_decoded_float} (or @code{cl_decoded_sfloat}, @code{cl_decoded_ffloat}, @code{cl_decoded_dfloat}, @code{cl_decoded_lfloat}, respectively), defined by @example @@ -1851,6 +2040,7 @@ and returned by the function @table @code @item cl_decoded_@var{type}float decode_float (const @var{type}& x) +@cindex @code{decode_float ()} For @code{x} non-zero, this returns @code{(-1)^s}, @code{e}, @code{m} with @code{x = (-1)^s * 2^e * m} and @code{0.5 <= m < 1.0}. For @code{x} = 0, it returns @code{(-1)^s}=1, @code{e}=0, @code{m}=0. @@ -1859,6 +2049,7 @@ it returns @code{(-1)^s}=1, @code{e}=0, @code{m}=0. A complete decoding in terms of integers is provided as type @example +@cindex @code{cl_idecoded_float} struct cl_idecoded_float @{ cl_I mantissa; cl_I exponent; cl_I sign; @}; @@ -1867,6 +2058,7 @@ by the following function: @table @code @item cl_idecoded_float integer_decode_float (const @var{type}& x) +@cindex @code{integer_decode_float ()} For @code{x} non-zero, this returns @code{(-1)^s}, @code{e}, @code{m} with @code{x = (-1)^s * 2^e * m} and @code{m} an integer with @code{float_digits(x)} bits. For @code{x} = 0, it returns @code{(-1)^s}=1, @code{e}=0, @code{m}=0. @@ -1878,6 +2070,7 @@ Some other function, implemented only for class @code{cl_F}: @table @code @item cl_F float_sign (const cl_F& x, const cl_F& y) +@cindex @code{float_sign ()} This returns a floating point number whose precision and absolute value is that of @code{y} and whose sign is that of @code{x}. If @code{x} is zero, it is treated as positive. Same for @code{y}. @@ -1885,6 +2078,7 @@ zero, it is treated as positive. Same for @code{y}. @section Conversion functions +@cindex conversion @subsection Conversion to floating-point numbers @@ -1892,6 +2086,7 @@ The type @code{cl_float_format_t} describes a floating-point format. @table @code @item cl_float_format_t cl_float_format (uintL n) +@cindex @code{cl_float_format ()} Returns the smallest float format which guarantees at least @code{n} decimal digits in the mantissa (after the decimal point). @@ -1899,6 +2094,7 @@ decimal digits in the mantissa (after the decimal point). Returns the floating point format of @code{x}. @item cl_float_format_t cl_default_float_format +@cindex @code{cl_default_float_format} Global variable: the default float format used when converting rational numbers to floats. @end table @@ -1910,6 +2106,7 @@ defines the following operations: @table @code @item cl_F cl_float (const @var{type}&x, cl_float_format_t f) +@cindex @code{cl_float} Returns @code{x} as a float of format @code{f}. @item cl_F cl_float (const @var{type}&x, const cl_F& y) Returns @code{x} in the float format of @code{y}. @@ -1924,23 +2121,29 @@ Every floating-point format has some characteristic numbers: @table @code @item cl_F most_positive_float (cl_float_format_t f) +@cindex @code{most_positive_float ()} Returns the largest (most positive) floating point number in float format @code{f}. @item cl_F most_negative_float (cl_float_format_t f) +@cindex @code{most_negative_float ()} Returns the smallest (most negative) floating point number in float format @code{f}. @item cl_F least_positive_float (cl_float_format_t f) +@cindex @code{least_positive_float ()} Returns the least positive floating point number (i.e. > 0 but closest to 0) in float format @code{f}. @item cl_F least_negative_float (cl_float_format_t f) +@cindex @code{least_negative_float ()} Returns the least negative floating point number (i.e. < 0 but closest to 0) in float format @code{f}. @item cl_F float_epsilon (cl_float_format_t f) +@cindex @code{float_epsilon ()} Returns the smallest floating point number e > 0 such that @code{1+e != 1}. @item cl_F float_negative_epsilon (cl_float_format_t f) +@cindex @code{float_negative_epsilon ()} Returns the smallest floating point number e > 0 such that @code{1-e != 1}. @end table @@ -1952,6 +2155,7 @@ defines the following operation: @table @code @item cl_RA rational (const @var{type}& x) +@cindex @code{rational ()} Returns the value of @code{x} as an exact number. If @code{x} is already an exact number, this is @code{x}. If @code{x} is a floating-point number, the value is a rational number whose denominator is a power of 2. @@ -1962,6 +2166,7 @@ the function @table @code @item cl_RA rationalize (const cl_R& x) +@cindex @code{rationalize ()} If @code{x} is a floating-point number, it actually represents an interval of real numbers, and this function returns the rational number with smallest denominator (and smallest numerator, in magnitude) @@ -1993,6 +2198,7 @@ Calling one of these modifies the state of the random number generator in a complicated but deterministic way. The global variable +@cindex @code{cl_default_random_state} @example cl_random_state cl_default_random_state @end example @@ -2002,26 +2208,31 @@ below are called without @code{cl_random_state} argument. @table @code @item uint32 random32 (cl_random_state& randomstate) @itemx uint32 random32 () +@cindex @code{random32 ()} Returns a random unsigned 32-bit number. All bits are equally random. @item cl_I random_I (cl_random_state& randomstate, const cl_I& n) @itemx cl_I random_I (const cl_I& n) +@cindex @code{random_I ()} @code{n} must be an integer > 0. This function returns a random integer @code{x} in the range @code{0 <= x < n}. @item cl_F random_F (cl_random_state& randomstate, const cl_F& n) @itemx cl_F random_F (const cl_F& n) +@cindex @code{random_F ()} @code{n} must be a float > 0. This function returns a random floating-point number of the same format as @code{n} in the range @code{0 <= x < n}. @item cl_R random_R (cl_random_state& randomstate, const cl_R& n) @itemx cl_R random_R (const cl_R& n) +@cindex @code{random_R ()} Behaves like @code{random_I} if @code{n} is an integer and like @code{random_F} if @code{n} is a float. @end table @section Obfuscating operators +@cindex modifying operators The modifying C/C++ operators @code{+=}, @code{-=}, @code{*=}, @code{/=}, @code{&=}, @code{|=}, @code{^=}, @code{<<=}, @code{>>=} @@ -2032,6 +2243,7 @@ to get happy, then add @example #define WANT_OBFUSCATING_OPERATORS @end example +@cindex @code{WANT_OBFUSCATING_OPERATORS} to the beginning of your source files, before the inclusion of any CLN include files. This flag will enable the following operators: @@ -2040,9 +2252,13 @@ For the classes @code{cl_N}, @code{cl_R}, @code{cl_RA}, @table @code @item @var{type}& operator += (@var{type}&, const @var{type}&) +@cindex @code{operator += ()} @itemx @var{type}& operator -= (@var{type}&, const @var{type}&) +@cindex @code{operator -= ()} @itemx @var{type}& operator *= (@var{type}&, const @var{type}&) +@cindex @code{operator *= ()} @itemx @var{type}& operator /= (@var{type}&, const @var{type}&) +@cindex @code{operator /= ()} @end table For the class @code{cl_I}: @@ -2052,10 +2268,15 @@ For the class @code{cl_I}: @itemx @var{type}& operator -= (@var{type}&, const @var{type}&) @itemx @var{type}& operator *= (@var{type}&, const @var{type}&) @itemx @var{type}& operator &= (@var{type}&, const @var{type}&) +@cindex @code{operator &= ()} @itemx @var{type}& operator |= (@var{type}&, const @var{type}&) +@cindex @code{operator |= ()} @itemx @var{type}& operator ^= (@var{type}&, const @var{type}&) +@cindex @code{operator ^= ()} @itemx @var{type}& operator <<= (@var{type}&, const @var{type}&) +@cindex @code{operator <<= ()} @itemx @var{type}& operator >>= (@var{type}&, const @var{type}&) +@cindex @code{operator >>= ()} @end table For the classes @code{cl_N}, @code{cl_R}, @code{cl_RA}, @code{cl_I}, @@ -2063,12 +2284,14 @@ For the classes @code{cl_N}, @code{cl_R}, @code{cl_RA}, @code{cl_I}, @table @code @item @var{type}& operator ++ (@var{type}& x) +@cindex @code{operator ++ ()} The prefix operator @code{++x}. @item void operator ++ (@var{type}& x, int) The postfix operator @code{x++}. @item @var{type}& operator -- (@var{type}& x) +@cindex @code{operator -- ()} The prefix operator @code{--x}. @item void operator -- (@var{type}& x, int) @@ -2081,8 +2304,10 @@ efficient. @chapter Input/Output +@cindex Input/Output @section Internal and printed representation +@cindex representation All computations deal with the internal representations of the numbers. @@ -2091,8 +2316,10 @@ Several external representations may denote the same number, for example, "20.0" and "20.000". Converting an internal to an external representation is called ``printing'', +@cindex printing converting an external to an internal representation is called ``reading''. -In CLN, is it always true that conversion of an internal to an external +@cindex reading +In CLN, it is always true that conversion of an internal to an external representation and then back to an internal representation will yield the same internal representation. Symbolically: @code{read(print(x)) == x}. This is called ``print-read consistency''. @@ -2366,7 +2593,7 @@ using this variable name. Default is @code{"x"}. @end table The global variable @code{cl_default_print_flags} contains the default values, -used by the function @code{fprint}, +used by the function @code{fprint}. @chapter Rings @@ -2433,8 +2660,10 @@ Tests whether the given number is an element of the number ring R. @chapter Modular integers +@cindex modular integer @section Modular integer rings +@cindex ring CLN implements modular integers, i.e. integers modulo a fixed integer N. The modulus is explicitly part of every modular integer. CLN doesn't @@ -2468,9 +2697,11 @@ Modular integer rings are constructed using the function @table @code @item cl_modint_ring cl_find_modint_ring (const cl_I& N) +@cindex @code{cl_find_modint_ring ()} This function returns the modular ring @samp{Z/NZ}. It takes care of finding out about special cases of @code{N}, like powers of two and odd numbers for which Montgomery multiplication will be a win, +@cindex Montgomery multiplication and precomputes any necessary auxiliary data for computing modulo @code{N}. There is a cache table of rings, indexed by @code{N} (or, more precisely, by @code{abs(N)}). This ensures that the precomputation costs are reduced @@ -2481,7 +2712,9 @@ Modular integer rings can be compared for equality: @table @code @item bool operator== (const cl_modint_ring&, const cl_modint_ring&) +@cindex @code{operator == ()} @itemx bool operator!= (const cl_modint_ring&, const cl_modint_ring&) +@cindex @code{operator != ()} These compare two modular integer rings for equality. Two different calls to @code{cl_find_modint_ring} with the same argument necessarily return the same ring because it is memoized in the cache table. @@ -2493,23 +2726,29 @@ Given a modular integer ring @code{R}, the following members can be used. @table @code @item cl_I R->modulus +@cindex @code{modulus} This is the ring's modulus, normalized to be nonnegative: @code{abs(N)}. @item cl_MI R->zero() +@cindex @code{zero ()} This returns @code{0 mod N}. @item cl_MI R->one() +@cindex @code{one ()} This returns @code{1 mod N}. @item cl_MI R->canonhom (const cl_I& x) +@cindex @code{canonhom ()} This returns @code{x mod N}. @item cl_I R->retract (const cl_MI& x) +@cindex @code{etract ()} This is a partial inverse function to @code{R->canonhom}. It returns the standard representative (@code{>=0}, @code{random(cl_random_state& randomstate) @itemx cl_MI R->random() +@cindex @code{random ()} This returns a random integer modulo @code{N}. @end table @@ -2517,13 +2756,16 @@ The following operations are defined on modular integers. @table @code @item cl_modint_ring x.ring () +@cindex @code{ring()} Returns the ring to which the modular integer @code{x} belongs. @item cl_MI operator+ (const cl_MI&, const cl_MI&) +@cindex @code{operator + ()} Returns the sum of two modular integers. One of the arguments may also be a plain integer. @item cl_MI operator- (const cl_MI&, const cl_MI&) +@cindex @code{operator - ()} Returns the difference of two modular integers. One of the arguments may also be a plain integer. @@ -2531,40 +2773,51 @@ a plain integer. Returns the negative of a modular integer. @item cl_MI operator* (const cl_MI&, const cl_MI&) +@cindex @code{operator * ()} Returns the product of two modular integers. One of the arguments may also be a plain integer. @item cl_MI square (const cl_MI&) +@cindex @code{square ()} Returns the square of a modular integer. @item cl_MI recip (const cl_MI& x) +@cindex @code{recip ()} Returns the reciprocal @code{x^-1} of a modular integer @code{x}. @code{x} must be coprime to the modulus, otherwise an error message is issued. @item cl_MI div (const cl_MI& x, const cl_MI& y) +@cindex @code{div ()} Returns the quotient @code{x*y^-1} of two modular integers @code{x}, @code{y}. @code{y} must be coprime to the modulus, otherwise an error message is issued. @item cl_MI expt_pos (const cl_MI& x, const cl_I& y) +@cindex @code{expt_pos ()} @code{y} must be > 0. Returns @code{x^y}. @item cl_MI expt (const cl_MI& x, const cl_I& y) +@cindex @code{expt ()} Returns @code{x^y}. If @code{y} is negative, @code{x} must be coprime to the modulus, else an error message is issued. @item cl_MI operator<< (const cl_MI& x, const cl_I& y) +@cindex @code{operator << ()} Returns @code{x*2^y}. @item cl_MI operator>> (const cl_MI& x, const cl_I& y) +@cindex @code{operator >> ()} Returns @code{x*2^-y}. When @code{y} is positive, the modulus must be odd, or an error message is issued. @item bool operator== (const cl_MI&, const cl_MI&) +@cindex @code{operator == ()} @itemx bool operator!= (const cl_MI&, const cl_MI&) +@cindex @code{operator != ()} Compares two modular integers, belonging to the same modular integer ring, for equality. @item cl_boolean zerop (const cl_MI& x) +@cindex @code{zerop ()} Returns true if @code{x} is @code{0 mod N}. @end table @@ -2573,17 +2826,21 @@ input/output). @table @code @item void fprint (cl_ostream stream, const cl_MI& x) +@cindex @code{fprint ()} @itemx cl_ostream operator<< (cl_ostream stream, const cl_MI& x) +@cindex @code{operator << ()} Prints the modular integer @code{x} on the @code{stream}. The output may depend on the global printer settings in the variable @code{cl_default_print_flags}. @end table @chapter Symbolic data types +@cindex symbolic type CLN implements two symbolic (non-numeric) data types: strings and symbols. @section Strings +@cindex string The class @@ -2599,6 +2856,7 @@ Strings are constructed through the following constructors: @table @code @item cl_string (const char * s) +@cindex @code{cl_string ()} Returns an immutable copy of the (zero-terminated) C string @code{s}. @item cl_string (const char * ptr, unsigned long len) @@ -2613,19 +2871,24 @@ The following functions are available on strings: Assignment from @code{cl_string} and @code{const char *}. @item s.length() +@cindex @code{length ()} @itemx strlen(s) +@cindex @code{strlen ()} Returns the length of the string @code{s}. @item s[i] +@cindex @code{operator [] ()} Returns the @code{i}th character of the string @code{s}. @code{i} must be in the range @code{0 <= i < s.length()}. @item bool equal (const cl_string& s1, const cl_string& s2) +@cindex @code{equal ()} Compares two strings for equality. One of the arguments may also be a plain @code{const char *}. @end table @section Symbols +@cindex symbol Symbols are uniquified strings: all symbols with the same name are shared. This means that comparison of two symbols is fast (effectively just a pointer @@ -2638,6 +2901,7 @@ Symbols are constructed through the following constructor: @table @code @item cl_symbol (const cl_string& s) +@cindex @code{cl_symbol ()} Looks up or creates a new symbol with a given name. @end table @@ -2649,11 +2913,14 @@ Conversion to @code{cl_string}: Returns the string which names the symbol @code{sym}. @item bool equal (const cl_symbol& sym1, const cl_symbol& sym2) +@cindex @code{equal ()} Compares two symbols for equality. This is very fast. @end table @chapter Univariate polynomials +@cindex polynomial +@cindex univariate polynomial @section Univariate polynomial rings @@ -2749,6 +3016,7 @@ This ensures that two calls of this function with the same arguments will return the same polynomial ring. @item cl_univpoly_complex_ring cl_find_univpoly_ring (const cl_complex_ring& R) +@cindex @code{cl_find_univpoly_ring ()} @itemx cl_univpoly_complex_ring cl_find_univpoly_ring (const cl_complex_ring& R, const cl_symbol& varname) @itemx cl_univpoly_real_ring cl_find_univpoly_ring (const cl_real_ring& R) @itemx cl_univpoly_real_ring cl_find_univpoly_ring (const cl_real_ring& R, const cl_symbol& varname) @@ -2768,22 +3036,28 @@ Given a univariate polynomial ring @code{R}, the following members can be used. @table @code @item cl_ring R->basering() +@cindex @code{basering ()} This returns the base ring, as passed to @samp{cl_find_univpoly_ring}. @item cl_UP R->zero() +@cindex @code{zero ()} This returns @code{0 in R}, a polynomial of degree -1. @item cl_UP R->one() +@cindex @code{one ()} This returns @code{1 in R}, a polynomial of degree <= 0. @item cl_UP R->canonhom (const cl_I& x) +@cindex @code{canonhom ()} This returns @code{x in R}, a polynomial of degree <= 0. @item cl_UP R->monomial (const cl_ring_element& x, uintL e) +@cindex @code{monomial ()} This returns a sparse polynomial: @code{x * X^e}, where @code{X} is the indeterminate. @item cl_UP R->create (sintL degree) +@cindex @code{create ()} Creates a new polynomial with a given degree. The zero polynomial has degree @code{-1}. After creating the polynomial, you should put in the coefficients, using the @code{set_coeff} member function, and then call the @code{finalize} @@ -2794,11 +3068,13 @@ The following are the only destructive operations on univariate polynomials. @table @code @item void set_coeff (cl_UP& x, uintL index, const cl_ring_element& y) +@cindex @code{set_coeff ()} This changes the coefficient of @code{X^index} in @code{x} to be @code{y}. After changing a polynomial and before applying any "normal" operation on it, you should call its @code{finalize} member function. @item void finalize (cl_UP& x) +@cindex @code{finalize ()} This function marks the endpoint of destructive modifications of a polynomial. It normalizes the internal representation so that subsequent computations have less overhead. Doing normal computations on unnormalized polynomials may @@ -2809,47 +3085,60 @@ The following operations are defined on univariate polynomials. @table @code @item cl_univpoly_ring x.ring () +@cindex @code{ring ()} Returns the ring to which the univariate polynomial @code{x} belongs. @item cl_UP operator+ (const cl_UP&, const cl_UP&) +@cindex @code{operator + ()} Returns the sum of two univariate polynomials. @item cl_UP operator- (const cl_UP&, const cl_UP&) +@cindex @code{operator - ()} Returns the difference of two univariate polynomials. @item cl_UP operator- (const cl_UP&) Returns the negative of a univariate polynomial. @item cl_UP operator* (const cl_UP&, const cl_UP&) +@cindex @code{operator * ()} Returns the product of two univariate polynomials. One of the arguments may also be a plain integer or an element of the base ring. @item cl_UP square (const cl_UP&) +@cindex @code{square ()} Returns the square of a univariate polynomial. @item cl_UP expt_pos (const cl_UP& x, const cl_I& y) +@cindex @code{expt_pos ()} @code{y} must be > 0. Returns @code{x^y}. @item bool operator== (const cl_UP&, const cl_UP&) +@cindex @code{operator == ()} @itemx bool operator!= (const cl_UP&, const cl_UP&) +@cindex @code{operator != ()} Compares two univariate polynomials, belonging to the same univariate polynomial ring, for equality. @item cl_boolean zerop (const cl_UP& x) +@cindex @code{zerop ()} Returns true if @code{x} is @code{0 in R}. @item sintL degree (const cl_UP& x) +@cindex @code{degree ()} Returns the degree of the polynomial. The zero polynomial has degree @code{-1}. @item cl_ring_element coeff (const cl_UP& x, uintL index) +@cindex @code{coeff ()} Returns the coefficient of @code{X^index} in the polynomial @code{x}. @item cl_ring_element x (const cl_ring_element& y) +@cindex @code{operator () ()} Evaluation: If @code{x} is a polynomial and @code{y} belongs to the base ring, then @samp{x(y)} returns the value of the substitution of @code{y} into @code{x}. @item cl_UP deriv (const cl_UP& x) +@cindex @code{deriv ()} Returns the derivative of the polynomial @code{x} with respect to the indeterminate @code{X}. @end table @@ -2859,7 +3148,9 @@ input/output). @table @code @item void fprint (cl_ostream stream, const cl_UP& x) +@cindex @code{fprint ()} @itemx cl_ostream operator<< (cl_ostream stream, const cl_UP& x) +@cindex @code{operator << ()} Prints the univariate polynomial @code{x} on the @code{stream}. The output may depend on the global printer settings in the variable @code{cl_default_print_flags}. @@ -2871,15 +3162,23 @@ The following functions return special polynomials. @table @code @item cl_UP_I cl_tschebychev (sintL n) +@cindex @code{cl_tschebychev ()} +@cindex Tschebychev polynomial Returns the n-th Tchebychev polynomial (n >= 0). @item cl_UP_I cl_hermite (sintL n) +@cindex @code{cl_hermite ()} +@cindex Hermite polynomial Returns the n-th Hermite polynomial (n >= 0). @item cl_UP_RA cl_legendre (sintL n) +@cindex @code{cl_legendre ()} +@cindex Legende polynomial Returns the n-th Legendre polynomial (n >= 0). @item cl_UP_I cl_laguerre (sintL n) +@cindex @code{cl_laguerre ()} +@cindex Laguerre polynomial Returns the n-th Laguerre polynomial (n >= 0). @end table @@ -2891,6 +3190,7 @@ of these polynomials from their definition can be found in the @chapter Internals @section Why C++ ? +@cindex advocacy Using C++ as an implementation language provides @@ -2899,6 +3199,7 @@ Using C++ as an implementation language provides Efficiency: It compiles to machine code. @item +@cindex portability Portability: It runs on all platforms supporting a C++ compiler. Because of the availability of GNU C++, this includes all currently used 32-bit and 64-bit platforms, independently of the quality of the vendor's C++ compiler. @@ -2907,7 +3208,7 @@ of the availability of GNU C++, this includes all currently used 32-bit and Type safety: The C++ compilers knows about the number types and complains if, for example, you try to assign a float to an integer variable. However, a drawback is that C++ doesn't know about generic types, hence a restriction -like that @code{operation+ (const cl_MI&, const cl_MI&)} requires that both +like that @code{operator+ (const cl_MI&, const cl_MI&)} requires that both arguments belong to the same modular ring cannot be expressed as a compile-time information. @@ -2934,6 +3235,8 @@ In order to save memory allocations, CLN implements: Object sharing: An operation like @code{x+0} returns @code{x} without copying it. @item +@cindex garbage collection +@cindex reference counting Garbage collection: A reference counting mechanism makes sure that any number object's storage is freed immediately when the last reference to the object is gone. @@ -2958,8 +3261,8 @@ memory access, just a couple of instructions for each elementary operation. The kernel of CLN has been written in assembly language for some CPUs (@code{i386}, @code{m68k}, @code{sparc}, @code{mips}, @code{arm}). @item -On all CPUs, CLN uses the superefficient low-level routines from GNU -GMP version 2. +On all CPUs, CLN may be configured to use the superefficient low-level +routines from GNU GMP version 3. @item For large numbers, CLN uses, instead of the standard @code{O(N^2)} algorithm, the Karatsuba multiplication, which is an @@ -2976,9 +3279,11 @@ algorithm. For very large numbers (more than 12000 decimal digits), CLN uses @iftex Sch{@"o}nhage-Strassen +@cindex Sch{@"o}nhage-Strassen @end iftex @ifinfo Schönhage-Strassen +@cindex Schönhage-Strassen @end ifinfo multiplication, which is an asymptotically optimal multiplication algorithm. @@ -2989,6 +3294,7 @@ of division and radix conversion. @section Garbage collection +@cindex garbage collection All the number classes are reference count classes: They only contain a pointer to an object in the heap. Upon construction, assignment and destruction of @@ -3014,6 +3320,7 @@ environment variables, or directly substitute the appropriate values. @section Compiler options +@cindex compiler options Until you have installed CLN in a public place, the following options are needed: @@ -3037,6 +3344,8 @@ linking a CLN application it is sufficient to give the flag @code{-lcln}. @section Include files +@cindex include files +@cindex header files Here is a summary of the include files and their contents. @@ -3167,6 +3476,7 @@ Includes all of the above. @section An Example A function which computes the nth Fibonacci number can be written as follows. +@cindex Fibonacci number @example #include @@ -3227,8 +3537,11 @@ When the function returns, all the local variables in the function are automatically reclaimed (garbage collected). Only the result survives and gets passed to the caller. +The file @code{fibonacci.cc} in the subdirectory @code{examples} +contains this implementation together with an even faster algorithm. @section Debugging support +@cindex debugging When debugging a CLN application with GNU @code{gdb}, two facilities are available from the library: @@ -3253,6 +3566,7 @@ CLN offers a function @code{cl_print}, callable from the debugger, for printing number objects. In order to get this function, you have to define the macro @samp{CL_DEBUG} and then include all the header files for which you want @code{cl_print} debugging support. For example: +@cindex @code{CL_DEBUG} @example #define CL_DEBUG #include @@ -3275,6 +3589,7 @@ only with number objects and similar. Therefore CLN offers a member function @code{debug_print()} on all CLN types. The same macro @samp{CL_DEBUG} is needed for this member function to be implemented. Under @code{gdb}, you call it like this: +@cindex @code{debug_print ()} @example (gdb) print s $7 = @{ = @{ = @{pointer = 0x8055b60, heappointer = 0x8055b60, @@ -3292,6 +3607,7 @@ Unfortunately, this feature does not seem to work under all circumstances. @chapter Customizing +@cindex customizing @section Error handling @@ -3304,10 +3620,12 @@ yourself, with the prototype #include void cl_abort (void); @end example +@cindex @code{cl_abort ()} This function must not return control to its caller. @section Floating-point underflow +@cindex underflow Floating point underflow denotes the situation when a floating-point number is to be created which is so close to @code{0} that its exponent is too @@ -3317,15 +3635,15 @@ If you set the global variable cl_boolean cl_inhibit_floating_point_underflow @end example to @code{cl_true}, the error will be inhibited, and a floating-point zero -will be generated instead. -The default value of @code{cl_inhibit_floating_point_underflow} is -@code{cl_false}. +will be generated instead. The default value of +@code{cl_inhibit_floating_point_underflow} is @code{cl_false}. @section Customizing I/O The output of the function @code{fprint} may be customized by changing the value of the global variable @code{cl_default_print_flags}. +@cindex @code{cl_default_print_flags} @section Customizing the memory allocator @@ -3343,6 +3661,8 @@ like this: void* (*cl_malloc_hook) (size_t size) = @dots{}; void (*cl_free_hook) (void* ptr) = @dots{}; @end example +@cindex @code{cl_malloc_hook ()} +@cindex @code{cl_free_hook ()} The @code{cl_malloc_hook} function must not return a @code{NULL} pointer. It is not possible to change the memory allocator at runtime, because diff --git a/doc/cln.texi b/doc/cln.texi index 5f89fc2..2ddb3b9 100644 --- a/doc/cln.texi +++ b/doc/cln.texi @@ -313,8 +313,9 @@ CLN is speed efficient: The kernel of CLN has been written in assembly language for some CPUs (@code{i386}, @code{m68k}, @code{sparc}, @code{mips}, @code{arm}). @item -On all CPUs, CLN uses the superefficient low-level routines from GNU -GMP version 2. +@cindex GMP +On all CPUs, CLN may be configured to use the superefficient low-level +routines from GNU GMP version 3. @item It uses Karatsuba multiplication, which is significantly faster for large numbers than the standard multiplication algorithm. @@ -322,13 +323,14 @@ for large numbers than the standard multiplication algorithm. For very large numbers (more than 12000 decimal digits), it uses @iftex Sch{@"o}nhage-Strassen +@cindex Sch{@"o}nhage-Strassen multiplication @end iftex @ifinfo Schönhage-Strassen +@cindex Schönhage-Strassen multiplication @end ifinfo -multiplication, which is an asymptotically -optimal multiplication algorithm, for multiplication, division and -radix conversion. +multiplication, which is an asymptotically optimal multiplication +algorithm, for multiplication, division and radix conversion. @end itemize @noindent @@ -370,7 +372,7 @@ This section describes how to install the CLN package on your system. To build CLN, you need a C++ compiler. Actually, you need GNU @code{g++ 2.7.0} or newer. On HPPA, you need GNU @code{g++ 2.8.0} or newer. -I recommend GNU @code{egcs 1.1} or newer. +I recommend GNU @code{g++ 2.95} or newer. The following C++ features are used: classes, member functions, @@ -419,11 +421,13 @@ initializations will not work. @end itemize @end ignore +@cindex @code{make} @node Make utility, Sed utility, C++ compiler, Prerequisites @subsection Make utility To build CLN, you also need to have GNU @code{make} installed. +@cindex @code{sed} @node Sed utility, , Make utility, Prerequisites @subsection Sed utility @@ -538,9 +542,6 @@ add either @samp{-O} or @samp{-O2 -fno-schedule-insns} to the CXXFLAGS. With full @samp{-O2}, @code{g++} miscompiles the division routines. Also, for --enable-shared to work, you need egcs-1.1.2 or newer. -On MIPS (SGI Irix 6), pass option @code{--without-gmp} to configure. gmp does -not work when compiled in @samp{n32} binary format on Irix. - By default, only a static library is built. You can build CLN as a shared library too, by calling @code{configure} with the option @samp{--enable-shared}. To get it built as a shared library only, call @code{configure} with the options @@ -553,6 +554,7 @@ library. @node Installing the library, Cleaning up, Building the library, Installation @section Installing the library +@cindex installation As with any autoconfiguring GNU software, installation is as easy as this: @@ -621,23 +623,33 @@ Rational number Floating-point number @end example +@cindex @code{cl_number} +@cindex abstract class The base class @code{cl_number} is an abstract base class. It is not useful to declare a variable of this type except if you want to completely disable compile-time type checking and use run-time type checking instead. +@cindex @code{cl_N} +@cindex real number +@cindex complex number The class @code{cl_N} comprises real and complex numbers. There is no special class for complex numbers since complex numbers with imaginary part @code{0} are automatically converted to real numbers. +@cindex @code{cl_R} The class @code{cl_R} comprises real numbers of different kinds. It is an abstract class. +@cindex @code{cl_RA} +@cindex rational number +@cindex integer The class @code{cl_RA} comprises exact real numbers: rational numbers, including integers. There is no special class for non-integral rational numbers since rational numbers with denominator @code{1} are automatically converted to integers. +@cindex @code{cl_F} The class @code{cl_F} implements floating-point approximations to real numbers. It is an abstract class. @@ -651,6 +663,7 @@ It is an abstract class. @node Exact numbers, Floating-point numbers, Ordinary number types, Ordinary number types @section Exact numbers +@cindex exact number Some numbers are represented as exact numbers: there is no loss of information when such a number is converted from its mathematical value to its internal @@ -681,6 +694,7 @@ is completely transparent. @node Floating-point numbers, Complex numbers, Exact numbers, Ordinary number types @section Floating-point numbers +@cindex floating-point number Not all real numbers can be represented exactly. (There is an easy mathematical proof for this: Only a countable set of numbers can be stored exactly in @@ -688,6 +702,7 @@ a computer, even if one assumes that it has unlimited storage. But there are uncountably many real numbers.) So some approximation is needed. CLN implements ordinary floating-point numbers, with mantissa and exponent. +@cindex rounding error The elementary operations (@code{+}, @code{-}, @code{*}, @code{/}, @dots{}) only return approximate results. For example, the value of the expression @code{(cl_F) 0.3 + (cl_F) 0.4} prints as @samp{0.70000005}, not as @@ -709,12 +724,14 @@ Floating point numbers come in four flavors: @itemize @bullet @item +@cindex @code{cl_SF} Short floats, type @code{cl_SF}. They have 1 sign bit, 8 exponent bits (including the exponent's sign), and 17 mantissa bits (including the ``hidden'' bit). They don't consume heap allocation. @item +@cindex @code{cl_FF} Single floats, type @code{cl_FF}. They have 1 sign bit, 8 exponent bits (including the exponent's sign), and 24 mantissa bits (including the ``hidden'' bit). @@ -722,6 +739,7 @@ In CLN, they are represented as IEEE single-precision floating point numbers. This corresponds closely to the C/C++ type @samp{float}. @item +@cindex @code{cl_DF} Double floats, type @code{cl_DF}. They have 1 sign bit, 11 exponent bits (including the exponent's sign), and 53 mantissa bits (including the ``hidden'' bit). @@ -729,6 +747,7 @@ In CLN, they are represented as IEEE double-precision floating point numbers. This corresponds closely to the C/C++ type @samp{double}. @item +@cindex @code{cl_LF} Long floats, type @code{cl_LF}. They have 1 sign bit, 32 exponent bits (including the exponent's sign), and n mantissa bits (including the ``hidden'' bit), where n >= 64. @@ -744,6 +763,7 @@ gradual underflow. If the exponent range of some floating-point type is too limited for your application, choose another floating-point type with larger exponent range. +@cindex @code{cl_F} As a user of CLN, you can forget about the differences between the four floating-point types and just declare all your floating-point variables as being of type @code{cl_F}. This has the advantage that @@ -758,6 +778,7 @@ the floating point contagion rule happened to change in the future.) @node Complex numbers, Conversions, Floating-point numbers, Ordinary number types @section Complex numbers +@cindex complex number Complex numbers, as implemented by the class @code{cl_N}, have a real part and an imaginary part, both real numbers. A complex number whose @@ -770,6 +791,7 @@ through application of @code{sqrt} or transcendental functions. @node Conversions, , Complex numbers, Ordinary number types @section Conversions +@cindex conversion Conversions from any class to any its superclasses (``base classes'' in C++ terminology) is done automatically. @@ -811,6 +833,7 @@ Conversions from @samp{const char *} are provided for the classes @code{cl_R}, @code{cl_N}. The easiest way to specify a value which is outside of the range of the C++ built-in types is therefore to specify it as a string, like this: +@cindex Rubik's cube @example cl_I order_of_rubiks_cube_group = "43252003274489856000"; @end example @@ -822,9 +845,13 @@ the functions @table @code @item int cl_I_to_int (const cl_I& x) +@cindex @code{cl_I_to_int ()} @itemx unsigned int cl_I_to_uint (const cl_I& x) +@cindex @code{cl_I_to_uint ()} @itemx long cl_I_to_long (const cl_I& x) +@cindex @code{cl_I_to_long ()} @itemx unsigned long cl_I_to_ulong (const cl_I& x) +@cindex @code{cl_I_to_ulong ()} Returns @code{x} as element of the C type @var{ctype}. If @code{x} is not representable in the range of @var{ctype}, a runtime error occurs. @end table @@ -837,7 +864,9 @@ the functions @table @code @item float cl_float_approx (const @var{type}& x) +@cindex @code{cl_float_approx ()} @itemx double cl_double_approx (const @var{type}& x) +@cindex @code{cl_double_approx ()} Returns an approximation of @code{x} of C type @var{ctype}. If @code{abs(x)} is too close to 0 (underflow), 0 is returned. If @code{abs(x)} is too large (overflow), an IEEE infinity is returned. @@ -847,8 +876,10 @@ Conversions from any class to any of its subclasses (``derived classes'' in C++ terminology) are not provided. Instead, you can assert and check that a value belongs to a certain subclass, and return it as element of that class, using the @samp{As} and @samp{The} macros. +@cindex @code{As() ()} @code{As(@var{type})(@var{value})} checks that @var{value} belongs to @var{type} and returns it as such. +@cindex @code{The() ()} @code{The(@var{type})(@var{value})} assumes that @var{value} belongs to @var{type} and returns it as such. It is your responsibility to ensure that this assumption is valid. @@ -962,24 +993,30 @@ defines the following operations: @table @code @item @var{type} operator + (const @var{type}&, const @var{type}&) +@cindex @code{operator + ()} Addition. @item @var{type} operator - (const @var{type}&, const @var{type}&) +@cindex @code{operator - ()} Subtraction. @item @var{type} operator - (const @var{type}&) Returns the negative of the argument. @item @var{type} plus1 (const @var{type}& x) +@cindex @code{plus1 ()} Returns @code{x + 1}. @item @var{type} minus1 (const @var{type}& x) +@cindex @code{minus1 ()} Returns @code{x - 1}. @item @var{type} operator * (const @var{type}&, const @var{type}&) +@cindex @code{operator * ()} Multiplication. @item @var{type} square (const @var{type}& x) +@cindex @code{square ()} Returns @code{x * x}. @end table @@ -989,9 +1026,11 @@ defines the following operations: @table @code @item @var{type} operator / (const @var{type}&, const @var{type}&) +@cindex @code{operator / ()} Division. @item @var{type} recip (const @var{type}&) +@cindex @code{recip ()} Returns the reciprocal of the argument. @end table @@ -1003,6 +1042,7 @@ Instead, @code{cl_I} defines an ``exact quotient'' function: @table @code @item cl_I exquo (const cl_I& x, const cl_I& y) +@cindex @code{exquo ()} Checks that @code{y} divides @code{x}, and returns the quotient @code{x}/@code{y}. @end table @@ -1010,10 +1050,12 @@ The following exponentiation functions are defined: @table @code @item cl_I expt_pos (const cl_I& x, const cl_I& y) +@cindex @code{expt_pos ()} @itemx cl_RA expt_pos (const cl_RA& x, const cl_I& y) @code{y} must be > 0. Returns @code{x^y}. @item cl_RA expt (const cl_RA& x, const cl_I& y) +@cindex @code{expt ()} @itemx cl_R expt (const cl_R& x, const cl_I& y) @itemx cl_N expt (const cl_N& x, const cl_I& y) Returns @code{x^y}. @@ -1025,6 +1067,7 @@ defines the following operation: @table @code @item @var{type} abs (const @var{type}& x) +@cindex @code{abs ()} Returns the absolute value of @code{x}. This is @code{x} if @code{x >= 0}, and @code{-x} if @code{x <= 0}. @end table @@ -1042,6 +1085,7 @@ defines the following operation: @table @code @item @var{type} signum (const @var{type}& x) +@cindex @code{signum ()} Returns the sign of @code{x}, in the same number format as @code{x}. This is defined as @code{x / abs(x)} if @code{x} is non-zero, and @code{x} if @code{x} is zero. If @code{x} is real, the value is either @@ -1056,9 +1100,11 @@ Each of the classes @code{cl_RA}, @code{cl_I} defines the following operations: @table @code @item cl_I numerator (const @var{type}& x) +@cindex @code{numerator ()} Returns the numerator of @code{x}. @item cl_I denominator (const @var{type}& x) +@cindex @code{denominator ()} Returns the denominator of @code{x}. @end table @@ -1073,6 +1119,7 @@ The class @code{cl_N} defines the following operation: @table @code @item cl_N complex (const cl_R& a, const cl_R& b) +@cindex @code{complex ()} Returns the complex number @code{a+bi}, that is, the complex number with real part @code{a} and imaginary part @code{b}. @end table @@ -1081,12 +1128,15 @@ Each of the classes @code{cl_N}, @code{cl_R} defines the following operations: @table @code @item cl_R realpart (const @var{type}& x) +@cindex @code{realpart ()} Returns the real part of @code{x}. @item cl_R imagpart (const @var{type}& x) +@cindex @code{imagpart ()} Returns the imaginary part of @code{x}. @item @var{type} conjugate (const @var{type}& x) +@cindex @code{conjugate ()} Returns the complex conjugate of @code{x}. @end table @@ -1102,6 +1152,7 @@ We have the relations @node Comparisons, Rounding functions, Elementary complex functions, Functions on numbers @section Comparisons +@cindex comparison Each of the classes @code{cl_N}, @code{cl_R}, @code{cl_RA}, @code{cl_I}, @code{cl_F}, @code{cl_SF}, @code{cl_FF}, @code{cl_DF}, @code{cl_LF} @@ -1109,15 +1160,19 @@ defines the following operations: @table @code @item bool operator == (const @var{type}&, const @var{type}&) +@cindex @code{operator == ()} @itemx bool operator != (const @var{type}&, const @var{type}&) +@cindex @code{operator != ()} Comparison, as in C and C++. @item uint32 cl_equal_hashcode (const @var{type}&) +@cindex @code{cl_equal_hashcode ()} Returns a 32-bit hash code that is the same for any two numbers which are the same according to @code{==}. This hash code depends on the number's value, not its type or precision. @item cl_boolean zerop (const @var{type}& x) +@cindex @code{zerop ()} Compare against zero: @code{x == 0} @end table @@ -1127,25 +1182,34 @@ defines the following operations: @table @code @item cl_signean cl_compare (const @var{type}& x, const @var{type}& y) +@cindex @code{cl_compare ()} Compares @code{x} and @code{y}. Returns +1 if @code{x}>@code{y}, -1 if @code{x}<@code{y}, 0 if @code{x}=@code{y}. @item bool operator <= (const @var{type}&, const @var{type}&) +@cindex @code{operator <= ()} @itemx bool operator < (const @var{type}&, const @var{type}&) +@cindex @code{operator < ()} @itemx bool operator >= (const @var{type}&, const @var{type}&) +@cindex @code{operator >= ()} @itemx bool operator > (const @var{type}&, const @var{type}&) +@cindex @code{operator > ()} Comparison, as in C and C++. @item cl_boolean minusp (const @var{type}& x) +@cindex @code{minusp ()} Compare against zero: @code{x < 0} @item cl_boolean plusp (const @var{type}& x) +@cindex @code{plusp ()} Compare against zero: @code{x > 0} @item @var{type} max (const @var{type}& x, const @var{type}& y) +@cindex @code{max ()} Return the maximum of @code{x} and @code{y}. @item @var{type} min (const @var{type}& x, const @var{type}& y) +@cindex @code{min ()} Return the minimum of @code{x} and @code{y}. @end table @@ -1159,6 +1223,7 @@ there is no floating point number whose value is exactly @code{1/3}. @node Rounding functions, Roots, Comparisons, Functions on numbers @section Rounding functions +@cindex rounding When a real number is to be converted to an integer, there is no ``best'' rounding. The desired rounding function depends on the application. @@ -1206,12 +1271,16 @@ defines the following operations: @table @code @item cl_I floor1 (const @var{type}& x) +@cindex @code{floor1 ()} Returns @code{floor(x)}. @item cl_I ceiling1 (const @var{type}& x) +@cindex @code{ceiling1 ()} Returns @code{ceiling(x)}. @item cl_I truncate1 (const @var{type}& x) +@cindex @code{truncate1 ()} Returns @code{truncate(x)}. @item cl_I round1 (const @var{type}& x) +@cindex @code{round1 ()} Returns @code{round(x)}. @end table @@ -1271,9 +1340,13 @@ defines the following operations: @table @code @item struct @var{type}_div_t @{ cl_I quotient; @var{type} remainder; @}; @itemx @var{type}_div_t floor2 (const @var{type}& x, const @var{type}& y) +@cindex @code{floor2 ()} @itemx @var{type}_div_t ceiling2 (const @var{type}& x, const @var{type}& y) +@cindex @code{ceiling2 ()} @itemx @var{type}_div_t truncate2 (const @var{type}& x, const @var{type}& y) +@cindex @code{truncate2 ()} @itemx @var{type}_div_t round2 (const @var{type}& x, const @var{type}& y) +@cindex @code{round2 ()} @end table Sometimes, one wants the quotient as a floating-point number (of the @@ -1286,9 +1359,13 @@ defines the following operations: @table @code @item @var{type} ffloor (const @var{type}& x) +@cindex @code{ffloor ()} @itemx @var{type} fceiling (const @var{type}& x) +@cindex @code{fceiling ()} @itemx @var{type} ftruncate (const @var{type}& x) +@cindex @code{ftruncate ()} @itemx @var{type} fround (const @var{type}& x) +@cindex @code{fround ()} @end table and similarly for class @code{cl_R}, but with return type @code{cl_F}. @@ -1312,9 +1389,13 @@ defines the following operations: @table @code @item struct @var{type}_fdiv_t @{ @var{type} quotient; @var{type} remainder; @}; @itemx @var{type}_fdiv_t ffloor2 (const @var{type}& x) +@cindex @code{ffloor2 ()} @itemx @var{type}_fdiv_t fceiling2 (const @var{type}& x) +@cindex @code{fceiling2 ()} @itemx @var{type}_fdiv_t ftruncate2 (const @var{type}& x) +@cindex @code{ftruncate2 ()} @itemx @var{type}_fdiv_t fround2 (const @var{type}& x) +@cindex @code{fround2 ()} @end table and similarly for class @code{cl_R}, but with quotient type @code{cl_F}. @@ -1348,7 +1429,9 @@ The classes @code{cl_R}, @code{cl_I} define the following operations: @table @code @item @var{type} mod (const @var{type}& x, const @var{type}& y) +@cindex @code{mod ()} @itemx @var{type} rem (const @var{type}& x, const @var{type}& y) +@cindex @code{rem ()} @end table @@ -1361,6 +1444,7 @@ defines the following operation: @table @code @item @var{type} sqrt (const @var{type}& x) +@cindex @code{sqrt ()} @code{x} must be >= 0. This function returns the square root of @code{x}, normalized to be >= 0. If @code{x} is the square of a rational number, @code{sqrt(x)} will be a rational number, else it will return a @@ -1371,6 +1455,7 @@ The classes @code{cl_RA}, @code{cl_I} define the following operation: @table @code @item cl_boolean sqrtp (const @var{type}& x, @var{type}* root) +@cindex @code{sqrtp ()} This tests whether @code{x} is a perfect square. If so, it returns true and the exact square root in @code{*root}, else it returns false. @end table @@ -1379,6 +1464,7 @@ Furthermore, for integers, similarly: @table @code @item cl_boolean isqrt (const @var{type}& x, @var{type}* root) +@cindex @code{isqrt ()} @code{x} should be >= 0. This function sets @code{*root} to @code{floor(sqrt(x))} and returns the same value as @code{sqrtp}: the boolean value @code{(expt(*root,2) == x)}. @@ -1389,6 +1475,7 @@ define the following operation: @table @code @item cl_boolean rootp (const @var{type}& x, const cl_I& n, @var{type}* root) +@cindex @code{rootp ()} @code{x} must be >= 0. @code{n} must be > 0. This tests whether @code{x} is an @code{n}th power of a rational number. If so, it returns true and the exact root in @code{*root}, else it returns @@ -1400,6 +1487,7 @@ for class @code{cl_N}: @table @code @item cl_N sqrt (const cl_N& z) +@cindex @code{sqrt ()} Returns the square root of @code{z}, as defined by the formula @code{sqrt(z) = exp(log(z)/2)}. Conversion to a floating-point type or to a complex number are done if necessary. The range of the result is the @@ -1412,7 +1500,7 @@ The result is an exact number only if @code{z} is an exact number. @node Transcendental functions, Functions on integers, Roots, Functions on numbers @section Transcendental functions - +@cindex transcendental functions The transcendental functions return an exact result if the argument is exact and the result is exact as well. Otherwise they must return @@ -1433,21 +1521,25 @@ For example, @code{cos(0) = 1} returns the rational number @code{1}. @table @code @item cl_R exp (const cl_R& x) +@cindex @code{exp ()} @itemx cl_N exp (const cl_N& x) Returns the exponential function of @code{x}. This is @code{e^x} where @code{e} is the base of the natural logarithms. The range of the result is the entire complex plane excluding 0. @item cl_R ln (const cl_R& x) +@cindex @code{ln ()} @code{x} must be > 0. Returns the (natural) logarithm of x. @item cl_N log (const cl_N& x) +@cindex @code{log ()} Returns the (natural) logarithm of x. If @code{x} is real and positive, this is @code{ln(x)}. In general, @code{log(x) = log(abs(x)) + i*phase(x)}. The range of the result is the strip in the complex plane @code{-pi < imagpart(log(x)) <= pi}. @item cl_R phase (const cl_N& x) +@cindex @code{phase ()} Returns the angle part of @code{x} in its polar representation as a complex number. That is, @code{phase(x) = atan(realpart(x),imagpart(x))}. This is also the imaginary part of @code{log(x)}. @@ -1466,6 +1558,7 @@ Returns the logarithm of @code{a} with respect to base @code{b}. @code{log(a,b) = log(a)/log(b)}. @item cl_N expt (const cl_N& x, const cl_N& y) +@cindex @code{expt ()} Exponentiation: Returns @code{x^y = exp(y*log(x))}. @end table @@ -1473,6 +1566,7 @@ The constant e = exp(1) = 2.71828@dots{} is returned by the following functions: @table @code @item cl_F cl_exp1 (cl_float_format_t f) +@cindex @code{exp1 ()} Returns e as a float of format @code{f}. @item cl_F cl_exp1 (const cl_F& y) @@ -1488,6 +1582,7 @@ Returns e as a float of format @code{cl_default_float_format}. @table @code @item cl_R sin (const cl_R& x) +@cindex @code{sin ()} Returns @code{sin(x)}. The range of the result is the interval @code{-1 <= sin(x) <= 1}. @@ -1495,6 +1590,7 @@ Returns @code{sin(x)}. The range of the result is the interval Returns @code{sin(z)}. The range of the result is the entire complex plane. @item cl_R cos (const cl_R& x) +@cindex @code{cos ()} Returns @code{cos(x)}. The range of the result is the interval @code{-1 <= cos(x) <= 1}. @@ -1502,20 +1598,26 @@ Returns @code{cos(x)}. The range of the result is the interval Returns @code{cos(z)}. The range of the result is the entire complex plane. @item struct cl_cos_sin_t @{ cl_R cos; cl_R sin; @}; +@cindex @code{cl_cos_sin_t} @itemx cl_cos_sin_t cl_cos_sin (const cl_R& x) Returns both @code{sin(x)} and @code{cos(x)}. This is more efficient than +@cindex @code{cl_cos_sin ()} computing them separately. The relation @code{cos^2 + sin^2 = 1} will hold only approximately. @item cl_R tan (const cl_R& x) +@cindex @code{tan ()} @itemx cl_N tan (const cl_N& x) Returns @code{tan(x) = sin(x)/cos(x)}. @item cl_N cis (const cl_R& x) +@cindex @code{cis ()} @itemx cl_N cis (const cl_N& x) Returns @code{exp(i*x)}. The name @samp{cis} means ``cos + i sin'', because @code{e^(i*x) = cos(x) + i*sin(x)}. +@cindex @code{asin} +@cindex @code{asin ()} @item cl_N asin (const cl_N& z) Returns @code{arcsin(z)}. This is defined as @code{arcsin(z) = log(iz+sqrt(1-z^2))/i} and satisfies @@ -1530,6 +1632,7 @@ results for arsinh. @end ignore @item cl_N acos (const cl_N& z) +@cindex @code{acos ()} Returns @code{arccos(z)}. This is defined as @code{arccos(z) = pi/2 - arcsin(z) = log(z+i*sqrt(1-z^2))/i} @ignore @@ -1545,6 +1648,8 @@ with @code{realpart = pi} and @code{imagpart > 0}. Proof: This follows from the results about arcsin. @end ignore +@cindex @code{atan} +@cindex @code{atan ()} @item cl_R atan (const cl_R& x, const cl_R& y) Returns the angle of the polar representation of the complex number @code{x+iy}. This is @code{atan(y/x)} if @code{x>0}. The range of @@ -1572,10 +1677,13 @@ Proof: arctan(z) = artanh(iz)/i, we know the range of the artanh function. @end table -The constant pi = 3.14@dots{} is returned by the following functions: +@cindex pi +@cindex Archimedes' constant +Archimedes' constant pi = 3.14@dots{} is returned by the following functions: @table @code @item cl_F cl_pi (cl_float_format_t f) +@cindex @code{cl_pi} Returns pi as a float of format @code{f}. @item cl_F cl_pi (const cl_F& y) @@ -1591,12 +1699,14 @@ Returns pi as a float of format @code{cl_default_float_format}. @table @code @item cl_R sinh (const cl_R& x) +@cindex @code{sinh ()} Returns @code{sinh(x)}. @item cl_N sinh (const cl_N& z) Returns @code{sinh(z)}. The range of the result is the entire complex plane. @item cl_R cosh (const cl_R& x) +@cindex @code{cosh ()} Returns @code{cosh(x)}. The range of the result is the interval @code{cosh(x) >= 1}. @@ -1604,16 +1714,20 @@ Returns @code{cosh(x)}. The range of the result is the interval Returns @code{cosh(z)}. The range of the result is the entire complex plane. @item struct cl_cosh_sinh_t @{ cl_R cosh; cl_R sinh; @}; +@cindex @code{cl_cosh_sinh_t} @itemx cl_cosh_sinh_t cl_cosh_sinh (const cl_R& x) +@cindex @code{cl_cosh_sinh ()} Returns both @code{sinh(x)} and @code{cosh(x)}. This is more efficient than computing them separately. The relation @code{cosh^2 - sinh^2 = 1} will hold only approximately. @item cl_R tanh (const cl_R& x) +@cindex @code{tanh ()} @itemx cl_N tanh (const cl_N& x) Returns @code{tanh(x) = sinh(x)/cosh(x)}. @item cl_N asinh (const cl_N& z) +@cindex @code{asinh ()} Returns @code{arsinh(z)}. This is defined as @code{arsinh(z) = log(z+sqrt(1+z^2))} and satisfies @code{arsinh(-z) = -arsinh(z)}. @@ -1645,6 +1759,7 @@ log(sqrt(1+z^2)+z) = 2 artanh(z/(1+sqrt(1+z^2))) @end ignore @item cl_N acosh (const cl_N& z) +@cindex @code{acosh ()} Returns @code{arcosh(z)}. This is defined as @code{arcosh(z) = 2*log(sqrt((z+1)/2)+sqrt((z-1)/2))}. The range of the result is the half-strip in the complex domain @@ -1690,6 +1805,7 @@ Otherwise, -z is in Range(sqrt). @end ignore @item cl_N atanh (const cl_N& z) +@cindex @code{atanh ()} Returns @code{artanh(z)}. This is defined as @code{artanh(z) = (log(1+z)-log(1-z)) / 2} and satisfies @code{artanh(-z) = -artanh(z)}. The range of the result is @@ -1722,11 +1838,13 @@ Proof: Write z = x+iy. Examine @node Euler gamma, Riemann zeta, Hyperbolic functions, Transcendental functions @subsection Euler gamma +@cindex Euler's constant Euler's constant C = 0.577@dots{} is returned by the following functions: @table @code @item cl_F cl_eulerconst (cl_float_format_t f) +@cindex @code{cl_eulerconst ()} Returns Euler's constant as a float of format @code{f}. @item cl_F cl_eulerconst (const cl_F& y) @@ -1737,9 +1855,11 @@ Returns Euler's constant as a float of format @code{cl_default_float_format}. @end table Catalan's constant G = 0.915@dots{} is returned by the following functions: +@cindex Catalan's constant @table @code @item cl_F cl_catalanconst (cl_float_format_t f) +@cindex @code{cl_catalanconst ()} Returns Catalan's constant as a float of format @code{f}. @item cl_F cl_catalanconst (const cl_F& y) @@ -1752,12 +1872,14 @@ Returns Catalan's constant as a float of format @code{cl_default_float_format}. @node Riemann zeta, , Euler gamma, Transcendental functions @subsection Riemann zeta +@cindex Riemann's zeta Riemann's zeta function at an integral point @code{s>1} is returned by the following functions: @table @code @item cl_F cl_zeta (int s, cl_float_format_t f) +@cindex @code{cl_zeta ()} Returns Riemann's zeta function at @code{s} as a float of format @code{f}. @item cl_F cl_zeta (int s, const cl_F& y) @@ -1794,46 +1916,62 @@ on each of the bit positions in parallel. @table @code @item cl_I lognot (const cl_I& x) +@cindex @code{lognot ()} @itemx cl_I operator ~ (const cl_I& x) +@cindex @code{operator ~ ()} Logical not, like @code{~x} in C. This is the same as @code{-1-x}. @item cl_I logand (const cl_I& x, const cl_I& y) +@cindex @code{logand ()} @itemx cl_I operator & (const cl_I& x, const cl_I& y) +@cindex @code{operator & ()} Logical and, like @code{x & y} in C. @item cl_I logior (const cl_I& x, const cl_I& y) +@cindex @code{logior ()} @itemx cl_I operator | (const cl_I& x, const cl_I& y) +@cindex @code{operator | ()} Logical (inclusive) or, like @code{x | y} in C. @item cl_I logxor (const cl_I& x, const cl_I& y) +@cindex @code{logxor ()} @itemx cl_I operator ^ (const cl_I& x, const cl_I& y) +@cindex @code{operator ^ ()} Exclusive or, like @code{x ^ y} in C. @item cl_I logeqv (const cl_I& x, const cl_I& y) +@cindex @code{logeqv ()} Bitwise equivalence, like @code{~(x ^ y)} in C. @item cl_I lognand (const cl_I& x, const cl_I& y) +@cindex @code{lognand ()} Bitwise not and, like @code{~(x & y)} in C. @item cl_I lognor (const cl_I& x, const cl_I& y) +@cindex @code{lognor ()} Bitwise not or, like @code{~(x | y)} in C. @item cl_I logandc1 (const cl_I& x, const cl_I& y) +@cindex @code{logandc1 ()} Logical and, complementing the first argument, like @code{~x & y} in C. @item cl_I logandc2 (const cl_I& x, const cl_I& y) +@cindex @code{logandc2 ()} Logical and, complementing the second argument, like @code{x & ~y} in C. @item cl_I logorc1 (const cl_I& x, const cl_I& y) +@cindex @code{logorc1 ()} Logical or, complementing the first argument, like @code{~x | y} in C. @item cl_I logorc2 (const cl_I& x, const cl_I& y) +@cindex @code{logorc2 ()} Logical or, complementing the second argument, like @code{x | ~y} in C. @end table These operations are all available though the function @table @code @item cl_I boole (cl_boole op, const cl_I& x, const cl_I& y) +@cindex @code{boole ()} @end table where @code{op} must have one of the 16 values (each one stands for a function which combines two bits into one bit): @code{boole_clr}, @code{boole_set}, @@ -1841,19 +1979,38 @@ which combines two bits into one bit): @code{boole_clr}, @code{boole_set}, @code{boole_and}, @code{boole_ior}, @code{boole_xor}, @code{boole_eqv}, @code{boole_nand}, @code{boole_nor}, @code{boole_andc1}, @code{boole_andc2}, @code{boole_orc1}, @code{boole_orc2}. +@cindex @code{boole_clr} +@cindex @code{boole_set} +@cindex @code{boole_1} +@cindex @code{boole_2} +@cindex @code{boole_c1} +@cindex @code{boole_c2} +@cindex @code{boole_and} +@cindex @code{boole_xor} +@cindex @code{boole_eqv} +@cindex @code{boole_nand} +@cindex @code{boole_nor} +@cindex @code{boole_andc1} +@cindex @code{boole_andc2} +@cindex @code{boole_orc1} +@cindex @code{boole_orc2} + Other functions that view integers as bit strings: @table @code @item cl_boolean logtest (const cl_I& x, const cl_I& y) +@cindex @code{logtest ()} Returns true if some bit is set in both @code{x} and @code{y}, i.e. if @code{logand(x,y) != 0}. @item cl_boolean logbitp (const cl_I& n, const cl_I& x) +@cindex @code{logbitp ()} Returns true if the @code{n}th bit (from the right) of @code{x} is set. Bit 0 is the least significant bit. @item uintL logcount (const cl_I& x) +@cindex @code{logcount ()} Returns the number of one bits in @code{x}, if @code{x} >= 0, or the number of zero bits in @code{x}, if @code{x} < 0. @end table @@ -1863,20 +2020,24 @@ The type @example struct cl_byte @{ uintL size; uintL position; @}; @end example +@cindex @code{cl_byte} represents the bit interval containing the bits @code{position}@dots{}@code{position+size-1} of an integer. The constructor @code{cl_byte(size,position)} constructs a @code{cl_byte}. @table @code @item cl_I ldb (const cl_I& n, const cl_byte& b) +@cindex @code{ldb ()} extracts the bits of @code{n} described by the bit interval @code{b} and returns them as a nonnegative integer with @code{b.size} bits. @item cl_boolean ldb_test (const cl_I& n, const cl_byte& b) +@cindex @code{ldb_test ()} Returns true if some bit described by the bit interval @code{b} is set in @code{n}. @item cl_I dpb (const cl_I& newbyte, const cl_I& n, const cl_byte& b) +@cindex @code{dpb ()} Returns @code{n}, with the bits described by the bit interval @code{b} replaced by @code{newbyte}. Only the lowest @code{b.size} bits of @code{newbyte} are relevant. @@ -1887,10 +2048,12 @@ functions are their counterparts without shifting: @table @code @item cl_I mask_field (const cl_I& n, const cl_byte& b) +@cindex @code{mask_field ()} returns an integer with the bits described by the bit interval @code{b} copied from the corresponding bits in @code{n}, the other bits zero. @item cl_I deposit_field (const cl_I& newbyte, const cl_I& n, const cl_byte& b) +@cindex @code{deposit_field ()} returns an integer where the bits described by the bit interval @code{b} come from @code{newbyte} and the other bits come from @code{n}. @end table @@ -1911,39 +2074,47 @@ for common arithmetic operations: @table @code @item cl_boolean oddp (const cl_I& x) +@cindex @code{oddp ()} Returns true if the least significant bit of @code{x} is 1. Equivalent to @code{mod(x,2) != 0}. @item cl_boolean evenp (const cl_I& x) +@cindex @code{evenp ()} Returns true if the least significant bit of @code{x} is 0. Equivalent to @code{mod(x,2) == 0}. @item cl_I operator << (const cl_I& x, const cl_I& n) +@cindex @code{operator << ()} Shifts @code{x} by @code{n} bits to the left. @code{n} should be >=0. Equivalent to @code{x * expt(2,n)}. @item cl_I operator >> (const cl_I& x, const cl_I& n) +@cindex @code{operator >> ()} Shifts @code{x} by @code{n} bits to the right. @code{n} should be >=0. Bits shifted out to the right are thrown away. Equivalent to @code{floor(x / expt(2,n))}. @item cl_I ash (const cl_I& x, const cl_I& y) +@cindex @code{ash ()} Shifts @code{x} by @code{y} bits to the left (if @code{y}>=0) or by @code{-y} bits to the right (if @code{y}<=0). In other words, this returns @code{floor(x * expt(2,y))}. @item uintL integer_length (const cl_I& x) +@cindex @code{integer_length ()} Returns the number of bits (excluding the sign bit) needed to represent @code{x} in two's complement notation. This is the smallest n >= 0 such that -2^n <= x < 2^n. If x > 0, this is the unique n > 0 such that 2^(n-1) <= x < 2^n. @item uintL ord2 (const cl_I& x) +@cindex @code{ord2 ()} @code{x} must be non-zero. This function returns the number of 0 bits at the right of @code{x} in two's complement notation. This is the largest n >= 0 such that 2^n divides @code{x}. @item uintL power2p (const cl_I& x) +@cindex @code{power2p ()} @code{x} must be > 0. This function checks whether @code{x} is a power of 2. If @code{x} = 2^(n-1), it returns n. Else it returns 0. (See also the function @code{logp}.) @@ -1955,11 +2126,13 @@ If @code{x} = 2^(n-1), it returns n. Else it returns 0. @table @code @item uint32 gcd (uint32 a, uint32 b) +@cindex @code{gcd ()} @itemx cl_I gcd (const cl_I& a, const cl_I& b) This function returns the greatest common divisor of @code{a} and @code{b}, normalized to be >= 0. @item cl_I xgcd (const cl_I& a, const cl_I& b, cl_I* u, cl_I* v) +@cindex @code{xgcd ()} This function (``extended gcd'') returns the greatest common divisor @code{g} of @code{a} and @code{b} and at the same time the representation of @code{g} as an integral linear combination of @code{a} and @code{b}: @@ -1970,10 +2143,12 @@ value, in the following sense: If @code{a} and @code{b} are non-zero, and @code{abs(u) <= abs(b)/(2*g)}, @code{abs(v) <= abs(a)/(2*g)}. @item cl_I lcm (const cl_I& a, const cl_I& b) +@cindex @code{lcm ()} This function returns the least common multiple of @code{a} and @code{b}, normalized to be >= 0. @item cl_boolean logp (const cl_I& a, const cl_I& b, cl_RA* l) +@cindex @code{logp ()} @itemx cl_boolean logp (const cl_RA& a, const cl_RA& b, cl_RA* l) @code{a} must be > 0. @code{b} must be >0 and != 1. If log(a,b) is rational number, this function returns true and sets *l = log(a,b), else @@ -1986,15 +2161,18 @@ it returns false. @table @code @item cl_I factorial (uintL n) +@cindex @code{factorial ()} @code{n} must be a small integer >= 0. This function returns the factorial @code{n}! = @code{1*2*@dots{}*n}. @item cl_I doublefactorial (uintL n) +@cindex @code{doublefactorial ()} @code{n} must be a small integer >= 0. This function returns the doublefactorial @code{n}!! = @code{1*3*@dots{}*n} or @code{n}!! = @code{2*4*@dots{}*n}, respectively. @item cl_I binomial (uintL n, uintL k) +@cindex @code{binomial ()} @code{n} and @code{k} must be small integers >= 0. This function returns the binomial coefficient @tex @@ -2020,6 +2198,7 @@ defines the following operations. @table @code @item @var{type} scale_float (const @var{type}& x, sintL delta) +@cindex @code{scale_float ()} @itemx @var{type} scale_float (const @var{type}& x, const cl_I& delta) Returns @code{x*2^delta}. This is more efficient than an explicit multiplication because it copies @code{x} and modifies the exponent. @@ -2030,23 +2209,28 @@ representation of floating-point numbers. @table @code @item sintL float_exponent (const @var{type}& x) +@cindex @code{float_exponent ()} Returns the exponent @code{e} of @code{x}. For @code{x = 0.0}, this is 0. For @code{x} non-zero, this is the unique integer with @code{2^(e-1) <= abs(x) < 2^e}. @item sintL float_radix (const @var{type}& x) +@cindex @code{float_radix ()} Returns the base of the floating-point representation. This is always @code{2}. @item @var{type} float_sign (const @var{type}& x) +@cindex @code{float_sign ()} Returns the sign @code{s} of @code{x} as a float. The value is 1 for @code{x} >= 0, -1 for @code{x} < 0. @item uintL float_digits (const @var{type}& x) +@cindex @code{float_digits ()} Returns the number of mantissa bits in the floating-point representation of @code{x}, including the hidden bit. The value only depends on the type of @code{x}, not on its value. @item uintL float_precision (const @var{type}& x) +@cindex @code{float_precision ()} Returns the number of significant mantissa bits in the floating-point representation of @code{x}. Since denormalized numbers are not supported, this is the same as @code{float_digits(x)} if @code{x} is non-zero, and @@ -2054,6 +2238,11 @@ this is the same as @code{float_digits(x)} if @code{x} is non-zero, and @end table The complete internal representation of a float is encoded in the type +@cindex @code{cl_decoded_float} +@cindex @code{cl_decoded_sfloat} +@cindex @code{cl_decoded_ffloat} +@cindex @code{cl_decoded_dfloat} +@cindex @code{cl_decoded_lfloat} @code{cl_decoded_float} (or @code{cl_decoded_sfloat}, @code{cl_decoded_ffloat}, @code{cl_decoded_dfloat}, @code{cl_decoded_lfloat}, respectively), defined by @example @@ -2066,6 +2255,7 @@ and returned by the function @table @code @item cl_decoded_@var{type}float decode_float (const @var{type}& x) +@cindex @code{decode_float ()} For @code{x} non-zero, this returns @code{(-1)^s}, @code{e}, @code{m} with @code{x = (-1)^s * 2^e * m} and @code{0.5 <= m < 1.0}. For @code{x} = 0, it returns @code{(-1)^s}=1, @code{e}=0, @code{m}=0. @@ -2074,6 +2264,7 @@ it returns @code{(-1)^s}=1, @code{e}=0, @code{m}=0. A complete decoding in terms of integers is provided as type @example +@cindex @code{cl_idecoded_float} struct cl_idecoded_float @{ cl_I mantissa; cl_I exponent; cl_I sign; @}; @@ -2082,6 +2273,7 @@ by the following function: @table @code @item cl_idecoded_float integer_decode_float (const @var{type}& x) +@cindex @code{integer_decode_float ()} For @code{x} non-zero, this returns @code{(-1)^s}, @code{e}, @code{m} with @code{x = (-1)^s * 2^e * m} and @code{m} an integer with @code{float_digits(x)} bits. For @code{x} = 0, it returns @code{(-1)^s}=1, @code{e}=0, @code{m}=0. @@ -2093,6 +2285,7 @@ Some other function, implemented only for class @code{cl_F}: @table @code @item cl_F float_sign (const cl_F& x, const cl_F& y) +@cindex @code{float_sign ()} This returns a floating point number whose precision and absolute value is that of @code{y} and whose sign is that of @code{x}. If @code{x} is zero, it is treated as positive. Same for @code{y}. @@ -2101,6 +2294,7 @@ zero, it is treated as positive. Same for @code{y}. @node Conversion functions, Random number generators, Functions on floating-point numbers, Functions on numbers @section Conversion functions +@cindex conversion @menu * Conversion to floating-point numbers:: @@ -2114,6 +2308,7 @@ The type @code{cl_float_format_t} describes a floating-point format. @table @code @item cl_float_format_t cl_float_format (uintL n) +@cindex @code{cl_float_format ()} Returns the smallest float format which guarantees at least @code{n} decimal digits in the mantissa (after the decimal point). @@ -2121,6 +2316,7 @@ decimal digits in the mantissa (after the decimal point). Returns the floating point format of @code{x}. @item cl_float_format_t cl_default_float_format +@cindex @code{cl_default_float_format} Global variable: the default float format used when converting rational numbers to floats. @end table @@ -2132,6 +2328,7 @@ defines the following operations: @table @code @item cl_F cl_float (const @var{type}&x, cl_float_format_t f) +@cindex @code{cl_float} Returns @code{x} as a float of format @code{f}. @item cl_F cl_float (const @var{type}&x, const cl_F& y) Returns @code{x} in the float format of @code{y}. @@ -2146,23 +2343,29 @@ Every floating-point format has some characteristic numbers: @table @code @item cl_F most_positive_float (cl_float_format_t f) +@cindex @code{most_positive_float ()} Returns the largest (most positive) floating point number in float format @code{f}. @item cl_F most_negative_float (cl_float_format_t f) +@cindex @code{most_negative_float ()} Returns the smallest (most negative) floating point number in float format @code{f}. @item cl_F least_positive_float (cl_float_format_t f) +@cindex @code{least_positive_float ()} Returns the least positive floating point number (i.e. > 0 but closest to 0) in float format @code{f}. @item cl_F least_negative_float (cl_float_format_t f) +@cindex @code{least_negative_float ()} Returns the least negative floating point number (i.e. < 0 but closest to 0) in float format @code{f}. @item cl_F float_epsilon (cl_float_format_t f) +@cindex @code{float_epsilon ()} Returns the smallest floating point number e > 0 such that @code{1+e != 1}. @item cl_F float_negative_epsilon (cl_float_format_t f) +@cindex @code{float_negative_epsilon ()} Returns the smallest floating point number e > 0 such that @code{1-e != 1}. @end table @@ -2175,6 +2378,7 @@ defines the following operation: @table @code @item cl_RA rational (const @var{type}& x) +@cindex @code{rational ()} Returns the value of @code{x} as an exact number. If @code{x} is already an exact number, this is @code{x}. If @code{x} is a floating-point number, the value is a rational number whose denominator is a power of 2. @@ -2185,6 +2389,7 @@ the function @table @code @item cl_RA rationalize (const cl_R& x) +@cindex @code{rationalize ()} If @code{x} is a floating-point number, it actually represents an interval of real numbers, and this function returns the rational number with smallest denominator (and smallest numerator, in magnitude) @@ -2217,6 +2422,7 @@ Calling one of these modifies the state of the random number generator in a complicated but deterministic way. The global variable +@cindex @code{cl_default_random_state} @example cl_random_state cl_default_random_state @end example @@ -2226,20 +2432,24 @@ below are called without @code{cl_random_state} argument. @table @code @item uint32 random32 (cl_random_state& randomstate) @itemx uint32 random32 () +@cindex @code{random32 ()} Returns a random unsigned 32-bit number. All bits are equally random. @item cl_I random_I (cl_random_state& randomstate, const cl_I& n) @itemx cl_I random_I (const cl_I& n) +@cindex @code{random_I ()} @code{n} must be an integer > 0. This function returns a random integer @code{x} in the range @code{0 <= x < n}. @item cl_F random_F (cl_random_state& randomstate, const cl_F& n) @itemx cl_F random_F (const cl_F& n) +@cindex @code{random_F ()} @code{n} must be a float > 0. This function returns a random floating-point number of the same format as @code{n} in the range @code{0 <= x < n}. @item cl_R random_R (cl_random_state& randomstate, const cl_R& n) @itemx cl_R random_R (const cl_R& n) +@cindex @code{random_R ()} Behaves like @code{random_I} if @code{n} is an integer and like @code{random_F} if @code{n} is a float. @end table @@ -2247,6 +2457,7 @@ if @code{n} is a float. @node Obfuscating operators, , Random number generators, Functions on numbers @section Obfuscating operators +@cindex modifying operators The modifying C/C++ operators @code{+=}, @code{-=}, @code{*=}, @code{/=}, @code{&=}, @code{|=}, @code{^=}, @code{<<=}, @code{>>=} @@ -2257,6 +2468,7 @@ to get happy, then add @example #define WANT_OBFUSCATING_OPERATORS @end example +@cindex @code{WANT_OBFUSCATING_OPERATORS} to the beginning of your source files, before the inclusion of any CLN include files. This flag will enable the following operators: @@ -2265,9 +2477,13 @@ For the classes @code{cl_N}, @code{cl_R}, @code{cl_RA}, @table @code @item @var{type}& operator += (@var{type}&, const @var{type}&) +@cindex @code{operator += ()} @itemx @var{type}& operator -= (@var{type}&, const @var{type}&) +@cindex @code{operator -= ()} @itemx @var{type}& operator *= (@var{type}&, const @var{type}&) +@cindex @code{operator *= ()} @itemx @var{type}& operator /= (@var{type}&, const @var{type}&) +@cindex @code{operator /= ()} @end table For the class @code{cl_I}: @@ -2277,10 +2493,15 @@ For the class @code{cl_I}: @itemx @var{type}& operator -= (@var{type}&, const @var{type}&) @itemx @var{type}& operator *= (@var{type}&, const @var{type}&) @itemx @var{type}& operator &= (@var{type}&, const @var{type}&) +@cindex @code{operator &= ()} @itemx @var{type}& operator |= (@var{type}&, const @var{type}&) +@cindex @code{operator |= ()} @itemx @var{type}& operator ^= (@var{type}&, const @var{type}&) +@cindex @code{operator ^= ()} @itemx @var{type}& operator <<= (@var{type}&, const @var{type}&) +@cindex @code{operator <<= ()} @itemx @var{type}& operator >>= (@var{type}&, const @var{type}&) +@cindex @code{operator >>= ()} @end table For the classes @code{cl_N}, @code{cl_R}, @code{cl_RA}, @code{cl_I}, @@ -2288,12 +2509,14 @@ For the classes @code{cl_N}, @code{cl_R}, @code{cl_RA}, @code{cl_I}, @table @code @item @var{type}& operator ++ (@var{type}& x) +@cindex @code{operator ++ ()} The prefix operator @code{++x}. @item void operator ++ (@var{type}& x, int) The postfix operator @code{x++}. @item @var{type}& operator -- (@var{type}& x) +@cindex @code{operator -- ()} The prefix operator @code{--x}. @item void operator -- (@var{type}& x, int) @@ -2307,6 +2530,7 @@ efficient. @node Input/Output, Rings, Functions on numbers, Top @chapter Input/Output +@cindex Input/Output @menu * Internal and printed representation:: @@ -2316,6 +2540,7 @@ efficient. @node Internal and printed representation, Input functions, Input/Output, Input/Output @section Internal and printed representation +@cindex representation All computations deal with the internal representations of the numbers. @@ -2324,8 +2549,10 @@ Several external representations may denote the same number, for example, "20.0" and "20.000". Converting an internal to an external representation is called ``printing'', +@cindex printing converting an external to an internal representation is called ``reading''. -In CLN, is it always true that conversion of an internal to an external +@cindex reading +In CLN, it is always true that conversion of an internal to an external representation and then back to an internal representation will yield the same internal representation. Symbolically: @code{read(print(x)) == x}. This is called ``print-read consistency''. @@ -2601,7 +2828,7 @@ using this variable name. Default is @code{"x"}. @end table The global variable @code{cl_default_print_flags} contains the default values, -used by the function @code{fprint}, +used by the function @code{fprint}. @node Rings, Modular integers, Input/Output, Top @@ -2670,6 +2897,7 @@ Tests whether the given number is an element of the number ring R. @node Modular integers, Symbolic data types, Rings, Top @chapter Modular integers +@cindex modular integer @menu * Modular integer rings:: @@ -2678,6 +2906,7 @@ Tests whether the given number is an element of the number ring R. @node Modular integer rings, Functions on modular integers, Modular integers, Modular integers @section Modular integer rings +@cindex ring CLN implements modular integers, i.e. integers modulo a fixed integer N. The modulus is explicitly part of every modular integer. CLN doesn't @@ -2711,9 +2940,11 @@ Modular integer rings are constructed using the function @table @code @item cl_modint_ring cl_find_modint_ring (const cl_I& N) +@cindex @code{cl_find_modint_ring ()} This function returns the modular ring @samp{Z/NZ}. It takes care of finding out about special cases of @code{N}, like powers of two and odd numbers for which Montgomery multiplication will be a win, +@cindex Montgomery multiplication and precomputes any necessary auxiliary data for computing modulo @code{N}. There is a cache table of rings, indexed by @code{N} (or, more precisely, by @code{abs(N)}). This ensures that the precomputation costs are reduced @@ -2724,7 +2955,9 @@ Modular integer rings can be compared for equality: @table @code @item bool operator== (const cl_modint_ring&, const cl_modint_ring&) +@cindex @code{operator == ()} @itemx bool operator!= (const cl_modint_ring&, const cl_modint_ring&) +@cindex @code{operator != ()} These compare two modular integer rings for equality. Two different calls to @code{cl_find_modint_ring} with the same argument necessarily return the same ring because it is memoized in the cache table. @@ -2737,23 +2970,29 @@ Given a modular integer ring @code{R}, the following members can be used. @table @code @item cl_I R->modulus +@cindex @code{modulus} This is the ring's modulus, normalized to be nonnegative: @code{abs(N)}. @item cl_MI R->zero() +@cindex @code{zero ()} This returns @code{0 mod N}. @item cl_MI R->one() +@cindex @code{one ()} This returns @code{1 mod N}. @item cl_MI R->canonhom (const cl_I& x) +@cindex @code{canonhom ()} This returns @code{x mod N}. @item cl_I R->retract (const cl_MI& x) +@cindex @code{etract ()} This is a partial inverse function to @code{R->canonhom}. It returns the standard representative (@code{>=0}, @code{random(cl_random_state& randomstate) @itemx cl_MI R->random() +@cindex @code{random ()} This returns a random integer modulo @code{N}. @end table @@ -2761,13 +3000,16 @@ The following operations are defined on modular integers. @table @code @item cl_modint_ring x.ring () +@cindex @code{ring()} Returns the ring to which the modular integer @code{x} belongs. @item cl_MI operator+ (const cl_MI&, const cl_MI&) +@cindex @code{operator + ()} Returns the sum of two modular integers. One of the arguments may also be a plain integer. @item cl_MI operator- (const cl_MI&, const cl_MI&) +@cindex @code{operator - ()} Returns the difference of two modular integers. One of the arguments may also be a plain integer. @@ -2775,40 +3017,51 @@ a plain integer. Returns the negative of a modular integer. @item cl_MI operator* (const cl_MI&, const cl_MI&) +@cindex @code{operator * ()} Returns the product of two modular integers. One of the arguments may also be a plain integer. @item cl_MI square (const cl_MI&) +@cindex @code{square ()} Returns the square of a modular integer. @item cl_MI recip (const cl_MI& x) +@cindex @code{recip ()} Returns the reciprocal @code{x^-1} of a modular integer @code{x}. @code{x} must be coprime to the modulus, otherwise an error message is issued. @item cl_MI div (const cl_MI& x, const cl_MI& y) +@cindex @code{div ()} Returns the quotient @code{x*y^-1} of two modular integers @code{x}, @code{y}. @code{y} must be coprime to the modulus, otherwise an error message is issued. @item cl_MI expt_pos (const cl_MI& x, const cl_I& y) +@cindex @code{expt_pos ()} @code{y} must be > 0. Returns @code{x^y}. @item cl_MI expt (const cl_MI& x, const cl_I& y) +@cindex @code{expt ()} Returns @code{x^y}. If @code{y} is negative, @code{x} must be coprime to the modulus, else an error message is issued. @item cl_MI operator<< (const cl_MI& x, const cl_I& y) +@cindex @code{operator << ()} Returns @code{x*2^y}. @item cl_MI operator>> (const cl_MI& x, const cl_I& y) +@cindex @code{operator >> ()} Returns @code{x*2^-y}. When @code{y} is positive, the modulus must be odd, or an error message is issued. @item bool operator== (const cl_MI&, const cl_MI&) +@cindex @code{operator == ()} @itemx bool operator!= (const cl_MI&, const cl_MI&) +@cindex @code{operator != ()} Compares two modular integers, belonging to the same modular integer ring, for equality. @item cl_boolean zerop (const cl_MI& x) +@cindex @code{zerop ()} Returns true if @code{x} is @code{0 mod N}. @end table @@ -2817,7 +3070,9 @@ input/output). @table @code @item void fprint (cl_ostream stream, const cl_MI& x) +@cindex @code{fprint ()} @itemx cl_ostream operator<< (cl_ostream stream, const cl_MI& x) +@cindex @code{operator << ()} Prints the modular integer @code{x} on the @code{stream}. The output may depend on the global printer settings in the variable @code{cl_default_print_flags}. @end table @@ -2825,6 +3080,7 @@ on the global printer settings in the variable @code{cl_default_print_flags}. @node Symbolic data types, Univariate polynomials, Modular integers, Top @chapter Symbolic data types +@cindex symbolic type CLN implements two symbolic (non-numeric) data types: strings and symbols. @@ -2835,6 +3091,7 @@ CLN implements two symbolic (non-numeric) data types: strings and symbols. @node Strings, Symbols, Symbolic data types, Symbolic data types @section Strings +@cindex string The class @@ -2850,6 +3107,7 @@ Strings are constructed through the following constructors: @table @code @item cl_string (const char * s) +@cindex @code{cl_string ()} Returns an immutable copy of the (zero-terminated) C string @code{s}. @item cl_string (const char * ptr, unsigned long len) @@ -2864,20 +3122,25 @@ The following functions are available on strings: Assignment from @code{cl_string} and @code{const char *}. @item s.length() +@cindex @code{length ()} @itemx strlen(s) +@cindex @code{strlen ()} Returns the length of the string @code{s}. @item s[i] +@cindex @code{operator [] ()} Returns the @code{i}th character of the string @code{s}. @code{i} must be in the range @code{0 <= i < s.length()}. @item bool equal (const cl_string& s1, const cl_string& s2) +@cindex @code{equal ()} Compares two strings for equality. One of the arguments may also be a plain @code{const char *}. @end table @node Symbols, , Strings, Symbolic data types @section Symbols +@cindex symbol Symbols are uniquified strings: all symbols with the same name are shared. This means that comparison of two symbols is fast (effectively just a pointer @@ -2890,6 +3153,7 @@ Symbols are constructed through the following constructor: @table @code @item cl_symbol (const cl_string& s) +@cindex @code{cl_symbol ()} Looks up or creates a new symbol with a given name. @end table @@ -2901,12 +3165,15 @@ Conversion to @code{cl_string}: Returns the string which names the symbol @code{sym}. @item bool equal (const cl_symbol& sym1, const cl_symbol& sym2) +@cindex @code{equal ()} Compares two symbols for equality. This is very fast. @end table @node Univariate polynomials, Internals, Symbolic data types, Top @chapter Univariate polynomials +@cindex polynomial +@cindex univariate polynomial @menu * Univariate polynomial rings:: @@ -3009,6 +3276,7 @@ This ensures that two calls of this function with the same arguments will return the same polynomial ring. @item cl_univpoly_complex_ring cl_find_univpoly_ring (const cl_complex_ring& R) +@cindex @code{cl_find_univpoly_ring ()} @itemx cl_univpoly_complex_ring cl_find_univpoly_ring (const cl_complex_ring& R, const cl_symbol& varname) @itemx cl_univpoly_real_ring cl_find_univpoly_ring (const cl_real_ring& R) @itemx cl_univpoly_real_ring cl_find_univpoly_ring (const cl_real_ring& R, const cl_symbol& varname) @@ -3029,22 +3297,28 @@ Given a univariate polynomial ring @code{R}, the following members can be used. @table @code @item cl_ring R->basering() +@cindex @code{basering ()} This returns the base ring, as passed to @samp{cl_find_univpoly_ring}. @item cl_UP R->zero() +@cindex @code{zero ()} This returns @code{0 in R}, a polynomial of degree -1. @item cl_UP R->one() +@cindex @code{one ()} This returns @code{1 in R}, a polynomial of degree <= 0. @item cl_UP R->canonhom (const cl_I& x) +@cindex @code{canonhom ()} This returns @code{x in R}, a polynomial of degree <= 0. @item cl_UP R->monomial (const cl_ring_element& x, uintL e) +@cindex @code{monomial ()} This returns a sparse polynomial: @code{x * X^e}, where @code{X} is the indeterminate. @item cl_UP R->create (sintL degree) +@cindex @code{create ()} Creates a new polynomial with a given degree. The zero polynomial has degree @code{-1}. After creating the polynomial, you should put in the coefficients, using the @code{set_coeff} member function, and then call the @code{finalize} @@ -3055,11 +3329,13 @@ The following are the only destructive operations on univariate polynomials. @table @code @item void set_coeff (cl_UP& x, uintL index, const cl_ring_element& y) +@cindex @code{set_coeff ()} This changes the coefficient of @code{X^index} in @code{x} to be @code{y}. After changing a polynomial and before applying any "normal" operation on it, you should call its @code{finalize} member function. @item void finalize (cl_UP& x) +@cindex @code{finalize ()} This function marks the endpoint of destructive modifications of a polynomial. It normalizes the internal representation so that subsequent computations have less overhead. Doing normal computations on unnormalized polynomials may @@ -3070,47 +3346,60 @@ The following operations are defined on univariate polynomials. @table @code @item cl_univpoly_ring x.ring () +@cindex @code{ring ()} Returns the ring to which the univariate polynomial @code{x} belongs. @item cl_UP operator+ (const cl_UP&, const cl_UP&) +@cindex @code{operator + ()} Returns the sum of two univariate polynomials. @item cl_UP operator- (const cl_UP&, const cl_UP&) +@cindex @code{operator - ()} Returns the difference of two univariate polynomials. @item cl_UP operator- (const cl_UP&) Returns the negative of a univariate polynomial. @item cl_UP operator* (const cl_UP&, const cl_UP&) +@cindex @code{operator * ()} Returns the product of two univariate polynomials. One of the arguments may also be a plain integer or an element of the base ring. @item cl_UP square (const cl_UP&) +@cindex @code{square ()} Returns the square of a univariate polynomial. @item cl_UP expt_pos (const cl_UP& x, const cl_I& y) +@cindex @code{expt_pos ()} @code{y} must be > 0. Returns @code{x^y}. @item bool operator== (const cl_UP&, const cl_UP&) +@cindex @code{operator == ()} @itemx bool operator!= (const cl_UP&, const cl_UP&) +@cindex @code{operator != ()} Compares two univariate polynomials, belonging to the same univariate polynomial ring, for equality. @item cl_boolean zerop (const cl_UP& x) +@cindex @code{zerop ()} Returns true if @code{x} is @code{0 in R}. @item sintL degree (const cl_UP& x) +@cindex @code{degree ()} Returns the degree of the polynomial. The zero polynomial has degree @code{-1}. @item cl_ring_element coeff (const cl_UP& x, uintL index) +@cindex @code{coeff ()} Returns the coefficient of @code{X^index} in the polynomial @code{x}. @item cl_ring_element x (const cl_ring_element& y) +@cindex @code{operator () ()} Evaluation: If @code{x} is a polynomial and @code{y} belongs to the base ring, then @samp{x(y)} returns the value of the substitution of @code{y} into @code{x}. @item cl_UP deriv (const cl_UP& x) +@cindex @code{deriv ()} Returns the derivative of the polynomial @code{x} with respect to the indeterminate @code{X}. @end table @@ -3120,7 +3409,9 @@ input/output). @table @code @item void fprint (cl_ostream stream, const cl_UP& x) +@cindex @code{fprint ()} @itemx cl_ostream operator<< (cl_ostream stream, const cl_UP& x) +@cindex @code{operator << ()} Prints the univariate polynomial @code{x} on the @code{stream}. The output may depend on the global printer settings in the variable @code{cl_default_print_flags}. @@ -3133,15 +3424,23 @@ The following functions return special polynomials. @table @code @item cl_UP_I cl_tschebychev (sintL n) +@cindex @code{cl_tschebychev ()} +@cindex Tschebychev polynomial Returns the n-th Tchebychev polynomial (n >= 0). @item cl_UP_I cl_hermite (sintL n) +@cindex @code{cl_hermite ()} +@cindex Hermite polynomial Returns the n-th Hermite polynomial (n >= 0). @item cl_UP_RA cl_legendre (sintL n) +@cindex @code{cl_legendre ()} +@cindex Legende polynomial Returns the n-th Legendre polynomial (n >= 0). @item cl_UP_I cl_laguerre (sintL n) +@cindex @code{cl_laguerre ()} +@cindex Laguerre polynomial Returns the n-th Laguerre polynomial (n >= 0). @end table @@ -3162,6 +3461,7 @@ of these polynomials from their definition can be found in the @node Why C++ ?, Memory efficiency, Internals, Internals @section Why C++ ? +@cindex advocacy Using C++ as an implementation language provides @@ -3170,6 +3470,7 @@ Using C++ as an implementation language provides Efficiency: It compiles to machine code. @item +@cindex portability Portability: It runs on all platforms supporting a C++ compiler. Because of the availability of GNU C++, this includes all currently used 32-bit and 64-bit platforms, independently of the quality of the vendor's C++ compiler. @@ -3178,7 +3479,7 @@ of the availability of GNU C++, this includes all currently used 32-bit and Type safety: The C++ compilers knows about the number types and complains if, for example, you try to assign a float to an integer variable. However, a drawback is that C++ doesn't know about generic types, hence a restriction -like that @code{operation+ (const cl_MI&, const cl_MI&)} requires that both +like that @code{operator+ (const cl_MI&, const cl_MI&)} requires that both arguments belong to the same modular ring cannot be expressed as a compile-time information. @@ -3206,6 +3507,8 @@ In order to save memory allocations, CLN implements: Object sharing: An operation like @code{x+0} returns @code{x} without copying it. @item +@cindex garbage collection +@cindex reference counting Garbage collection: A reference counting mechanism makes sure that any number object's storage is freed immediately when the last reference to the object is gone. @@ -3231,8 +3534,8 @@ memory access, just a couple of instructions for each elementary operation. The kernel of CLN has been written in assembly language for some CPUs (@code{i386}, @code{m68k}, @code{sparc}, @code{mips}, @code{arm}). @item -On all CPUs, CLN uses the superefficient low-level routines from GNU -GMP version 2. +On all CPUs, CLN may be configured to use the superefficient low-level +routines from GNU GMP version 3. @item For large numbers, CLN uses, instead of the standard @code{O(N^2)} algorithm, the Karatsuba multiplication, which is an @@ -3249,9 +3552,11 @@ algorithm. For very large numbers (more than 12000 decimal digits), CLN uses @iftex Sch{@"o}nhage-Strassen +@cindex Sch{@"o}nhage-Strassen @end iftex @ifinfo Schönhage-Strassen +@cindex Schönhage-Strassen @end ifinfo multiplication, which is an asymptotically optimal multiplication algorithm. @@ -3263,6 +3568,7 @@ of division and radix conversion. @node Garbage collection, , Speed efficiency, Internals @section Garbage collection +@cindex garbage collection All the number classes are reference count classes: They only contain a pointer to an object in the heap. Upon construction, assignment and destruction of @@ -3297,6 +3603,7 @@ environment variables, or directly substitute the appropriate values. @node Compiler options, Include files, Using the library, Using the library @section Compiler options +@cindex compiler options Until you have installed CLN in a public place, the following options are needed: @@ -3321,6 +3628,8 @@ linking a CLN application it is sufficient to give the flag @code{-lcln}. @node Include files, An Example, Compiler options, Using the library @section Include files +@cindex include files +@cindex header files Here is a summary of the include files and their contents. @@ -3452,6 +3761,7 @@ Includes all of the above. @section An Example A function which computes the nth Fibonacci number can be written as follows. +@cindex Fibonacci number @example #include @@ -3512,9 +3822,12 @@ When the function returns, all the local variables in the function are automatically reclaimed (garbage collected). Only the result survives and gets passed to the caller. +The file @code{fibonacci.cc} in the subdirectory @code{examples} +contains this implementation together with an even faster algorithm. @node Debugging support, , An Example, Using the library @section Debugging support +@cindex debugging When debugging a CLN application with GNU @code{gdb}, two facilities are available from the library: @@ -3539,6 +3852,7 @@ CLN offers a function @code{cl_print}, callable from the debugger, for printing number objects. In order to get this function, you have to define the macro @samp{CL_DEBUG} and then include all the header files for which you want @code{cl_print} debugging support. For example: +@cindex @code{CL_DEBUG} @example #define CL_DEBUG #include @@ -3561,6 +3875,7 @@ only with number objects and similar. Therefore CLN offers a member function @code{debug_print()} on all CLN types. The same macro @samp{CL_DEBUG} is needed for this member function to be implemented. Under @code{gdb}, you call it like this: +@cindex @code{debug_print ()} @example (gdb) print s $7 = @{ = @{ = @{pointer = 0x8055b60, heappointer = 0x8055b60, @@ -3579,6 +3894,7 @@ Unfortunately, this feature does not seem to work under all circumstances. @node Customizing, Index, Using the library, Top @chapter Customizing +@cindex customizing @menu * Error handling:: @@ -3599,11 +3915,13 @@ yourself, with the prototype #include void cl_abort (void); @end example +@cindex @code{cl_abort ()} This function must not return control to its caller. @node Floating-point underflow, Customizing I/O, Error handling, Customizing @section Floating-point underflow +@cindex underflow Floating point underflow denotes the situation when a floating-point number is to be created which is so close to @code{0} that its exponent is too @@ -3613,9 +3931,8 @@ If you set the global variable cl_boolean cl_inhibit_floating_point_underflow @end example to @code{cl_true}, the error will be inhibited, and a floating-point zero -will be generated instead. -The default value of @code{cl_inhibit_floating_point_underflow} is -@code{cl_false}. +will be generated instead. The default value of +@code{cl_inhibit_floating_point_underflow} is @code{cl_false}. @node Customizing I/O, Customizing the memory allocator, Floating-point underflow, Customizing @@ -3623,6 +3940,7 @@ The default value of @code{cl_inhibit_floating_point_underflow} is The output of the function @code{fprint} may be customized by changing the value of the global variable @code{cl_default_print_flags}. +@cindex @code{cl_default_print_flags} @node Customizing the memory allocator, , Customizing I/O, Customizing @@ -3641,6 +3959,8 @@ like this: void* (*cl_malloc_hook) (size_t size) = @dots{}; void (*cl_free_hook) (void* ptr) = @dots{}; @end example +@cindex @code{cl_malloc_hook ()} +@cindex @code{cl_free_hook ()} The @code{cl_malloc_hook} function must not return a @code{NULL} pointer. It is not possible to change the memory allocator at runtime, because diff --git a/doc/cln_1.html b/doc/cln_1.html index 6a1cb07..4f72621 100644 --- a/doc/cln_1.html +++ b/doc/cln_1.html @@ -1,6 +1,6 @@ - + CLN, a Class Library for Numbers - 1. Introduction @@ -134,8 +134,9 @@ The kernel of CLN has been written in assembly language for some CPUs (i386, m68k, sparc, mips, arm).

    • -On all CPUs, CLN uses the superefficient low-level routines from GNU -GMP version 2. + +On all CPUs, CLN may be configured to use the superefficient low-level +routines from GNU GMP version 3.
    • It uses Karatsuba multiplication, which is significantly faster @@ -144,9 +145,9 @@ for large numbers than the standard multiplication algorithm. For very large numbers (more than 12000 decimal digits), it uses Schönhage-Strassen -multiplication, which is an asymptotically -optimal multiplication algorithm, for multiplication, division and -radix conversion. + +multiplication, which is an asymptotically optimal multiplication +algorithm, for multiplication, division and radix conversion.

    diff --git a/doc/cln_10.html b/doc/cln_10.html index 059d504..d858b76 100644 --- a/doc/cln_10.html +++ b/doc/cln_10.html @@ -1,6 +1,6 @@ - + CLN, a Class Library for Numbers - 10. Internals @@ -14,6 +14,9 @@ Go to the first, previous, 10.1 Why C++ ? +

    + +

    Using C++ as an implementation language provides @@ -27,6 +30,7 @@ Efficiency: It compiles to machine code.

  • + Portability: It runs on all platforms supporting a C++ compiler. Because of the availability of GNU C++, this includes all currently used 32-bit and 64-bit platforms, independently of the quality of the vendor's C++ compiler. @@ -36,7 +40,7 @@ of the availability of GNU C++, this includes all currently used 32-bit and Type safety: The C++ compilers knows about the number types and complains if, for example, you try to assign a float to an integer variable. However, a drawback is that C++ doesn't know about generic types, hence a restriction -like that operation+ (const cl_MI&, const cl_MI&) requires that both +like that operator+ (const cl_MI&, const cl_MI&) requires that both arguments belong to the same modular ring cannot be expressed as a compile-time information. @@ -72,6 +76,8 @@ Object sharing: An operation like x+0 returns x withou it.
  • + + Garbage collection: A reference counting mechanism makes sure that any number object's storage is freed immediately when the last reference to the object is gone. @@ -104,8 +110,8 @@ The kernel of CLN has been written in assembly language for some CPUs (i386, m68k, sparc, mips, arm).
  • -On all CPUs, CLN uses the superefficient low-level routines from GNU -GMP version 2. +On all CPUs, CLN may be configured to use the superefficient low-level +routines from GNU GMP version 3.
  • For large numbers, CLN uses, instead of the standard O(N^2) @@ -116,6 +122,7 @@ algorithm. For very large numbers (more than 12000 decimal digits), CLN uses Schönhage-Strassen + multiplication, which is an asymptotically optimal multiplication algorithm.
  • @@ -127,6 +134,9 @@ of division and radix conversion.

    10.4 Garbage collection

    +

    + +

    All the number classes are reference count classes: They only contain a pointer diff --git a/doc/cln_11.html b/doc/cln_11.html index 61ab64b..411c047 100644 --- a/doc/cln_11.html +++ b/doc/cln_11.html @@ -1,6 +1,6 @@ - + CLN, a Class Library for Numbers - 11. Using the library @@ -22,6 +22,9 @@ environment variables, or directly substitute the appropriate values.

    11.1 Compiler options

    +

    + +

    Until you have installed CLN in a public place, the following options are @@ -58,6 +61,10 @@ linking a CLN application it is sufficient to give the flag -lcln.

    11.2 Include files

    +

    + + +

    Here is a summary of the include files and their contents. @@ -253,6 +260,7 @@ Includes all of the above.

    A function which computes the nth Fibonacci number can be written as follows. + @@ -329,9 +337,17 @@ automatically reclaimed (garbage collected). Only the result survives and gets passed to the caller. +

    +The file fibonacci.cc in the subdirectory examples +contains this implementation together with an even faster algorithm. + +

    11.4 Debugging support

    +

    + +

    When debugging a CLN application with GNU gdb, two facilities are @@ -364,6 +380,7 @@ CLN offers a function cl_print, callable from the debugger, for printing number objects. In order to get this function, you have to define the macro `CL_DEBUG' and then include all the header files for which you want cl_print debugging support. For example: +

     #define CL_DEBUG
    @@ -390,6 +407,7 @@ only with number objects and similar. Therefore CLN offers a member function
     debug_print() on all CLN types. The same macro `CL_DEBUG'
     is needed for this member function to be implemented. Under gdb,
     you call it like this:
    +
     
     
     (gdb) print s
    diff --git a/doc/cln_12.html b/doc/cln_12.html
    index 0070b35..9399348 100644
    --- a/doc/cln_12.html
    +++ b/doc/cln_12.html
    @@ -1,6 +1,6 @@
     
     
    -
    +
     
     CLN, a Class Library for Numbers - 12. Customizing
     
    @@ -10,6 +10,9 @@ Go to the first, previous, 12. Customizing
    +

    + + @@ -28,12 +31,16 @@ void cl_abort (void);

    + This function must not return control to its caller.

    12.2 Floating-point underflow

    +

    + +

    Floating point underflow denotes the situation when a floating-point number @@ -47,9 +54,8 @@ cl_boolean cl_inhibit_floating_point_underflow

    to cl_true, the error will be inhibited, and a floating-point zero -will be generated instead. -The default value of cl_inhibit_floating_point_underflow is -cl_false. +will be generated instead. The default value of +cl_inhibit_floating_point_underflow is cl_false. @@ -59,6 +65,7 @@ The default value of cl_inhibit_floating_point_underflow is

    The output of the function fprint may be customized by changing the value of the global variable cl_default_print_flags. + @@ -82,6 +89,8 @@ void (*cl_free_hook) (void* ptr) = ...;

    + + The cl_malloc_hook function must not return a NULL pointer. diff --git a/doc/cln_13.html b/doc/cln_13.html index 7186cd1..1240d1e 100644 --- a/doc/cln_13.html +++ b/doc/cln_13.html @@ -1,6 +1,6 @@ - + CLN, a Class Library for Numbers - Index diff --git a/doc/cln_2.html b/doc/cln_2.html index 2a92f22..d9f2136 100644 --- a/doc/cln_2.html +++ b/doc/cln_2.html @@ -1,6 +1,6 @@ - + CLN, a Class Library for Numbers - 2. Installation @@ -27,7 +27,7 @@ This section describes how to install the CLN package on your system. To build CLN, you need a C++ compiler. Actually, you need GNU g++ 2.7.0 or newer. On HPPA, you need GNU g++ 2.8.0 or newer. -I recommend GNU egcs 1.1 or newer. +I recommend GNU g++ 2.95 or newer.

    @@ -50,6 +50,8 @@ of static and global variables, a feature which I could implement for GNU g++ only. +

    +

    2.1.2 Make utility

    @@ -58,6 +60,8 @@ implement for GNU g++ only. To build CLN, you also need to have GNU make installed. +

    +

    2.1.3 Sed utility

    @@ -181,11 +185,6 @@ With full `-O2', g++ miscompiles the division routines --enable-shared to work, you need egcs-1.1.2 or newer. -

    -On MIPS (SGI Irix 6), pass option --without-gmp to configure. gmp does -not work when compiled in `n32' binary format on Irix. - -

    By default, only a static library is built. You can build CLN as a shared library too, by calling configure with the option `--enable-shared'. @@ -202,6 +201,9 @@ library.

    2.3 Installing the library

    +

    + +

    As with any autoconfiguring GNU software, installation is as easy as this: diff --git a/doc/cln_3.html b/doc/cln_3.html index 9db9d05..ed3eae4 100644 --- a/doc/cln_3.html +++ b/doc/cln_3.html @@ -1,6 +1,6 @@ - + CLN, a Class Library for Numbers - 3. Ordinary number types @@ -45,6 +45,8 @@ Rational number Floating-point number

    + + The base class cl_number is an abstract base class. It is not useful to declare a variable of this type except if you want to completely disable compile-time type checking and use run-time type @@ -52,17 +54,24 @@ checking instead.

    + + + The class cl_N comprises real and complex numbers. There is no special class for complex numbers since complex numbers with imaginary part 0 are automatically converted to real numbers.

    + The class cl_R comprises real numbers of different kinds. It is an abstract class.

    + + + The class cl_RA comprises exact real numbers: rational numbers, including integers. There is no special class for non-integral rational numbers since rational numbers with denominator 1 are automatically converted @@ -70,6 +79,7 @@ to integers.

    + The class cl_F implements floating-point approximations to real numbers. It is an abstract class. @@ -77,6 +87,9 @@ It is an abstract class.

    3.1 Exact numbers

    +

    + +

    Some numbers are represented as exact numbers: there is no loss of information @@ -118,6 +131,9 @@ is completely transparent.

    3.2 Floating-point numbers

    +

    + +

    Not all real numbers can be represented exactly. (There is an easy mathematical @@ -128,6 +144,7 @@ CLN implements ordinary floating-point numbers, with mantissa and exponent.

    + The elementary operations (+, -, *, /, ...) only return approximate results. For example, the value of the expression (cl_F) 0.3 + (cl_F) 0.4 prints as `0.70000005', not as @@ -158,6 +175,7 @@ Floating point numbers come in four flavors:

    • + Short floats, type cl_SF. They have 1 sign bit, 8 exponent bits (including the exponent's sign), and 17 mantissa bits (including the "hidden" bit). @@ -165,6 +183,7 @@ They don't consume heap allocation.
    • + Single floats, type cl_FF. They have 1 sign bit, 8 exponent bits (including the exponent's sign), and 24 mantissa bits (including the "hidden" bit). @@ -173,6 +192,7 @@ This corresponds closely to the C/C++ type `float'.
    • + Double floats, type cl_DF. They have 1 sign bit, 11 exponent bits (including the exponent's sign), and 53 mantissa bits (including the "hidden" bit). @@ -181,6 +201,7 @@ This corresponds closely to the C/C++ type `double'.
    • + Long floats, type cl_LF. They have 1 sign bit, 32 exponent bits (including the exponent's sign), and n mantissa bits (including the "hidden" bit), where n >= 64. @@ -201,6 +222,7 @@ with larger exponent range.

      + As a user of CLN, you can forget about the differences between the four floating-point types and just declare all your floating-point variables as being of type cl_F. This has the advantage that @@ -216,6 +238,9 @@ the floating point contagion rule happened to change in the future.)

      3.3 Complex numbers

      +

      + +

      Complex numbers, as implemented by the class cl_N, have a real @@ -232,6 +257,9 @@ through application of sqrt or transcendental functions.

      3.4 Conversions

      +

      + +

      Conversions from any class to any its superclasses ("base classes" in @@ -289,6 +317,7 @@ Conversions from `const char *' are provided for the classes cl_R, cl_N. The easiest way to specify a value which is outside of the range of the C++ built-in types is therefore to specify it as a string, like this: +

          cl_I order_of_rubiks_cube_group = "43252003274489856000";
      @@ -308,12 +337,16 @@ the functions
       
       
      int cl_I_to_int (const cl_I& x)
      +
      unsigned int cl_I_to_uint (const cl_I& x)
      +
      long cl_I_to_long (const cl_I& x)
      +
      unsigned long cl_I_to_ulong (const cl_I& x)
      + Returns x as element of the C type ctype. If x is not representable in the range of ctype, a runtime error occurs. @@ -330,8 +363,10 @@ the functions
      float cl_float_approx (const type& x)
      +
      double cl_double_approx (const type& x)
      + Returns an approximation of x of C type ctype. If abs(x) is too close to 0 (underflow), 0 is returned. If abs(x) is too large (overflow), an IEEE infinity is returned. @@ -342,8 +377,10 @@ Conversions from any class to any of its subclasses ("derived classes" in C++ terminology) are not provided. Instead, you can assert and check that a value belongs to a certain subclass, and return it as element of that class, using the `As' and `The' macros. + As(type)(value) checks that value belongs to type and returns it as such. + The(type)(value) assumes that value belongs to type and returns it as such. It is your responsibility to ensure that this assumption is valid. diff --git a/doc/cln_4.html b/doc/cln_4.html index f9ac86e..4bf113f 100644 --- a/doc/cln_4.html +++ b/doc/cln_4.html @@ -1,6 +1,6 @@ - + CLN, a Class Library for Numbers - 4. Functions on numbers @@ -109,10 +109,12 @@ defines the following operations:
      type operator + (const type&, const type&)
      + Addition.
      type operator - (const type&, const type&)
      + Subtraction.
      type operator - (const type&) @@ -121,18 +123,22 @@ Returns the negative of the argument.
      type plus1 (const type& x)
      + Returns x + 1.
      type minus1 (const type& x)
      + Returns x - 1.
      type operator * (const type&, const type&)
      + Multiplication.
      type square (const type& x)
      + Returns x * x. @@ -146,10 +152,12 @@ defines the following operations:
      type operator / (const type&, const type&)
      + Division.
      type recip (const type&)
      + Returns the reciprocal of the argument. @@ -165,6 +173,7 @@ Instead, cl_I defines an "exact quotient" function:
      cl_I exquo (const cl_I& x, const cl_I& y)
      + Checks that y divides x, and returns the quotient x/y. @@ -176,12 +185,14 @@ The following exponentiation functions are defined:
      cl_I expt_pos (const cl_I& x, const cl_I& y)
      +
      cl_RA expt_pos (const cl_RA& x, const cl_I& y)
      y must be > 0. Returns x^y.
      cl_RA expt (const cl_RA& x, const cl_I& y)
      +
      cl_R expt (const cl_R& x, const cl_I& y)
      cl_N expt (const cl_N& x, const cl_I& y) @@ -199,6 +210,7 @@ defines the following operation:
      type abs (const type& x)
      + Returns the absolute value of x. This is x if x >= 0, and -x if x <= 0. @@ -224,6 +236,7 @@ defines the following operation:
      type signum (const type& x)
      + Returns the sign of x, in the same number format as x. This is defined as x / abs(x) if x is non-zero, and x if x is zero. If x is real, the value is either @@ -242,10 +255,12 @@ Each of the classes cl_RA, cl_I defines the following
      cl_I numerator (const type& x)
      + Returns the numerator of x.
      cl_I denominator (const type& x)
      + Returns the denominator of x. @@ -266,6 +281,7 @@ The class cl_N defines the following operation:
      cl_N complex (const cl_R& a, const cl_R& b)
      + Returns the complex number a+bi, that is, the complex number with real part a and imaginary part b. @@ -278,14 +294,17 @@ Each of the classes cl_N, cl_R defines the following o
      cl_R realpart (const type& x)
      + Returns the real part of x.
      cl_R imagpart (const type& x)
      + Returns the imaginary part of x.
      type conjugate (const type& x)
      + Returns the complex conjugate of x. @@ -306,6 +325,9 @@ We have the relations

      4.5 Comparisons

      +

      + +

      Each of the classes cl_N, cl_R, cl_RA, cl_I, @@ -317,18 +339,22 @@ defines the following operations:

      bool operator == (const type&, const type&)
      +
      bool operator != (const type&, const type&)
      + Comparison, as in C and C++.
      uint32 cl_equal_hashcode (const type&)
      + Returns a 32-bit hash code that is the same for any two numbers which are the same according to ==. This hash code depends on the number's value, not its type or precision.
      cl_boolean zerop (const type& x)
      + Compare against zero: x == 0 @@ -342,33 +368,42 @@ defines the following operations:
      cl_signean cl_compare (const type& x, const type& y)
      + Compares x and y. Returns +1 if x>y, -1 if x<y, 0 if x=y.
      bool operator <= (const type&, const type&)
      +
      bool operator < (const type&, const type&)
      +
      bool operator >= (const type&, const type&)
      +
      bool operator > (const type&, const type&)
      + Comparison, as in C and C++.
      cl_boolean minusp (const type& x)
      + Compare against zero: x < 0
      cl_boolean plusp (const type& x)
      + Compare against zero: x > 0
      type max (const type& x, const type& y)
      + Return the maximum of x and y.
      type min (const type& x, const type& y)
      + Return the minimum of x and y. @@ -384,6 +419,9 @@ there is no floating point number whose value is exactly 1/3.

      4.6 Rounding functions

      +

      + +

      When a real number is to be converted to an integer, there is no "best" @@ -453,15 +491,19 @@ defines the following operations:

      cl_I floor1 (const type& x)
      + Returns floor(x).
      cl_I ceiling1 (const type& x)
      + Returns ceiling(x).
      cl_I truncate1 (const type& x)
      + Returns truncate(x).
      cl_I round1 (const type& x)
      + Returns round(x). @@ -550,12 +592,16 @@ defines the following operations:
      type_div_t floor2 (const type& x, const type& y)
      +
      type_div_t ceiling2 (const type& x, const type& y)
      +
      type_div_t truncate2 (const type& x, const type& y)
      +
      type_div_t round2 (const type& x, const type& y)
      +

      @@ -574,12 +620,16 @@ defines the following operations:

      type ffloor (const type& x)
      +
      type fceiling (const type& x)
      +
      type ftruncate (const type& x)
      +
      type fround (const type& x)
      +

      @@ -619,12 +669,16 @@ defines the following operations:

      type_fdiv_t ffloor2 (const type& x)
      +
      type_fdiv_t fceiling2 (const type& x)
      +
      type_fdiv_t ftruncate2 (const type& x)
      +
      type_fdiv_t fround2 (const type& x)
      +

      and similarly for class cl_R, but with quotient type cl_F. @@ -679,8 +733,10 @@ The classes cl_R, cl_I define the following operations

      type mod (const type& x, const type& y)
      +
      type rem (const type& x, const type& y)
      + @@ -697,6 +753,7 @@ defines the following operation:
      type sqrt (const type& x)
      + x must be >= 0. This function returns the square root of x, normalized to be >= 0. If x is the square of a rational number, sqrt(x) will be a rational number, else it will return a @@ -711,6 +768,7 @@ The classes cl_RA, cl_I define the following operation
      cl_boolean sqrtp (const type& x, type* root)
      + This tests whether x is a perfect square. If so, it returns true and the exact square root in *root, else it returns false. @@ -723,6 +781,7 @@ Furthermore, for integers, similarly:
      cl_boolean isqrt (const type& x, type* root)
      + x should be >= 0. This function sets *root to floor(sqrt(x)) and returns the same value as sqrtp: the boolean value (expt(*root,2) == x). @@ -737,6 +796,7 @@ define the following operation:
      cl_boolean rootp (const type& x, const cl_I& n, type* root)
      + x must be >= 0. n must be > 0. This tests whether x is an nth power of a rational number. If so, it returns true and the exact root in *root, else it returns @@ -752,6 +812,7 @@ for class cl_N:
      cl_N sqrt (const cl_N& z)
      + Returns the square root of z, as defined by the formula sqrt(z) = exp(log(z)/2). Conversion to a floating-point type or to a complex number are done if necessary. The range of the result is the @@ -764,6 +825,9 @@ The result is an exact number only if z is an exact number.

      4.8 Transcendental functions

      +

      + +

      The transcendental functions return an exact result if the argument @@ -780,6 +844,7 @@ For example, cos(0) = 1 returns the rational number 1.

      cl_R exp (const cl_R& x)
      +
      cl_N exp (const cl_N& x)
      Returns the exponential function of x. This is e^x where @@ -788,10 +853,12 @@ is the entire complex plane excluding 0.
      cl_R ln (const cl_R& x)
      + x must be > 0. Returns the (natural) logarithm of x.
      cl_N log (const cl_N& x)
      + Returns the (natural) logarithm of x. If x is real and positive, this is ln(x). In general, log(x) = log(abs(x)) + i*phase(x). The range of the result is the strip in the complex plane @@ -799,6 +866,7 @@ The range of the result is the strip in the complex plane
      cl_R phase (const cl_N& x)
      + Returns the angle part of x in its polar representation as a complex number. That is, phase(x) = atan(realpart(x),imagpart(x)). This is also the imaginary part of log(x). @@ -820,6 +888,7 @@ Returns the logarithm of a with respect to base b.
      cl_N expt (const cl_N& x, const cl_N& y)
      + Exponentiation: Returns x^y = exp(y*log(x)). @@ -831,6 +900,7 @@ The constant e = exp(1) = 2.71828... is returned by the following functions:
      cl_F cl_exp1 (cl_float_format_t f)
      + Returns e as a float of format f.
      cl_F cl_exp1 (const cl_F& y) @@ -850,6 +920,7 @@ Returns e as a float of format cl_default_float_format.
      cl_R sin (const cl_R& x)
      + Returns sin(x). The range of the result is the interval -1 <= sin(x) <= 1. @@ -859,6 +930,7 @@ Returns sin(z). The range of the result is the entire complex plane
      cl_R cos (const cl_R& x)
      + Returns cos(x). The range of the result is the interval -1 <= cos(x) <= 1. @@ -868,25 +940,31 @@ Returns cos(z). The range of the result is the entire complex plane
      struct cl_cos_sin_t { cl_R cos; cl_R sin; };
      +
      cl_cos_sin_t cl_cos_sin (const cl_R& x)
      Returns both sin(x) and cos(x). This is more efficient than + computing them separately. The relation cos^2 + sin^2 = 1 will hold only approximately.
      cl_R tan (const cl_R& x)
      +
      cl_N tan (const cl_N& x)
      Returns tan(x) = sin(x)/cos(x).
      cl_N cis (const cl_R& x)
      +
      cl_N cis (const cl_N& x)
      Returns exp(i*x). The name `cis' means "cos + i sin", because e^(i*x) = cos(x) + i*sin(x). + +
      cl_N asin (const cl_N& z)
      Returns arcsin(z). This is defined as @@ -899,6 +977,7 @@ with realpart = pi/2 and imagpart > 0.
      cl_N acos (const cl_N& z)
      + Returns arccos(z). This is defined as arccos(z) = pi/2 - arcsin(z) = log(z+i*sqrt(1-z^2))/i and satisfies arccos(-z) = pi - arccos(z). @@ -907,6 +986,8 @@ The range of the result is the strip in the complex domain with realpart = 0 and imagpart < 0 and the numbers with realpart = pi and imagpart > 0. + +
      cl_R atan (const cl_R& x, const cl_R& y)
      Returns the angle of the polar representation of the complex number @@ -935,13 +1016,16 @@ with realpart = pi/2 and imagpart <= 0.

      -The constant pi = 3.14... is returned by the following functions: + + +Archimedes' constant pi = 3.14... is returned by the following functions:

      cl_F cl_pi (cl_float_format_t f)
      + Returns pi as a float of format f.
      cl_F cl_pi (const cl_F& y) @@ -961,6 +1045,7 @@ Returns pi as a float of format cl_default_float_format.
      cl_R sinh (const cl_R& x)
      + Returns sinh(x).
      cl_N sinh (const cl_N& z) @@ -969,6 +1054,7 @@ Returns sinh(z). The range of the result is the entire complex plan
      cl_R cosh (const cl_R& x)
      + Returns cosh(x). The range of the result is the interval cosh(x) >= 1. @@ -978,20 +1064,24 @@ Returns cosh(z). The range of the result is the entire complex plan
      struct cl_cosh_sinh_t { cl_R cosh; cl_R sinh; };
      +
      cl_cosh_sinh_t cl_cosh_sinh (const cl_R& x)
      + Returns both sinh(x) and cosh(x). This is more efficient than computing them separately. The relation cosh^2 - sinh^2 = 1 will hold only approximately.
      cl_R tanh (const cl_R& x)
      +
      cl_N tanh (const cl_N& x)
      Returns tanh(x) = sinh(x)/cosh(x).
      cl_N asinh (const cl_N& z)
      + Returns arsinh(z). This is defined as arsinh(z) = log(z+sqrt(1+z^2)) and satisfies arsinh(-z) = -arsinh(z). @@ -1002,6 +1092,7 @@ with imagpart = pi/2 and realpart < 0.
      cl_N acosh (const cl_N& z)
      + Returns arcosh(z). This is defined as arcosh(z) = 2*log(sqrt((z+1)/2)+sqrt((z-1)/2)). The range of the result is the half-strip in the complex domain @@ -1010,6 +1101,7 @@ excluding the numbers with realpart = 0 and -pi < imagpar
      cl_N atanh (const cl_N& z)
      + Returns artanh(z). This is defined as artanh(z) = (log(1+z)-log(1-z)) / 2 and satisfies artanh(-z) = -artanh(z). The range of the result is @@ -1022,6 +1114,9 @@ with imagpart = pi/2 and realpart >= 0.

      4.8.4 Euler gamma

      +

      + +

      Euler's constant C = 0.577... is returned by the following functions: @@ -1031,6 +1126,7 @@ Euler's constant C = 0.577... is returned by the following functions:

      cl_F cl_eulerconst (cl_float_format_t f)
      + Returns Euler's constant as a float of format f.
      cl_F cl_eulerconst (const cl_F& y) @@ -1044,12 +1140,14 @@ Returns Euler's constant as a float of format cl_default_float_format Catalan's constant G = 0.915... is returned by the following functions: +
      cl_F cl_catalanconst (cl_float_format_t f)
      + Returns Catalan's constant as a float of format f.
      cl_F cl_catalanconst (const cl_F& y) @@ -1064,6 +1162,9 @@ Returns Catalan's constant as a float of format cl_default_float_format4.8.5 Riemann zeta +

      + +

      Riemann's zeta function at an integral point s>1 is returned by the @@ -1074,6 +1175,7 @@ following functions:

      cl_F cl_zeta (int s, cl_float_format_t f)
      + Returns Riemann's zeta function at s as a float of format f.
      cl_F cl_zeta (int s, const cl_F& y) @@ -1113,54 +1215,69 @@ on each of the bit positions in parallel.
      cl_I lognot (const cl_I& x)
      +
      cl_I operator ~ (const cl_I& x)
      + Logical not, like ~x in C. This is the same as -1-x.
      cl_I logand (const cl_I& x, const cl_I& y)
      +
      cl_I operator & (const cl_I& x, const cl_I& y)
      + Logical and, like x & y in C.
      cl_I logior (const cl_I& x, const cl_I& y)
      +
      cl_I operator | (const cl_I& x, const cl_I& y)
      + Logical (inclusive) or, like x | y in C.
      cl_I logxor (const cl_I& x, const cl_I& y)
      +
      cl_I operator ^ (const cl_I& x, const cl_I& y)
      + Exclusive or, like x ^ y in C.
      cl_I logeqv (const cl_I& x, const cl_I& y)
      + Bitwise equivalence, like ~(x ^ y) in C.
      cl_I lognand (const cl_I& x, const cl_I& y)
      + Bitwise not and, like ~(x & y) in C.
      cl_I lognor (const cl_I& x, const cl_I& y)
      + Bitwise not or, like ~(x | y) in C.
      cl_I logandc1 (const cl_I& x, const cl_I& y)
      + Logical and, complementing the first argument, like ~x & y in C.
      cl_I logandc2 (const cl_I& x, const cl_I& y)
      + Logical and, complementing the second argument, like x & ~y in C.
      cl_I logorc1 (const cl_I& x, const cl_I& y)
      + Logical or, complementing the first argument, like ~x | y in C.
      cl_I logorc2 (const cl_I& x, const cl_I& y)
      + Logical or, complementing the second argument, like x | ~y in C.
      @@ -1170,6 +1287,7 @@ These operations are all available though the function
      cl_I boole (cl_boole op, const cl_I& x, const cl_I& y)
      +

      where op must have one of the 16 values (each one stands for a function @@ -1178,6 +1296,21 @@ which combines two bits into one bit): boole_clr, boole_setboole_and, boole_ior, boole_xor, boole_eqv, boole_nand, boole_nor, boole_andc1, boole_andc2, boole_orc1, boole_orc2. + + + + + + + + + + + + + + +

      @@ -1188,16 +1321,19 @@ Other functions that view integers as bit strings:

      cl_boolean logtest (const cl_I& x, const cl_I& y)
      + Returns true if some bit is set in both x and y, i.e. if logand(x,y) != 0.
      cl_boolean logbitp (const cl_I& n, const cl_I& x)
      + Returns true if the nth bit (from the right) of x is set. Bit 0 is the least significant bit.
      uintL logcount (const cl_I& x)
      + Returns the number of one bits in x, if x >= 0, or the number of zero bits in x, if x < 0. @@ -1211,6 +1347,7 @@ struct cl_byte { uintL size; uintL position; };

      + represents the bit interval containing the bits position...position+size-1 of an integer. The constructor cl_byte(size,position) constructs a cl_byte. @@ -1220,16 +1357,19 @@ The constructor cl_byte(size,position) constructs a cl_bytecl_I ldb (const cl_I& n, const cl_byte& b)

      + extracts the bits of n described by the bit interval b and returns them as a nonnegative integer with b.size bits.
      cl_boolean ldb_test (const cl_I& n, const cl_byte& b)
      + Returns true if some bit described by the bit interval b is set in n.
      cl_I dpb (const cl_I& newbyte, const cl_I& n, const cl_byte& b)
      + Returns n, with the bits described by the bit interval b replaced by newbyte. Only the lowest b.size bits of newbyte are relevant. @@ -1244,11 +1384,13 @@ functions are their counterparts without shifting:
      cl_I mask_field (const cl_I& n, const cl_byte& b)
      + returns an integer with the bits described by the bit interval b copied from the corresponding bits in n, the other bits zero.
      cl_I deposit_field (const cl_I& newbyte, const cl_I& n, const cl_byte& b)
      + returns an integer where the bits described by the bit interval b come from newbyte and the other bits come from n. @@ -1279,33 +1421,39 @@ for common arithmetic operations:
      cl_boolean oddp (const cl_I& x)
      + Returns true if the least significant bit of x is 1. Equivalent to mod(x,2) != 0.
      cl_boolean evenp (const cl_I& x)
      + Returns true if the least significant bit of x is 0. Equivalent to mod(x,2) == 0.
      cl_I operator << (const cl_I& x, const cl_I& n)
      + Shifts x by n bits to the left. n should be >=0. Equivalent to x * expt(2,n).
      cl_I operator >> (const cl_I& x, const cl_I& n)
      + Shifts x by n bits to the right. n should be >=0. Bits shifted out to the right are thrown away. Equivalent to floor(x / expt(2,n)).
      cl_I ash (const cl_I& x, const cl_I& y)
      + Shifts x by y bits to the left (if y>=0) or by -y bits to the right (if y<=0). In other words, this returns floor(x * expt(2,y)).
      uintL integer_length (const cl_I& x)
      + Returns the number of bits (excluding the sign bit) needed to represent x in two's complement notation. This is the smallest n >= 0 such that -2^n <= x < 2^n. If x > 0, this is the unique n > 0 such that @@ -1313,12 +1461,14 @@ in two's complement notation. This is the smallest n >= 0 such that
      uintL ord2 (const cl_I& x)
      + x must be non-zero. This function returns the number of 0 bits at the right of x in two's complement notation. This is the largest n >= 0 such that 2^n divides x.
      uintL power2p (const cl_I& x)
      + x must be > 0. This function checks whether x is a power of 2. If x = 2^(n-1), it returns n. Else it returns 0. (See also the function logp.) @@ -1332,6 +1482,7 @@ If x = 2^(n-1), it returns n. Else it returns 0.
      uint32 gcd (uint32 a, uint32 b)
      +
      cl_I gcd (const cl_I& a, const cl_I& b)
      This function returns the greatest common divisor of a and b, @@ -1339,6 +1490,7 @@ normalized to be >= 0.
      cl_I xgcd (const cl_I& a, const cl_I& b, cl_I* u, cl_I* v)
      + This function ("extended gcd") returns the greatest common divisor g of a and b and at the same time the representation of g as an integral linear combination of a and b: @@ -1350,11 +1502,13 @@ value, in the following sense: If a and b are non-zero
      cl_I lcm (const cl_I& a, const cl_I& b)
      + This function returns the least common multiple of a and b, normalized to be >= 0.
      cl_boolean logp (const cl_I& a, const cl_I& b, cl_RA* l)
      +
      cl_boolean logp (const cl_RA& a, const cl_RA& b, cl_RA* l)
      a must be > 0. b must be >0 and != 1. If log(a,b) is @@ -1370,17 +1524,20 @@ it returns false.
      cl_I factorial (uintL n)
      + n must be a small integer >= 0. This function returns the factorial n! = 1*2*...*n.
      cl_I doublefactorial (uintL n)
      + n must be a small integer >= 0. This function returns the doublefactorial n!! = 1*3*...*n or n!! = 2*4*...*n, respectively.
      cl_I binomial (uintL n, uintL k)
      + n and k must be small integers >= 0. This function returns the binomial coefficient (n choose k) = n! / k! (n-k)! @@ -1407,6 +1564,7 @@ defines the following operations.
      type scale_float (const type& x, sintL delta)
      +
      type scale_float (const type& x, const cl_I& delta)
      Returns x*2^delta. This is more efficient than an explicit multiplication @@ -1422,27 +1580,32 @@ representation of floating-point numbers.
      sintL float_exponent (const type& x)
      + Returns the exponent e of x. For x = 0.0, this is 0. For x non-zero, this is the unique integer with 2^(e-1) <= abs(x) < 2^e.
      sintL float_radix (const type& x)
      + Returns the base of the floating-point representation. This is always 2.
      type float_sign (const type& x)
      + Returns the sign s of x as a float. The value is 1 for x >= 0, -1 for x < 0.
      uintL float_digits (const type& x)
      + Returns the number of mantissa bits in the floating-point representation of x, including the hidden bit. The value only depends on the type of x, not on its value.
      uintL float_precision (const type& x)
      + Returns the number of significant mantissa bits in the floating-point representation of x. Since denormalized numbers are not supported, this is the same as float_digits(x) if x is non-zero, and @@ -1451,6 +1614,11 @@ this is the same as float_digits(x) if x is non-zero,

      The complete internal representation of a float is encoded in the type + + + + + cl_decoded_float (or cl_decoded_sfloat, cl_decoded_ffloat, cl_decoded_dfloat, cl_decoded_lfloat, respectively), defined by @@ -1468,6 +1636,7 @@ and returned by the function

      cl_decoded_typefloat decode_float (const type& x)
      + For x non-zero, this returns (-1)^s, e, m with x = (-1)^s * 2^e * m and 0.5 <= m < 1.0. For x = 0, it returns (-1)^s=1, e=0, m=0. @@ -1478,7 +1647,7 @@ it returns (-1)^s=1, e=0, m=0. A complete decoding in terms of integers is provided as type
      -struct cl_idecoded_float {
      +struct cl_idecoded_float {
               cl_I mantissa; cl_I exponent; cl_I sign;
       };
       
      @@ -1491,6 +1660,7 @@ by the following function:
      cl_idecoded_float integer_decode_float (const type& x)
      + For x non-zero, this returns (-1)^s, e, m with x = (-1)^s * 2^e * m and m an integer with float_digits(x) bits. For x = 0, it returns (-1)^s=1, e=0, m=0. @@ -1506,6 +1676,7 @@ Some other function, implemented only for class cl_F:
      cl_F float_sign (const cl_F& x, const cl_F& y)
      + This returns a floating point number whose precision and absolute value is that of y and whose sign is that of x. If x is zero, it is treated as positive. Same for y. @@ -1514,6 +1685,9 @@ zero, it is treated as positive. Same for y.

      4.11 Conversion functions

      +

      + + @@ -1527,6 +1701,7 @@ The type cl_float_format_t describes a floating-point format.

      cl_float_format_t cl_float_format (uintL n)
      + Returns the smallest float format which guarantees at least n decimal digits in the mantissa (after the decimal point). @@ -1536,6 +1711,7 @@ Returns the floating point format of x.
      cl_float_format_t cl_default_float_format
      + Global variable: the default float format used when converting rational numbers to floats. @@ -1551,6 +1727,7 @@ defines the following operations:
      cl_F cl_float (const type&x, cl_float_format_t f)
      + Returns x as a float of format f.
      cl_F cl_float (const type&x, const cl_F& y)
      @@ -1573,28 +1750,34 @@ Every floating-point format has some characteristic numbers:
      cl_F most_positive_float (cl_float_format_t f)
      + Returns the largest (most positive) floating point number in float format f.
      cl_F most_negative_float (cl_float_format_t f)
      + Returns the smallest (most negative) floating point number in float format f.
      cl_F least_positive_float (cl_float_format_t f)
      + Returns the least positive floating point number (i.e. > 0 but closest to 0) in float format f.
      cl_F least_negative_float (cl_float_format_t f)
      + Returns the least negative floating point number (i.e. < 0 but closest to 0) in float format f.
      cl_F float_epsilon (cl_float_format_t f)
      + Returns the smallest floating point number e > 0 such that 1+e != 1.
      cl_F float_negative_epsilon (cl_float_format_t f)
      + Returns the smallest floating point number e > 0 such that 1-e != 1. @@ -1611,6 +1794,7 @@ defines the following operation:
      cl_RA rational (const type& x)
      + Returns the value of x as an exact number. If x is already an exact number, this is x. If x is a floating-point number, the value is a rational number whose denominator is a power of 2. @@ -1625,6 +1809,7 @@ the function
      cl_RA rationalize (const cl_R& x)
      + If x is a floating-point number, it actually represents an interval of real numbers, and this function returns the rational number with smallest denominator (and smallest numerator, in magnitude) @@ -1666,6 +1851,7 @@ a complicated but deterministic way.

      The global variable +

       cl_random_state cl_default_random_state
      @@ -1682,12 +1868,14 @@ below are called without cl_random_state argument.
       
      uint32 random32 ()
      + Returns a random unsigned 32-bit number. All bits are equally random.
      cl_I random_I (cl_random_state& randomstate, const cl_I& n)
      cl_I random_I (const cl_I& n)
      + n must be an integer > 0. This function returns a random integer x in the range 0 <= x < n. @@ -1695,6 +1883,7 @@ in the range 0 <= x < n.
      cl_F random_F (const cl_F& n)
      + n must be a float > 0. This function returns a random floating-point number of the same format as n in the range 0 <= x < n. @@ -1702,6 +1891,7 @@ number of the same format as n in the range 0 <= x <
      cl_R random_R (const cl_R& n)
      + Behaves like random_I if n is an integer and like random_F if n is a float. @@ -1709,6 +1899,9 @@ if n is a float.

      4.13 Obfuscating operators

      +

      + +

      The modifying C/C++ operators +=, -=, *=, /=, @@ -1723,6 +1916,7 @@ to get happy, then add

      + to the beginning of your source files, before the inclusion of any CLN include files. This flag will enable the following operators: @@ -1736,12 +1930,16 @@ For the classes cl_N, cl_R, cl_RA,

      type& operator += (type&, const type&)
      +
      type& operator -= (type&, const type&)
      +
      type& operator *= (type&, const type&)
      +
      type& operator /= (type&, const type&)
      +

      @@ -1758,14 +1956,19 @@ For the class cl_I:

      type& operator &= (type&, const type&)
      +
      type& operator |= (type&, const type&)
      +
      type& operator ^= (type&, const type&)
      +
      type& operator <<= (type&, const type&)
      +
      type& operator >>= (type&, const type&)
      +

      @@ -1777,6 +1980,7 @@ For the classes cl_N, cl_R, cl_RA,

      type& operator ++ (type& x)
      + The prefix operator ++x.
      void operator ++ (type& x, int) @@ -1785,6 +1989,7 @@ The postfix operator x++.
      type& operator -- (type& x)
      + The prefix operator --x.
      void operator -- (type& x, int) diff --git a/doc/cln_5.html b/doc/cln_5.html index 4df2aed..7f83961 100644 --- a/doc/cln_5.html +++ b/doc/cln_5.html @@ -1,6 +1,6 @@ - + CLN, a Class Library for Numbers - 5. Input/Output @@ -10,10 +10,16 @@ Go to the first, previous, 5. Input/Output +

      + +

      5.1 Internal and printed representation

      +

      + +

      All computations deal with the internal representations of the numbers. @@ -27,8 +33,10 @@ Several external representations may denote the same number, for example,

      Converting an internal to an external representation is called "printing", + converting an external to an internal representation is called "reading". -In CLN, is it always true that conversion of an internal to an external + +In CLN, it is always true that conversion of an internal to an external representation and then back to an internal representation will yield the same internal representation. Symbolically: read(print(x)) == x. This is called "print-read consistency". @@ -409,7 +417,7 @@ using this variable name. Default is "x".

      The global variable cl_default_print_flags contains the default values, -used by the function fprint, +used by the function fprint.


      diff --git a/doc/cln_6.html b/doc/cln_6.html index 4d9413f..4ccf7aa 100644 --- a/doc/cln_6.html +++ b/doc/cln_6.html @@ -1,6 +1,6 @@ - + CLN, a Class Library for Numbers - 6. Rings diff --git a/doc/cln_7.html b/doc/cln_7.html index e065b2b..007ae5a 100644 --- a/doc/cln_7.html +++ b/doc/cln_7.html @@ -1,6 +1,6 @@ - + CLN, a Class Library for Numbers - 7. Modular integers @@ -10,10 +10,16 @@ Go to the first, previous, 7. Modular integers +

      + +

      7.1 Modular integer rings

      +

      + +

      CLN implements modular integers, i.e. integers modulo a fixed integer N. @@ -59,9 +65,11 @@ Modular integer rings are constructed using the function

      cl_modint_ring cl_find_modint_ring (const cl_I& N)
      + This function returns the modular ring `Z/NZ'. It takes care of finding out about special cases of N, like powers of two and odd numbers for which Montgomery multiplication will be a win, + and precomputes any necessary auxiliary data for computing modulo N. There is a cache table of rings, indexed by N (or, more precisely, by abs(N)). This ensures that the precomputation costs are reduced @@ -76,8 +84,10 @@ Modular integer rings can be compared for equality:
      bool operator== (const cl_modint_ring&, const cl_modint_ring&)
      +
      bool operator!= (const cl_modint_ring&, const cl_modint_ring&)
      + These compare two modular integer rings for equality. Two different calls to cl_find_modint_ring with the same argument necessarily return the same ring because it is memoized in the cache table. @@ -95,22 +105,27 @@ Given a modular integer ring R, the following members can be used.
      cl_I R->modulus
      + This is the ring's modulus, normalized to be nonnegative: abs(N).
      cl_MI R->zero()
      + This returns 0 mod N.
      cl_MI R->one()
      + This returns 1 mod N.
      cl_MI R->canonhom (const cl_I& x)
      + This returns x mod N.
      cl_I R->retract (const cl_MI& x)
      + This is a partial inverse function to R->canonhom. It returns the standard representative (>=0, <N) of x. @@ -118,6 +133,7 @@ standard representative (>=0, <N) of x
      cl_MI R->random()
      + This returns a random integer modulo N. @@ -129,15 +145,18 @@ The following operations are defined on modular integers.
      cl_modint_ring x.ring ()
      + Returns the ring to which the modular integer x belongs.
      cl_MI operator+ (const cl_MI&, const cl_MI&)
      + Returns the sum of two modular integers. One of the arguments may also be a plain integer.
      cl_MI operator- (const cl_MI&, const cl_MI&)
      + Returns the difference of two modular integers. One of the arguments may also be a plain integer. @@ -147,50 +166,61 @@ Returns the negative of a modular integer.
      cl_MI operator* (const cl_MI&, const cl_MI&)
      + Returns the product of two modular integers. One of the arguments may also be a plain integer.
      cl_MI square (const cl_MI&)
      + Returns the square of a modular integer.
      cl_MI recip (const cl_MI& x)
      + Returns the reciprocal x^-1 of a modular integer x. x must be coprime to the modulus, otherwise an error message is issued.
      cl_MI div (const cl_MI& x, const cl_MI& y)
      + Returns the quotient x*y^-1 of two modular integers x, y. y must be coprime to the modulus, otherwise an error message is issued.
      cl_MI expt_pos (const cl_MI& x, const cl_I& y)
      + y must be > 0. Returns x^y.
      cl_MI expt (const cl_MI& x, const cl_I& y)
      + Returns x^y. If y is negative, x must be coprime to the modulus, else an error message is issued.
      cl_MI operator<< (const cl_MI& x, const cl_I& y)
      + Returns x*2^y.
      cl_MI operator>> (const cl_MI& x, const cl_I& y)
      + Returns x*2^-y. When y is positive, the modulus must be odd, or an error message is issued.
      bool operator== (const cl_MI&, const cl_MI&)
      +
      bool operator!= (const cl_MI&, const cl_MI&)
      + Compares two modular integers, belonging to the same modular integer ring, for equality.
      cl_boolean zerop (const cl_MI& x)
      + Returns true if x is 0 mod N. @@ -203,8 +233,10 @@ input/output).
      void fprint (cl_ostream stream, const cl_MI& x)
      +
      cl_ostream operator<< (cl_ostream stream, const cl_MI& x)
      + Prints the modular integer x on the stream. The output may depend on the global printer settings in the variable cl_default_print_flags. diff --git a/doc/cln_8.html b/doc/cln_8.html index a0381f6..3dd2018 100644 --- a/doc/cln_8.html +++ b/doc/cln_8.html @@ -1,6 +1,6 @@ - + CLN, a Class Library for Numbers - 8. Symbolic data types @@ -10,6 +10,9 @@ Go to the first, previous, 8. Symbolic data types +

      + +

      CLN implements two symbolic (non-numeric) data types: strings and symbols. @@ -18,6 +21,9 @@ CLN implements two symbolic (non-numeric) data types: strings and symbols.

      8.1 Strings

      +

      + +

      The class @@ -42,6 +48,7 @@ Strings are constructed through the following constructors:

      cl_string (const char * s)
      + Returns an immutable copy of the (zero-terminated) C string s.
      cl_string (const char * ptr, unsigned long len) @@ -62,17 +69,21 @@ Assignment from cl_string and const char *.
      s.length()
      +
      strlen(s)
      + Returns the length of the string s.
      s[i]
      + Returns the ith character of the string s. i must be in the range 0 <= i < s.length().
      bool equal (const cl_string& s1, const cl_string& s2)
      + Compares two strings for equality. One of the arguments may also be a plain const char *. @@ -80,6 +91,9 @@ plain const char *.

      8.2 Symbols

      +

      + +

      Symbols are uniquified strings: all symbols with the same name are shared. @@ -98,6 +112,7 @@ Symbols are constructed through the following constructor:

      cl_symbol (const cl_string& s)
      + Looks up or creates a new symbol with a given name. @@ -114,6 +129,7 @@ Conversion to cl_string: Returns the string which names the symbol
      bool equal (const cl_symbol& sym1, const cl_symbol& sym2)
      + Compares two symbols for equality. This is very fast. diff --git a/doc/cln_9.html b/doc/cln_9.html index be510a2..08c8bfe 100644 --- a/doc/cln_9.html +++ b/doc/cln_9.html @@ -1,6 +1,6 @@ - + CLN, a Class Library for Numbers - 9. Univariate polynomials @@ -10,6 +10,10 @@ Go to the first, previous, 9. Univariate polynomials +

      + + + @@ -121,6 +125,7 @@ return the same polynomial ring.

      cl_univpoly_complex_ring cl_find_univpoly_ring (const cl_complex_ring& R)
      +
      cl_univpoly_complex_ring cl_find_univpoly_ring (const cl_complex_ring& R, const cl_symbol& varname)
      cl_univpoly_real_ring cl_find_univpoly_ring (const cl_real_ring& R) @@ -155,27 +160,33 @@ Given a univariate polynomial ring R, the following members can be
      cl_ring R->basering()
      + This returns the base ring, as passed to `cl_find_univpoly_ring'.
      cl_UP R->zero()
      + This returns 0 in R, a polynomial of degree -1.
      cl_UP R->one()
      + This returns 1 in R, a polynomial of degree <= 0.
      cl_UP R->canonhom (const cl_I& x)
      + This returns x in R, a polynomial of degree <= 0.
      cl_UP R->monomial (const cl_ring_element& x, uintL e)
      + This returns a sparse polynomial: x * X^e, where X is the indeterminate.
      cl_UP R->create (sintL degree)
      + Creates a new polynomial with a given degree. The zero polynomial has degree -1. After creating the polynomial, you should put in the coefficients, using the set_coeff member function, and then call the finalize @@ -190,12 +201,14 @@ The following are the only destructive operations on univariate polynomials.
      void set_coeff (cl_UP& x, uintL index, const cl_ring_element& y)
      + This changes the coefficient of X^index in x to be y. After changing a polynomial and before applying any "normal" operation on it, you should call its finalize member function.
      void finalize (cl_UP& x)
      + This function marks the endpoint of destructive modifications of a polynomial. It normalizes the internal representation so that subsequent computations have less overhead. Doing normal computations on unnormalized polynomials may @@ -210,14 +223,17 @@ The following operations are defined on univariate polynomials.
      cl_univpoly_ring x.ring ()
      + Returns the ring to which the univariate polynomial x belongs.
      cl_UP operator+ (const cl_UP&, const cl_UP&)
      + Returns the sum of two univariate polynomials.
      cl_UP operator- (const cl_UP&, const cl_UP&)
      + Returns the difference of two univariate polynomials.
      cl_UP operator- (const cl_UP&) @@ -226,44 +242,54 @@ Returns the negative of a univariate polynomial.
      cl_UP operator* (const cl_UP&, const cl_UP&)
      + Returns the product of two univariate polynomials. One of the arguments may also be a plain integer or an element of the base ring.
      cl_UP square (const cl_UP&)
      + Returns the square of a univariate polynomial.
      cl_UP expt_pos (const cl_UP& x, const cl_I& y)
      + y must be > 0. Returns x^y.
      bool operator== (const cl_UP&, const cl_UP&)
      +
      bool operator!= (const cl_UP&, const cl_UP&)
      + Compares two univariate polynomials, belonging to the same univariate polynomial ring, for equality.
      cl_boolean zerop (const cl_UP& x)
      + Returns true if x is 0 in R.
      sintL degree (const cl_UP& x)
      + Returns the degree of the polynomial. The zero polynomial has degree -1.
      cl_ring_element coeff (const cl_UP& x, uintL index)
      + Returns the coefficient of X^index in the polynomial x.
      cl_ring_element x (const cl_ring_element& y)
      + Evaluation: If x is a polynomial and y belongs to the base ring, then `x(y)' returns the value of the substitution of y into x.
      cl_UP deriv (const cl_UP& x)
      + Returns the derivative of the polynomial x with respect to the indeterminate X. @@ -277,8 +303,10 @@ input/output).
      void fprint (cl_ostream stream, const cl_UP& x)
      +
      cl_ostream operator<< (cl_ostream stream, const cl_UP& x)
      + Prints the univariate polynomial x on the stream. The output may depend on the global printer settings in the variable cl_default_print_flags. @@ -296,18 +324,26 @@ The following functions return special polynomials.
      cl_UP_I cl_tschebychev (sintL n)
      + + Returns the n-th Tchebychev polynomial (n >= 0).
      cl_UP_I cl_hermite (sintL n)
      + + Returns the n-th Hermite polynomial (n >= 0).
      cl_UP_RA cl_legendre (sintL n)
      + + Returns the n-th Legendre polynomial (n >= 0).
      cl_UP_I cl_laguerre (sintL n)
      + + Returns the n-th Laguerre polynomial (n >= 0). diff --git a/doc/cln_toc.html b/doc/cln_toc.html index ecf7ce9..5dd7415 100644 --- a/doc/cln_toc.html +++ b/doc/cln_toc.html @@ -1,6 +1,6 @@ - + CLN, a Class Library for Numbers - Table of Contents @@ -115,7 +115,7 @@
    • Index


    -This document was generated on 14 January 2000 using +This document was generated on 4 May 2000 using texi2html 1.56k.