Skip to content

Commit 3cc13a2

Browse files
author
Release Manager
committed
gh-38128: Deprecate `is_AlgebraicNumber`, `is_AlgebraicReal`, `is_ComplexDoubleElement`, `is_ComplexIntervalFieldElement`, `is_ComplexNumber`, `is_FractionField`, `is_FractionFieldElement`, `is_Integer`, `is_IntegerMod`, `is_IntegerRing`, `is_Rational`, `is_RationalField`, `is_RealDoubleElement`, `is_RealIntervalField`, `is_RealIntervalFieldElement`, `is_RealNumber` <!-- ^ Please provide a concise and informative title. --> <!-- ^ Don't put issue numbers in the title, do this in the PR description below. --> <!-- ^ For example, instead of "Fixes #12345" use "Introduce new method to calculate 1 + 2". --> <!-- v Describe your changes below in detail. --> <!-- v Why is this change required? What problem does it solve? --> <!-- v If this PR resolves an open issue, please link to it here. For example, "Fixes #12345". --> - Fixes #24525 ### 📝 Checklist <!-- Put an `x` in all the boxes that apply. --> - [x] The title is concise and informative. - [ ] The description explains in detail what this PR is about. - [x] I have linked a relevant issue or discussion. - [ ] I have created tests covering the changes. - [ ] I have updated the documentation and checked the documentation preview. ### ⌛ Dependencies <!-- List all open PRs that this PR logically depends on. For example, --> <!-- - #12345: short description why this is a dependency --> <!-- - #34567: ... --> URL: #38128 Reported by: Matthias Köppe Reviewer(s): gmou3
2 parents 67b5de7 + e88d435 commit 3cc13a2

File tree

71 files changed

+331
-210
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+331
-210
lines changed

src/sage/algebras/quatalg/quaternion_algebra.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
from sage.rings.rational import Rational
5252
from sage.rings.finite_rings.finite_field_constructor import GF
5353
from sage.rings.ideal import Ideal_fractional
54-
from sage.rings.rational_field import is_RationalField, QQ
54+
from sage.rings.rational_field import RationalField, QQ
5555
from sage.rings.infinity import infinity
5656
from sage.rings.number_field.number_field_base import NumberField
5757
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
@@ -429,7 +429,7 @@ def is_division_algebra(self) -> bool:
429429
...
430430
NotImplementedError: base field must be rational numbers
431431
"""
432-
if not is_RationalField(self.base_ring()):
432+
if not isinstance(self.base_ring(), RationalField):
433433
raise NotImplementedError("base field must be rational numbers")
434434
return self.discriminant() != 1
435435

@@ -453,7 +453,7 @@ def is_matrix_ring(self) -> bool:
453453
NotImplementedError: base field must be rational numbers
454454
455455
"""
456-
if not is_RationalField(self.base_ring()):
456+
if not isinstance(self.base_ring(), RationalField):
457457
raise NotImplementedError("base field must be rational numbers")
458458
return self.discriminant() == 1
459459

