def __rsub__(self, other): res = _new_mpc() # TODO use context precision if isinstance(other, mpfr): gmp.mpc_fr_sub(res, other._mpfr, self._mpc, gmp.MPC_RNDNN) elif isinstance(other, mpq): gmp.mpfr_sub_q(gmp.mpc_realref(res), gmp.mpc_realref(self._mpc), other._mpq, gmp.MPFR_RNDN) gmp.mpfr_neg(gmp.mpc_realref(res), gmp.mpc_realref(res), gmp.MPFR_RNDN) gmp.mpfr_set(gmp.mpc_imagref(res), gmp.mpc_imagref(self._mpc), gmp.MPFR_RNDN) elif isinstance(other, mpz): gmp.mpfr_z_sub(gmp.mpc_realref(res), other._mpz, gmp.mpc_realref(self._mpc), gmp.MPFR_RNDN) gmp.mpfr_neg(gmp.mpc_imagref(res), gmp.mpc_imagref(self._mpc), gmp.MPFR_RNDN) elif isinstance(other, complex): gmp.mpfr_d_sub(gmp.mpc_realref(res), other.real, gmp.mpc_realref(self._mpc), gmp.MPFR_RNDN) gmp.mpfr_d_sub(gmp.mpc_imagref(res), other.imag, gmp.mpc_imagref(self._mpc), gmp.MPFR_RNDN) elif isinstance(other, float): gmp.mpfr_d_sub(gmp.mpc_realref(res), other, gmp.mpc_realref(self._mpc), gmp.MPFR_RNDN) gmp.mpfr_neg(gmp.mpc_imagref(res), gmp.mpc_imagref(self._mpc), gmp.MPFR_RNDN) elif isinstance(other, (int, long)): if 0 <= other <= MAX_UI: gmp.mpc_ui_sub(res, other, self._mpc, gmp.MPC_RNDNN) elif -sys.maxsize - 1 <= other <= sys.maxsize: gmp.mpfr_si_sub(gmp.mpc_realref(res), other, gmp.mpc_realref(self._mpc), gmp.MPFR_RNDN) gmp.mpfr_neg(gmp.mpc_imagref(res), gmp.mpc_imagref(self._mpc), gmp.MPFR_RNDN) else: tmp_mpz = _new_mpz() _pyint_to_mpz(other, tmp_mpz) gmp.mpfr_z_sub(gmp.mpc_realref(res), tmp_mpz, gmp.mpc_realref(self._mpc), gmp.MPFR_RNDN) gmp.mpfr_neg(gmp.mpc_imagref(res), gmp.mpc_imagref(self._mpc), gmp.MPFR_RNDN) _del_mpz(tmp_mpz) else: return NotImplemented return mpc._from_c_mpc(res)
def __sub__(self, other): res = _new_mpc() # TODO use context precision if isinstance(other, mpc): gmp.mpc_sub(res, self._mpc, other._mpc, gmp.MPC_RNDNN) elif isinstance(other, mpfr): gmp.mpc_sub_fr(res, self._mpc, other._mpfr, gmp.MPC_RNDNN) elif isinstance(other, mpq): gmp.mpfr_sub_q(gmp.mpc_realref(res), gmp.mpc_realref(self._mpc), other._mpq, gmp.MPFR_RNDN) gmp.mpfr_set(gmp.mpc_imagref(res), gmp.mpc_imagref(self._mpc), gmp.MPFR_RNDN) elif isinstance(other, mpz): gmp.mpfr_sub_z(gmp.mpc_realref(res), gmp.mpc_realref(self._mpc), other._mpz, gmp.MPFR_RNDN) gmp.mpfr_set(gmp.mpc_imagref(res), gmp.mpc_imagref(self._mpc), gmp.MPFR_RNDN) elif isinstance(other, complex): gmp.mpfr_sub_d(gmp.mpc_realref(res), gmp.mpc_realref(self._mpc), other.real, gmp.MPFR_RNDN) gmp.mpfr_sub_d(gmp.mpc_imagref(res), gmp.mpc_imagref(self._mpc), other.imag, gmp.MPFR_RNDN) elif isinstance(other, float): gmp.mpfr_sub_d(gmp.mpc_realref(res), gmp.mpc_realref(self._mpc), other, gmp.MPFR_RNDN) gmp.mpfr_set(gmp.mpc_imagref(res), gmp.mpc_imagref(self._mpc), gmp.MPFR_RNDN) elif isinstance(other, (int, long)): if 0 <= other <= MAX_UI: gmp.mpc_sub_ui(res, self._mpc, other, gmp.MPC_RNDNN) elif -sys.maxsize - 1 <= other <= sys.maxsize: gmp.mpfr_sub_si(gmp.mpc_realref(res), gmp.mpc_realref(self._mpc), other, gmp.MPFR_RNDN) gmp.mpfr_set(gmp.mpc_imagref(res), gmp.mpc_imagref(self._mpc), gmp.MPFR_RNDN) else: tmp_mpz = _new_mpz() _pyint_to_mpz(other, tmp_mpz) gmp.mpfr_sub_z(gmp.mpc_realref(res), gmp.mpc_realref(self._mpc), tmp_mpz, gmp.MPFR_RNDN) gmp.mpfr_set(gmp.mpc_imagref(res), gmp.mpc_imagref(self._mpc), gmp.MPFR_RNDN) _del_mpz(tmp_mpz) else: return NotImplemented return mpc._from_c_mpc(res)
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 __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")