def specht_module_dim(D):
    """
    Return the dimension of the Specht module of diagram ``D``.
    
    INPUT:
    
    - ``D`` -- a list of cells ``(r,c)`` for row ``r`` and column ``c``
    """
    n = len(D)
    Sn = SymmetricGroupAlgebra(ZZ, n)
    row_diagram = [set() for _ in range(n)]
    col_diagram = [set() for _ in range(n)]
    for i,cell in enumerate(D):
        x,y = cell
        row_diagram[x].add(i)
        col_diagram[y].add(i)
    # Construct the row and column stabilizer elements
    row_stab = Sn.zero()
    col_stab = Sn.zero()
    B = Sn.basis()
    for w in B.keys():
        # Remember that the permutation w is 1-based
        row_perm = [set() for _ in range(n)]
        col_perm = [set() for _ in range(n)]
        for i,cell in enumerate(D):
            x,y = cell
            row_perm[x].add(w[i]-1)
            col_perm[y].add(w[i]-1)
        if row_diagram == row_perm:
            row_stab += B[w]
        if col_diagram == col_perm:
            col_stab += w.sign() * B[w]
    gen = col_stab * row_stab
    M = matrix([(b*gen).to_vector() for b in B])
    return M.rank()