@@ -678,7 +678,7 @@ def __init__(self, base_ring, a, b, names='i,j,k'):
678678
Parent.__init__(self, base=base_ring, names=names, category=cat)
679679
self._a = a
680680
self._b = b
681-
if is_RationalField(base_ring) and a.denominator() == 1 == b.denominator():
681+
if isinstance(base_ring, RationalField) and a.denominator() == 1 == b.denominator():
682682
self.Element = QuaternionAlgebraElement_rational_field
683683
elif (isinstance(base_ring, NumberField) and base_ring.degree() > 2 and base_ring.is_absolute() and
684684
a.denominator() == 1 == b.denominator() and base_ring.defining_polynomial().is_monic()):
@@ -1066,7 +1066,7 @@ def is_definite(self):
10661066
...
10671067
ValueError: base field must be rational numbers
10681068
"""
1069-
if not is_RationalField(self.base_ring()):
1069+
if not isinstance(self.base_ring(), RationalField):
10701070
raise ValueError("base field must be rational numbers")
10711071
a, b = self.invariants()
10721072
return a < 0 and b < 0
@@ -1218,7 +1218,7 @@ def discriminant(self):
12181218
sage: QuaternionAlgebra(QQ[sqrt(2)], 3, 19).discriminant() # needs sage.symbolic
12191219
Fractional ideal (1)
12201220
"""
1221-
if not is_RationalField(self.base_ring()):
1221+
if not isinstance(self.base_ring(), RationalField):
12221222
try:
12231223
F = self.base_ring()
12241224
return F.hilbert_conductor(self._a, self._b)
@@ -1245,7 +1245,7 @@ def ramified_primes(self):
12451245
sage: QuaternionAlgebra(QQ, -58, -69).ramified_primes()
12461246
[3, 23, 29]
12471247
"""
1248-
if not is_RationalField(self.base_ring()):
1248+
if not isinstance(self.base_ring(), RationalField):
12491249
raise ValueError("base field must be the rational numbers")
12501250

12511251
a, b = self._a, self._b
@@ -2517,7 +2517,7 @@ def attempt_isomorphism(self, other):
25172517
if other.quaternion_algebra() != Q:
25182518
raise TypeError('not an order in the same quaternion algebra')
25192519

2520-
if not is_RationalField(Q.base_ring()):
2520+
if not isinstance(Q.base_ring(), RationalField):
25212521
raise NotImplementedError('only implemented for orders in a rational quaternion algebra')
25222522
if not Q.is_definite():
25232523
raise NotImplementedError('only implemented for definite quaternion orders')

src/sage/combinat/finite_state_machine_generators.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -268,8 +268,8 @@ def Word(self, word, input_alphabet=None):
268268
269269
TESTS::
270270
271-
sage: from sage.rings.integer import is_Integer
272-
sage: all(is_Integer(s.label()) for s in A.states())
271+
sage: from sage.rings.integer import Integer
272+
sage: all(isinstance(s.label(), Integer) for s in A.states())
273273
True
274274
"""
275275
letters = list(word)

