Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/mypy.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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
3 changes: 3 additions & 0 deletions src/sage/categories/morphism.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@

class Morphism:
...
13 changes: 11 additions & 2 deletions src/sage/rings/factorint_pari.pyi
Original file line number Diff line number Diff line change
@@ -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]]:
...
120 changes: 52 additions & 68 deletions src/sage/rings/integer.pyi
Original file line number Diff line number Diff line change
@@ -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
11 changes: 9 additions & 2 deletions src/sage/rings/integer.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -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):
"""
Expand Down Expand Up @@ -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`.
Expand Down
4 changes: 4 additions & 0 deletions src/sage/rings/rational.pyi
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from sage.structure.element import FieldElement

class Rational(FieldElement):
...
78 changes: 78 additions & 0 deletions src/sage/structure/element.pyi
Original file line number Diff line number Diff line change
@@ -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):
...
Loading