def getUDEdges(self): # UpDownEdges : position of edges UR,UF,UL,UB,DR,DF,DL and DB with permutation # 8! = 40320 ep = self.ep[:8] n = 0 for i in range(7, 0, -1): k = 0 while i != ep[i]: rotLeft(ep, 0, i) k += 1 n = (i + 1) * n + k return n
def getCp(self): # 8! # (0..40319) perm = self.cp[:] n = 0 for i in range(7, 0, -1): k = 0 while perm[i] != i: rotLeft(perm, 0, i) k += 1 n = (i + 1) * n + k return n
def setDownEdges(self, n): sliceE = [4, 5, 6, 7] otherE = [3, 2, 1, 0, 11, 10, 9, 8] m = n % 24 # Permutation n = n // 24 # Location for i in range(1, 4): k = m % (i + 1) m //= i + 1 while k > 0: rotRight(sliceE, 0, i) k -= 1 sliceE = sliceE[::-1] for i in range(12): if n - binomial(11 - i, len(sliceE)) >= 0: n -= binomial(11 - i, len(sliceE)) self.ep[i] = sliceE.pop() else: self.ep[i] = otherE.pop() for _ in range(4): rotLeft(self.ep, 0, 11)
def getSliceSorted(self): # UD-Slice : position of edges FR, FL, BL, BR with permutation # 12 * 11 * 10 * 9 = 11880 # < 11880 in phase 1, < 24 in phase 2, 0 for solved cube n = 0 edge = [] # n < 495 (4 parmi 12) for i in range(11, -1, -1): if self.ep[i] in {8, 9, 10, 11}: n += binomial(11 - i, len(edge) + 1) edge.append(self.ep[i]) # m < 24 (4!) permutations edge = edge[::-1] m = 0 for i in range(3, 0, -1): k = 0 while edge[i] != i + 8: rotLeft(edge, 0, i) k += 1 m = (i + 1) * m + k return 24 * n + m
def getDownEdges(self): # DownEdges : position of edges DR, DF, DL, DB with permutation # 12 * 11 * 10 * 9 = 11880 # < 11880 in phase 1, < 1656 + 24 in phase 2, 1656 for solved cube n = 0 edge = [] ep = self.ep[8:] + self.ep[:8] # n < 495 (4 parmi 12) for i in range(11, -1, -1): if ep[i] in {4, 5, 6, 7}: n += binomial(11 - i, len(edge) + 1) edge.append(ep[i]) # m < 24 (4!) permutations edge = edge[::-1] m = 0 for i in range(3, 0, -1): k = 0 while edge[i] != i + 4: rotLeft(edge, 0, i) k += 1 m = (i + 1) * m + k return 24 * n + m