一组排列的轨道

问题描述 投票:0回答:2

在GAP中,我们可以很容易地找到一组排列的轨道:

grp := Group([ (1,2,3,4,5), (1,2,4,3) ]);;
els := Elements(grp);;
O := Orbit(grp, els{[1,2,3,4]}, OnSets);

[ [ (), (2,3,5,4), (2,4,5,3), (2,5)(3,4) ], [ (), (1,3)(4,5), (1,4,3,5), (1,5,3,4) ],
  [ (), (1,2,5,4), (1,4,5,2), (1,5)(2,4) ], [ (), (1,2)(3,5), (1,3,2,5), (1,5,2,3) ],
  [ (), (1,2,4,3), (1,3,4,2), (1,4)(2,3) ] ]

我想在Sage中执行此操作(最好不调用GAP接口)。在文档中,我发现以下内容:http://doc.sagemath.org/html/en/reference/groups/sage/groups/perm_gps/permgroup.html#sage.groups.perm_gps.permgroup.PermutationGroup_generic.orbit

他们提供了以下“ OnSets”示例:

sage: S3 = groups.permutation.Symmetric(3)
sage: S3.orbit((1,2), action = "OnSets")
({1, 2}, {2, 3}, {1, 3})

所以我尝试了以下操作:

grp = PermutationGroup([ '(1,2,3,4,5)', '(1,2,4,3)' ])
els = list(grp)
grp.orbit(els[:4], action = "OnSets")

TypeError: unhashable type: 'list'

有人知道如何正确计算吗?目前,我正在使用gap.eval解决此问题:

gap.eval("grp := Group([ (1,2,3,4,5), (1,2,4,3) ])")
gap.eval("els := Elements(grp)")
gap.eval("test_orbit := Orbit(grp, els{[1,2,3,4]}, OnSets)")
O = gap.new("test_orbit")

现在我使用'O'进行的任何计算都非常慢,所以我想尝试在Sage中执行所有操作,或者以某种方式将'O'转换为可以快速使用的适当Sage对象。

sage
2个回答
0
投票

这归结为Sage不准备递归处理此输入。这是相关的代码(您可以通过执行grp.orbit??找到此代码):

    def input_for_gap(x, depth, container):
        if depth == len(container):
            try:
                return self._domain_to_gap[x]
            except KeyError:
                raise ValueError('{0} is not part of the domain'.format(x))
        x = [input_for_gap(xx, depth+1, container) for xx in x]
        if container[depth] is Set:
            x.sort()
        return x

但是grp._domain_to_gap产生了字典{1: 1, 2: 2, 3: 3, 4: 4, 5: 5},显然,它对()甚至其他元素并没有太大的意义(这是第二次递归,它将发生)。

问题是,这里需要进行另一层递归,但是由于某些原因而没有考虑。我为此打开了Ticket 29151。>


0
投票

虽然我无法使Sage'orbit'命令正常工作,但我可以通过直接实现该函数来计算所需的轨道。在GAP中,函数:Orbit(grp, els{[1,2,3,4]}, OnSets)通过将grp中的每个y的共轭,使els{[1,2,3,4]}中的x​​作用于els。即xyx ^ {-1}。我已经使用以下方法在Sage中实现了它:

© www.soinside.com 2019 - 2024. All rights reserved.