{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}
には約100万の順列があり、計算に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}]