|   | 1 |  initial version  | 
To iterate over the power of a set, you can use itertools as follows:
sage: itertools.product(M, repeat=3)
<itertools.product object at 0x7fa377e38f50>
Which is a generator that you can expand into al list to be sure:
sage: list(itertools.product(M, repeat=3))
[(
[1 0]  [1 0]  [1 0]
[0 1], [0 1], [0 1]
),
 (
[1 0]  [1 0]  [0 1]
[0 1], [0 1], [1 0]
),
 (
[1 0]  [1 0]  [1 1]
[0 1], [0 1], [0 1]
),
 (
[1 0]  [0 1]  [1 0]
[0 1], [1 0], [0 1]
),
 (
[1 0]  [0 1]  [0 1]
[0 1], [1 0], [1 0]
),
 (
[1 0]  [0 1]  [1 1]
[0 1], [1 0], [0 1]
),
 (
[1 0]  [1 1]  [1 0]
[0 1], [0 1], [0 1]
),
 (
[1 0]  [1 1]  [0 1]
[0 1], [0 1], [1 0]
),
 (
[1 0]  [1 1]  [1 1]
[0 1], [0 1], [0 1]
),
 (
[0 1]  [1 0]  [1 0]
[1 0], [0 1], [0 1]
),
 (
[0 1]  [1 0]  [0 1]
[1 0], [0 1], [1 0]
),
 (
[0 1]  [1 0]  [1 1]
[1 0], [0 1], [0 1]
),
 (
[0 1]  [0 1]  [1 0]
[1 0], [1 0], [0 1]
),
 (
[0 1]  [0 1]  [0 1]
[1 0], [1 0], [1 0]
),
 (
[0 1]  [0 1]  [1 1]
[1 0], [1 0], [0 1]
),
 (
[0 1]  [1 1]  [1 0]
[1 0], [0 1], [0 1]
),
 (
[0 1]  [1 1]  [0 1]
[1 0], [0 1], [1 0]
),
 (
[0 1]  [1 1]  [1 1]
[1 0], [0 1], [0 1]
),
 (
[1 1]  [1 0]  [1 0]
[0 1], [0 1], [0 1]
),
 (
[1 1]  [1 0]  [0 1]
[0 1], [0 1], [1 0]
),
 (
[1 1]  [1 0]  [1 1]
[0 1], [0 1], [0 1]
),
 (
[1 1]  [0 1]  [1 0]
[0 1], [1 0], [0 1]
),
 (
[1 1]  [0 1]  [0 1]
[0 1], [1 0], [1 0]
),
 (
[1 1]  [0 1]  [1 1]
[0 1], [1 0], [0 1]
),
 (
[1 1]  [1 1]  [1 0]
[0 1], [0 1], [0 1]
),
 (
[1 1]  [1 1]  [0 1]
[0 1], [0 1], [1 0]
),
 (
[1 1]  [1 1]  [1 1]
[0 1], [0 1], [0 1]
)]
Each element of this list is a triple of matrices, you can make the producst of each such triple as follows:
sage: [prod(i) for i in itertools.product(M, repeat=3)]
[
[1 0]  [0 1]  [1 1]  [0 1]  [1 0]  [0 1]  [1 1]  [1 1]  [1 2]  [0 1]
[0 1], [1 0], [0 1], [1 0], [0 1], [1 1], [0 1], [1 0], [0 1], [1 0],
[1 0]  [0 1]  [1 0]  [0 1]  [1 1]  [0 1]  [1 0]  [0 1]  [1 1]  [1 1]
[0 1], [1 1], [0 1], [1 0], [0 1], [1 1], [1 1], [1 2], [0 1], [1 0],
[1 2]  [1 1]  [1 1]  [1 2]  [1 2]  [2 1]  [1 3]
[0 1], [1 0], [0 1], [1 1], [0 1], [1 0], [0 1]
]
If you want to make a function that returns a set, you can do, using the immutabilize function defined in my answer of this ask question:
sage: f = lambda l : {immutabilize(prod(i)) for i in itertools.product(M, repeat=l)}
sage: f(1)
{[0 1]
 [1 0], [1 0]
 [0 1], [1 1]
 [0 1]}
sage: f(2)
{[0 1]
 [1 0], [0 1]
 [1 1], [1 0]
 [0 1], [1 1]
 [0 1], [1 1]
 [1 0], [1 2]
 [0 1]}
sage: f(3)
{[0 1]
 [1 0], [0 1]
 [1 1], [0 1]
 [1 2], [1 0]
 [0 1], [1 0]
 [1 1], [1 1]
 [0 1], [1 1]
 [1 0], [1 2]
 [0 1], [1 2]
 [1 1], [1 3]
 [0 1], [2 1]
 [1 0]}
