Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
    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)