Boundedness of \(k\)-Regular Sequences

This module contains a collection of algorithms to check for boundedness. This is done - based on eigenvalues and - by the criterion presented in [MS1977a].

Various

AUTHORS:

  • Gabriel Lipnik (2017)

ACKNOWLEDGEMENT:

  • Gabriel Lipnik is supported by the Austrian Science Fund (FWF): P 24644-N26.

sage.combinat.regular_sequence_bounded.construct_phi(matrices)[source]

Return the set \(\phi(S)\) as defined in [MS1977a].

INPUT:

  • matrices – a list of non-negative square matrices in the same dimension

OUTPUT:

A list of matrices.

EXAMPLES:

sage: from sage.combinat.regular_sequence_bounded import construct_phi
sage: L = [Matrix([[2, 2], [1, 3]]), Matrix([[0, 2], [1, 1]])]
sage: construct_phi(L)
[
[2 2]  [2 2]  [0 2]
[2 2], [1 2], [1 1]
]
>>> from sage.all import *
>>> from sage.combinat.regular_sequence_bounded import construct_phi
>>> L = [Matrix([[Integer(2), Integer(2)], [Integer(1), Integer(3)]]), Matrix([[Integer(0), Integer(2)], [Integer(1), Integer(1)]])]
>>> construct_phi(L)
[
[2 2]  [2 2]  [0 2]
[2 2], [1 2], [1 1]
]

sage: L = [Matrix([[42, 1, 0], [5, 0, 1], [0, 0, 1]]), Matrix([[0, 1, 1],
....: [4, 1, 1], [1, 2, 2]]), Matrix([[5, 1, 1], [1, 7, 1], [0, 1, 32]])]
sage: construct_phi(L)
[
[2 2 1]  [1 2 2]  [2 2 2]  [2 2 2]  [2 2 2]  [2 2 2]  [2 0 2]  [2 2 2]
[2 2 1]  [2 2 2]  [2 2 2]  [2 2 2]  [2 2 2]  [2 2 2]  [2 2 2]  [2 1 2]
[0 0 1], [2 2 2], [2 2 2], [0 1 2], [2 0 2], [0 0 1], [2 1 2], [2 1 2],

[2 1 2]  [2 2 2]  [2 2 2]  [2 2 2]  [2 1 1]  [2 2 2]  [0 1 1]  [2 1 0]
[2 2 2]  [1 2 2]  [2 2 2]  [2 2 2]  [1 2 1]  [2 1 2]  [2 1 1]  [2 0 1]
[2 2 2], [1 2 2], [1 2 2], [2 1 2], [0 1 2], [2 0 2], [1 2 2], [0 0 1]
]
>>> from sage.all import *
>>> L = [Matrix([[Integer(42), Integer(1), Integer(0)], [Integer(5), Integer(0), Integer(1)], [Integer(0), Integer(0), Integer(1)]]), Matrix([[Integer(0), Integer(1), Integer(1)],
... [Integer(4), Integer(1), Integer(1)], [Integer(1), Integer(2), Integer(2)]]), Matrix([[Integer(5), Integer(1), Integer(1)], [Integer(1), Integer(7), Integer(1)], [Integer(0), Integer(1), Integer(32)]])]
>>> construct_phi(L)
[
[2 2 1]  [1 2 2]  [2 2 2]  [2 2 2]  [2 2 2]  [2 2 2]  [2 0 2]  [2 2 2]
[2 2 1]  [2 2 2]  [2 2 2]  [2 2 2]  [2 2 2]  [2 2 2]  [2 2 2]  [2 1 2]
[0 0 1], [2 2 2], [2 2 2], [0 1 2], [2 0 2], [0 0 1], [2 1 2], [2 1 2],
<BLANKLINE>
[2 1 2]  [2 2 2]  [2 2 2]  [2 2 2]  [2 1 1]  [2 2 2]  [0 1 1]  [2 1 0]
[2 2 2]  [1 2 2]  [2 2 2]  [2 2 2]  [1 2 1]  [2 1 2]  [2 1 1]  [2 0 1]
[2 2 2], [1 2 2], [1 2 2], [2 1 2], [0 1 2], [2 0 2], [1 2 2], [0 0 1]
]
sage.combinat.regular_sequence_bounded.has_bounded_matrix_powers(matrices)[source]

Return whether \(M^n\) is bounded for \(n \to \infty\) for all \(M\) in matrices.

INPUT:

  • matrices – a list of square matrices

