CONVERSIONS

destination: source


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

unsigned 
int:         ZZ

unsigned 
long:        ZZ

xdouble:     int, long, ZZ, float, double, xdouble, quad_float, RR, 
             unsigned int, unsigned long, const char*

quad_float:  int, long, ZZ, float, double, xdouble, quad_float, RR, 
             unsigned int, unsigned long, const char*

RR:          int, long, ZZ, float, double, xdouble, quad_float, RR, 
             unsigned int, unsigned long, const char*

ZZ:          int, long, ZZ, float, double, xdouble, quad_float, RR, 
             unsigned int, unsigned long, const char*

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 ***********

[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);

    Note that when T is 'unsigned int/long', the functional
    forms are 'to_uint' and 'to_ulong'.

[2] All conversions from ZZ to signed or unsigned int or long compute 
    the result modulo 2^n, where n is the number of bits of 
    the destination type.

[2] All floating point to integral conversions compute the floor
    function *exactly*.

[3] 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.

[4] All conversions to RR round to the current working precision.

[5] All conversions from long or ZZ to one of "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.

[6] All polynomial to polynomial conversions apply coefficient-wise
    conversion.

[7] All vector/matrix to vector/matrix conversions apply element-wise
    conversion.

[8] The GF2X/ZZ_pX/zz_pX to GF2E/ZZ_pE/zz_pE conversions reduce
    the given polynomial modulo the current modulus.

