Wolfram mathematica 给定对称性下不同的置换(Mathematica 8群论)

Wolfram mathematica 给定对称性下不同的置换(Mathematica 8群论),wolfram-mathematica,abstract-algebra,Wolfram Mathematica,Abstract Algebra,给定一个整数列表,如{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,0,0}大约有一百万个排列,计算需要0.1秒。显然,移除对称性后应该有1292个订单,但我的方法并没有在10分钟内完成

给定一个整数列表,如
{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,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}]
有什么问题吗

nonequivalentPermutations[list_,group_]:= Union[Permute[list,#]& /@ GroupElements[group];
nonequivalentPermutations[{2,1,1,0},DihedralGroup[4]]
我没有Mathematica 8,所以我不能测试这个。我刚刚有Mathematica 7。

有什么问题:

nonequivalentPermutations[list_,group_]:= Union[Permute[list,#]& /@ GroupElements[group];
nonequivalentPermutations[{2,1,1,0},DihedralGroup[4]]

我没有Mathematica 8,所以我不能测试这个。我只有Mathematica 7。

我从Maxim Rytin那里得到了一个优雅而快速的解决方案,它依赖于ConnectedComponents函数

Module[{gens, verts, edges},
 gens = PermutationList /@ GroupGenerators@DihedralGroup[16];
 verts =
  Permutations@{2, 2, 2, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0};
 edges = Join @@ (Transpose@{verts, verts[[All, #]]} &) /@ gens;
 Length@ConnectedComponents@Graph[Rule @@@ Union@edges]] // Timing

我从Maxim Rytin那里得到了一个优雅而快速的解决方案,它依赖于ConnectedComponents函数

Module[{gens, verts, edges},
 gens = PermutationList /@ GroupGenerators@DihedralGroup[16];
 verts =
  Permutations@{2, 2, 2, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0};
 edges = Join @@ (Transpose@{verts, verts[[All, #]]} &) /@ gens;
 Length@ConnectedComponents@Graph[Rule @@@ Union@edges]] // Timing

这听起来像一个NP难问题;-)。这感觉有点像索引规范化。也许你可以从(例如)中得到一些想法,特别是关于组件索引的讨论。好吧,也许我的具体问题比一般问题简单,在二面体群[16]下列出16个元素列表等价物的所有排列,显然“GAP”可以做到这一点。这听起来可疑地像一个NP难问题;-)。这感觉有点像索引规范化。也许你可以从(eg)-特别是组件索引的讨论中得到一些想法。好吧,也许我的具体问题比一般问题更简单,在二面体群[16]下列出16个元素列表等价物的所有排列,显然“GAP”在处理{2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,0,0}时会太慢,真的吗?比你的慢?难以置信。真糟糕,我没有8个,所以我可以自己检查一下。你需要列举清单吗?还是只是伯爵?有很多方法可以很快得到计数。你看过Burnside引理吗?我在MacBook上得到了一个0.0029秒的稳定值,{2,2,2,2,2,2,1,1,1,1,1,1,0,0}和二面体群[16],但生成的列表中只有~30个排列。是的,这不对,列表中应该有大约30030个条目。是的,我上面的代码是垃圾。它没有做正确的事情。在{2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,0,0}上工作太慢了真的吗?比你的慢?难以置信。真糟糕,我没有8个,所以我可以自己检查一下。你需要列举清单吗?还是只是伯爵?有很多方法可以很快得到计数。你看过Burnside引理吗?我在MacBook上得到了一个0.0029秒的稳定值,{2,2,2,2,2,2,1,1,1,1,1,1,0,0}和二面体群[16],但生成的列表中只有~30个排列。是的,这不对,列表中应该有大约30030个条目。是的,我上面的代码是垃圾。它做的事情不对。