Учитывая список целых чисел, таких как {2,1,1,0}
Я хотел бы перечислить все перестановки этого списка, которые не являются эквивалентными в данной группе.Например, при использовании симметрии квадрата результат будет {{2, 1, 1, 0}, {2, 1, 0, 1}}
.
При подходе ниже (Mathematica 8) генерируются все перестановки, а затем отсеиваются эквивалентные.Я не могу использовать его, потому что не могу позволить себе генерировать все перестановки, есть ли более эффективный способ?
Обновление : на самом деле, узкое место находится в DeleteCases
.Следующий список {2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0}
имеет около миллиона перестановок и занимает 0,1 секунды для вычисления.По-видимому, после удаления симметрии должно быть 1292 порядка, но мой подход не заканчивается через 10 минут
removeEquivalent[{}] := {};
removeEquivalent[list_] := (
Sow[First[list]];
equivalents = Permute[First[list], #] & /@ GroupElements[group];
DeleteCases[list, Alternatives @@ equivalents]
);
nonequivalentPermutations[list_] := (
reaped = Reap@FixedPoint[removeEquivalent, Permutations@list];
reaped[[2, 1]]
);
group = DihedralGroup[4];
nonequivalentPermutations[{2, 1, 1, 0}]