/** * Returns true if this group is abelian and false otherwise. * * @return true if this group is abelian and false otherwise. */ public boolean isAbelian() { if (isTrivial()) return true; if (isAbelian != null) return isAbelian.booleanValue(); isAbelian = true; List<Permutation> generators = generators(); final int size = generators.size(); out: for (int i = 0; i < size; ++i) for (int j = i + 1; j < size; ++j) if (!generators.get(i).commutator(generators.get(j)).isIdentity()) return isAbelian = false; return isAbelian.booleanValue(); }
@Override public boolean is(Permutation permutation) { if (permutation.isIdentity()) return false; for (Permutation p : subgroup.generators()) if (!p.commutator(permutation).isIdentity()) return false; return true; }
/** * Returns a commutator of this group with specified group. * * @param group permutation group * @return commutator of this and specified group */ public PermutationGroup commutator(PermutationGroup group) { //commutator is normal closure of set [generators, group.generators] in <generators,group.generators>. ArrayList<Permutation> commutator = new ArrayList<>(); Permutation c; for (Permutation a : generators) for (Permutation b : group.generators) { c = a.commutator(b); if (!c.isIdentity()) commutator.add(c); } if (commutator.isEmpty()) return TRIVIAL_GROUP; return union(group).normalClosureOf(createPermutationGroup(commutator)); }