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.