Skip to content

Commit f776785

Browse files
committed
Trac #21343: adapt to removed transpose-property in dependency
1 parent 8488b55 commit f776785

File tree

1 file changed

+107
-12
lines changed

1 file changed

+107
-12
lines changed

src/sage/combinat/k_regular_sequence.py

Lines changed: 107 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@
5959
There is a `2`-recursive sequence describing the numbers above as well::
6060
6161
sage: U = Seq2((Matrix([[3, 2], [0, 1]]), Matrix([[2, 0], [1, 3]])),
62-
....: left=vector([0, 1]), right=vector([1, 0])).transposed()
62+
....: left=vector([0, 1]), right=vector([1, 0]),
63+
....: allow_degenerated_sequence=True).transposed()
6364
sage: all(U[n] == u(n) for n in srange(30))
6465
True
6566
@@ -267,8 +268,8 @@ def __init__(self, parent, mu, left=None, right=None):
267268
EXAMPLES::
268269
269270
sage: Seq2 = kRegularSequenceSpace(2, ZZ)
270-
sage: S = Seq2((Matrix([[3, 6], [0, 1]]), Matrix([[0, -6], [1, 5]])),
271-
....: vector([0, 1]), vector([1, 0])).transposed(); S
271+
sage: S = Seq2((Matrix([[3, 0], [6, 1]]), Matrix([[0, 1], [-6, 5]])),
272+
....: vector([1, 0]), vector([0, 1])); S
272273
2-regular sequence 0, 1, 3, 5, 9, 11, 15, 19, 27, 29, ...
273274
274275
We can access the coefficients of a sequence by
@@ -303,8 +304,8 @@ def _repr_(self):
303304
TESTS::
304305
305306
sage: Seq2 = kRegularSequenceSpace(2, ZZ)
306-
sage: s = Seq2((Matrix([[3, 6], [0, 1]]), Matrix([[0, -6], [1, 5]])),
307-
....: vector([0, 1]), vector([1, 0])).transposed()
307+
sage: s = Seq2((Matrix([[3, 0], [6, 1]]), Matrix([[0, 1], [-6, 5]])),
308+
....: vector([1, 0]), vector([0, 1]))
308309
sage: repr(s) # indirect doctest
309310
'2-regular sequence 0, 1, 3, 5, 9, 11, 15, 19, 27, 29, ...'
310311
"""
@@ -387,7 +388,8 @@ def __iter__(self):
387388
@cached_method
388389
def is_degenerated(self):
389390
r"""
390-
Return whether this `k`-regular sequence satisfies
391+
Return whether this `k`-regular sequence is degenerated,
392+
i.e., whether this `k`-regular sequence does not satisfiy
391393
`\mu[0] \mathit{right} = \mathit{right}`.
392394
393395
EXAMPLES::
@@ -417,6 +419,31 @@ def is_degenerated(self):
417419
from sage.rings.integer_ring import ZZ
418420
return (self.mu[ZZ(0)] * self.right) != self.right
419421

422+
def _error_if_degenerated_(self):
423+
r"""
424+
Raise an error if this `k`-regular sequence is degenerated,
425+
i.e., if this `k`-regular sequence does not satisfiy
426+
`\mu[0] \mathit{right} = \mathit{right}`.
427+
428+
TESTS::
429+
430+
sage: Seq2 = kRegularSequenceSpace(2, ZZ)
431+
sage: Seq2((Matrix([[3, 2], [0, 1]]), Matrix([[2, 0], [1, 3]])),
432+
....: left=vector([0, 1]), right=vector([1, 0])) # indirect doctest
433+
Traceback (most recent call last):
434+
...
435+
DegeneratedSequenceError: degenerated sequence: mu[0]*right != right.
436+
Using such a sequence might lead to wrong results.
437+
You can use 'allow_degenerated_sequence=True' followed
438+
by a call of method .regenerated() for correcting this.
439+
"""
440+
if self.is_degenerated():
441+
raise DegeneratedSequenceError(
442+
"degenerated sequence: mu[0]*right != right. "
443+
"Using such a sequence might lead to wrong results. "
444+
"You can use 'allow_degenerated_sequence=True' followed by "
445+
"a call of method .regenerated() "
446+
"for correcting this.")
420447

