Skip to content

Commit 88de5ab

Browse files
author
Release Manager
committedMar 31, 2023
gh-35240: ABC for `BooleanPolynomialRing` <!-- ^^^^^ Please provide a concise, informative and self-explanatory title. Don't put issue numbers in there, do this in the PR body below. For example, instead of "Fixes #1234" use "Introduce new method to calculate 1+1" --> ### 📚 Description The new ABC `sage.rings.polynomial.multi_polynomial_ring_base.BooleanPol ynomialRing_base` can be imported for `isinstance` tests, without a compile time dependency on `brial`. This is a step towards a modularized distribution **sagemath-brial**. Part of: - #32414 ### 📝 Checklist <!-- Put an `x` in all the boxes that apply. --> <!-- If your change requires a documentation PR, please link it appropriately --> <!-- If you're unsure about any of these, don't hesitate to ask. We're here to help! --> - [x] I have made sure that the title is self-explanatory and the description concisely explains the PR. - [x] I have linked an issue or discussion. - [x] I have created tests covering the changes. - [ ] I have updated the documentation accordingly. ### ⌛ Dependencies <!-- List all open pull requests that this PR logically depends on --> <!-- - #xyz: short description why this is a dependency - #abc: ... --> URL: #35240 Reported by: Matthias Köppe Reviewer(s): François Bissey, Matthias Köppe
2 parents c9daf36 + 77c25aa commit 88de5ab

File tree

5 files changed

+45
-14
lines changed

5 files changed

+45
-14
lines changed
 

‎src/sage/rings/polynomial/multi_polynomial_ring_base.pxd

+4
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,7 @@ cdef class MPolynomialRing_base(sage.rings.ring.CommutativeRing):
99
cdef public dict _magma_cache
1010

1111
cdef _coerce_c_impl(self, x)
12+
13+
14+
cdef class BooleanPolynomialRing_base(MPolynomialRing_base):
15+
pass

‎src/sage/rings/polynomial/multi_polynomial_ring_base.pyx

+22
Original file line numberDiff line numberDiff line change
@@ -1750,6 +1750,28 @@ cdef class MPolynomialRing_base(sage.rings.ring.CommutativeRing):
17501750
return DifferentialWeylAlgebra(self)
17511751

17521752

1753+
cdef class BooleanPolynomialRing_base(MPolynomialRing_base):
1754+
r"""
1755+
Abstract base class for :class:`~sage.rings.polynomial.pbori.pbori.BooleanPolynomialRing`.
1756+
1757+
This class is defined for the purpose of ``isinstance`` tests. It should not be
1758+
instantiated.
1759+
1760+
EXAMPLES::
1761+
1762+
sage: from sage.rings.polynomial.multi_polynomial_ring_base import BooleanPolynomialRing_base
1763+
sage: R.<x, y, z> = BooleanPolynomialRing()
1764+
sage: isinstance(R, BooleanPolynomialRing_base)
1765+
True
1766+
1767+
By design, there is only one direct implementation subclass::
1768+
1769+
sage: len(BooleanPolynomialRing_base.__subclasses__()) <= 1
1770+
True
1771+
"""
1772+
pass
1773+
1774+
17531775
####################
17541776
# Leave *all* old versions!
17551777

‎src/sage/rings/polynomial/multi_polynomial_sequence.py