src/sage/combinat/sf/jack.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
from sage.rings.rational_field import QQ
3737
from sage.arith.misc import gcd
3838
from sage.arith.functions import lcm
39-
from sage.rings.fraction_field import is_FractionField
39+
from sage.rings.fraction_field import FractionField_generic
4040
from sage.misc.misc_c import prod
4141
from sage.categories.morphism import SetMorphism
4242
from sage.categories.homset import Hom, End
@@ -481,7 +481,7 @@ def normalize_coefficients(self, c):
481481
6/(t^2 + 3*t + 2)
482482
"""
483483
BR = self.base_ring()
484-
if is_FractionField(BR) and BR.base_ring() == QQ:
484+
if isinstance(BR, FractionField_generic) and BR.base_ring() == QQ:
485485
denom = c.denominator()
486486
numer = c.numerator()
487487

src/sage/dynamics/arithmetic_dynamics/affine_ds.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class initialization directly.
4545
from sage.rings.integer import Integer
4646
from sage.rings.finite_rings.finite_field_base import FiniteField
4747
from sage.rings.fraction_field import FractionField
48-
from sage.rings.fraction_field import is_FractionField
48+
from sage.rings.fraction_field import FractionField_generic
4949
from sage.rings.quotient_ring import is_QuotientRing
5050
from sage.schemes.affine.affine_morphism import SchemeMorphism_polynomial_affine_space
5151
from sage.schemes.affine.affine_morphism import SchemeMorphism_polynomial_affine_space_field
@@ -261,7 +261,7 @@ def __classcall_private__(cls, morphism_or_polys, domain=None):
261261
polys = [morphism_or_polys]
262262

263263
PR = get_coercion_model().common_parent(*polys)
264-
fraction_field = any(is_FractionField(poly.parent()) for poly in polys)
264+
fraction_field = any(isinstance(poly.parent(), FractionField_generic) for poly in polys)
265265
if fraction_field:
266266
K = PR.base_ring().fraction_field()
267267
# Replace base ring with its fraction field

src/sage/dynamics/arithmetic_dynamics/projective_ds.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ class initialization directly.
8787
from sage.rings.finite_rings.finite_field_base import FiniteField
8888
from sage.rings.finite_rings.finite_field_constructor import GF
8989
from sage.rings.finite_rings.integer_mod_ring import Zmod
90-
from sage.rings.fraction_field import (FractionField, is_FractionField, FractionField_1poly_field)
91-
from sage.rings.fraction_field_element import is_FractionFieldElement, FractionFieldElement
90+
from sage.rings.fraction_field import FractionField, FractionField_generic, FractionField_1poly_field
91+
from sage.rings.fraction_field_element import FractionFieldElement
9292
from sage.rings.function_field.function_field import is_FunctionField
9393
from sage.rings.integer import Integer
9494
from sage.rings.integer_ring import ZZ
@@ -394,11 +394,11 @@ def __classcall_private__(cls, morphism_or_polys, domain=None, names=None):
394394
# homogenize!
395395
f = morphism_or_polys
396396
aff_CR = f.parent()
397-
if (not is_PolynomialRing(aff_CR) and not is_FractionField(aff_CR)
397+
if (not is_PolynomialRing(aff_CR) and not isinstance(aff_CR, FractionField_generic)
398398
and not (is_MPolynomialRing(aff_CR) and aff_CR.ngens() == 1)):
399399
msg = '{} is not a single variable polynomial or rational function'
400400
raise ValueError(msg.format(f))
401-
if is_FractionField(aff_CR):
401+
if isinstance(aff_CR, FractionField_generic):
402402
polys = [f.numerator(),f.denominator()]
403403
else:
404404
polys = [f, aff_CR(1)]
@@ -889,7 +889,7 @@ def dynatomic_polynomial(self, period):
889889
# do it again to divide out by denominators of coefficients
890890
PHI = QR2[0].sage()
891891
PHI = PHI.numerator()._maxima_().divide(PHI.denominator())[0].sage()
892-
if not is_FractionFieldElement(PHI):
892+
if not isinstance(PHI, FractionFieldElement):
893893
from sage.symbolic.expression_conversions import polynomial
894894
PHI = polynomial(PHI, ring=self.coordinate_ring())
895895
except (TypeError, NotImplementedError): #something Maxima, or the conversion, can't handle
@@ -3533,7 +3533,7 @@ def affine_preperiodic_model(self, m, n, return_conjugation=False):
35333533
if hyperplane_found:
35343534
break
35353535
else:
3536-
if is_PolynomialRing(R) or is_MPolynomialRing(R) or is_FractionField(R):
3536+
if is_PolynomialRing(R) or is_MPolynomialRing(R) or isinstance(R, FractionField_generic):
35373537
# for polynomial rings, we can get an infinite family of hyperplanes
35383538
# by increasing the degree
35393539
var = R.gen()
@@ -3702,7 +3702,7 @@ def automorphism_group(self, **kwds):
37023702
raise NotImplementedError("rational function of degree 1 not implemented")
37033703
f = self.dehomogenize(1)
37043704
R = PolynomialRing(f.base_ring(),'x')
3705-
if is_FractionFieldElement(f[0]):
3705+
if isinstance(f[0], FractionFieldElement):
37063706
F = (f[0].numerator().univariate_polynomial(R))/f[0].denominator().univariate_polynomial(R)
37073707
else:
37083708
F = f[0].univariate_polynomial(R)
@@ -4880,7 +4880,7 @@ def periodic_points(self, n, minimal=True, formal=False, R=None, algorithm='vari
48804880
if isinstance(R, FractionField_1poly_field) or is_FunctionField(R):
48814881
raise NotImplementedError('periodic points not implemented for fraction function fields; '
48824882
'clear denominators and use the polynomial ring instead')
4883-
if is_FractionField(R):
4883+
if isinstance(R, FractionField_generic):
48844884
if is_MPolynomialRing(R.ring()):
48854885
raise NotImplementedError('periodic points not implemented for fraction function fields; '
48864886
'clear denominators and use the polynomial ring instead')
@@ -5784,7 +5784,7 @@ def sigma_invariants(self, n, formal=False, embedding=None, type='point',
57845784
X = X.change_ring(F)
57855785
else:
57865786
F = base_ring
5787-
if is_FractionField(base_ring):
5787+
if isinstance(base_ring, FractionField_generic):
57885788
if is_MPolynomialRing(base_ring.ring()) or is_PolynomialRing(base_ring.ring()):
57895789
f.normalize_coordinates()
57905790
f_ring = f.change_ring(base_ring.ring())
@@ -5886,7 +5886,7 @@ def sigma_invariants(self, n, formal=False, embedding=None, type='point',
58865886
return sigmas
58875887

58885888
base_ring = dom.base_ring()
5889-
if is_FractionField(base_ring):
5889+
if isinstance(base_ring, FractionField_generic):
58905890
base_ring = base_ring.ring()
58915891
if (is_PolynomialRing(base_ring) or is_MPolynomialRing(base_ring)):
58925892
base_ring = base_ring.base_ring()

src/sage/dynamics/complex_dynamics/mandel_julia.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
from sage.schemes.projective.projective_space import ProjectiveSpace
5252
from sage.misc.prandom import randint
5353
from sage.calculus.var import var
54-
from sage.rings.fraction_field import is_FractionField
54+
from sage.rings.fraction_field import FractionField_generic
5555
from sage.categories.function_fields import FunctionFields
5656

5757
lazy_import('sage.dynamics.arithmetic_dynamics.generic_ds', 'DynamicalSystem')
@@ -243,14 +243,14 @@ def mandelbrot_plot(f=None, **kwds):
243243
P = f.parent()
244244

245245
if P.base_ring() is CC or P.base_ring() is CDF:
246-
if is_FractionField(P):
246+
if isinstance(P, FractionField_generic):
247247
raise NotImplementedError("coefficients must be polynomials in the parameter")
248248
gen_list = list(P.gens())
249249
parameter = gen_list.pop(gen_list.index(parameter))
250250
variable = gen_list.pop()
251251

252252
elif P.base_ring().base_ring() is CC or P.base_ring().base_ring() is CDF:
253-
if is_FractionField(P.base_ring()):
253+
if isinstance(P.base_ring(), FractionField_generic):
254254
raise NotImplementedError("coefficients must be polynomials in the parameter")
255255
phi = P.flattening_morphism()
256256
f = phi(f)

src/sage/dynamics/complex_dynamics/mandel_julia_helper.pyx

+3-3
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ from sage.ext.fast_callable import fast_callable
3434
from sage.calculus.all import symbolic_expression
3535
from sage.symbolic.ring import SR
3636
from sage.calculus.var import var
37-
from sage.rings.fraction_field import is_FractionField
37+
from sage.rings.fraction_field import FractionField_generic
3838
from sage.categories.function_fields import FunctionFields
3939
from cypari2.handle_error import PariError
4040
from math import sqrt
@@ -709,14 +709,14 @@ cpdef polynomial_mandelbrot(f, parameter=None, double x_center=0,
709709
P = f.parent()
710710

711711
if P.base_ring() is CC:
712-
if is_FractionField(P):
712+
if isinstance(P, FractionField_generic):
713713
raise NotImplementedError("coefficients must be polynomials in the parameter")
714714
gen_list = list(P.gens())
715715
parameter = gen_list.pop(gen_list.index(parameter))
716716
variable = gen_list.pop()
717717

718718
elif P.base_ring().base_ring() is CC:
719-
if is_FractionField(P.base_ring()):
719+
if isinstance(P.base_ring(), FractionField_generic):
720720
raise NotImplementedError("coefficients must be polynomials in the parameter")
721721
phi = P.flattening_morphism()
722722
f = phi(f)

src/sage/functions/transcendental.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@
2828

2929
lazy_import('sage.combinat.combinat', 'bernoulli_polynomial')
3030
lazy_import('sage.rings.cc', 'CC')
31-
lazy_import('sage.rings.complex_mpfr', ['ComplexField', 'is_ComplexNumber'])
31+
lazy_import('sage.rings.complex_mpfr', ['ComplexField', 'ComplexNumber'])
3232
lazy_import('sage.rings.polynomial.polynomial_real_mpfr_dense', 'PolynomialRealDense')
3333
lazy_import('sage.rings.real_double', 'RDF')
34-
lazy_import('sage.rings.real_mpfr', ['RR', 'RealField', 'is_RealNumber'])
34+
lazy_import('sage.rings.real_mpfr', ['RR', 'RealField', 'RealNumber'])
3535

3636
lazy_import('sage.libs.mpmath.utils', 'call', as_='_mpmath_utils_call')
3737
lazy_import('mpmath', 'zeta', as_='_mpmath_zeta')
@@ -452,7 +452,7 @@ def zeta_symmetric(s):
452452
- I copied the definition of xi from
453453
http://web.viu.ca/pughg/RiemannZeta/RiemannZetaLong.html
454454
"""
455-
if not (is_ComplexNumber(s) or is_RealNumber(s)):
455+
if not (isinstance(s, ComplexNumber) or isinstance(s, RealNumber)):
456456
s = ComplexField()(s)
457457

