Section 3.8 Sage
Many of the groups discussed in this chapter are available for study in Sage. It is important to understand that sets that form algebraic objects (groups in this chapter) are called “parents” in Sage, and elements of these objects are called, well, “elements.” So every element belongs to a parent (in other words, is contained in some set). We can ask about properties of parents (finite? order? abelian?), and we can ask about properties of individual elements (identity? inverse?). In the following we will show you how to create some of these common groups and begin to explore their properties with Sage.
Subsection Integers mod n
xxxxxxxxxx
Z8 = Integers(8)
Z8
xxxxxxxxxx
Z8.list()
xxxxxxxxxx
a = Z8.an_element(); a
xxxxxxxxxx
a.parent()
We would like to work with elements of the rational number the real number or the complex number Or perhaps you really do want the integer mod Sage really has no idea what you mean or want. To make this clear, you can “coerce”
Z8
. If you were to type a 6
into a compute cell right now, what would you mean? The integer 6
into Z8
with the syntax Z8(6)
. Without this, Sage will treat a input number like 6
as an integer, the simplest possible interpretation in some sense. Study the following carefully, where we first work with “normal” integers and then with integers mod 8.xxxxxxxxxx
a = 6
a
xxxxxxxxxx
a.parent()
xxxxxxxxxx
b = 7
c = a + b; c
xxxxxxxxxx
d = Z8(6)
d
xxxxxxxxxx
d.parent()
xxxxxxxxxx
e = Z8(7)
f = d+e; f
xxxxxxxxxx
g = Z8(85); g
xxxxxxxxxx
f == g
Z8
is a bit unusual as a first example, since it has two operations defined, both addition and multiplication, with addition forming a group, and multiplication not forming a group. Still, we can work with the additive portion, here forming the Cayley table for the addition.xxxxxxxxxx
Z8.addition_table(names='elements')
When is a prime number, the multipicative structure (excluding zero), will also form a group.
The integers mod are very important, so Sage implements both addition and multiplication together. Groups of symmetries are a better example of how Sage implements groups, since there is just one operation present.
xxxxxxxxxx
# Practice area (not linked for Sage Cell use)
Subsection Groups of symmetries
The symmetries of some geometric shapes are already defined in Sage, albeit with different names. They are implemented as “permutation groups” which we will begin to study carefully in Chapter 5.
Sage uses integers to label vertices, starting the count at with coercion, followed by outputting the element in cycle notation. Then we create just the bottom row of the notation we are using for permutations.
1
, instead of letters. Elements by default are printed using “cycle notation” which we will see described carefully in Chapter 5. Here is an example, with both the mathematics and Sage. For the Sage part, we create the group of symmetries and then create the symmetry xxxxxxxxxx
triangle = SymmetricGroup(3)
rho2 = triangle([3,1,2])
rho2
xxxxxxxxxx
[rho2(x) for x in triangle.domain()]
The final list comprehension deserves comment. The
.domain()
method gives a list of the symbols used for the permutation group triangle
and then rho2
is employed with syntax like it is a function (it is a function) to create the images that would occupy the bottom row.With a double list comprehension we can list all six elements of the group in the “bottom row” format. A good exercise would be to pair up each element with its name as given in Figure 3.6.
xxxxxxxxxx
[[a(x) for x in triangle.domain()] for a in triangle]
Different books, different authors, different software all have different ideas about the order in which to write multiplication of functions. This textbook builds on the idea of composition of functions, so that is the composition and it is natural to apply first. Sage takes the opposite view and since we write Sage will understand that we want to do first. Neither approach is wrong, and neither is necessarily superior, they are just different and there are good arguments for either one. When you consult other books that work with permutation groups, you want to first determine which approach it takes. (Be aware that this discussion of Sage function composition is limited to permutations only—“regular” functions in Sage compose in the order you might be familiar with from a calculus course.)
The translation here between the text and Sage will be worthwhile practice. Here we will reprise the discussion at the end of Section 3.1, but reverse the order on each product to compute Sage-style and exactly mirror what the text does.
xxxxxxxxxx
mu1 = triangle([1,3,2])
mu2 = triangle([3,2,1])
mu3 = triangle([2,1,3])
rho1 = triangle([2,3,1])
product = rho1*mu1
product == mu2
xxxxxxxxxx
[product(x) for x in triangle.domain()]
xxxxxxxxxx
rho1*mu1 == mu1*rho1
xxxxxxxxxx
mu1*rho1 == mu3
Now that we understand that Sage does multiplication in reverse, we can compute the Cayley table for this group. Default behavior is to just name elements of a group as letters, in the same order that the and
a,
b, c
, .list()
command would produce the elements of the group. But you can also print the elements in the table as themselves (that uses cycle notation here), or you can give the elements names. We will use u
as shorthand for r
as shorthand for xxxxxxxxxx
triangle.cayley_table()
xxxxxxxxxx
triangle.cayley_table(names='elements')
xxxxxxxxxx
triangle.cayley_table(names=['id','u3','r1','r2','u1','u2'])
You should verify that the table above is correct, just like Table 3.2 is correct. Remember that the convention is to multiply a row label times a column label, in that order. However, to do a check across the two tables, you will need to recall the difference in ordering between your textbook and Sage.
xxxxxxxxxx
# Practice area (not linked for Sage Cell use)
Subsection Quaternions
Sage implements the quaternions, but the elements are not matrices, but rather are permutations. Despite appearances the structure is identical. It should not matter which version you have in mind (matrices or permutations) if you build the Cayley table and use the default behavior of using letters to name the elements. As permutations, or as letters, can you identify and
xxxxxxxxxx
Q = QuaternionGroup()
[[a(x) for x in Q.domain()] for a in Q]
xxxxxxxxxx
Q.cayley_table()
It should be fairly obvious that ), either from its behavior in the table, or from its “bottom row” representation as the first element of the list above. And if you prefer, you can ask Sage for a list of its outputs when viewed as a function.
a
is the identity element of the group (xxxxxxxxxx
id = Q.identity()
[id(x) for x in Q.domain()]
Now should have the property that We see that the identity element once we locate we can easily compute and so on.
a
is on the diagonal of the Cayley table only when we compute c*c
. We can verify this easily, by extracting the third element of the column headings of the Cayley table. Now that we have identified xxxxxxxxxx
minus_one = Q.cayley_table().column_keys()[2]
[minus_one(x) for x in Q.domain()]
xxxxxxxxxx
minus_one*minus_one == Q.identity()
See if you can pair up the letters with all eight elements of the quaternions. Be a bit careful with your names, the symbol (which we will use below), but Sage will silently let you redefine it to be anything you like. Same goes for using lower-case
I
is used by Sage for the imaginary number i
in Sage. So call your elements of the quaternions something like QI, QJ, QK
to avoid confusion.As we begin to work with groups it is instructive to work with the actual elements. But many properties of groups are totally independent of the order we use for multiplication, or the names or representations we use for the elements. Here are facts about the quaternions we can compute without any knowledge of just how the elements are written or multiplied.
xxxxxxxxxx
Q.is_finite()
xxxxxxxxxx
Q.order()
xxxxxxxxxx
Q.is_abelian()
xxxxxxxxxx
# Practice area (not linked for Sage Cell use)
Subsection Subgroups
The best techniques for creating subgroups will come in future chapters, but we can create some groups that are naturally subgroups of other groups.
Elements of the quaternions were represented by certain permutations of the integers 1 through 8. We can also build the group of all permutations of these eight integers. It gets pretty big, so do not list it unless you want a lot of output! (I dare you.)
xxxxxxxxxx
S8 = SymmetricGroup(8)
a = S8.random_element()
[a(x) for x in S8.domain()] # random
xxxxxxxxxx
S8.order()
The quaternions, or
Q
, is a subgroup of the full group of all permutations, the symmetric group S8
, and Sage regards this as a property of Q
.xxxxxxxxxx
Q.is_subgroup(S8)
In Sage the complex numbers are known by the name
CC
. We can create a list of the elements in the subgroup described in Example 3.16. Then we can verify that this set is a subgroup by examining the Cayley table, using multiplication as the operation.xxxxxxxxxx
H = [CC(1), CC(-1), CC(I), CC(-I)]
CC.multiplication_table(elements=H,
names=['1', '-1', 'i', '-i'])
xxxxxxxxxx
# Practice area (not linked for Sage Cell use)