Alphabet¶
AUTHORS:
Franco Saliola (2008-12-17) : merged into sage
Vincent Delecroix and Stepan Starosta (2012): remove classes for alphabet and use other Sage classes otherwise (TotallyOrderedFiniteSet, FiniteEnumeratedSet, …). More shortcut to standard alphabets.
EXAMPLES:
sage: build_alphabet("ab")
{'a', 'b'}
sage: build_alphabet([0,1,2])
{0, 1, 2}
sage: build_alphabet(name='PP')
Positive integers
sage: build_alphabet(name='NN')
Non negative integers
sage: build_alphabet(name='lower')
{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}
>>> from sage.all import *
>>> build_alphabet("ab")
{'a', 'b'}
>>> build_alphabet([Integer(0),Integer(1),Integer(2)])
{0, 1, 2}
>>> build_alphabet(name='PP')
Positive integers
>>> build_alphabet(name='NN')
Non negative integers
>>> build_alphabet(name='lower')
{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}
- sage.combinat.words.alphabet.Alphabet(data=None, names=None, name=None)[source]¶
Return an object representing an ordered alphabet.
INPUT:
data
– the letters of the alphabet; it can be:a list/tuple/iterable of letters; the iterable may be infinite
an integer \(n\) to represent \(\{1, \ldots, n\}\), or infinity to represent \(\NN\)
names
– (optional) a list for the letters (i.e. variable names) or a string for prefix for all letters; if given a list, it must have the same cardinality as the set represented bydata
name
– (optional) if given, then return a named set and can be equal to :'lower', 'upper', 'space', 'underscore', 'punctuation', 'printable', 'binary', 'octal', 'decimal', 'hexadecimal', 'radix64'
.You can use many of them at once, separated by spaces :
'lower punctuation'
represents the union of the two alphabets'lower'
and'punctuation'
.Alternatively,
name
can be set to'positive integers'
(or'PP'
) or'natural numbers'
(or'NN'
).name
cannot be combined withdata
.
EXAMPLES:
If the argument is a Set, it just returns it:
sage: build_alphabet(ZZ) is ZZ True sage: F = FiniteEnumeratedSet('abc') sage: build_alphabet(F) is F True
>>> from sage.all import * >>> build_alphabet(ZZ) is ZZ True >>> F = FiniteEnumeratedSet('abc') >>> build_alphabet(F) is F True
If a list, tuple or string is provided, then it builds a proper Sage class (
TotallyOrderedFiniteSet
):sage: build_alphabet([0,1,2]) {0, 1, 2} sage: F = build_alphabet('abc'); F {'a', 'b', 'c'} sage: print(type(F).__name__) TotallyOrderedFiniteSet_with_category
>>> from sage.all import * >>> build_alphabet([Integer(0),Integer(1),Integer(2)]) {0, 1, 2} >>> F = build_alphabet('abc'); F {'a', 'b', 'c'} >>> print(type(F).__name__) TotallyOrderedFiniteSet_with_category
If an integer and a set is given, then it constructs a
TotallyOrderedFiniteSet
:sage: build_alphabet(3, ['a','b','c']) {'a', 'b', 'c'}
>>> from sage.all import * >>> build_alphabet(Integer(3), ['a','b','c']) {'a', 'b', 'c'}
If an integer and a string is given, then it considers that string as a prefix:
sage: build_alphabet(3, 'x') {'x0', 'x1', 'x2'}
>>> from sage.all import * >>> build_alphabet(Integer(3), 'x') {'x0', 'x1', 'x2'}
If no data is provided,
name
may be a string which describe an alphabet. The available names decompose into two families. The first one are ‘positive integers’, ‘PP’, ‘natural numbers’ or ‘NN’ which refer to standard set of numbers:sage: build_alphabet(name="positive integers") Positive integers sage: build_alphabet(name='PP') Positive integers sage: build_alphabet(name="natural numbers") Non negative integers sage: build_alphabet(name="NN") Non negative integers
>>> from sage.all import * >>> build_alphabet(name="positive integers") Positive integers >>> build_alphabet(name='PP') Positive integers >>> build_alphabet(name="natural numbers") Non negative integers >>> build_alphabet(name="NN") Non negative integers
The other families for the option
name
are among ‘lower’, ‘upper’, ‘space’, ‘underscore’, ‘punctuation’, ‘printable’, ‘binary’, ‘octal’, ‘decimal’, ‘hexadecimal’, ‘radix64’ which refer to standard set of characters. Theses names may be combined by separating them by a space:sage: build_alphabet(name='lower') {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'} sage: build_alphabet(name='hexadecimal') {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'} sage: build_alphabet(name="decimal punctuation") {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' ', ',', '.', ';', ':', '!', '?'}
>>> from sage.all import * >>> build_alphabet(name='lower') {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'} >>> build_alphabet(name='hexadecimal') {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'} >>> build_alphabet(name="decimal punctuation") {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' ', ',', '.', ';', ':', '!', '?'}
In the case the alphabet is built from a list or a tuple, the order on the alphabet is given by the elements themselves:
sage: A = build_alphabet([0,2,1]) sage: A(0) < A(2) True sage: A(2) < A(1) False
>>> from sage.all import * >>> A = build_alphabet([Integer(0),Integer(2),Integer(1)]) >>> A(Integer(0)) < A(Integer(2)) True >>> A(Integer(2)) < A(Integer(1)) False
If a different order is needed, you may use
TotallyOrderedFiniteSet
and set the optionfacade
toFalse
. That way, the comparison fits the order of the input:sage: A = TotallyOrderedFiniteSet([4,2,6,1], facade=False) sage: A(4) < A(2) True sage: A(1) < A(6) False
>>> from sage.all import * >>> A = TotallyOrderedFiniteSet([Integer(4),Integer(2),Integer(6),Integer(1)], facade=False) >>> A(Integer(4)) < A(Integer(2)) True >>> A(Integer(1)) < A(Integer(6)) False
Be careful, the element of the set in the last example are no more integers and do not compare equal with integers:
sage: type(A.an_element()) <class 'sage.sets.totally_ordered_finite_set.TotallyOrderedFiniteSet_with_category.element_class'> sage: A(1) == 1 False sage: 1 == A(1) False
>>> from sage.all import * >>> type(A.an_element()) <class 'sage.sets.totally_ordered_finite_set.TotallyOrderedFiniteSet_with_category.element_class'> >>> A(Integer(1)) == Integer(1) False >>> Integer(1) == A(Integer(1)) False
We give an example of an infinite alphabet indexed by the positive integers and the prime numbers:
sage: build_alphabet(oo, 'x') Lazy family (x(i))_{i in Non negative integers} sage: build_alphabet(Primes(), 'y') Lazy family (y(i))_{i in Set of all prime numbers: 2, 3, 5, 7, ...}
>>> from sage.all import * >>> build_alphabet(oo, 'x') Lazy family (x(i))_{i in Non negative integers} >>> build_alphabet(Primes(), 'y') Lazy family (y(i))_{i in Set of all prime numbers: 2, 3, 5, 7, ...}
- sage.combinat.words.alphabet.build_alphabet(data=None, names=None, name=None)[source]¶
Return an object representing an ordered alphabet.
INPUT:
data
– the letters of the alphabet; it can be:a list/tuple/iterable of letters; the iterable may be infinite
an integer \(n\) to represent \(\{1, \ldots, n\}\), or infinity to represent \(\NN\)
names
– (optional) a list for the letters (i.e. variable names) or a string for prefix for all letters; if given a list, it must have the same cardinality as the set represented bydata
name
– (optional) if given, then return a named set and can be equal to :'lower', 'upper', 'space', 'underscore', 'punctuation', 'printable', 'binary', 'octal', 'decimal', 'hexadecimal', 'radix64'
.You can use many of them at once, separated by spaces :
'lower punctuation'
represents the union of the two alphabets'lower'
and'punctuation'
.Alternatively,
name
can be set to'positive integers'
(or'PP'
) or'natural numbers'
(or'NN'
).name
cannot be combined withdata
.
EXAMPLES:
If the argument is a Set, it just returns it:
sage: build_alphabet(ZZ) is ZZ True sage: F = FiniteEnumeratedSet('abc') sage: build_alphabet(F) is F True
>>> from sage.all import * >>> build_alphabet(ZZ) is ZZ True >>> F = FiniteEnumeratedSet('abc') >>> build_alphabet(F) is F True
If a list, tuple or string is provided, then it builds a proper Sage class (
TotallyOrderedFiniteSet
):sage: build_alphabet([0,1,2]) {0, 1, 2} sage: F = build_alphabet('abc'); F {'a', 'b', 'c'} sage: print(type(F).__name__) TotallyOrderedFiniteSet_with_category
>>> from sage.all import * >>> build_alphabet([Integer(0),Integer(1),Integer(2)]) {0, 1, 2} >>> F = build_alphabet('abc'); F {'a', 'b', 'c'} >>> print(type(F).__name__) TotallyOrderedFiniteSet_with_category
If an integer and a set is given, then it constructs a
TotallyOrderedFiniteSet
:sage: build_alphabet(3, ['a','b','c']) {'a', 'b', 'c'}
>>> from sage.all import * >>> build_alphabet(Integer(3), ['a','b','c']) {'a', 'b', 'c'}
If an integer and a string is given, then it considers that string as a prefix:
sage: build_alphabet(3, 'x') {'x0', 'x1', 'x2'}
>>> from sage.all import * >>> build_alphabet(Integer(3), 'x') {'x0', 'x1', 'x2'}
If no data is provided,
name
may be a string which describe an alphabet. The available names decompose into two families. The first one are ‘positive integers’, ‘PP’, ‘natural numbers’ or ‘NN’ which refer to standard set of numbers:sage: build_alphabet(name="positive integers") Positive integers sage: build_alphabet(name='PP') Positive integers sage: build_alphabet(name="natural numbers") Non negative integers sage: build_alphabet(name="NN") Non negative integers
>>> from sage.all import * >>> build_alphabet(name="positive integers") Positive integers >>> build_alphabet(name='PP') Positive integers >>> build_alphabet(name="natural numbers") Non negative integers >>> build_alphabet(name="NN") Non negative integers
The other families for the option
name
are among ‘lower’, ‘upper’, ‘space’, ‘underscore’, ‘punctuation’, ‘printable’, ‘binary’, ‘octal’, ‘decimal’, ‘hexadecimal’, ‘radix64’ which refer to standard set of characters. Theses names may be combined by separating them by a space:sage: build_alphabet(name='lower') {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'} sage: build_alphabet(name='hexadecimal') {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'} sage: build_alphabet(name="decimal punctuation") {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' ', ',', '.', ';', ':', '!', '?'}
>>> from sage.all import * >>> build_alphabet(name='lower') {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'} >>> build_alphabet(name='hexadecimal') {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'} >>> build_alphabet(name="decimal punctuation") {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' ', ',', '.', ';', ':', '!', '?'}
In the case the alphabet is built from a list or a tuple, the order on the alphabet is given by the elements themselves:
sage: A = build_alphabet([0,2,1]) sage: A(0) < A(2) True sage: A(2) < A(1) False
>>> from sage.all import * >>> A = build_alphabet([Integer(0),Integer(2),Integer(1)]) >>> A(Integer(0)) < A(Integer(2)) True >>> A(Integer(2)) < A(Integer(1)) False
If a different order is needed, you may use
TotallyOrderedFiniteSet
and set the optionfacade
toFalse
. That way, the comparison fits the order of the input:sage: A = TotallyOrderedFiniteSet([4,2,6,1], facade=False) sage: A(4) < A(2) True sage: A(1) < A(6) False
>>> from sage.all import * >>> A = TotallyOrderedFiniteSet([Integer(4),Integer(2),Integer(6),Integer(1)], facade=False) >>> A(Integer(4)) < A(Integer(2)) True >>> A(Integer(1)) < A(Integer(6)) False
Be careful, the element of the set in the last example are no more integers and do not compare equal with integers:
sage: type(A.an_element()) <class 'sage.sets.totally_ordered_finite_set.TotallyOrderedFiniteSet_with_category.element_class'> sage: A(1) == 1 False sage: 1 == A(1) False
>>> from sage.all import * >>> type(A.an_element()) <class 'sage.sets.totally_ordered_finite_set.TotallyOrderedFiniteSet_with_category.element_class'> >>> A(Integer(1)) == Integer(1) False >>> Integer(1) == A(Integer(1)) False
We give an example of an infinite alphabet indexed by the positive integers and the prime numbers:
sage: build_alphabet(oo, 'x') Lazy family (x(i))_{i in Non negative integers} sage: build_alphabet(Primes(), 'y') Lazy family (y(i))_{i in Set of all prime numbers: 2, 3, 5, 7, ...}
>>> from sage.all import * >>> build_alphabet(oo, 'x') Lazy family (x(i))_{i in Non negative integers} >>> build_alphabet(Primes(), 'y') Lazy family (y(i))_{i in Set of all prime numbers: 2, 3, 5, 7, ...}