sage: f(4)
{[0 1]
 [1 0], [0 1]
 [1 1], [0 1]
 [1 2], [0 1]
 [1 3], [1 0]
 [0 1], [1 0]
 [1 1], [1 0]
 [2 1], [1 1]
 [0 1], [1 1]
 [1 0], [1 1]
 [1 2], [1 2]
 [0 1], [1 2]
 [1 1], [1 3]
 [0 1], [1 3]
 [1 2], [1 4]
 [0 1], [2 1]
 [1 0], [2 1]
 [1 1], [2 3]
 [1 1], [3 1]
 [1 0]}
As you can see, many matrices in the list are the same, so that making a set seriously reduces the number of product to work with:
sage: [len(f(l)) for l in range(1,10)]
[3, 6, 11, 19, 32, 53, 87, 142, 231]
To be compared with:
sage: [3^l for l in range(1,10)]
[3, 9, 27, 81, 243, 729, 2187, 6561, 19683]
The formatting of sets of matrices is not very nice, but you can make it nicer while printing it as a list (still with the benefits of having removed repetitions):
sage: list(f(4))
[
[0 1]  [1 1]  [1 1]  [0 1]  [1 0]  [0 1]  [1 2]  [1 2]  [0 1]  [1 0]
[1 1], [1 0], [0 1], [1 0], [1 1], [1 2], [1 1], [0 1], [1 3], [2 1],
[1 1]  [1 0]  [1 4]  [3 1]  [2 1]  [1 3]  [1 3]  [2 3]  [2 1]
[1 2], [0 1], [0 1], [1 0], [1 1], [1 2], [0 1], [1 1], [1 0]
]
|   | 2 |  No.2 Revision  | 
To iterate over the power of a set, you can use itertools as follows:
sage: itertools.product(M, repeat=3)
<itertools.product object at 0x7fa377e38f50>
Which is a generator that you can expand into al list to be sure:check its content is what you need:
sage: list(itertools.product(M, repeat=3))
[(
[1 0]  [1 0]  [1 0]
[0 1], [0 1], [0 1]
),
 (
[1 0]  [1 0]  [0 1]
[0 1], [0 1], [1 0]
),
 (
[1 0]  [1 0]  [1 1]
[0 1], [0 1], [0 1]
),
 (
[1 0]  [0 1]  [1 0]
[0 1], [1 0], [0 1]
),
 (
[1 0]  [0 1]  [0 1]
[0 1], [1 0], [1 0]
),
 (
[1 0]  [0 1]  [1 1]
[0 1], [1 0], [0 1]
),
 (
[1 0]  [1 1]  [1 0]
[0 1], [0 1], [0 1]
),
 (
[1 0]  [1 1]  [0 1]
[0 1], [0 1], [1 0]
),
 (
[1 0]  [1 1]  [1 1]
[0 1], [0 1], [0 1]
),
 (
[0 1]  [1 0]  [1 0]
[1 0], [0 1], [0 1]
),
 (
[0 1]  [1 0]  [0 1]
[1 0], [0 1], [1 0]
),
 (
[0 1]  [1 0]  [1 1]
[1 0], [0 1], [0 1]
),
 (
[0 1]  [0 1]  [1 0]
[1 0], [1 0], [0 1]
),
 (
[0 1]  [0 1]  [0 1]
[1 0], [1 0], [1 0]
),
 (
[0 1]  [0 1]  [1 1]
[1 0], [1 0], [0 1]
),
 (
[0 1]  [1 1]  [1 0]
[1 0], [0 1], [0 1]
),
 (
[0 1]  [1 1]  [0 1]
[1 0], [0 1], [1 0]
),
 (
[0 1]  [1 1]  [1 1]
[1 0], [0 1], [0 1]
),
 (
[1 1]  [1 0]  [1 0]
[0 1], [0 1], [0 1]
),
 (
[1 1]  [1 0]  [0 1]
[0 1], [0 1], [1 0]
),
 (
[1 1]  [1 0]  [1 1]
[0 1], [0 1], [0 1]
),
 (
[1 1]  [0 1]  [1 0]
[0 1], [1 0], [0 1]
),
 (
[1 1]  [0 1]  [0 1]
[0 1], [1 0], [1 0]
),
 (
[1 1]  [0 1]  [1 1]
[0 1], [1 0], [0 1]
),
 (
[1 1]  [1 1]  [1 0]
[0 1], [0 1], [0 1]
),
 (
[1 1]  [1 1]  [0 1]
[0 1], [0 1], [1 0]
),
 (
[1 1]  [1 1]  [1 1]
[0 1], [0 1], [0 1]
)]
Each element of this list is a triple of matrices, you can make the producst of each such triple as follows:
sage: [prod(i) for i in itertools.product(M, repeat=3)]
[
[1 0]  [0 1]  [1 1]  [0 1]  [1 0]  [0 1]  [1 1]  [1 1]  [1 2]  [0 1]
[0 1], [1 0], [0 1], [1 0], [0 1], [1 1], [0 1], [1 0], [0 1], [1 0],
[1 0]  [0 1]  [1 0]  [0 1]  [1 1]  [0 1]  [1 0]  [0 1]  [1 1]  [1 1]
[0 1], [1 1], [0 1], [1 0], [0 1], [1 1], [1 1], [1 2], [0 1], [1 0],
[1 2]  [1 1]  [1 1]  [1 2]  [1 2]  [2 1]  [1 3]
[0 1], [1 0], [0 1], [1 1], [0 1], [1 0], [0 1]
]
If you want to make a function that returns a set, you can do, using the immutabilize function defined in my answer of this ask question:
sage: f = lambda l : {immutabilize(prod(i)) for i in itertools.product(M, repeat=l)}
sage: f(1)
{[0 1]
 [1 0], [1 0]
 [0 1], [1 1]
 [0 1]}
