private static ArrayList<BSGSElement> convertToAntisymmetric(ArrayList<BSGSElement> symmetricGroup) { ArrayList<BSGSCandidateElement> bsgs = asBSGSCandidatesList(symmetricGroup); for (BSGSCandidateElement c : bsgs) { ListIterator<Permutation> stabs = c.getStabilizerGeneratorsReference().listIterator(); while (stabs.hasNext()) { Permutation p = stabs.next(); if (p.parity() == 1) stabs.set(Permutations.createPermutation(true, p.oneLine())); } } return asBSGSList(bsgs); }
/** * Returns true is this group is natural alternating group Alt(degree) and false otherwise. * * @return true is this group is natural alternating group Alt(degree) and false otherwise */ public boolean isAlternating() { if (isAlternating != null) return isAlternating; isAlternating = isAlt0(); if (isAlternating) return isAlternating.booleanValue(); isAlternating = order().equals(factorial(internalDegree).divide(BigInteger.valueOf(2))); if (isAlternating) for (Permutation p : generators()) if (p.parity() == 1) return isAlternating = false; return isAlternating; }
/** * Returns {@code true} if it is known that this group is symmetric, {@code false} if it is not known. * * @return {@code true} if it is known that this group is symmetric, {@code false} if it is not known */ private boolean isSym0() { if (isTrivial() || !isTransitive()) return isSymmetric = false; if (internalDegree > 2 && generators().size() == 1) return isSymmetric = false; boolean isSym = isSymOrAlt(DEFAULT_CONFIDENCE_LEVEL); if (!isSym) return false; boolean containsOdd = false; for (Permutation p : generators()) if (p.parity() == 1) { containsOdd = true; break; } return isSymmetric = containsOdd; }
/** * Returns {@code true} if it is known that this group is alternating, {@code false} if it is not known. * * @return {@code true} if it is known that this group is alternating, {@code false} if it is not known */ private boolean isAlt0() { if (isTrivial() || !isTransitive()) return isAlternating = false; boolean isAlt = isSymOrAlt(DEFAULT_CONFIDENCE_LEVEL); if (!isAlt) return false; for (Permutation p : generators()) if (p.parity() == 1) return isAlternating = false; return isAlternating = true; }
/** * Returns true if specified group is a subgroup of this. * * @param subgroup permutation group * @return true if specified group is a subgroup of this */ public boolean containsSubgroup(PermutationGroup subgroup) { if (degree() < subgroup.degree()) return false; if (isTrivial()) return subgroup.isTrivial(); if (isSymmetric()) return true; if (isAlternating()) { for (Permutation p : subgroup.generators()) if (p.parity() == 1) return false; return true; } if (subgroup.order().compareTo(order()) > 0) return false; return membershipTest(subgroup.generators()); }
if (p.parity() == 1) return this; //subgroup contains odd permutations return alternatingGroup(internalDegree);