internal static void InitEPermMove() { CubieCube c = new CubieCube(); CubieCube d = new CubieCube(); for (int i = 0; i < N_PERM_SYM; i++) { c.SetEPerm(CubieCube.EPermS2R[i]); for (int j = 0; j < N_MOVES2; j++) { CubieCube.EdgeMult(c, CubieCube.MoveCube[Util.Ud2std[j]], d); EPermMove[i][j] = (char)d.GetEPermSym(); } } }
internal static void InitPermSym2Raw() { CubieCube c = new CubieCube(); CubieCube d = new CubieCube(); int[] occ = new int[40320 / 32]; int count = 0; for (int i = 0; i < 40320 / 32; occ[i++] = 0) { ; } EPermR2S = new char[40320]; for (int i = 0; i < 40320; i++) { if ((occ[i >> 5] & (1 << (i & 0x1f))) == 0) { c.SetEPerm(i); for (int s = 0; s < 16; s++) { EdgeConjugate(c, s, d); int idx = d.GetEPerm(); if (idx == i) { SymStatePerm[count] |= (char)(1 << s); } occ[idx >> 5] |= 1 << (idx & 0x1f); int a = d.GetU4Comb(); int b = d.GetD4Comb() >> 9; int m = 494 - (a & 0x1ff) + (a >> 9) * 70 + b * 1680; MtoEPerm[m] = EPermR2S[idx] = (char)(count << 4 | s); } EPermS2R[count++] = (char)i; } } }