sage: f(2)
{[0 1]
 [1 0], [0 1]
 [1 1], [1 0]
 [0 1], [1 1]
 [0 1], [1 1]
 [1 0], [1 2]
 [0 1]}
sage: f(3)
{[0 1]
 [1 0], [0 1]
 [1 1], [0 1]
 [1 2], [1 0]
 [0 1], [1 0]
 [1 1], [1 1]
 [0 1], [1 1]
 [1 0], [1 2]
 [0 1], [1 2]
 [1 1], [1 3]
 [0 1], [2 1]
 [1 0]}
sage: f(4)
{[0 1]
 [1 0], [0 1]
 [1 1], [0 1]
 [1 2], [0 1]
 [1 3], [1 0]
 [0 1], [1 0]
 [1 1], [1 0]
 [2 1], [1 1]
 [0 1], [1 1]
 [1 0], [1 1]
 [1 2], [1 2]
 [0 1], [1 2]
 [1 1], [1 3]
 [0 1], [1 3]
 [1 2], [1 4]
 [0 1], [2 1]
 [1 0], [2 1]
 [1 1], [2 3]
 [1 1], [3 1]
 [1 0]}
As you can see, many matrices in the list are the same, so that making a set seriously reduces the number of product to work with:
sage: [len(f(l)) for l in range(1,10)]
[3, 6, 11, 19, 32, 53, 87, 142, 231]
To be compared with:
sage: [3^l for l in range(1,10)]
[3, 9, 27, 81, 243, 729, 2187, 6561, 19683]
The formatting of sets of matrices is not very nice, but you can make it nicer while printing it as a list (still with the benefits of having removed repetitions):
sage: list(f(4))
[
[0 1]  [1 1]  [1 1]  [0 1]  [1 0]  [0 1]  [1 2]  [1 2]  [0 1]  [1 0]
[1 1], [1 0], [0 1], [1 0], [1 1], [1 2], [1 1], [0 1], [1 3], [2 1],
[1 1]  [1 0]  [1 4]  [3 1]  [2 1]  [1 3]  [1 3]  [2 3]  [2 1]
[1 2], [0 1], [0 1], [1 0], [1 1], [1 2], [0 1], [1 1], [1 0]
]
|   | 3 |  No.3 Revision  | 
To iterate over the power of a set, you can use itertools as follows:
sage: itertools.product(M, repeat=3)
<itertools.product object at 0x7fa377e38f50>
Which is a generator that you can expand into al list to check its content is what you need:
sage: list(itertools.product(M, repeat=3))
[(
[1 0]  [1 0]  [1 0]
[0 1], [0 1], [0 1]
),
 (
[1 0]  [1 0]  [0 1]
[0 1], [0 1], [1 0]
),
 (
[1 0]  [1 0]  [1 1]
[0 1], [0 1], [0 1]
),
 (
[1 0]  [0 1]  [1 0]
[0 1], [1 0], [0 1]
),
 (
[1 0]  [0 1]  [0 1]
[0 1], [1 0], [1 0]
),
 (
[1 0]  [0 1]  [1 1]
[0 1], [1 0], [0 1]
),
 (
[1 0]  [1 1]  [1 0]
[0 1], [0 1], [0 1]
),
 (
[1 0]  [1 1]  [0 1]
[0 1], [0 1], [1 0]
),
 (
[1 0]  [1 1]  [1 1]
[0 1], [0 1], [0 1]
),
 (
[0 1]  [1 0]  [1 0]
[1 0], [0 1], [0 1]
),
 (
[0 1]  [1 0]  [0 1]
[1 0], [0 1], [1 0]
),
 (
[0 1]  [1 0]  [1 1]
[1 0], [0 1], [0 1]
),
 (
[0 1]  [0 1]  [1 0]
[1 0], [1 0], [0 1]
),
 (
[0 1]  [0 1]  [0 1]
[1 0], [1 0], [1 0]
),
 (
[0 1]  [0 1]  [1 1]
[1 0], [1 0], [0 1]
),
 (
[0 1]  [1 1]  [1 0]
[1 0], [0 1], [0 1]
),
 (
[0 1]  [1 1]  [0 1]
[1 0], [0 1], [1 0]
),
 (
[0 1]  [1 1]  [1 1]
[1 0], [0 1], [0 1]
),
 (
[1 1]  [1 0]  [1 0]
[0 1], [0 1], [0 1]
),
 (
[1 1]  [1 0]  [0 1]
[0 1], [0 1], [1 0]
),
 (
[1 1]  [1 0]  [1 1]
[0 1], [0 1], [0 1]
),
 (
[1 1]  [0 1]  [1 0]
[0 1], [1 0], [0 1]
),
 (
[1 1]  [0 1]  [0 1]
[0 1], [1 0], [1 0]
),
 (
[1 1]  [0 1]  [1 1]
[0 1], [1 0], [0 1]
),
 (
[1 1]  [1 1]  [1 0]
[0 1], [0 1], [0 1]
),
 (
[1 1]  [1 1]  [0 1]
[0 1], [0 1], [1 0]
),
 (
[1 1]  [1 1]  [1 1]
[0 1], [0 1], [0 1]
)]
Each element of this list is a triple of matrices, you can make the producst of each such triple as follows:
sage: [prod(i) for i in itertools.product(M, repeat=3)]
[
[1 0]  [0 1]  [1 1]  [0 1]  [1 0]  [0 1]  [1 1]  [1 1]  [1 2]  [0 1]
[0 1], [1 0], [0 1], [1 0], [0 1], [1 1], [0 1], [1 0], [0 1], [1 0],
[1 0]  [0 1]  [1 0]  [0 1]  [1 1]  [0 1]  [1 0]  [0 1]  [1 1]  [1 1]
[0 1], [1 1], [0 1], [1 0], [0 1], [1 1], [1 1], [1 2], [0 1], [1 0],
[1 2]  [1 1]  [1 1]  [1 2]  [1 2]  [2 1]  [1 3]
[0 1], [1 0], [0 1], [1 1], [0 1], [1 0], [0 1]
]
If you want to make a function that returns a set, you can do, using the immutabilize function defined in my answer of this ask question:
sage: f = lambda l : {immutabilize(prod(i)) for i in itertools.product(M, repeat=l)}
sage: f(1)
{[0 1]
 [1 0], [1 0]
 [0 1], [1 1]
 [0 1]}
