CONVERSIONS

notation:

   typedef unsigned int  uint;
   typedef unsigned long ulong;
   typedef const char *  cstr;


destination: source


int:         int, long, uint, ulong, ZZ, float, double, xdouble, quad_float, RR

long:        int, long, uint, ulong, ZZ, float, double, xdouble, quad_float, RR

float:       int, long, uint, ulong, ZZ, float, double, xdouble, quad_float, RR

double:      int, long, uint, ulong, ZZ, float, double, xdouble, quad_float, RR

uint:        ZZ

ulong:       ZZ

xdouble:     int, long, uint, ulong, ZZ, float, double, xdouble, RR, cstr

quad_float:  int, long, uint, ulong, ZZ, float, double, quad_float, RR, cstr

RR:          int, long, uint, ulong, ZZ, float, double, xdouble, quad_float, 
             RR, cstr

ZZ:          int, long, uint, ulong, ZZ, float, double, xdouble, quad_float, 
             RR, cstr

ZZ_p:        long, ZZ

vec_ZZ_p:    vec_ZZ

ZZ_pX:       long, ZZ_p, ZZ, ZZX, vec_ZZ_p

zz_p:        long, ZZ

vec_zz_p:    vec_ZZ

ZZ_pX:       long, zz_p, ZZ, ZZX, vec_zz_p

vec_ZZ:      vec_ZZ_p, vec_zz_p

ZZX:         long, ZZ, ZZ_pX, zz_pX

GF2:         long, ZZ

vec_GF2:     GF2X

GF2X:        long, ZZ, GF2, vec_GF2

GF2E:        long, ZZ, GF2, GF2X

GF2EX:       long, ZZ, GF2, GF2E, GF2X, vec_GF2E

mat_ZZ_p:    mat_ZZ  

mat_zz_p:    mat_ZZ  

ZZ_pE:       long, ZZ, ZZ_p, ZZ_pX

ZZ_pEX:      long, ZZ, ZZ_p, ZZ_pE, ZZ_pX

zz_pE:       long, ZZ, zz_p, zz_pX

zz_pEX:      long, ZZ, zz_p, zz_pE, zz_pX


********** NOTES ***********

nomenclature:

  - integral types: int, long, uint, ulong, ZZ
  - bounded integral types: int, long, uint, ulong
  - floating point types: float, double, xdouble, quad_float, RR


 [1] All conversion operators come in procedural or functional
     form.  To convert  a  of type S to  x  of type T, you can write
        conv(x, a);
     or
        x = to_T(a);

     E.g., to_int(a), to_long(a), to_uint(a), to_ulong(a), 
     to_ZZ(a), to_xdouble(a), to_RR(a).
 
 [2] All conversions from an integral type to a bounded integral type
     compute the result modulo 2^n, where n is the number of bits of the 
     destination type:  no overflow occurs.
 
 [3] All floating point to integral conversions compute the floor
     function *exactly*, unless the destination type is int or long
     and overflow occurs, in which case the behavior is undefined.
 
 [4] The ZZ to double conversion routine is very precise:
     the result is the nearest double, breaking ties using the 
     "round to even" rule.  Overflow results in +/- Infinity.
     All this assumes the underlying floating point adheres to
     the IEEE standard.
 
 [5] All conversions to RR round to the current working precision.
 
 [6] All conversions from long or ZZ to one of the "mod p" types
        ZZ_p, ZZ_pX, ZZ_pE, ZZ_pEX,
        zz_p, zz_pX, zz_pE, zz_pEX,
        GF2, GF2X, GF2E, GF2EX
     yield the the residue class modulo p.
 
 [7] All polynomial to polynomial conversions apply coefficient-wise
     conversion.
 
 [8] All vector/matrix to vector/matrix conversions apply element-wise
     conversion.
 
 [9] The GF2X/ZZ_pX/zz_pX to GF2E/ZZ_pE/zz_pE conversions reduce
     the given polynomial modulo the current modulus.
 
[10] All conversions from the type cstr apply the same algorithm
     as is used for reading from an I/O stream, so 
        ZZ x = to_ZZ("999999999999999999");
     initializes the ZZ x to the integer 999999999999999999.
 
[11] The conversions to vec_ZZ from vec_ZZ_p and vec_zz_p copy the
     standard non-negative residues; likewise for the conversions
     to ZZX from ZZ_pX and zz_pX.
 
