from typing import Any, Literal

from sympy.core.numbers import Integer
from sympy.external.gmpy import MPZ
from sympy.polys.domains.characteristiczero import CharacteristicZero
from sympy.polys.domains.ring import Ring
from sympy.polys.domains.simpledomain import SimpleDomain

class IntegerRing(Ring, CharacteristicZero, SimpleDomain):
    rep = ...
    alias = ...
    dtype = MPZ
    zero = MPZ(0)
    one = MPZ(1)
    tp: type
    is_ZZ = ...
    is_Numerical = ...
    is_PID = ...
    has_assoc_Ring = ...
    has_assoc_Field = ...
    def __init__(self) -> None: ...
    def to_sympy(self, a) -> Integer: ...
    def from_sympy(self, a) -> int: ...
    def get_field(self) -> Any: ...
    def algebraic_field(self, *extension, alias=...) -> Any: ...
    def from_AlgebraicField(K1, a, K0) -> None: ...
    def log(self, a, b): ...
    def from_FF(K1, a, K0) -> int: ...
    def from_FF_python(K1, a, K0) -> int: ...
    def from_ZZ(K1, a, K0) -> int: ...
    def from_ZZ_python(K1, a, K0) -> int: ...
    def from_QQ(K1, a, K0) -> int | None: ...
    def from_QQ_python(K1, a, K0) -> int | None: ...
    def from_FF_gmpy(K1, a, K0): ...
    def from_ZZ_gmpy(K1, a, K0): ...
    def from_QQ_gmpy(K1, a, K0) -> None: ...
    def from_RealField(K1, a, K0) -> int | None: ...
    def from_GaussianIntegerRing(K1, a, K0) -> None: ...
    def gcdex(
        self, a, b
    ) -> (
        tuple[Any | Literal[1, 0, -1], Any | Literal[0], Any | Literal[0, -1, 1]]
        | tuple[Any | Literal[0, -1, 1], Any | Literal[1, 0, -1], Any | Literal[0]]
    ): ...
    def gcd(self, a, b) -> int: ...
    def lcm(self, a, b) -> Literal[0]: ...
    def sqrt(self, a) -> int: ...
    def factorial(self, a) -> int: ...

ZZ = ...
