import sys
from collections.abc import Generator
from typing import Any
from typing_extensions import LiteralString, TypeAlias

from sympy.polys.polyutils import IntegerPowerable

if sys.version_info >= (3, 10):
    from types import NotImplementedType
else:
    NotImplementedType: TypeAlias = Any

class Ideal(IntegerPowerable):
    def is_whole_ring(self): ...
    def is_zero(self): ...
    def is_prime(self): ...
    def is_maximal(self): ...
    def is_radical(self): ...
    def is_primary(self): ...
    def is_principal(self): ...
    def radical(self): ...
    def depth(self): ...
    def height(self): ...
    def __init__(self, ring) -> None: ...
    def contains(self, elem): ...
    def subset(self, other) -> bool: ...
    def quotient(self, J, **opts): ...
    def intersect(self, J): ...
    def saturate(self, J): ...
    def union(self, J): ...
    def product(self, J): ...
    def reduce_element(self, x): ...
    def __add__(self, e): ...

    __radd__ = ...
    def __mul__(self, e) -> NotImplementedType: ...

    __rmul__ = ...
    def __eq__(self, e) -> bool: ...
    def __ne__(self, e) -> bool: ...

class ModuleImplementedIdeal(Ideal):
    def __init__(self, ring, module) -> None: ...
    @property
    def gens(self) -> Generator[Any, None, None]: ...
    def is_zero(self): ...
    def is_whole_ring(self): ...
    def __repr__(self) -> LiteralString: ...
    def in_terms_of_generators(self, e): ...
    def reduce_element(self, x, **options): ...