421448
@cached_method
422449
def regenerated(self, minimize=True):
@@ -510,6 +537,78 @@ def regenerated(self, minimize=True):
510537
else:
511538
return result
512539

540+
def transposed(self, allow_degenerated_sequence=False):
541+
r"""
542+
Return the transposed sequence.
543+
544+
INPUT:
545+
546+
- ``allow_degenerated_sequence`` -- (default: ``False``) a boolean. If set, then
547+
there will be no check if the transposed sequence is a degenerated sequence
548+
(see :meth:`is_degenerated`).
549+
Otherwise the transposed sequence is checked and a :class:`DegeneratedSequenceError`
550+
is raised if such a sequence is detected.
551+
552+
OUTPUT:
553+
554+
A :class:`kRegularSequence`
555+
556+
Each of the matrices in :meth:`mu <mu>` is transposed. Additionally
557+
the vectors :meth:`left <left>` and :meth:`right <right>` are switched.
558+
559+
EXAMPLES::
560+
561+
sage: Seq2 = kRegularSequenceSpace(2, ZZ)
562+
sage: U = Seq2((Matrix([[3, 2], [0, 1]]), Matrix([[2, 0], [1, 3]])),
563+
....: left=vector([0, 1]), right=vector([1, 0]),
564+
....: allow_degenerated_sequence=True)
565+
sage: U.is_degenerated()
566+
True
567+
sage: Ut = U.transposed()
568+
sage: Ut.is_degenerated()
569+
False
570+
571+
sage: Ut.transposed()
572+
Traceback (most recent call last):
573+
...
574+
DegeneratedSequenceError: degenerated sequence: mu[0]*right != right.
575+
Using such a sequence might lead to wrong results.
576+
You can use 'allow_degenerated_sequence=True' followed
577+
by a call of method .regenerated() for correcting this.
578+
sage: Utt = Ut.transposed(allow_degenerated_sequence=True)
579+
sage: Utt.is_degenerated()
580+
True
581+
582+
.. SEEALSO::
583+
584+
:meth:`RecognizableSeries.tranposed <sage.combinat.recognizable_series.RecognizableSeries.tranposed>`
585+
"""
586+
element = super().transposed()
587+
if not allow_degenerated_sequence:
588+
element._error_if_degenerated_()
589+
return element
590+
591+
def _minimized_right_(self):
592+
r"""
593+
Return a recognizable series equivalent to this series, but
594+
with a right minimized linear representation.
595+
596+
OUTPUT:
597+
598+
A :class:`kRegularSequence`
599+
600+
.. SEEALSO::
601+
602+
:meth:`RecognizableSeries._minimized_right_ <sage.combinat.recognizable_series.RecognizableSeries._minimized_right>`
603+
604+
TESTS::
605+
606+
sage: Seq2 = kRegularSequenceSpace(2, ZZ)
607+
sage: Seq2((Matrix([[3, 0], [2, 1]]), Matrix([[2, 1], [0, 3]])),
608+
....: left=vector([1, 0]), right=vector([0, 1])).minimized() # indirect doctest
609+
2-regular sequence 0, 1, 3, 5, 9, 11, 15, 19, 27, 29, ...
610+
"""
611+
return self.transposed(allow_degenerated_sequence=True)._minimized_left_().transposed(allow_degenerated_sequence=True)
513612

514613
def subsequence(self, a, b, minimize=True):
515614
r"""
@@ -1166,12 +1265,8 @@ def _element_constructor_(self, *args, **kwds):
11661265
"""
11671266
allow_degenerated_sequence = kwds.pop('allow_degenerated_sequence', False)
11681267
element = super(kRegularSequenceSpace, self)._element_constructor_(*args, **kwds)
1169-
if not allow_degenerated_sequence and element.is_degenerated():
1170-
raise DegeneratedSequenceError("degenerated sequence: mu[0]*right != right. "
1171-
"Using such a sequence might lead to wrong results. "
1172-
"You can use 'allow_degenerated_sequence=True' followed by "
1173-
"a call of method .regenerated() "
1174-
"for correcting this.")
1268+
if not allow_degenerated_sequence:
1269+
element._error_if_degenerated_()
11751270
return element
11761271

11771272

0 commit comments

Comments
 (0)