|
59 | 59 | There is a `2`-recursive sequence describing the numbers above as well::
|
60 | 60 |
|
61 | 61 | 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() |
63 | 64 | sage: all(U[n] == u(n) for n in srange(30))
|
64 | 65 | True
|
65 | 66 |
|
@@ -267,8 +268,8 @@ def __init__(self, parent, mu, left=None, right=None):
|
267 | 268 | EXAMPLES::
|
268 | 269 |
|
269 | 270 | 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 |
272 | 273 | 2-regular sequence 0, 1, 3, 5, 9, 11, 15, 19, 27, 29, ...
|
273 | 274 |
|
274 | 275 | We can access the coefficients of a sequence by
|
@@ -303,8 +304,8 @@ def _repr_(self):
|
303 | 304 | TESTS::
|
304 | 305 |
|
305 | 306 | 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])) |
308 | 309 | sage: repr(s) # indirect doctest
|
309 | 310 | '2-regular sequence 0, 1, 3, 5, 9, 11, 15, 19, 27, 29, ...'
|
310 | 311 | """
|
@@ -387,7 +388,8 @@ def __iter__(self):
|
387 | 388 | @cached_method
|
388 | 389 | def is_degenerated(self):
|
389 | 390 | 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 |
391 | 393 | `\mu[0] \mathit{right} = \mathit{right}`.
|
392 | 394 |
|
393 | 395 | EXAMPLES::
|
@@ -417,6 +419,31 @@ def is_degenerated(self):
|
417 | 419 | from sage.rings.integer_ring import ZZ
|
418 | 420 | return (self.mu[ZZ(0)] * self.right) != self.right
|
419 | 421 |
|
| 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.") |
420 | 447 |
|
421 | 448 | @cached_method
|
422 | 449 | def regenerated(self, minimize=True):
|
@@ -510,6 +537,78 @@ def regenerated(self, minimize=True):
|
510 | 537 | else:
|
511 | 538 | return result
|
512 | 539 |
|
| 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) |
513 | 612 |
|
514 | 613 | def subsequence(self, a, b, minimize=True):
|
515 | 614 | r"""
|
@@ -1166,12 +1265,8 @@ def _element_constructor_(self, *args, **kwds):
|
1166 | 1265 | """
|
1167 | 1266 | allow_degenerated_sequence = kwds.pop('allow_degenerated_sequence', False)
|
1168 | 1267 | 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_() |
1175 | 1270 | return element
|
1176 | 1271 |
|
1177 | 1272 |
|
|
0 commit comments