sage: f(2)
{[0 1]
 [1 0], [0 1]
 [1 1], [1 0]
 [0 1], [1 1]
 [0 1], [1 1]
 [1 0], [1 2]
 [0 1]}
sage: f(3)
{[0 1]
 [1 0], [0 1]
 [1 1], [0 1]
 [1 2], [1 0]
 [0 1], [1 0]
 [1 1], [1 1]
 [0 1], [1 1]
 [1 0], [1 2]
 [0 1], [1 2]
 [1 1], [1 3]
 [0 1], [2 1]
 [1 0]}
sage: f(4)
{[0 1]
 [1 0], [0 1]
 [1 1], [0 1]
 [1 2], [0 1]
 [1 3], [1 0]
 [0 1], [1 0]
 [1 1], [1 0]
 [2 1], [1 1]
 [0 1], [1 1]
 [1 0], [1 1]
 [1 2], [1 2]
 [0 1], [1 2]
 [1 1], [1 3]
 [0 1], [1 3]
 [1 2], [1 4]
 [0 1], [2 1]
 [1 0], [2 1]
 [1 1], [2 3]
 [1 1], [3 1]
 [1 0]}
As you can see, many matrices in the list are the same, so that making a set seriously reduces the number of product to work with:
sage: [len(f(l)) for l in range(1,10)]
[3, 6, 11, 19, 32, 53, 87, 142, 231]
To be compared with:
sage: [3^l for l in range(1,10)]
[3, 9, 27, 81, 243, 729, 2187, 6561, 19683]
The formatting of sets of matrices is not very nice, but you can make it nicer while printing it as a list (still with the benefits of having removed repetitions):repetitions, because it comes from  a set):
sage: list(f(4))
[
[0 1]  [1 1]  [1 1]  [0 1]  [1 0]  [0 1]  [1 2]  [1 2]  [0 1]  [1 0]
[1 1], [1 0], [0 1], [1 0], [1 1], [1 2], [1 1], [0 1], [1 3], [2 1],
[1 1]  [1 0]  [1 4]  [3 1]  [2 1]  [1 3]  [1 3]  [2 3]  [2 1]
[1 2], [0 1], [0 1], [1 0], [1 1], [1 2], [0 1], [1 1], [1 0]
]
 Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.
 
                
                Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.