ALGORITHM:

Eigenvalues are used for the check.

EXAMPLES:

Maximum of the absolute value of the eigenvalues \(=1\), algebraic multiplicity equals geometric multiplicity for all eigenvalues with absolute value \(=1\):

sage: from sage.combinat.regular_sequence_bounded import has_bounded_matrix_powers
sage: matrices = [Matrix([[-1, 1, 1], [-1, 1, 1], [1, -1, 1]]),
....:             Matrix([[-1, 1, 1], [-1, 0, 0], [1, 1, 1]])]
sage: has_bounded_matrix_powers(matrices)
True
>>> from sage.all import *
>>> from sage.combinat.regular_sequence_bounded import has_bounded_matrix_powers
>>> matrices = [Matrix([[-Integer(1), Integer(1), Integer(1)], [-Integer(1), Integer(1), Integer(1)], [Integer(1), -Integer(1), Integer(1)]]),
...             Matrix([[-Integer(1), Integer(1), Integer(1)], [-Integer(1), Integer(0), Integer(0)], [Integer(1), Integer(1), Integer(1)]])]
>>> has_bounded_matrix_powers(matrices)
True

Maximum of the absolute value of the eigenvalues \(>1\):

sage: matrices = [Matrix([[1, 1], [1/2, -1]])]
sage: has_bounded_matrix_powers(matrices)
False
>>> from sage.all import *
>>> matrices = [Matrix([[Integer(1), Integer(1)], [Integer(1)/Integer(2), -Integer(1)]])]
>>> has_bounded_matrix_powers(matrices)
False

Maximum of the absolute value of the eigenvalues \(=1\), algebraic and geometric multiplicities different for eigenvalue \(1\):

sage: matrices = [Matrix([[1,1],[0,1]])]
sage: has_bounded_matrix_powers(matrices)
False
>>> from sage.all import *
>>> matrices = [Matrix([[Integer(1),Integer(1)],[Integer(0),Integer(1)]])]
>>> has_bounded_matrix_powers(matrices)
False

Maximum of the absolute value of the eigenvalues \(<1\):

sage: matrices = [Matrix([[1, -1], [1/2, -1]])]
sage: has_bounded_matrix_powers(matrices)
True
>>> from sage.all import *
>>> matrices = [Matrix([[Integer(1), -Integer(1)], [Integer(1)/Integer(2), -Integer(1)]])]
>>> has_bounded_matrix_powers(matrices)
True
sage.combinat.regular_sequence_bounded.is_bounded_via_mandel_simon_algorithm(matrices)[source]

Return whether the semigroup generated whether the semigroup of all possible products of matrices is finite/bounded.

INPUT:

  • matrices – a list of non-negative square matrices in the same dimension

OUTPUT:

A boolean.

ALGORITHM:

A criterion based on [MS1977a] is used here.

EXAMPLES:

sage: from sage.combinat.regular_sequence_bounded import is_bounded_via_mandel_simon_algorithm
sage: J = [Matrix([[1, 0, 1], [0, 1, 1], [0, 0, 0]])]
sage: is_bounded_via_mandel_simon_algorithm(J)
True
>>> from sage.all import *
>>> from sage.combinat.regular_sequence_bounded import is_bounded_via_mandel_simon_algorithm
>>> J = [Matrix([[Integer(1), Integer(0), Integer(1)], [Integer(0), Integer(1), Integer(1)], [Integer(0), Integer(0), Integer(0)]])]
>>> is_bounded_via_mandel_simon_algorithm(J)
True

sage: from sage.combinat.regular_sequence_bounded import is_bounded_via_mandel_simon_algorithm
sage: K = [Matrix([[1, 1], [1, 1]])]
sage: is_bounded_via_mandel_simon_algorithm(K)
False
>>> from sage.all import *
>>> from sage.combinat.regular_sequence_bounded import is_bounded_via_mandel_simon_algorithm
>>> K = [Matrix([[Integer(1), Integer(1)], [Integer(1), Integer(1)]])]
>>> is_bounded_via_mandel_simon_algorithm(K)
False

sage: L = [Matrix([[1, 0], [0, 1]]), Matrix([[1, 0], [0, 0]])]
sage: is_bounded_via_mandel_simon_algorithm(L)
True
>>> from sage.all import *
>>> L = [Matrix([[Integer(1), Integer(0)], [Integer(0), Integer(1)]]), Matrix([[Integer(1), Integer(0)], [Integer(0), Integer(0)]])]
>>> is_bounded_via_mandel_simon_algorithm(L)
True

