I think that this does the same as your code, although it seems to me that this is not want you really want because the pairs (A,B) of subgroups that you return will not in general have the property that G=A x B. I have not played at all with groups in sage before so this may be far from optimal:
def direct_summands(G): r""" Return the direct summands of the abelian group ``G``. EXAMPLES:: sage: direct_summands( CyclicPermutationGroup(4) ) [(Permutation Group with generators [()], Permutation Group with generators [(1,2,3,4)]), (Permutation Group with generators [(1,3)(2,4)], Permutation Group with generators [(1,3)(2,4)])] """ if not (G in Groups and G.is_finite() and G.is_abelian() ): raise ValueError, '%s must be a finite abelian group' % G # will create a dictionary of the subgroups in G up to isomorphism indexed by size subgroups_by_size={} for H in G.subgroups(): # loop over *all* subgroups of G h=H.cardinality() if h in subgroups_by_size: if not all(H.is_isomorphic(K) for K in subgroups[h]): subgroups_by_size[h].append(H) else: subgroups_by_size[h]=[H] # n is the number of divisors of |G| g=G.cardinality() divisors = [(d, g/d) for d in g.divisors() if 2*d<=g] return [(A,B) for (d,e) in divisors if d in subgroups_by_size and e in subgroups_by_size for A in subgroups_by_size[d] for B in subgroups_by_size[e] ] Put this into a file, say, summands,py, and then type sage: attach summands,py inside sage. As a general rule, you can find out what to do using tab-completion. For example, if you type sage: G=CyclicPermutationGroup(4) sage: G.<tab> then you will get a list of the methods that apply to the group G. Andrew -- You received this message because you are subscribed to the Google Groups "sage-support" group. To post to this group, send email to sage-support@googlegroups.com. To unsubscribe from this group, send email to sage-support+unsubscr...@googlegroups.com. Visit this group at http://groups.google.com/group/sage-support?hl=en.