+14-8
Original file line numberDiff line numberDiff line change
@@ -1257,14 +1257,16 @@ def eliminate_linear_variables(self, maxlength=Infinity, skip=None, return_reduc
12571257
12581258
This is called "massaging" in [BCJ2007]_.
12591259
"""
1260-
from sage.rings.polynomial.pbori.pbori import BooleanPolynomialRing,gauss_on_polys
1261-
from sage.rings.polynomial.pbori.ll import eliminate,ll_encode,ll_red_nf_redsb
1260+
from sage.rings.polynomial.multi_polynomial_ring_base import BooleanPolynomialRing_base
12621261

12631262
R = self.ring()
12641263

1265-
if not isinstance(R, BooleanPolynomialRing):
1264+
if not isinstance(R, BooleanPolynomialRing_base):
12661265
raise NotImplementedError("Only BooleanPolynomialRing's are supported.")
12671266

1267+
from sage.rings.polynomial.pbori.pbori import gauss_on_polys
1268+
from sage.rings.polynomial.pbori.ll import eliminate, ll_encode, ll_red_nf_redsb
1269+
12681270
F = self
12691271
reductors = []
12701272

@@ -1340,10 +1342,11 @@ def _groebner_strategy(self):
13401342
sage: F._groebner_strategy()
13411343
<sage.rings.polynomial.pbori.pbori.GroebnerStrategy object at 0x...>
13421344
"""
1343-
from sage.rings.polynomial.pbori.pbori import BooleanPolynomialRing
1345+
from sage.rings.polynomial.multi_polynomial_ring_base import BooleanPolynomialRing_base
1346+
13441347
R = self.ring()
13451348

1346-
if not isinstance(R, BooleanPolynomialRing):
1349+
if not isinstance(R, BooleanPolynomialRing_base):
13471350
from sage.libs.singular.groebner_strategy import GroebnerStrategy
13481351
return GroebnerStrategy(self.ideal())
13491352
else:
@@ -1452,7 +1455,6 @@ def solve(self, algorithm='polybori', n=1, eliminate_linear_variables=True, ver
14521455
[]
14531456
14541457
"""
1455-
from sage.rings.polynomial.pbori.pbori import BooleanPolynomialRing
14561458
from sage.modules.free_module import VectorSpace
14571459

14581460
S = self
@@ -1462,6 +1464,8 @@ def solve(self, algorithm='polybori', n=1, eliminate_linear_variables=True, ver
14621464
if eliminate_linear_variables:
14631465
T, reductors = self.eliminate_linear_variables(return_reductors=True)
14641466
if T.variables() != ():
1467+
from sage.rings.polynomial.pbori.pbori import BooleanPolynomialRing
1468+
14651469
R_solving = BooleanPolynomialRing( T.nvariables(), [str(_) for _ in list(T.variables())] )
14661470
S = PolynomialSequence( R_solving, [ R_solving(f) for f in T] )
14671471

@@ -1543,11 +1547,13 @@ def reduced(self):
15431547
....: assert g[i].lt() not in t.divisors()
15441548
"""
15451549

1546-
from sage.rings.polynomial.pbori.pbori import BooleanPolynomialRing
1550+
from sage.rings.polynomial.multi_polynomial_ring_base import BooleanPolynomialRing_base
1551+
15471552
R = self.ring()
15481553

1549-
if isinstance(R, BooleanPolynomialRing):
1554+
if isinstance(R, BooleanPolynomialRing_base):
15501555
from sage.rings.polynomial.pbori.interred import interred as inter_red
1556+
15511557
l = [p for p in self if not p==0]
15521558
l = sorted(inter_red(l, completely=True), reverse=True)
15531559
return PolynomialSequence(l, R, immutable=True)

‎src/sage/rings/polynomial/pbori/pbori.pxd

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
from libcpp.memory cimport unique_ptr, shared_ptr, make_shared
22

3-
from sage.rings.polynomial.multi_polynomial_ring_base cimport \
4-
MPolynomialRing_base
3+
from sage.rings.polynomial.multi_polynomial_ring_base cimport MPolynomialRing_base, BooleanPolynomialRing_base
54
from sage.rings.polynomial.multi_polynomial cimport MPolynomial
65
from sage.structure.element cimport MonoidElement
76

87
from sage.libs.polybori.decl cimport *
98

109

11-
cdef class BooleanPolynomialRing(MPolynomialRing_base):
10+
cdef class BooleanPolynomialRing(BooleanPolynomialRing_base):
1211
cdef PBRing _pbring
1312
cdef Py_ssize_t* pbind
1413
cdef public _monom_monoid

‎src/sage/rings/polynomial/pbori/pbori.pyx

+3-3
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ block_dp_asc = int(pbblock_dp_asc)
256256
rings = sage.misc.weak_dict.WeakValueDictionary()
257257

258258

259-
cdef class BooleanPolynomialRing(MPolynomialRing_base):
259+
cdef class BooleanPolynomialRing(BooleanPolynomialRing_base):
260260
"""
261261
Construct a boolean polynomial ring with the following parameters:
262262
@@ -409,7 +409,7 @@ cdef class BooleanPolynomialRing(MPolynomialRing_base):
409409
pbnames = tuple(names)
410410
names = [name.replace('(', '').replace(')', '') for name in pbnames]
411411

412-
MPolynomialRing_base.__init__(self, GF((2,1)), n, names, order)
412+
BooleanPolynomialRing_base.__init__(self, GF((2,1)), n, names, order)
413413

414414
counter = 0
415415
for i in range(len(order.blocks()) - 1):
@@ -7615,7 +7615,7 @@ cdef BooleanPolynomialRing BooleanPolynomialRing_from_PBRing(PBRing _ring):
76157615

76167616
self._pbring = _ring
76177617

7618-
MPolynomialRing_base.__init__(self, GF(2), n, names, T)
7618+
BooleanPolynomialRing_base.__init__(self, GF(2), n, names, T)
76197619

76207620
self._zero_element = new_BP(self)
76217621
(<BooleanPolynomial>self._zero_element)._pbpoly = PBBoolePolynomial(0, self._pbring)

0 commit comments

Comments
 (0)
Please sign in to comment.