458458
R = s.parent()
@@ -544,7 +544,7 @@ def _eval_(self, x):
544544
sage: dickman_rho(0) # needs sage.symbolic
545545
1.00000000000000
546546
"""
547-
if not is_RealNumber(x):
547+
if not isinstance(x, RealNumber):
548548
try:
549549
x = RR(x)
550550
except (TypeError, ValueError):

src/sage/groups/affine_gps/affine_group.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,8 @@ def __classcall__(cls, *args, **kwds):
173173
ring = V.base_ring()
174174
if len(args) == 2:
175175
degree, ring = args
176-
from sage.rings.integer import is_Integer
177-
if is_Integer(ring):
176+
from sage.rings.integer import Integer
177+
if isinstance(ring, Integer):
178178
from sage.rings.finite_rings.finite_field_constructor import FiniteField
179179
var = kwds.get('var', 'a')
180180
ring = FiniteField(ring, var)

src/sage/groups/matrix_gps/matrix_group.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959

6060
from sage.categories.groups import Groups
6161
from sage.categories.rings import Rings
62-
from sage.rings.integer import is_Integer
62+
from sage.rings.integer import Integer
6363
from sage.matrix.matrix_space import MatrixSpace
6464
from sage.misc.latex import latex
6565
from sage.structure.richcmp import (richcmp_not_equal, rich_to_bool,
@@ -455,7 +455,7 @@ def __init__(self, degree, base_ring, category=None):
455455
True
456456
"""
457457
assert base_ring in Rings
458-
assert is_Integer(degree)
458+
assert isinstance(degree, Integer)
459459

