SymPy排列组奇偶校验未按预期工作

时间:2019-01-17 03:22:02

标签: python-3.x permutation sympy finite-group-theory

我已经使用元组的排列实现了魔方。不变的多维数据集表示为(0,1,2,...,45,46,47)。

要将“转弯”应用于多维数据集,数字将随机排列。我已经对所有转弯进行了充分的测试,以至于我相当确定没有错别字。

我一直在尝试实现一种检查多维数据集是否有效的方法,因为(1,2,... 47,48)的12个随机排列中只有1个是有效的多维数据集。为了使排列成为有效的Rubik立方体,它必须满足3个要求。该SO线程对此进行了充分的记录:https://math.stackexchange.com/questions/127577/how-to-tell-if-a-rubiks-cube-is-solvable

3个步骤是: 边缘方向:边缘翻转的次数必须是偶数。 转角方向:转角次数必须除以3。 排列奇偶校验:这是我遇到麻烦的地方。排列奇偶校验必须是偶数,这意味着拐角奇偶校验必须与边缘奇偶校验匹配。

SymPy库为我提供了一种使用许多置换组属性的好方法,因此在计算置换奇偶校验的尝试中将其包括在内。

在应成功时失败的最简单的测试输入是多维数据集的向后旋转,表示为B。

代码如下:

def check_permutation_parity(cube):
    corners = cube[:24]
    edges = cube[24:]
    edges = [e - 24 for e in edges]

    corner_perms = corner_perms_only(corners)
    edge_perms = edge_perms_only(edges)

    normalized_corners = [int(c/3) for c in corner_perms]
    normalized_edges = [int(e/2) for e in edge_perms]

    sympy_corners = Permutation(list(normalized_corners))
    sympy_edges = Permutation(list(normalized_edges))

    corners_perm_parity = Permutation(list(normalized_corners)).parity()
    edges_perm_parity = Permutation(list(normalized_edges)).parity()

    if corners_perm_parity != edges_perm_parity:
        return False

    return True

使用一堆打印语句,我概述了整个代码中发生的事情:

这是初始状态。这是立方体的B排列,看起来像预期的那样。

cube:

(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 18, 19, 20, 12, 13, 14, 21, 22, 23, 15, 16, 17, 24, 25, 26, 27, 30, 31, 28, 29, 32, 33, 36, 37, 34, 35, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47)

接下来,我们看一下拐角和边缘。请记住,边上每边减去24。这对于最终转换为SymPy排列是必要的。

corners, edges

(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 18, 19, 20, 12, 13, 14, 21, 22, 23, 15, 16, 17)

[0, 1, 2, 3, 6, 7, 4, 5, 8, 9, 12, 13, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]

然后,我们仅提取每个3个角和每个2个边。因为我们不在乎方向,所以我们只能查看每个片段的排列。

corner_perms_only, edges_perms_only

(0, 3, 6, 9, 18, 12, 21, 15)

(0, 2, 6, 4, 8, 12, 10, 14, 16, 18, 20, 22)

然后我们以2或3的比例神化为SymPy

normalized_corners, edges

[0, 1, 2, 3, 6, 4, 7, 5]

[0, 1, 3, 2, 4, 6, 5, 7, 8, 9, 10, 11]

转换为SymPy后,拐角如下所示:

sympy corners

(4 6 7 5)

[(4, 5), (4, 7), (4, 6)]

[[0], [1], [2], [3], [4, 6, 7, 5]]

边缘看起来像这样:

sympy edges

(11)(2 3)(5 6)

[(2, 3), (5, 6)]

[[0], [1], [2, 3], [4], [5, 6], [7], [8], [9], [10], [11]]

给我们这种平价,因为拐角由3个周期组成,边缘由2个周期组成:

角,烫发边平价

1

0

由于奇偶校验不同,该函数返回false。

B:错

我们知道奇偶校验应该匹配,但是我无法获得结果,而且我迷失在哪里可以进行进一步的调试。所有代码都可以在我的GitHub上找到:https://github.com/elliotmartin/RubikLite/blob/master/Rubik.py

1 个答案:

答案 0 :(得分:0)

我的问题与SymPy和排列奇偶无关。为了检查这一点,我实现了自己的循环分解算法,然后检查了奇偶校验。最后,问题与我如何为每个动作设置排列有关。

我想我已经学到了很多关于测试的知识-如果您的测试没有测试正确的东西,那么它们就没那么有用了。