sage: M = [Matrix([[1, 0], [0, 2]]), Matrix([[1, 0], [0, 0]])]
sage: is_bounded_via_mandel_simon_algorithm(M)
False
>>> from sage.all import *
>>> M = [Matrix([[Integer(1), Integer(0)], [Integer(0), Integer(2)]]), Matrix([[Integer(1), Integer(0)], [Integer(0), Integer(0)]])]
>>> is_bounded_via_mandel_simon_algorithm(M)
False

Non-integer-valued input:

sage: N = [Matrix([[0.5, 0], [1, 0]])]
sage: is_bounded_via_mandel_simon_algorithm(N)
Traceback (most recent call last):
...
ValueError: Not all matrices are integer-valued.
>>> from sage.all import *
>>> N = [Matrix([[RealNumber('0.5'), Integer(0)], [Integer(1), Integer(0)]])]
>>> is_bounded_via_mandel_simon_algorithm(N)
Traceback (most recent call last):
...
ValueError: Not all matrices are integer-valued.
sage.combinat.regular_sequence_bounded.is_integer_valued(matrices)[source]

Return whether every matrix in matrices is integer-valued.

INPUT:

  • matrices – a list of square matrices in the same dimension

OUTPUT:

A boolean.

EXAMPLES:

sage: from sage.combinat.regular_sequence_bounded import is_integer_valued
sage: matrices = [Matrix([[1, 2], [-1, 0]]), Matrix([[42, -42], [0, 0]])]
sage: is_integer_valued(matrices)
True
>>> from sage.all import *
>>> from sage.combinat.regular_sequence_bounded import is_integer_valued
>>> matrices = [Matrix([[Integer(1), Integer(2)], [-Integer(1), Integer(0)]]), Matrix([[Integer(42), -Integer(42)], [Integer(0), Integer(0)]])]
>>> is_integer_valued(matrices)
True

sage: matrices = [Matrix([[1, pi], [-1, 0]])]
sage: is_integer_valued(matrices)
False
>>> from sage.all import *
>>> matrices = [Matrix([[Integer(1), pi], [-Integer(1), Integer(0)]])]
>>> is_integer_valued(matrices)
False

sage: matrices = [Matrix([[1, 1/2], [2/4, 0]])]
sage: is_integer_valued(matrices)
False
>>> from sage.all import *
>>> matrices = [Matrix([[Integer(1), Integer(1)/Integer(2)], [Integer(2)/Integer(4), Integer(0)]])]
>>> is_integer_valued(matrices)
False

sage: matrices = [Matrix([[1, 4/2], [-1, 0]])]
sage: is_integer_valued(matrices)
True
>>> from sage.all import *
>>> matrices = [Matrix([[Integer(1), Integer(4)/Integer(2)], [-Integer(1), Integer(0)]])]
>>> is_integer_valued(matrices)
True
sage.combinat.regular_sequence_bounded.is_non_negative(matrices)[source]

Return whether every matrix in matrices is non-negative.

INPUT:

  • matrices – a list of square matrices in the same dimension

OUTPUT:

A boolean.

EXAMPLES:

sage: from sage.combinat.regular_sequence_bounded import is_non_negative
sage: matrices = [Matrix([[1, 2], [1, 0]]), Matrix([[42, -42], [0, 0]])]
sage: is_non_negative(matrices)
False
>>> from sage.all import *
>>> from sage.combinat.regular_sequence_bounded import is_non_negative
>>> matrices = [Matrix([[Integer(1), Integer(2)], [Integer(1), Integer(0)]]), Matrix([[Integer(42), -Integer(42)], [Integer(0), Integer(0)]])]
>>> is_non_negative(matrices)
False

sage: matrices = [Matrix([[0]])]
sage: is_non_negative(matrices)
True
>>> from sage.all import *
>>> matrices = [Matrix([[Integer(0)]])]
>>> is_non_negative(matrices)
True

sage: matrices = [Matrix([[1, 1/2], [2/4, 0]])]
sage: is_non_negative(matrices)
True
>>> from sage.all import *
>>> matrices = [Matrix([[Integer(1), Integer(1)/Integer(2)], [Integer(2)/Integer(4), Integer(0)]])]
>>> is_non_negative(matrices)
True
sage.combinat.regular_sequence_bounded.make_positive(matrices)[source]

Return a list of non-negative matrices

INPUT:

  • matrices – a list of matrices where every matrix is either non-negative or non-positive.

