diff --git a/src/mypy.ini b/src/mypy.ini index 7c01a3dab12..fceb5f3537d 100644 --- a/src/mypy.ini +++ b/src/mypy.ini @@ -3,5 +3,5 @@ python_version = 3.12 # https://github.com/sagemath/sage/issues/36198#issuecomment-1709521850 -follow_imports = skip +follow_imports = silent ignore_missing_imports = True diff --git a/src/sage/categories/morphism.pyi b/src/sage/categories/morphism.pyi new file mode 100644 index 00000000000..108497e6243 --- /dev/null +++ b/src/sage/categories/morphism.pyi @@ -0,0 +1,3 @@ + +class Morphism: + ... diff --git a/src/sage/rings/factorint_pari.pyi b/src/sage/rings/factorint_pari.pyi index 4b0e9f6020d..101dd4cf745 100644 --- a/src/sage/rings/factorint_pari.pyi +++ b/src/sage/rings/factorint_pari.pyi @@ -1,4 +1,13 @@ -from typing import Union +from typing import overload, Literal +from sage.rings.integer import Int -def factor_using_pari(n: Union[int, Integer], int_: bool = False, debug_level: int = 0, proof: bool | None = None) -> list[tuple[Union[int, Integer], int]]: +@overload +def factor_using_pari(n: Int, int_: Literal[True], debug_level: int = 0, proof: bool | None = None) -> list[tuple[int, int]]: + ... + +@overload +def factor_using_pari(n: Int, int_: Literal[False], debug_level: int = 0, proof: bool | None = None) -> list[tuple[Integer, int]]: + ... + +def factor_using_pari(n: Int, int_: bool = False, debug_level: int = 0, proof: bool | None = None) -> list[tuple[Int, int]]: ... diff --git a/src/sage/rings/integer.pyi b/src/sage/rings/integer.pyi index 5d81a21b2b7..89f297aae19 100644 --- a/src/sage/rings/integer.pyi +++ b/src/sage/rings/integer.pyi @@ -1,72 +1,56 @@ -from sage.libs.gmp.types import __mpz_struct, mpz_t, mpz_ptr -from sage.libs.gmp.mpz import mpz_set +from typing import overload from sage.structure.element import EuclideanDomainElement, RingElement -from sage.categories.morphism import Morphism class Integer(EuclideanDomainElement): - value: __mpz_struct[1] - - def set_from_mpz(self, value: mpz_t) -> None: - ... - - def hash_c(self) -> int: - ... - - def __pari__(self) -> object: - ... - - def _shift_helper(self, y: object, sign: int) -> object: - ... - - def _add_(self, other: object) -> object: - ... - - def _mul_(self, other: object) -> object: - ... - - def _pow_(self, other: object) -> object: - ... - - def _and(self, other: 'Integer') -> 'Integer': - ... - - def _or(self, other: 'Integer') -> 'Integer': - ... - - def _xor(self, other: 'Integer') -> 'Integer': - ... - - def _exact_log_log2_iter(self, m: 'Integer') -> int: - ... - - def _exact_log_mpfi_log(self, m: object) -> int: - ... - - def _valuation(self, p: 'Integer') -> RingElement: - ... - - def _val_unit(self, p: 'Integer') -> object: - ... - - def _divide_knowing_divisible_by(self, right: 'Integer') -> 'Integer': - ... - - def _is_power_of(self, n: 'Integer') -> bool: - ... - - def _pseudoprime_is_prime(self, proof: object) -> bool: - ... - -def mpz_set_str_python(z: mpz_ptr, s: str, base: int) -> int: - ... - -def smallInteger(value: int) -> 'Integer': - ... - -_small_primes_table: list[bool] - -def _Integer_from_mpz(e: mpz_t) -> 'Integer': - z = Integer.__new__(Integer) - mpz_set(z.value, e) - return z + def __init__(self, x: object = None, base: Int = 0) -> None: ... + def __pari__(self) -> object: ... + def _shift_helper(self, y: object, sign: int) -> object: ... + def _add_(self, other: Integer) -> Integer: ... + def _sub_(self, other: Integer) -> Integer: ... + def _mul_(self, other: Integer) -> Integer: ... + def _pow_(self, other: Integer) -> Integer: ... + def _exact_log_log2_iter(self, m: Integer) -> int: ... + def _exact_log_mpfi_log(self, m: object) -> int: ... + def _valuation(self, p: Integer) -> RingElement: ... + def valuation(self, p: Int) -> RingElement: ... + + ord = valuation + + def val_unit(self, p: Int) -> object: ... + def divide_knowing_divisible_by(self, right: Int) -> Integer: ... + def is_power_of(self, n: Integer) -> bool: ... + def is_pseudoprime(self) -> bool: ... + @overload + def __add__(self, other: Int) -> Integer: ... + @overload + def __add__(self, other: object) -> object: ... + @overload + def __sub__(self, other: Int) -> Integer: ... + @overload + def __sub__(self, other: object) -> object: ... + @overload + def __rsub__(self, other: int) -> Integer: ... + @overload + def __rsub__(self, other: object) -> object: ... + @overload + def __radd__(self, other: int) -> Integer: ... + @overload + def __radd__(self, other: object) -> object: ... + @overload + def __mul__(self, other: Int) -> Integer: ... + @overload + def __mul__(self, other: object) -> object: ... + @overload + def __rmul__(self, other: int) -> Integer: ... + @overload + def __rmul__(self, other: object) -> object: ... + @overload + def __pow__(self, other: Int) -> Integer: ... + @overload + def __pow__(self, other: Int, modulo: Int | None) -> Integer: ... + @overload + def __pow__(self, other: object, modulo: object | None) -> object: ... + +# This type alias is not available at runtime +type Int = Integer | int diff --git a/src/sage/rings/integer.pyx b/src/sage/rings/integer.pyx index 1bf3fb94b82..c9702d9db7f 100644 --- a/src/sage/rings/integer.pyx +++ b/src/sage/rings/integer.pyx @@ -4586,8 +4586,15 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement): 107326510974310118493 sage: a.divide_knowing_divisible_by(11) # way off and possibly random 43215361478743422388970455040 + + TESTS: + + Make sure the methods works for Python ints:: + + sage: 10.divide_knowing_divisible_by(5r) + 2 """ - return self._divide_knowing_divisible_by(right) + return self._divide_knowing_divisible_by(as_Integer(right)) def _lcm(self, Integer n): """ @@ -5213,7 +5220,7 @@ cdef class Integer(sage.structure.element.EuclideanDomainElement): else: return 0 - def is_power_of(Integer self, n): + def is_power_of(self, n) -> bool: r""" Return ``True`` if there is an integer `b` with `\mathtt{self} = n^b`. diff --git a/src/sage/rings/rational.pyi b/src/sage/rings/rational.pyi new file mode 100644 index 00000000000..5c925c1488d --- /dev/null +++ b/src/sage/rings/rational.pyi @@ -0,0 +1,4 @@ +from sage.structure.element import FieldElement + +class Rational(FieldElement): + ... diff --git a/src/sage/structure/element.pyi b/src/sage/structure/element.pyi new file mode 100644 index 00000000000..e61458d665c --- /dev/null +++ b/src/sage/structure/element.pyi @@ -0,0 +1,78 @@ +from sage.structure.sage_object import SageObject + +class Element(SageObject): + + def __add__(self, other): ... + + def __sub__(self, other): ... + + def __neg__(self): ... + + def __mul__(self, other): ... + + def __matmul__(self, other): ... + + def __truediv__(self, other): ... + + def __floordiv__(self, other): ... + + def __mod__(self, other): ... + + def __pow__(self, other, modulo): ... + +class ElementWithCachedMethod(Element): + ... + +class ModuleElement(Element): + ... + +class ModuleElementWithMutability(ModuleElement): + ... + +class MonoidElement(Element): + ... + +class AdditiveGroupElement(ModuleElement): + ... + +class MultiplicativeGroupElement(MonoidElement): + ... + +class RingElement(ModuleElement): + ... + +class CommutativeRingElement(RingElement): + ... + +class Expression(CommutativeRingElement): + ... + +class Vector(ModuleElementWithMutability): + ... + +class Matrix(ModuleElement): + ... + +class IntegralDomainElement(CommutativeRingElement): + ... + +class DedekindDomainElement(IntegralDomainElement): + ... + +class PrincipalIdealDomainElement(DedekindDomainElement): + ... + +class EuclideanDomainElement(PrincipalIdealDomainElement): + ... + +class FieldElement(CommutativeRingElement): + ... + +class AlgebraElement(RingElement): + ... + +class CommutativeAlgebraElement(CommutativeRingElement): + ... + +class InfinityElement(RingElement): + ...