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
from sympy.utilities import public

class IntegerRing(Ring, CharacteristicZero, SimpleDomain):  # type: ignore
    rep = ...
    alias = ...
    dtype = MPZ
    zero = dtype(0)
    one = dtype(1)
    tp: type[dtype]
    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) -> dtype: ...
    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 = ...