OUTPUT:

A list of matrices containing every non-negative matrix of matrices, and \(-M\) if \(M\) is a non-positive matrix of matrices.

EXAMPLES:

sage: from sage.combinat.regular_sequence_bounded import make_positive
sage: matrices = [Matrix([[1, 2], [1, 0]]), Matrix([[42, 42], [0, 0]])]
sage: make_positive(matrices)
[
[1 2]  [42 42]
[1 0], [ 0  0]
]
>>> from sage.all import *
>>> from sage.combinat.regular_sequence_bounded import make_positive
>>> matrices = [Matrix([[Integer(1), Integer(2)], [Integer(1), Integer(0)]]), Matrix([[Integer(42), Integer(42)], [Integer(0), Integer(0)]])]
>>> make_positive(matrices)
[
[1 2]  [42 42]
[1 0], [ 0  0]
]

sage: matrices = [Matrix([[1, 2], [1, 0]]), Matrix([[-42, -42], [0, 0]])]
sage: make_positive(matrices)
[
[1 2]  [42 42]
[1 0], [ 0  0]
]
>>> from sage.all import *
>>> matrices = [Matrix([[Integer(1), Integer(2)], [Integer(1), Integer(0)]]), Matrix([[-Integer(42), -Integer(42)], [Integer(0), Integer(0)]])]
>>> make_positive(matrices)
[
[1 2]  [42 42]
[1 0], [ 0  0]
]

sage: matrices = [Matrix([[1, 2], [1, 0]]), Matrix([[42, -42], [0, 0]])]
sage: make_positive(matrices)
Traceback (most recent call last):
...
ValueError: There is a matrix which is neither non-negative nor non-positive.
>>> from sage.all import *
>>> matrices = [Matrix([[Integer(1), Integer(2)], [Integer(1), Integer(0)]]), Matrix([[Integer(42), -Integer(42)], [Integer(0), Integer(0)]])]
>>> make_positive(matrices)
Traceback (most recent call last):
...
ValueError: There is a matrix which is neither non-negative nor non-positive.
sage.combinat.regular_sequence_bounded.multiply_reduce(A, B)[source]

Return the matrix \(A\cdot B\) with entries \(\min{(A\cdot B)_{ij},2}\).

INPUT:

  • A – an \(m \times n\) matrix

  • B – an \(n \times p\) matrix

OUTPUT:

An \(m \times p\) matrix with entries \(\min{(A\cdot B)_{ij},2}\).

EXAMPLES:

sage: from sage.combinat.regular_sequence_bounded import multiply_reduce
sage: A = Matrix([[2, 0], [0, 2]])
sage: B = Matrix([[-2, 0], [0, 2]])
sage: A*B
[-4  0]
[ 0  4]
sage: multiply_reduce(A, B)
[-4  0]
[ 0  2]
>>> from sage.all import *
>>> from sage.combinat.regular_sequence_bounded import multiply_reduce
>>> A = Matrix([[Integer(2), Integer(0)], [Integer(0), Integer(2)]])
>>> B = Matrix([[-Integer(2), Integer(0)], [Integer(0), Integer(2)]])
>>> A*B
[-4  0]
[ 0  4]
>>> multiply_reduce(A, B)
[-4  0]
[ 0  2]

sage: A = Matrix([[1, 2, 3], [-1, -2, -3], [1, 2, 3]])
sage: B = Matrix([[1, 2, 3], [2, 3, 4], [1, 2, 3]])
sage: A*B
[  8  14  20]
[ -8 -14 -20]
[  8  14  20]
sage: multiply_reduce(A, B)
[  2   2   2]
[ -8 -14 -20]
[  2   2   2]
>>> from sage.all import *
>>> A = Matrix([[Integer(1), Integer(2), Integer(3)], [-Integer(1), -Integer(2), -Integer(3)], [Integer(1), Integer(2), Integer(3)]])
>>> B = Matrix([[Integer(1), Integer(2), Integer(3)], [Integer(2), Integer(3), Integer(4)], [Integer(1), Integer(2), Integer(3)]])
>>> A*B
[  8  14  20]
[ -8 -14 -20]
[  8  14  20]
>>> multiply_reduce(A, B)
[  2   2   2]
[ -8 -14 -20]
[  2   2   2]
sage.combinat.regular_sequence_bounded.regular_sequence_is_bounded(S)[source]

Return whether this \(k\)-regular sequence is bounded.

