def __pow__(self, other, modulo=None): if modulo is not None: raise TypeError("mpq.pow() no modulo allowed") if isinstance(other, mpq): # XXX Optimize return self ** gmpy_cffi.mpfr(other) elif isinstance(other, (mpz, int, long)): other = int(other) if 0 <= other <= MAX_UI: res = _new_mpq() gmp.mpz_pow_ui( gmp.mpq_numref(res), gmp.mpq_numref(self._mpq), other) gmp.mpz_pow_ui( gmp.mpq_denref(res), gmp.mpq_denref(self._mpq), other) return mpq._from_c_mpq(res) elif -MAX_UI <= other < 0: if self == 0: raise ZeroDivisionError( "mpq.pow() 0 base to negative exponent") res = _new_mpq() gmp.mpz_pow_ui( gmp.mpq_numref(res), gmp.mpq_denref(self._mpq), -other) gmp.mpz_pow_ui( gmp.mpq_denref(res), gmp.mpq_numref(self._mpq), -other) # For Example mpq(-1,1)**-1 == mpq(1, -1) -> mpq(1, 1) gmp.mpq_canonicalize(res) return mpq._from_c_mpq(res) else: raise ValueError('mpz.pow with outragous exponent') else: return NotImplemented
def __rpow__(self, other): if not isinstance(other, (int, long)): return NotImplemented if self < 0: raise ValueError("mpz.pow with negative exponent") res = _new_mpz() exp = int(self) if exp > MAX_UI: raise ValueError("mpz.pow with outragous exponent") if 0 <= other <= MAX_UI: gmp.mpz_ui_pow_ui(res, other, exp) else: base = _new_mpz() _pylong_to_mpz(other, base) gmp.mpz_pow_ui(res, base, exp) _del_mpz(base) return mpz._from_c_mpz(res)
def __rpow__(self, other): if not isinstance(other, (int, long)): return NotImplemented if self < 0: raise ValueError('mpz.pow with negative exponent') res = _new_mpz() exp = int(self) if exp > MAX_UI: raise ValueError('mpz.pow with outragous exponent') if 0 <= other <= MAX_UI: gmp.mpz_ui_pow_ui(res, other, exp) else: base = _new_mpz() _pylong_to_mpz(other, base) gmp.mpz_pow_ui(res, base, exp) _del_mpz(base) return mpz._from_c_mpz(res)
def __pow__(self, power, modulo=None): if not isinstance(power, (int, long, mpz)): return NotImplemented if modulo is not None and not isinstance(modulo, (int, long, mpz)): return NotImplemented if power < 0: raise ValueError("mpz.pow with negative exponent") res = _new_mpz() if modulo is None: exp = int(power) if exp > MAX_UI: raise ValueError("mpz.pow with outragous exponent") gmp.mpz_pow_ui(res, self._mpz, exp) else: del_mod = del_exp = False if isinstance(modulo, (int, long)): mod = _new_mpz() _pylong_to_mpz(abs(modulo), mod) del_mod = True else: mod = modulo._mpz if isinstance(power, (int, long)) and power <= MAX_UI: gmp.mpz_powm_ui(res, self._mpz, power, mod) else: if isinstance(power, (int, long)): exp = _new_mpz() _pylong_to_mpz(power, exp) del_exp = True else: exp = power._mpz gmp.mpz_powm(res, self._mpz, exp, mod) if del_exp: _del_mpz(exp) if del_mod: _del_mpz(mod) return mpz._from_c_mpz(res)
def __pow__(self, power, modulo=None): if not isinstance(power, (int, long, mpz)): return NotImplemented if modulo is not None and not isinstance(modulo, (int, long, mpz)): return NotImplemented if power < 0: raise ValueError('mpz.pow with negative exponent') res = _new_mpz() if modulo is None: exp = int(power) if exp > MAX_UI: raise ValueError('mpz.pow with outragous exponent') gmp.mpz_pow_ui(res, self._mpz, exp) else: del_mod = del_exp = False if isinstance(modulo, (int, long)): mod = _new_mpz() _pylong_to_mpz(abs(modulo), mod) del_mod = True else: mod = modulo._mpz if isinstance(power, (int, long)) and power <= MAX_UI: gmp.mpz_powm_ui(res, self._mpz, power, mod) else: if isinstance(power, (int, long)): exp = _new_mpz() _pylong_to_mpz(power, exp) del_exp = True else: exp = power._mpz gmp.mpz_powm(res, self._mpz, exp, mod) if del_exp: _del_mpz(exp) if del_mod: _del_mpz(mod) return mpz._from_c_mpz(res)