Doing linear algebra homework reminds me why I love NumPy so much. Instead of doing a 2-page homework assignment and then finding out at the end that something is wrong, I can check at every step. For example, to reduce a matrix A to the identity, using only elementary matrices:

#!/usr/bin/env python2
from itertools import chain
import numpy as np

# Given by the assignment
a = np.matrix([
        [-1, 1, 1],
        [3, 1, 0],
        [-2, 1, 1]
])

# Add to e as I find them
e = []

e.append(np.matrix([
        [1, 0, -1],
        [0, 1, 0],
        [0, 0, 1]
]))

e.append(np.matrix([
        [1, 0, 0],
        [0, 1, 1],
        [0, 0, 1]
]))

e.append(np.matrix([
        [1, 0, 0],
        [-1, 1, 0],
        [0, 0, 1]
]))

e.append(np.matrix([
        [1, 0, 0],
        [0, 1, 0],
        [2, 0, 1]
]))

e.append(np.matrix([
        [1, 0, 0],
        [0, 1, -2],
        [0, 0, 1]
]))

e.append(np.matrix([
        [1, 0, 0],
        [0, 0, 1],
        [0, 1, 0]
]))

e.append(np.matrix([
        [1, 0, 0],
        [0, 1, 1],
        [0, 0, 1]
]))

e.append(np.matrix([
        [1, 0, 0],
        [0, 1, 0],
        [0, 0, -1]
]))

# e_n * e_n-1 * ... * e_0 * a
# Could have used the multiplication operator, but writing
# the lambda was faster than looking it up.
print(np.vectorize(int)(reduce(lambda x, y: x * y, chain(reversed(e), [a]))))

Just run this after every step and I can be sure that my calculations are correct.

Also, what's not to love about that last line?