INPUT:

  • S – a \(k\)-regular sequence

OUTPUT:

A boolean.

EXAMPLES:

Thue–Morse Sequence:

sage: from sage.combinat.regular_sequence_bounded import regular_sequence_is_bounded
sage: Seq2 = RegularSequenceRing(2, ZZ)
sage: TM = Seq2([Matrix([[1, 0], [0, 1]]), Matrix([[0, 1], [1, 0]])],
....:            left=vector([1, 0]), right=vector([0, 1]))
sage: regular_sequence_is_bounded(TM)
True
>>> from sage.all import *
>>> from sage.combinat.regular_sequence_bounded import regular_sequence_is_bounded
>>> Seq2 = RegularSequenceRing(Integer(2), ZZ)
>>> TM = Seq2([Matrix([[Integer(1), Integer(0)], [Integer(0), Integer(1)]]), Matrix([[Integer(0), Integer(1)], [Integer(1), Integer(0)]])],
...            left=vector([Integer(1), Integer(0)]), right=vector([Integer(0), Integer(1)]))
>>> regular_sequence_is_bounded(TM)
True

Binary Sum of Digits:

sage: SD = Seq2([Matrix([[1, 0], [0, 1]]), Matrix([[0, -1], [1, 2]])],
....:           left=vector([0, 1]), right=vector([1, 0]))
sage: regular_sequence_is_bounded(SD)
False
>>> from sage.all import *
>>> SD = Seq2([Matrix([[Integer(1), Integer(0)], [Integer(0), Integer(1)]]), Matrix([[Integer(0), -Integer(1)], [Integer(1), Integer(2)]])],
...           left=vector([Integer(0), Integer(1)]), right=vector([Integer(1), Integer(0)]))
>>> regular_sequence_is_bounded(SD)
False

Sequence of All Natural Numbers:

sage: N = Seq2([Matrix([[2, 0], [2, 1]]), Matrix([[0, 1], [-2, 3]])],
....:          left=vector([1, 0]), right=vector([0, 1]))
sage: regular_sequence_is_bounded(N)
False
>>> from sage.all import *
>>> N = Seq2([Matrix([[Integer(2), Integer(0)], [Integer(2), Integer(1)]]), Matrix([[Integer(0), Integer(1)], [-Integer(2), Integer(3)]])],
...          left=vector([Integer(1), Integer(0)]), right=vector([Integer(0), Integer(1)]))
>>> regular_sequence_is_bounded(N)
False

Indicator Function of Even Integers:

sage: E = Seq2([Matrix([[0, 1], [0, 1]]), Matrix([[0, 0], [0, 1]])],
....:          left=vector([1, 0]), right=vector([1, 1]))
sage: regular_sequence_is_bounded(E)
True
>>> from sage.all import *
>>> E = Seq2([Matrix([[Integer(0), Integer(1)], [Integer(0), Integer(1)]]), Matrix([[Integer(0), Integer(0)], [Integer(0), Integer(1)]])],
...          left=vector([Integer(1), Integer(0)]), right=vector([Integer(1), Integer(1)]))
>>> regular_sequence_is_bounded(E)
True

Indicator Function of Odd Integers:

sage: O = Seq2([Matrix([[0, 0], [0, 1]]), Matrix([[0, 1], [0, 1]])],
....:          left=vector([1, 0]), right=vector([0, 1]))
sage: regular_sequence_is_bounded(O)
True
>>> from sage.all import *
>>> O = Seq2([Matrix([[Integer(0), Integer(0)], [Integer(0), Integer(1)]]), Matrix([[Integer(0), Integer(1)], [Integer(0), Integer(1)]])],
...          left=vector([Integer(1), Integer(0)]), right=vector([Integer(0), Integer(1)]))
>>> regular_sequence_is_bounded(O)
True

Number of Odd Entries in Pascal’s Triangle:

sage: U = Seq2([Matrix([[3, 0], [6, 1]]), Matrix([[0, 1], [-6, 5]])],
....:          left=vector([1, 0]), right=vector([0, 1]))
sage: regular_sequence_is_bounded(U)
False
>>> from sage.all import *
>>> U = Seq2([Matrix([[Integer(3), Integer(0)], [Integer(6), Integer(1)]]), Matrix([[Integer(0), Integer(1)], [-Integer(6), Integer(5)]])],
...          left=vector([Integer(1), Integer(0)]), right=vector([Integer(0), Integer(1)]))
>>> regular_sequence_is_bounded(U)
False

