def __init__(self, *args): nargs = len(args) if nargs == 1 and isinstance(args[0], self.__class__): self._mpfr = args[0]._mpfr return if nargs > 3: raise TypeError("mpfr() requires 0 to 3 arguments") if nargs >= 2: a = self._mpfr = ffi.gc(_new_mpfr(prec=args[1]), _del_mpfr) else: a = self._mpfr = ffi.gc(_new_mpfr(), _del_mpfr) if nargs == 0: gmp.mpfr_set_zero(a, 1) elif nargs == 3: if isinstance(args[0], str): _str_to_mpfr(args[0], args[2], a) else: raise TypeError('function takes at most 2 arguments (%i given)' % nargs) else: if isinstance(args[0], str): _str_to_mpfr(args[0], 10, a) elif isinstance(args[0], float): gmp.mpfr_set_d(a, args[0], gmp.MPFR_RNDN) elif isinstance(args[0], (int, long)): _pyint_to_mpfr(args[0], a) elif isinstance(args[0], mpz): gmp.mpfr_set_z(a, args[0]._mpz, gmp.MPFR_RNDN) elif isinstance(args[0], mpq): gmp.mpfr_set_q(a, args[0]._mpq, gmp.MPFR_RNDN) else: raise TypeError('cannot construct mpfr from %s.' % args[0])
def __init__(self, n=0, base=None): """ mpz() -> mpz(0) If no argument is given, return mpz(0). mpz(n) -> mpz Return an 'mpz' object with a numeric value 'n' (truncating n to its integer part if it's a Fraction, 'mpq', Decimal, float or 'mpfr'). mpz(s[, base=0]): Return an 'mpz' object from a string 's' made of digits in the given base. If base=0, binary, octal, or hex Python strings are recognized by leading 0b, 0o, or 0x characters, otherwise the string is assumed to be decimal. Values for base can range between 2 and 62. """ if isinstance(n, self.__class__): self._mpz = n._mpz return a = self._mpz = ffi.gc(_new_mpz(), _del_mpz) if isinstance(n, str): if base is None: base = 10 if base == 0 or 2 <= base <= 62: if gmp.mpz_set_str(a, n.encode('UTF-8'), base) != 0: raise ValueError("Can't create mpz from %s with base %s" % (n, base)) else: raise ValueError('base must be 0 or 2..62, not %s' % base) elif base is not None: raise ValueError('Base only allowed for str, not for %s.' % type(n)) elif isinstance(n, float): gmp.mpz_set_d(a, n) elif isinstance(n, (int, long)): _pyint_to_mpz(n, a) else: raise TypeError
def __init__(self, n=0, base=None): """ mpz() -> mpz(0) If no argument is given, return mpz(0). mpz(n) -> mpz Return an 'mpz' object with a numeric value 'n' (truncating n to its integer part if it's a Fraction, 'mpq', Decimal, float or 'mpfr'). mpz(s[, base=0]): Return an 'mpz' object from a string 's' made of digits in the given base. If base=0, binary, octal, or hex Python strings are recognized by leading 0b, 0o, or 0x characters, otherwise the string is assumed to be decimal. Values for base can range between 2 and 62. """ if isinstance(n, self.__class__): self._mpz = n._mpz return a = self._mpz = ffi.gc(_new_mpz(), _del_mpz) if isinstance(n, str): if base is None: base = 10 if base == 0 or 2 <= base <= 62: if gmp.mpz_set_str(a, n.encode("UTF-8"), base) != 0: raise ValueError("Can't create mpz from %s with base %s" % (n, base)) else: raise ValueError("base must be 0 or 2..62, not %s" % base) elif base is not None: raise ValueError("Base only allowed for str, not for %s." % type(n)) elif isinstance(n, float): gmp.mpz_set_d(a, n) elif isinstance(n, (int, long)): _pyint_to_mpz(n, a) else: raise TypeError
def __init__(self, *args): """ mpq() -> mpq(0,1) If no argument is given, return mpq(0,1). mpq(n) -> mpq Return an 'mpq' object with a numeric value n. Decimal and Fraction values are converted exactly. mpq(n,m) -> mpq Return an 'mpq' object with a numeric value n/m. mpq(s[, base=10]) -> mpq Return an 'mpq' object from a string s made up of digits in the given base. s may be made up of two numbers in the same base separated by a '/' character. """ #TODO kwargs (base) nargs = len(args) if nargs == 1 and isinstance(args[0], self.__class__): self._mpq = args[0]._mpq return a = self._mpq = ffi.gc(_new_mpq(), _del_mpq) if nargs == 0: gmp.mpq_set_ui(a, 0, 1) elif nargs == 1: if isinstance(args[0], float): gmp.mpq_set_d(a, args[0]) elif isinstance(args[0], (int, long)): _pyint_to_mpq(args[0], a) elif isinstance(args[0], mpz): gmp.mpq_set_z(a, args[0]._mpz) elif isinstance(args[0], str): _str_to_mpq(args[0], 10, a) else: raise TypeError('mpq() requires numeric or string argument') elif nargs == 2: if isinstance(args[0], str): _str_to_mpq(args[0], args[1], a) elif all(isinstance(arg, (int, long, mpz)) for arg in args): # Set Numerator if isinstance(args[0], mpz): gmp.mpq_set_num(a, args[0]._mpz) else: num = gmp.mpq_numref(a) _pyint_to_mpz(args[0], num) # Set Denominator if args[1] == 0: raise ZeroDivisionError("zero denominator in 'mpq'") if isinstance(args[1], mpz): gmp.mpq_set_den(a, args[1]._mpz) else: den = gmp.mpq_denref(a) _pyint_to_mpz(args[1], den) else: # Numerator if isinstance(args[0], mpq): gmp.mpq_set(a, args[0]._mpq) elif isinstance(args[0], float): gmp.mpq_set_d(a, args[0]) elif isinstance(args[0], (int, long)): _pyint_to_mpq(args[0], a) elif isinstance(args[0], mpz): gmp.mpq_set_z(a, args[0]._mpz) else: raise TypeError('mpq() requires numeric or string argument') # Denominator b = _new_mpq() if isinstance(args[1], mpq): gmp.mpq_set(b, args[1]._mpq) elif isinstance(args[1], float): gmp.mpq_set_d(b, args[1]) elif isinstance(args[1], (int, long)): _pyint_to_mpq(args[1], b) elif isinstance(args[1], mpz): gmp.mpq_set_z(b, args[1]._mpz) else: raise TypeError('mpq() requires numeric or string argument') # Divide them if gmp.mpq_sgn(b) == 0: _del_mpq(b) raise ZeroDivisionError gmp.mpq_div(a, a, b) _del_mpq(b) else: raise TypeError("mpq() requires 0, 1 or 2 arguments") # TODO only canonicalize when required (e.g. optimize mpq(42)) gmp.mpq_canonicalize(a)
def _from_c_mpq(cls, mpq): inst = object.__new__(cls) inst._mpq = ffi.gc(mpq, _del_mpq) return inst
def _from_c_mpz(cls, mpz): inst = object.__new__(cls) inst._mpz = ffi.gc(mpz, _del_mpz) return inst
def _from_c_mpfr(cls, mpfr): inst = object.__new__(cls) inst._mpfr = ffi.gc(mpfr, _del_mpfr) return inst
def __init__(self, *args): nargs = len(args) # if nargs == 1 and isinstance(args[0], self.__class__): # self._mpc = args[0]._mpc # return if nargs == 0: self._mpc = ffi.gc(_new_mpc(), _del_mpc) gmp.mpc_set_ui(self._mpc, 0, gmp.MPC_RNDNN) elif isinstance(args[0], str): # unicode? # First argument is a string if nargs == 1: prec, base = 0, 10 elif nargs == 2: prec, base = args[1], 10 elif nargs == 3: prec, base = args[1], args[2] else: raise TypeError("function takes at most 3 arguments (4 given)") prec = _check_prec(prec) self._mpc = ffi.gc(_new_mpc(prec), _del_mpc) _str_to_mpc(args[0], base, self._mpc) elif isinstance(args[0], (mpc, complex)): # First argument is complex if nargs == 1: prec = (0, 0) elif nargs == 2: prec = _check_prec(args[1]) else: raise TypeError("function takes at most 2 arguments (3 given)") self._mpc = ffi.gc(_new_mpc(prec), _del_mpc) if isinstance(args[0], mpc): gmp.mpc_set(self._mpc, args[0]._mpc, gmp.MPC_RNDNN) elif isinstance(args[0], complex): gmp.mpc_set_d_d(self._mpc, args[0].real, args[0].imag, gmp.MPC_RNDNN) elif isinstance(args[0], (mpfr, mpq, mpz, float, int, long)): # First argument is real if nargs <= 2: prec = (0, 0) elif nargs == 3: prec = _check_prec(args[2]) else: raise TypeError("function takes at most 3 arguments (4 given)") self._mpc = ffi.gc(_new_mpc(prec), _del_mpc) realref = gmp.mpc_realref(self._mpc) imagref = gmp.mpc_imagref(self._mpc) if isinstance(args[0], mpfr): gmp.mpfr_set(realref, args[0]._mpfr, gmp.MPFR_RNDN) elif isinstance(args[0], mpz): gmp.mpfr_set_z(realref, args[0]._mpz, gmp.MPFR_RNDN) elif isinstance(args[0], mpq): gmp.mpfr_set_q(realref, args[0]._mpq, gmp.MPFR_RNDN) elif isinstance(args[0], float): gmp.mpfr_set_d(realref, args[0], gmp.MPFR_RNDN) elif isinstance(args[0], (int, long)): _pyint_to_mpfr(args[0], realref) if nargs >= 2: # Check if second argument is real if isinstance(args[1], mpfr): gmp.mpfr_set(imagref, args[1]._mpfr, gmp.MPFR_RNDN) elif isinstance(args[1], mpz): gmp.mpfr_set_z(imagref, args[1]._mpz, gmp.MPFR_RNDN) elif isinstance(args[1], mpq): gmp.mpfr_set_q(imagref, args[1]._mpq, gmp.MPFR_RNDN) elif isinstance(args[1], float): gmp.mpfr_set_d(imagref, args[1], gmp.MPFR_RNDN) elif isinstance(args[1], (int, long)): _pyint_to_mpfr(args[1], imagref) else: raise TypeError( "invalid type for imaginary component in mpc()") else: gmp.mpfr_set_ui(imagref, 0, gmp.MPFR_RNDN) else: raise TypeError("mpc() requires numeric or string argument")
def _from_c_mpc(cls, mpc): inst = object.__new__(cls) inst._mpc = ffi.gc(mpc, _del_mpc) return inst
def __init__(self, *args): nargs = len(args) # if nargs == 1 and isinstance(args[0], self.__class__): # self._mpc = args[0]._mpc # return if nargs == 0: self._mpc = ffi.gc(_new_mpc(), _del_mpc) gmp.mpc_set_ui(self._mpc, 0, gmp.MPC_RNDNN) elif isinstance(args[0], str): # unicode? # First argument is a string if nargs == 1: prec, base = 0, 10 elif nargs == 2: prec, base = args[1], 10 elif nargs == 3: prec, base = args[1], args[2] else: raise TypeError("function takes at most 3 arguments (4 given)") prec = _check_prec(prec) self._mpc = ffi.gc(_new_mpc(prec), _del_mpc) _str_to_mpc(args[0], base, self._mpc) elif isinstance(args[0], (mpc, complex)): # First argument is complex if nargs == 1: prec = (0, 0) elif nargs == 2: prec = _check_prec(args[1]) else: raise TypeError("function takes at most 2 arguments (3 given)") self._mpc = ffi.gc(_new_mpc(prec), _del_mpc) if isinstance(args[0], mpc): gmp.mpc_set(self._mpc, args[0]._mpc, gmp.MPC_RNDNN) elif isinstance(args[0], complex): gmp.mpc_set_d_d(self._mpc, args[0].real, args[0].imag, gmp.MPC_RNDNN) elif isinstance(args[0], (mpfr, mpq, mpz, float, int, long)): # First argument is real if nargs <= 2: prec = (0, 0) elif nargs == 3: prec = _check_prec(args[2]) else: raise TypeError("function takes at most 3 arguments (4 given)") self._mpc = ffi.gc(_new_mpc(prec), _del_mpc) realref = gmp.mpc_realref(self._mpc) imagref = gmp.mpc_imagref(self._mpc) if isinstance(args[0], mpfr): gmp.mpfr_set(realref, args[0]._mpfr, gmp.MPFR_RNDN) elif isinstance(args[0], mpz): gmp.mpfr_set_z(realref, args[0]._mpz, gmp.MPFR_RNDN) elif isinstance(args[0], mpq): gmp.mpfr_set_q(realref, args[0]._mpq, gmp.MPFR_RNDN) elif isinstance(args[0], float): gmp.mpfr_set_d(realref, args[0], gmp.MPFR_RNDN) elif isinstance(args[0], (int, long)): _pyint_to_mpfr(args[0], realref) if nargs >= 2: # Check if second argument is real if isinstance(args[1], mpfr): gmp.mpfr_set(imagref, args[1]._mpfr, gmp.MPFR_RNDN) elif isinstance(args[1], mpz): gmp.mpfr_set_z(imagref, args[1]._mpz, gmp.MPFR_RNDN) elif isinstance(args[1], mpq): gmp.mpfr_set_q(imagref, args[1]._mpq, gmp.MPFR_RNDN) elif isinstance(args[1], float): gmp.mpfr_set_d(imagref, args[1], gmp.MPFR_RNDN) elif isinstance(args[1], (int, long)): _pyint_to_mpfr(args[1], imagref) else: raise TypeError("invalid type for imaginary component in mpc()") else: gmp.mpfr_set_ui(imagref, 0, gmp.MPFR_RNDN) else: raise TypeError("mpc() requires numeric or string argument")