460460
self._deg = degree
461461
if self._deg <= 0:

src/sage/matrix/matrix0.pyx

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ from sage.categories.commutative_rings import CommutativeRings
4242
from sage.categories.rings import Rings
4343

4444
import sage.rings.abc
45-
from sage.rings.integer_ring import is_IntegerRing
45+
from sage.rings.integer_ring import IntegerRing_class
4646

4747
import sage.modules.free_module
4848

@@ -5975,7 +5975,7 @@ cdef class Matrix(sage.structure.element.Matrix):
59755975
return (~self.lift_centered()).change_ring(R)
59765976
except (TypeError, ZeroDivisionError):
59775977
raise ZeroDivisionError("input matrix must be nonsingular")
5978-
elif algorithm is None and is_IntegerRing(R):
5978+
elif algorithm is None and isinstance(R, IntegerRing_class):
59795979
try:
59805980
return (~self).change_ring(R)
59815981
except (TypeError, ZeroDivisionError):

src/sage/matrix/matrix2.pyx

+7-7
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ from sage.structure.element import Vector
9393
from sage.structure.element cimport have_same_parent
9494
from sage.misc.verbose import verbose
9595
from sage.rings.number_field.number_field_base import NumberField
96-
from sage.rings.integer_ring import ZZ, is_IntegerRing
97-
from sage.rings.rational_field import QQ, is_RationalField
96+
from sage.rings.integer_ring import ZZ, IntegerRing_class
97+
from sage.rings.rational_field import QQ, RationalField
9898
import sage.rings.abc
9999
from sage.arith.numerical_approx cimport digits_to_bits
100100