Counting ‘10’ in the Binary Representation:

sage: C = Seq2([Matrix([[0, 1, 0, 0], [0, 0, 0, 1],
....:                   [-1, 0, 1, 1], [0, 0, 0, 1]]),
....:           Matrix([[0, 0, 1, 0], [0, 1, 0, 0],
....:                   [0, 0, 1, 0], [-1, 0, 1, 1]])],
....:                  left=vector([1, 0, 0, 0]),
....:                  right=vector([0, 0, 1, 0]))
sage: regular_sequence_is_bounded(C)
False
>>> from sage.all import *
>>> C = Seq2([Matrix([[Integer(0), Integer(1), Integer(0), Integer(0)], [Integer(0), Integer(0), Integer(0), Integer(1)],
...                   [-Integer(1), Integer(0), Integer(1), Integer(1)], [Integer(0), Integer(0), Integer(0), Integer(1)]]),
...           Matrix([[Integer(0), Integer(0), Integer(1), Integer(0)], [Integer(0), Integer(1), Integer(0), Integer(0)],
...                   [Integer(0), Integer(0), Integer(1), Integer(0)], [-Integer(1), Integer(0), Integer(1), Integer(1)]])],
...                  left=vector([Integer(1), Integer(0), Integer(0), Integer(0)]),
...                  right=vector([Integer(0), Integer(0), Integer(1), Integer(0)]))
>>> regular_sequence_is_bounded(C)
False

Numbers Starting with ‘10’:

sage: D = Seq2([Matrix([[0, 1, 0, 0], [0, 0, 1, 0],
....:                   [0, -2, 3, 0], [0, -2, 2, 1]]),
....:           Matrix([[2, 0, 0, 0], [0, 0, 0, 1],
....:                   [0, 2, 0, 1], [0, -2, 0, 3]])],
....:                  left=vector([1, 0, 0, 0]),
....:                  right=vector([2, 2, 2, 5]))
sage: regular_sequence_is_bounded(D)
False
>>> from sage.all import *
>>> D = Seq2([Matrix([[Integer(0), Integer(1), Integer(0), Integer(0)], [Integer(0), Integer(0), Integer(1), Integer(0)],
...                   [Integer(0), -Integer(2), Integer(3), Integer(0)], [Integer(0), -Integer(2), Integer(2), Integer(1)]]),
...           Matrix([[Integer(2), Integer(0), Integer(0), Integer(0)], [Integer(0), Integer(0), Integer(0), Integer(1)],
...                   [Integer(0), Integer(2), Integer(0), Integer(1)], [Integer(0), -Integer(2), Integer(0), Integer(3)]])],
...                  left=vector([Integer(1), Integer(0), Integer(0), Integer(0)]),
...                  right=vector([Integer(2), Integer(2), Integer(2), Integer(5)]))
>>> regular_sequence_is_bounded(D)
False

Signum Function:

sage: S = Seq2([Matrix([[1, 0], [0, 1]]), Matrix([[0, 1], [0, 1]])],
....:          left=vector([1, 0]), right=vector([0, 1]))
sage: regular_sequence_is_bounded(S)
True
>>> from sage.all import *
>>> S = Seq2([Matrix([[Integer(1), Integer(0)], [Integer(0), Integer(1)]]), Matrix([[Integer(0), Integer(1)], [Integer(0), Integer(1)]])],
...          left=vector([Integer(1), Integer(0)]), right=vector([Integer(0), Integer(1)]))
>>> regular_sequence_is_bounded(S)
True

Number of Digits from the Right to the First ‘1’:

sage: S = Seq2([Matrix([[0, 1, 0], [-1, 2, 0], [0, 0, 1]]),
....:           Matrix([[0, 0, 1], [0, 0, 2], [0, 0, 1]])],
....:          left=vector([1, 0, 0]), right=vector([0, 0, 1]))
sage: regular_sequence_is_bounded(S)
False
>>> from sage.all import *
>>> S = Seq2([Matrix([[Integer(0), Integer(1), Integer(0)], [-Integer(1), Integer(2), Integer(0)], [Integer(0), Integer(0), Integer(1)]]),
...           Matrix([[Integer(0), Integer(0), Integer(1)], [Integer(0), Integer(0), Integer(2)], [Integer(0), Integer(0), Integer(1)]])],
...          left=vector([Integer(1), Integer(0), Integer(0)]), right=vector([Integer(0), Integer(0), Integer(1)]))
>>> regular_sequence_is_bounded(S)
False