@@ -4675,11 +4675,11 @@ cdef class Matrix(Matrix1):
46754675
algorithm = 'default'
46764676
elif algorithm not in ['default', 'generic', 'flint', 'pari', 'padic', 'pluq']:
46774677
raise ValueError("matrix kernel algorithm '%s' not recognized" % algorithm)
4678-
elif algorithm == 'padic' and not (is_IntegerRing(R) or is_RationalField(R)):
4678+
elif algorithm == 'padic' and not (isinstance(R, IntegerRing_class) or isinstance(R, RationalField)):
46794679
raise ValueError("'padic' matrix kernel algorithm only available over the rationals and the integers, not over %s" % R)
4680-
elif algorithm == 'flint' and not (is_IntegerRing(R) or is_RationalField(R)):
4680+
elif algorithm == 'flint' and not (isinstance(R, IntegerRing_class) or isinstance(R, RationalField)):
46814681
raise ValueError("'flint' matrix kernel algorithm only available over the rationals and the integers, not over %s" % R)
4682-
elif algorithm == 'pari' and not (is_IntegerRing(R) or (isinstance(R, NumberField) and not is_RationalField(R))):
4682+
elif algorithm == 'pari' and not (isinstance(R, IntegerRing_class) or (isinstance(R, NumberField) and not isinstance(R, RationalField))):
46834683
raise ValueError("'pari' matrix kernel algorithm only available over non-trivial number fields and the integers, not over %s" % R)
46844684
elif algorithm == 'generic' and R not in _Fields:
46854685
raise ValueError("'generic' matrix kernel algorithm only available over a field, not over %s" % R)
@@ -4694,7 +4694,7 @@ cdef class Matrix(Matrix1):
46944694
raise ValueError("matrix kernel basis format '%s' not recognized" % basis)
46954695
elif basis == 'pivot' and R not in _Fields:
46964696
raise ValueError('pivot basis only available over a field, not over %s' % R)
4697-
elif basis == 'LLL' and not is_IntegerRing(R):
4697+
elif basis == 'LLL' and not isinstance(R, IntegerRing_class):
46984698
raise ValueError('LLL-reduced basis only available over the integers, not over %s' % R)
46994699
if basis == 'default':
47004700
basis = 'echelon' if R in _Fields else 'computed'
@@ -4703,7 +4703,7 @@ cdef class Matrix(Matrix1):
47034703
proof = kwds.pop('proof', None)
47044704
if proof not in [None, True, False]:
47054705
raise ValueError("'proof' must be one of True, False or None, not %s" % proof)
4706-
if not (proof is None or is_IntegerRing(R)):
4706+
if not (proof is None or isinstance(R, IntegerRing_class)):
47074707
raise ValueError("'proof' flag only valid for matrices over the integers")
47084708

47094709
# We could sanitize/process remaining (un-popped) keywords here and

src/sage/matrix/matrix_rational_dense.pyx

+2-2
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ from sage.matrix.args cimport SparseEntry, MatrixArgs_init
110110
from sage.matrix.matrix_integer_dense cimport Matrix_integer_dense, _lift_crt
111111
from sage.structure.element cimport Element, Vector
112112
from sage.rings.integer cimport Integer
113-
from sage.rings.integer_ring import ZZ, is_IntegerRing
113+
from sage.rings.integer_ring import ZZ, IntegerRing_class
114114
import sage.rings.abc
115115
from sage.rings.rational_field import QQ
116116

@@ -1465,7 +1465,7 @@ cdef class Matrix_rational_dense(Matrix_dense):
14651465
if self._is_immutable:
14661466
return self
14671467
return self.__copy__()
1468-
if is_IntegerRing(R):
1468+
if isinstance(R, IntegerRing_class):
14691469
A, d = self._clear_denom()
14701470
if not d.is_one():
14711471
raise TypeError("matrix has denominators so can't change to ZZ")

0 commit comments

Comments
 (0)