American ADFGVX

Tests

We load the module with double_avocado code: https://pastebin.com/UpnXmDdH

In [1]:
from A_ADFGVX import *

Encryption test:

In [2]:
# initial grid configuration
letters = 'XCUI1OPM7ZAHG8V5JFTYB0NR9QL2W3S64DKE'

# row labels, column labels
labels = ['ADFXGV', 'XGFADV']

# direction of dot on each quadrant
dirs = [
    [[1,0], [1,0]],
    [[-1,0], [0,1]],
]

cipher = Cipher(letters, dirs, labels)
print(cipher.encrypt('ATTACK AT DAWN'))
DD XX AX AD FG DV GA AA XV XV GD GV 

Decryption test

In [3]:
# initial grid configuration
letters = 'XCUI1OPM7ZAHG8V5JFTYB0NR9QL2W3S64DKE'

# row labels, column labels
labels = ['ADFXGV', 'XGFADV']

# direction of dot on each quadrant
dirs = [
    [[1,0], [1,0]],
    [[-1,0], [0,1]],
]

cipher = Cipher(letters, dirs, labels)
cipher.decrypt('DD XX AX AD FG DV GA AA XV XV GD GV'.split())
Out[3]:
'ATTACKATDAWN'

Let's just change initial grid configuration

In [4]:
# initial grid configuration
letters = 'XCUI1OPM7ZAHG8V5JFTYB0NR9QL2W3S64DKE'[::-1]  # string inversion

# row labels, column labels
labels = ['ADFXGV', 'XGFADV']

# direction of dot on each quadrant
dirs = [
    [[1,0], [1,0]],
    [[-1,0], [0,1]],
]

cipher = Cipher(letters, dirs, labels)
cipher.decrypt('DD XX AX AD FG DV GA AA XV XV GD GV'.split())
Out[4]:
'QFFQKCQFUQM8'

The two decrypted strings are "isomorphic": one passes from one to the other by a monoalphabetic substitution:

ATTACKATDAWN
QFFQKCQFUQM8

The invariant is the index of coincidence.

In [5]:
def IC( s ):
    """Returns the index coincidence of the string s
    """
    effectif = {}   # number of each character
    n = 0           # total number of character
    ic = 0          # index of index of coincidence
    for c in s:
        if c in effectif:
            effectif[c] += 1
        else:
            effectif[c] = 1
        n += 1
    for c in effectif:
        ic += effectif[c]*(effectif[c]-1)
    ic /= n*(n-1)
    return ic
In [6]:
IC('ATTACKATDAWN'), IC('QFFQKCQFUQM8')
Out[6]:
(0.13636363636363635, 0.13636363636363635)

Principle of the attack

We set the initial grid configuration to a fixed string.
For all the direction of dot on each quadrant and all the labels for row and column, one decrypts the crypto and one calculates the index of coincidence of the result.
If the result is a random string, we will have $ic \approx 0.028$ ($=\frac{1}{36}$, the alphabet has 36 characters)
But if the result is good English, we will have $ic \approx 0.066$

The number of cases to be evaluated is $6!\times 6!\times 4^4 = 132710400$.
This number is much too big. For an evaluation time of 0.1 sec, the entire process takes 3686.4 hours. I am not so patient!

It is best to use an optimization algorithm.
For each of the $4^4 = 256$ directions of dot on each quadrant, we look for row and column labels that maximize the index of coincidence. I use the simulated annealing algorithm.

In [7]:
import random
def new_state(row, col):
    """Returns a neighbour of the state (row, col)
    """
    select = random.random()
    if select < 0.45:
        c = list(row)
        i = random.randint(0,5)
        j = random.randint(0,5)
        c[i], c[j] = c[j], c[i] # permutation row
        return(''.join(c), col)
    elif select < 0.5:
        c = list(row)
        i = random.randint(0,5)
        c = c[i:] + c[:i]       # rotation row
        return(''.join(c), col)
    elif select < 0.95:
        c = list(col)
        i = random.randint(0,5)
        j = random.randint(0,5)
        c[i], c[j] = c[j], c[i] # permutation column
        return(row, ''.join(c))
    else:
        c = list(col)
        i = random.randint(0,5)
        c = c[i:] + c[:i]       # rotation column
        return(row, ''.join(c))
In [8]:
from math import exp
def Metropolis(delta, T):
    """The Metropolis criterion
    """
    if delta <= 0: return True
    if random.random() < exp(-delta/T): return True
    return False
In [9]:
def str_shuffle(s):
    """Returns a string with the characters of s shuffled
    """
    c = list(s)
    random.shuffle(c)
    return ''.join(c)
In [10]:
def eval_state(k, d, row, col):
    """Evaluates the ic for the state passed as a parameter
    """
    cipher = Cipher(letters, [[d[0], d[1]], [d[2], d[3]]], [row, col])
    txt = cipher.decrypt(crypto)
    ic = IC(txt)
    return ic, txt
In [11]:
def Maximize_ic(k, d, max_iter = 1000, CoolRatio = 0.8 ):
    """Search the state (row, col) that gives the maximum ic
    """
    best_row = str_shuffle('ADFGVX')
    best_col = str_shuffle('ADFGVX')
    row = best_row
    col = best_col
    best_ic, best_txt = eval_state(k, d, row, col)
    T = 0.01           # initial temperature
    old_ic = best_ic
    freeze = 0
    while True:
        nb_iter = 0
        while nb_iter < max_iter:
            nrow, ncol = new_state(row, col)
            ic, txt = eval_state(k, d, nrow, ncol)
            delta = old_ic - ic
            if Metropolis(delta, T):    # accepted transition
                row, col = nrow, ncol
                old_ic = ic
                if old_ic > best_ic:
                    best_ic = old_ic
                    best_row, best_col = row, col
                    freeze = 0
                else:
                    freeze += 1
            else:                       # rejected transition
                freeze += 1
            nb_iter += 1
        T *= CoolRatio
        if freeze > 5*max_iter:    # stop condition
            break
    return best_ic, d, best_row, best_col

The cryptogram

In [12]:
crypto = 'DVGVG DGXXG XFFAA FFAFV GVFAF GVDDF DAADA XVFDD ADXVA DFGAX \
DXAFA VAAFX VXAGF GVGVV GVDGA XVXDV VFAAA DGADX DFVXA VVDXG \
GGDFD DAXGD AXAXD FVGXV XFDDG VXADG VVDDD FAAVA VDGFX DFGAD \
XGGAD XADVF GGXVD DADDV XDDGF XDAGD GVAXX AGXXG FDFVD GGVAV \
GGADX VAXGG VFVGF AAGAX GDFAD GVDXG XXDGA DDDAG XAVAX ADGDF \
DAXVD AVVFX GGDVD VGAXF GFXDV XDDXG GDVXV GFADG VGDVA VGGVG \
DGXDG XDAGA DXAFV GVGFA XXAAG AGDXX VAXAA DAGDV GDFGV XGFXX \
DAAXA GVGVA XGVGX DAAXV XAGAX AVAXA FAAGG GADAA VDADV DVDVA \
VFAXA GXDVD GDXGG ADFAX DAXDA GGGDD GDXDX AADGV DVAGV DXGAX \
VADAD DDAVD XGFDD AGFXV GXXVD DFGVF XGXVX AXFDV AGXFD XXADD \
FDVGD VVGXV DXGGD GFXDV DAVFV FVFGA DDFDX DXAVD GVVDA XAXVD \
XGVFD DFADG XDDVG AFVDA FDDXX XXGDA XXXDA XGDVD DVAAA XXAGD \
DFGDG VVAXA VXFAX AXXXA AVAGV XXFGV VXVGA XDGXX DXGAA DXAGD \
VGDXD FXFAX GGXAD XVXGF XGAFD DDDAA AGXGD GXFVF VXAXG AXGVF \
GGDAG AXADF GDAGD AAGAG AGDAA XGDFA AGXFX DVGXD GFXXF FGXFX \
DGGDA GAFDF XXAAX XFXDV FGVDG AXXGF DGDFF ADGDX AFADD AXDAA \
DXGXA FDXDF GDAFX GDDAD VDGDX XADDG XFDDD GGGAX XDGDF GGXDX \
DGGFV XAGDF XDAAG VFDFX GVAAA XAAGF FGADA AAAXA GAVFX VFDFA \
XAVDV FAFDF XDVGA FDGXG AGXVG GXDAD'
In [13]:
crypto = crypto.replace(' ', '')
crypto = [crypto[i:i+2] for i in range(0, len(crypto), 2)]
In [14]:
letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
dirs = [(0,1), (1,0), (0,-1), (-1,0)]

The Attack

I adjusted the parameters of the Maximize_ic function so that the execution time is approximately one minute.
The treatment of 256 cases should take about 256 minutes, less than 5 hours.
For speed I only use the first two hundred characters of the crypto. That's enough to evaluate the ic

Let's go!

In [15]:
import time
import itertools
n = 1
for d in itertools.product(dirs, repeat=4):
    start = time.time()
    print("%03d" % n, Maximize_ic(crypto[:200], d), "%03.2f"%(time.time()-start), 'sec.') 
    n += 1
001 (0.032267334074898034, ((0, 1), (0, 1), (0, 1), (0, 1)), 'DVAXFG', 'FVAGXD') 43.09 sec.
002 (0.03156284760845384, ((0, 1), (0, 1), (0, 1), (1, 0)), 'XFGDVA', 'XAGDVF') 92.16 sec.
003 (0.031544308490915836, ((0, 1), (0, 1), (0, 1), (0, -1)), 'XGDAFV', 'XVADFG') 56.27 sec.
004 (0.03082128290693363, ((0, 1), (0, 1), (0, 1), (-1, 0)), 'XGDAFV', 'DGXFVA') 78.70 sec.
005 (0.03171116054875788, ((0, 1), (0, 1), (1, 0), (0, 1)), 'VFAGXD', 'XVGDFA') 151.59 sec.
006 (0.031618464961067856, ((0, 1), (0, 1), (1, 0), (1, 0)), 'GFADXV', 'GFXAVD') 106.61 sec.
007 (0.03163700407860586, ((0, 1), (0, 1), (1, 0), (0, -1)), 'VFGADX', 'DFGXVA') 106.77 sec.
008 (0.031099369670003707, ((0, 1), (0, 1), (1, 0), (-1, 0)), 'AGDVFX', 'DVXGAF') 49.45 sec.
009 (0.031053021876158694, ((0, 1), (0, 1), (0, -1), (0, 1)), 'VFADGX', 'GFDXVA') 63.63 sec.
010 (0.031043752317389692, ((0, 1), (0, 1), (0, -1), (1, 0)), 'ADVGFX', 'AFXDVG') 89.48 sec.
011 (0.03147942157953281, ((0, 1), (0, 1), (0, -1), (0, -1)), 'VFXDGA', 'AVGXFD') 80.50 sec.
012 (0.030589543937708564, ((0, 1), (0, 1), (0, -1), (-1, 0)), 'XVDGFA', 'DFXGVA') 71.70 sec.
013 (0.030682239525398593, ((0, 1), (0, 1), (-1, 0), (0, 1)), 'DVAGFX', 'XVFDGA') 48.58 sec.
014 (0.03132183908045977, ((0, 1), (0, 1), (-1, 0), (1, 0)), 'AVXDFG', 'XFGAVD') 66.82 sec.
015 (0.03134037819799777, ((0, 1), (0, 1), (-1, 0), (0, -1)), 'AVXGFD', 'GFDXVA') 199.05 sec.
016 (0.031238413051538745, ((0, 1), (0, 1), (-1, 0), (-1, 0)), 'DFGAVX', 'GFDXVA') 95.97 sec.
017 (0.03173896922506489, ((0, 1), (1, 0), (0, 1), (0, 1)), 'AVXGFD', 'GFADVX') 115.65 sec.
018 (0.031451612903225803, ((0, 1), (1, 0), (0, 1), (1, 0)), 'XFVDGA', 'GXDVFA') 85.26 sec.
019 (0.03088616981831665, ((0, 1), (1, 0), (0, 1), (0, -1)), 'XGDVFA', 'XVGAFD') 52.59 sec.
020 (0.03103448275862069, ((0, 1), (1, 0), (0, 1), (-1, 0)), 'AGVXFD', 'GXDAVF') 76.60 sec.
021 (0.031080830552465702, ((0, 1), (1, 0), (1, 0), (0, 1)), 'GVXAFD', 'XVFDAG') 68.98 sec.
022 (0.032341490545050054, ((0, 1), (1, 0), (1, 0), (1, 0)), 'AGVDFX', 'GXVAFD') 140.07 sec.
023 (0.030988134964775677, ((0, 1), (1, 0), (1, 0), (0, -1)), 'VFDAGX', 'DXGFVA') 52.59 sec.
024 (0.030941787170930664, ((0, 1), (1, 0), (1, 0), (-1, 0)), 'GVAXFD', 'DXAGVF') 74.80 sec.
025 (0.031275491286614755, ((0, 1), (1, 0), (0, -1), (0, 1)), 'GVAXFD', 'VFAGXD') 49.64 sec.
026 (0.031201334816462735, ((0, 1), (1, 0), (0, -1), (1, 0)), 'XGDAFV', 'GVAXFD') 51.09 sec.
027 (0.0314330737856878, ((0, 1), (1, 0), (0, -1), (0, -1)), 'AFGDXV', 'DFGXVA') 117.07 sec.
028 (0.03134037819799777, ((0, 1), (1, 0), (0, -1), (-1, 0)), 'XGAVFD', 'GVFAXD') 80.98 sec.
029 (0.031618464961067856, ((0, 1), (1, 0), (-1, 0), (0, 1)), 'GFAXVD', 'GVADFX') 124.49 sec.
030 (0.031275491286614755, ((0, 1), (1, 0), (-1, 0), (1, 0)), 'AFXGVD', 'XVAGFD') 93.93 sec.
031 (0.030913978494623656, ((0, 1), (1, 0), (-1, 0), (0, -1)), 'GFVDAX', 'XVFGDA') 66.61 sec.
032 (0.030728587319243605, ((0, 1), (1, 0), (-1, 0), (-1, 0)), 'AFVXGD', 'FGADVX') 92.18 sec.
033 (0.03081201334816463, ((0, 1), (0, -1), (0, 1), (0, 1)), 'XAGVFD', 'FVDXAG') 77.54 sec.
034 (0.0310715609936967, ((0, 1), (0, -1), (0, 1), (1, 0)), 'DAXGFV', 'FGADVX') 87.81 sec.
035 (0.03132183908045977, ((0, 1), (0, -1), (0, 1), (0, -1)), 'DFGAVX', 'DVFGXA') 84.21 sec.
036 (0.031154987022617722, ((0, 1), (0, -1), (0, 1), (-1, 0)), 'DVXGFA', 'XFDGVA') 71.93 sec.
037 (0.030978865406006674, ((0, 1), (0, -1), (1, 0), (0, 1)), 'DFVGAX', 'GFAXVD') 52.92 sec.
038 (0.0314330737856878, ((0, 1), (0, -1), (1, 0), (1, 0)), 'XFGAVD', 'GXADVF') 59.58 sec.
039 (0.03084909158324064, ((0, 1), (0, -1), (1, 0), (0, -1)), 'XGVAFD', 'DVGXAF') 53.10 sec.
040 (0.03156284760845384, ((0, 1), (0, -1), (1, 0), (-1, 0)), 'DVAXFG', 'GDAXVF') 63.26 sec.
041 (0.03134037819799777, ((0, 1), (0, -1), (0, -1), (0, 1)), 'GVDAFX', 'AVXDFG') 106.38 sec.
042 (0.03185947348906192, ((0, 1), (0, -1), (0, -1), (1, 0)), 'VGADFX', 'AFDGVX') 54.51 sec.
043 (0.03309232480533927, ((0, 1), (0, -1), (0, -1), (0, -1)), 'GVXAFD', 'XFDAVG') 125.31 sec.
044 (0.030598813496477566, ((0, 1), (0, -1), (0, -1), (-1, 0)), 'VFGADX', 'ADFGVX') 52.18 sec.
045 (0.03128476084538376, ((0, 1), (0, -1), (-1, 0), (0, 1)), 'AVXDFG', 'VFGDXA') 128.89 sec.
046 (0.030774935113088618, ((0, 1), (0, -1), (-1, 0), (1, 0)), 'VFGAXD', 'FXDGVA') 52.93 sec.
047 (0.03150723025583982, ((0, 1), (0, -1), (-1, 0), (0, -1)), 'AFDXVG', 'DVXAFG') 116.16 sec.
048 (0.031229143492769743, ((0, 1), (0, -1), (-1, 0), (-1, 0)), 'DFXVGA', 'DFAGVX') 62.58 sec.
049 (0.031535038932146826, ((0, 1), (-1, 0), (0, 1), (0, 1)), 'VGXDFA', 'DFGAVX') 99.37 sec.
050 (0.031275491286614755, ((0, 1), (-1, 0), (0, 1), (1, 0)), 'XVDAFG', 'AFXGVD') 79.33 sec.
051 (0.031127178346310715, ((0, 1), (-1, 0), (0, 1), (0, -1)), 'XFAGVD', 'FGDAVX') 189.28 sec.
052 (0.0317667779013719, ((0, 1), (-1, 0), (0, 1), (-1, 0)), 'DGAVFX', 'GDFAVX') 54.13 sec.
053 (0.03135891731553578, ((0, 1), (-1, 0), (1, 0), (0, 1)), 'XGAVFD', 'DVXAFG') 200.34 sec.
054 (0.0317667779013719, ((0, 1), (-1, 0), (1, 0), (1, 0)), 'VFXAGD', 'GVADFX') 71.30 sec.
055 (0.030793474230626623, ((0, 1), (-1, 0), (1, 0), (0, -1)), 'GFDXAV', 'GVAFDX') 97.89 sec.
056 (0.031238413051538745, ((0, 1), (-1, 0), (1, 0), (-1, 0)), 'GVXDFA', 'GVAFXD') 106.42 sec.
057 (0.030830552465702633, ((0, 1), (-1, 0), (0, -1), (0, 1)), 'GFDAXV', 'FVADXG') 53.37 sec.
058 (0.031164256581386725, ((0, 1), (-1, 0), (0, -1), (1, 0)), 'AGVDFX', 'VFADGX') 88.97 sec.
059 (0.03163700407860586, ((0, 1), (-1, 0), (0, -1), (0, -1)), 'VFXADG', 'GXDFVA') 103.07 sec.
060 (0.06449758991472006, ((0, 1), (-1, 0), (0, -1), (-1, 0)), 'GFADVX', 'DFXGVA') 146.05 sec.
061 (0.031090100111234704, ((0, 1), (-1, 0), (-1, 0), (0, 1)), 'AGDXFV', 'FVDGAX') 115.99 sec.
062 (0.03137745643307378, ((0, 1), (-1, 0), (-1, 0), (1, 0)), 'XGADFV', 'AFDXVG') 149.93 sec.
063 (0.030904708935854654, ((0, 1), (-1, 0), (-1, 0), (0, -1)), 'DFGVAX', 'DXGAVF') 54.26 sec.
064 (0.031229143492769743, ((0, 1), (-1, 0), (-1, 0), (-1, 0)), 'GFAXVD', 'GVDXFA') 141.31 sec.
065 (0.03156284760845384, ((1, 0), (0, 1), (0, 1), (0, 1)), 'DVXAFG', 'AVGXFD') 86.41 sec.
066 (0.03126622172784575, ((1, 0), (0, 1), (0, 1), (1, 0)), 'AVDFXG', 'XFDGVA') 49.73 sec.
067 (0.031525769373377824, ((1, 0), (0, 1), (0, 1), (0, -1)), 'AVGDFX', 'DVAXFG') 129.09 sec.
068 (0.03135891731553578, ((1, 0), (0, 1), (0, 1), (-1, 0)), 'AFDVGX', 'GXFAVD') 103.83 sec.
069 (0.030682239525398593, ((1, 0), (0, 1), (1, 0), (0, 1)), 'GFXDAV', 'GXFDVA') 87.86 sec.
070 (0.03133110863922877, ((1, 0), (0, 1), (1, 0), (1, 0)), 'XFDAVG', 'GVXAFD') 112.09 sec.
071 (0.06449758991472006, ((1, 0), (0, 1), (1, 0), (0, -1)), 'XVDAFG', 'AVGXFD') 67.41 sec.
072 (0.0310715609936967, ((1, 0), (0, 1), (1, 0), (-1, 0)), 'DVXGFA', 'DVXGFA') 59.05 sec.
073 (0.032017055988134965, ((1, 0), (0, 1), (0, -1), (0, 1)), 'XFADGV', 'GVDXFA') 103.68 sec.
074 (0.030988134964775677, ((1, 0), (0, 1), (0, -1), (1, 0)), 'VFDAGX', 'FVADXG') 66.44 sec.
075 (0.03118279569892473, ((1, 0), (0, 1), (0, -1), (0, -1)), 'XAGVFD', 'GVXADF') 83.87 sec.
076 (0.030691509084167595, ((1, 0), (0, 1), (0, -1), (-1, 0)), 'VFDAXG', 'AFGXVD') 89.48 sec.
077 (0.03141453466814979, ((1, 0), (0, 1), (-1, 0), (0, 1)), 'ADVXFG', 'FVDGXA') 51.81 sec.
078 (0.03103448275862069, ((1, 0), (0, 1), (-1, 0), (1, 0)), 'ADVXFG', 'GFXAVD') 85.11 sec.
079 (0.030682239525398593, ((1, 0), (0, 1), (-1, 0), (0, -1)), 'DGAFVX', 'DVXAFG') 62.57 sec.
080 (0.03167408231368187, ((1, 0), (0, 1), (-1, 0), (-1, 0)), 'XGDVFA', 'AVXDFG') 96.86 sec.
081 (0.03057100482017056, ((1, 0), (1, 0), (0, 1), (0, 1)), 'DFAXGV', 'GVDAFX') 79.19 sec.
082 (0.031173526140155727, ((1, 0), (1, 0), (0, 1), (1, 0)), 'XFGDAV', 'GFADVX') 88.65 sec.
083 (0.031609195402298854, ((1, 0), (1, 0), (0, 1), (0, -1)), 'GVXDFA', 'GDAXFV') 88.70 sec.
084 (0.031117908787541712, ((1, 0), (1, 0), (0, 1), (-1, 0)), 'DGXAFV', 'VFADGX') 129.20 sec.
085 (0.031229143492769743, ((1, 0), (1, 0), (1, 0), (0, 1)), 'AFDXVG', 'ADFXVG') 99.64 sec.
086 (0.030561735261401556, ((1, 0), (1, 0), (1, 0), (1, 0)), 'GFDAVX', 'DFGAVX') 71.66 sec.
087 (0.03136818687430478, ((1, 0), (1, 0), (1, 0), (0, -1)), 'GFXAVD', 'DFGVXA') 81.32 sec.
088 (0.031080830552465702, ((1, 0), (1, 0), (1, 0), (-1, 0)), 'VFDXGA', 'GDAXVF') 82.09 sec.
089 (0.03078420467185762, ((1, 0), (1, 0), (0, -1), (0, 1)), 'XFDGVA', 'GFXAVD') 81.90 sec.
090 (0.03089543937708565, ((1, 0), (1, 0), (0, -1), (1, 0)), 'DVXGFA', 'GVXDFA') 62.69 sec.
091 (0.031192065257693732, ((1, 0), (1, 0), (0, -1), (0, -1)), 'DFGXVA', 'AFXGVD') 99.74 sec.
092 (0.031015943641082684, ((1, 0), (1, 0), (0, -1), (-1, 0)), 'XFAVGD', 'XFVAGD') 61.56 sec.
093 (0.03167408231368187, ((1, 0), (1, 0), (-1, 0), (0, 1)), 'GFXADV', 'XFGDVA') 199.86 sec.
094 (0.031136447905079717, ((1, 0), (1, 0), (-1, 0), (1, 0)), 'DVAXFG', 'XFGDVA') 159.76 sec.
095 (0.03150723025583982, ((1, 0), (1, 0), (-1, 0), (0, -1)), 'GVDAFX', 'XVGFDA') 62.37 sec.
096 (0.030867630700778644, ((1, 0), (1, 0), (-1, 0), (-1, 0)), 'ADXGFV', 'XFDGVA') 52.93 sec.
097 (0.031275491286614755, ((1, 0), (0, -1), (0, 1), (0, 1)), 'VFAXGD', 'AFDGVX') 62.02 sec.
098 (0.03126622172784575, ((1, 0), (0, -1), (0, 1), (1, 0)), 'DVGXFA', 'DFGXVA') 78.67 sec.
099 (0.031090100111234704, ((1, 0), (0, -1), (0, 1), (0, -1)), 'GAXVFD', 'GFDAVX') 115.73 sec.
100 (0.03163700407860586, ((1, 0), (0, -1), (0, 1), (-1, 0)), 'XFVGDA', 'DFAXVG') 160.91 sec.
101 (0.031349647756766776, ((1, 0), (0, -1), (1, 0), (0, 1)), 'AFDGVX', 'GVADFX') 141.81 sec.
102 (0.031043752317389692, ((1, 0), (0, -1), (1, 0), (1, 0)), 'VFXAGD', 'FVXDAG') 181.15 sec.
103 (0.03225806451612903, ((1, 0), (0, -1), (1, 0), (0, -1)), 'DVXAFG', 'AVFXGD') 94.75 sec.
104 (0.031238413051538745, ((1, 0), (0, -1), (1, 0), (-1, 0)), 'XVGAFD', 'DXFAVG') 72.62 sec.
105 (0.03081201334816463, ((1, 0), (0, -1), (0, -1), (0, 1)), 'XGDAFV', 'DXGFVA') 86.14 sec.
106 (0.031099369670003707, ((1, 0), (0, -1), (0, -1), (1, 0)), 'XGDVFA', 'FDXAVG') 57.89 sec.
107 (0.031905821282906935, ((1, 0), (0, -1), (0, -1), (0, -1)), 'AFDXVG', 'AVGDFX') 150.65 sec.
108 (0.03103448275862069, ((1, 0), (0, -1), (0, -1), (-1, 0)), 'VXDAFG', 'DVXGFA') 78.41 sec.
109 (0.03128476084538376, ((1, 0), (0, -1), (-1, 0), (0, 1)), 'XVAGFD', 'FVXDAG') 49.76 sec.
110 (0.030756395995550613, ((1, 0), (0, -1), (-1, 0), (1, 0)), 'GVXDFA', 'DVAFXG') 57.28 sec.
111 (0.03139599555061179, ((1, 0), (0, -1), (-1, 0), (0, -1)), 'AVFGXD', 'AVXGFD') 64.94 sec.
112 (0.031451612903225803, ((1, 0), (0, -1), (-1, 0), (-1, 0)), 'AGXVFD', 'XFVGAD') 58.11 sec.
113 (0.031154987022617722, ((1, 0), (-1, 0), (0, 1), (0, 1)), 'XVGAFD', 'XVDGAF') 50.58 sec.
114 (0.03167408231368187, ((1, 0), (-1, 0), (0, 1), (1, 0)), 'XADGFV', 'FVDAGX') 109.19 sec.
115 (0.03092324805339266, ((1, 0), (-1, 0), (0, 1), (0, -1)), 'GFAVXD', 'FXGAVD') 50.14 sec.
116 (0.03100667408231368, ((1, 0), (-1, 0), (0, 1), (-1, 0)), 'GFVXDA', 'XDVAFG') 52.39 sec.
117 (0.03096959584723767, ((1, 0), (-1, 0), (1, 0), (0, 1)), 'GXVADF', 'VDGAXF') 42.59 sec.
118 (0.031229143492769743, ((1, 0), (-1, 0), (1, 0), (1, 0)), 'XDVAFG', 'DVGXFA') 94.78 sec.
119 (0.031544308490915836, ((1, 0), (-1, 0), (1, 0), (0, -1)), 'XGDVFA', 'GVADFX') 79.75 sec.
120 (0.03173896922506489, ((1, 0), (-1, 0), (1, 0), (-1, 0)), 'AFVDGX', 'AXFGVD') 80.46 sec.
121 (0.03128476084538376, ((1, 0), (-1, 0), (0, -1), (0, 1)), 'VGDXFA', 'VFAGXD') 65.64 sec.
122 (0.03099740452354468, ((1, 0), (-1, 0), (0, -1), (1, 0)), 'VDAGFX', 'XFGDVA') 52.87 sec.
123 (0.030737856878012608, ((1, 0), (-1, 0), (0, -1), (0, -1)), 'GDVAFX', 'FVXGAD') 45.74 sec.
124 (0.03100667408231368, ((1, 0), (-1, 0), (0, -1), (-1, 0)), 'XVGAFD', 'AVDGFX') 75.09 sec.
125 (0.03089543937708565, ((1, 0), (-1, 0), (-1, 0), (0, 1)), 'FVXAGD', 'XVADFG') 71.67 sec.
126 (0.03096959584723767, ((1, 0), (-1, 0), (-1, 0), (1, 0)), 'VGDXFA', 'GFAXVD') 43.02 sec.
127 (0.031692621431219876, ((1, 0), (-1, 0), (-1, 0), (0, -1)), 'AVDXFG', 'GXAFVD') 73.94 sec.
128 (0.031173526140155727, ((1, 0), (-1, 0), (-1, 0), (-1, 0)), 'VFDAXG', 'FDVAXG') 63.02 sec.
129 (0.03081201334816463, ((0, -1), (0, 1), (0, 1), (0, 1)), 'VDAGFX', 'DFGAVX') 50.65 sec.
130 (0.030978865406006674, ((0, -1), (0, 1), (0, 1), (1, 0)), 'DFVGAX', 'XVDGFA') 58.85 sec.
131 (0.03188728216536893, ((0, -1), (0, 1), (0, 1), (0, -1)), 'XGVDFA', 'AFDGVX') 58.31 sec.
132 (0.03126622172784575, ((0, -1), (0, 1), (0, 1), (-1, 0)), 'FDGAVX', 'XVDFAG') 79.63 sec.
133 (0.031062291434927697, ((0, -1), (0, 1), (1, 0), (0, 1)), 'DFGXVA', 'GVDFXA') 60.33 sec.
134 (0.030672969966629587, ((0, -1), (0, 1), (1, 0), (1, 0)), 'DAVXFG', 'GAXDVF') 44.50 sec.
135 (0.031025213199851687, ((0, -1), (0, 1), (1, 0), (0, -1)), 'VGDXFA', 'XFDGVA') 72.70 sec.
136 (0.031053021876158694, ((0, -1), (0, 1), (1, 0), (-1, 0)), 'DAXVFG', 'XVGAFD') 80.38 sec.
137 (0.031117908787541712, ((0, -1), (0, 1), (0, -1), (0, 1)), 'GVDXFA', 'GVXFAD') 86.70 sec.
138 (0.0317667779013719, ((0, -1), (0, 1), (0, -1), (1, 0)), 'AVXDFG', 'AVGFXD') 50.59 sec.
139 (0.031275491286614755, ((0, -1), (0, 1), (0, -1), (0, -1)), 'AFDXVG', 'DVAGFX') 57.87 sec.
140 (0.032017055988134965, ((0, -1), (0, 1), (0, -1), (-1, 0)), 'VGDAFX', 'AFXDVG') 87.20 sec.
141 (0.031655543196143866, ((0, -1), (0, 1), (-1, 0), (0, 1)), 'VGXAFD', 'FXGAVD') 58.71 sec.
142 (0.031979977753058955, ((0, -1), (0, 1), (-1, 0), (1, 0)), 'XFVAGD', 'AFGDVX') 81.31 sec.
143 (0.03133110863922877, ((0, -1), (0, 1), (-1, 0), (0, -1)), 'GFAXVD', 'GVADFX') 51.27 sec.
144 (0.03203559510567297, ((0, -1), (0, 1), (-1, 0), (-1, 0)), 'XFAGVD', 'AVGDFX') 130.76 sec.
145 (0.031015943641082684, ((0, -1), (1, 0), (0, 1), (0, 1)), 'DAGXFV', 'XVDGFA') 59.48 sec.
146 (0.031173526140155727, ((0, -1), (1, 0), (0, 1), (1, 0)), 'XDAVFG', 'GDAXVF') 80.10 sec.
147 (0.031173526140155727, ((0, -1), (1, 0), (0, 1), (0, -1)), 'AFDXGV', 'XAGVFD') 43.14 sec.
148 (0.03139599555061179, ((0, -1), (1, 0), (0, 1), (-1, 0)), 'AGFVXD', 'DAVGXF') 101.20 sec.
149 (0.03096959584723767, ((0, -1), (1, 0), (1, 0), (0, 1)), 'AFXGVD', 'GFDAVX') 80.06 sec.
150 (0.03193362995921394, ((0, -1), (1, 0), (1, 0), (1, 0)), 'AFXVGD', 'DFXAVG') 94.23 sec.
151 (0.031099369670003707, ((0, -1), (1, 0), (1, 0), (0, -1)), 'VFAXGD', 'FDXAVG') 57.52 sec.
152 (0.031192065257693732, ((0, -1), (1, 0), (1, 0), (-1, 0)), 'XFDGAV', 'FVDXGA') 86.56 sec.
153 (0.03096032628846867, ((0, -1), (1, 0), (0, -1), (0, 1)), 'GVDAFX', 'GFDAVX') 71.85 sec.
154 (0.03089543937708565, ((0, -1), (1, 0), (0, -1), (1, 0)), 'GFXDAV', 'AVDXFG') 72.02 sec.
155 (0.031043752317389692, ((0, -1), (1, 0), (0, -1), (0, -1)), 'XGDVFA', 'DFGVXA') 64.82 sec.
156 (0.03141453466814979, ((0, -1), (1, 0), (0, -1), (-1, 0)), 'GFXVDA', 'AXGDVF') 122.86 sec.
157 (0.03195216907675195, ((0, -1), (1, 0), (-1, 0), (0, 1)), 'GFADVX', 'GVDAFX') 44.57 sec.
158 (0.03159065628476085, ((0, -1), (1, 0), (-1, 0), (1, 0)), 'DVXAFG', 'AFGXVD') 73.41 sec.
159 (0.031497960697070816, ((0, -1), (1, 0), (-1, 0), (0, -1)), 'VFXGAD', 'DVAXFG') 72.86 sec.
160 (0.03058027437893956, ((0, -1), (1, 0), (-1, 0), (-1, 0)), 'GXDAFV', 'DGFXVA') 43.96 sec.
161 (0.031154987022617722, ((0, -1), (0, -1), (0, 1), (0, 1)), 'DVXAFG', 'GDAFVX') 43.98 sec.
162 (0.031229143492769743, ((0, -1), (0, -1), (0, 1), (1, 0)), 'XAGDFV', 'DVGAXF') 94.67 sec.
163 (0.031117908787541712, ((0, -1), (0, -1), (0, 1), (0, -1)), 'VGAXFD', 'DFXAVG') 59.28 sec.
164 (0.03088616981831665, ((0, -1), (0, -1), (0, 1), (-1, 0)), 'AXVGFD', 'DVAXGF') 80.70 sec.
165 (0.031136447905079717, ((0, -1), (0, -1), (1, 0), (0, 1)), 'GFXAVD', 'XFDAVG') 72.69 sec.
166 (0.03061735261401557, ((0, -1), (0, -1), (1, 0), (1, 0)), 'AXDGFV', 'XFGDVA') 73.04 sec.
167 (0.031831664812754915, ((0, -1), (0, -1), (1, 0), (0, -1)), 'GFXVAD', 'GVDAXF') 65.62 sec.
168 (0.031238413051538745, ((0, -1), (0, -1), (1, 0), (-1, 0)), 'VXGDFA', 'XDGFVA') 43.38 sec.
169 (0.03126622172784575, ((0, -1), (0, -1), (0, -1), (0, 1)), 'AFGDVX', 'XVADFG') 43.44 sec.
170 (0.031535038932146826, ((0, -1), (0, -1), (0, -1), (1, 0)), 'AFDXGV', 'GFDXVA') 53.18 sec.
171 (0.03210975157582499, ((0, -1), (0, -1), (0, -1), (0, -1)), 'DVGXFA', 'GFXAVD') 75.54 sec.
172 (0.03130329996292176, ((0, -1), (0, -1), (0, -1), (-1, 0)), 'GDXVFA', 'DVXGAF') 43.42 sec.
173 (0.030867630700778644, ((0, -1), (0, -1), (-1, 0), (0, 1)), 'GFADVX', 'DXAGVF') 59.12 sec.
174 (0.031025213199851687, ((0, -1), (0, -1), (-1, 0), (1, 0)), 'VFDGAX', 'AFXDVG') 51.26 sec.
175 (0.031646273637374864, ((0, -1), (0, -1), (-1, 0), (0, -1)), 'DVXAFG', 'DXFGVA') 126.38 sec.
176 (0.030978865406006674, ((0, -1), (0, -1), (-1, 0), (-1, 0)), 'DVXAFG', 'DVAXFG') 60.53 sec.
177 (0.031173526140155727, ((0, -1), (-1, 0), (0, 1), (0, 1)), 'DVAXFG', 'GVAXFD') 59.96 sec.
178 (0.031127178346310715, ((0, -1), (-1, 0), (0, 1), (1, 0)), 'XFADGV', 'GFDXVA') 67.01 sec.
179 (0.03134037819799777, ((0, -1), (-1, 0), (0, 1), (0, -1)), 'GFDAVX', 'DVFAXG') 141.59 sec.
180 (0.03166481275491287, ((0, -1), (-1, 0), (0, 1), (-1, 0)), 'GVDAFX', 'FXDAVG') 101.62 sec.
181 (0.03167408231368187, ((0, -1), (-1, 0), (1, 0), (0, 1)), 'XVGDFA', 'FXDAVG') 46.80 sec.
182 (0.03159065628476085, ((0, -1), (-1, 0), (1, 0), (1, 0)), 'DXAGFV', 'DVFAXG') 91.67 sec.
183 (0.031349647756766776, ((0, -1), (-1, 0), (1, 0), (0, -1)), 'DFGXVA', 'DGAXVF') 84.17 sec.
184 (0.031488691138301814, ((0, -1), (-1, 0), (1, 0), (-1, 0)), 'XVDAFG', 'AVGDFX') 145.89 sec.
185 (0.031349647756766776, ((0, -1), (-1, 0), (0, -1), (0, 1)), 'XADVFG', 'XVDAFG') 115.09 sec.
186 (0.03151649981460882, ((0, -1), (-1, 0), (0, -1), (1, 0)), 'XDAVFG', 'GDAFVX') 46.18 sec.
187 (0.031720430107526884, ((0, -1), (-1, 0), (0, -1), (0, -1)), 'VGDXFA', 'XVFGDA') 45.25 sec.
188 (0.03191509084167594, ((0, -1), (-1, 0), (0, -1), (-1, 0)), 'GFXAVD', 'XVDAFG') 60.06 sec.
189 (0.031247682610307748, ((0, -1), (-1, 0), (-1, 0), (0, 1)), 'AFVXDG', 'XVFAGD') 82.44 sec.
190 (0.031062291434927697, ((0, -1), (-1, 0), (-1, 0), (1, 0)), 'AFGXVD', 'GFDXVA') 52.51 sec.
191 (0.031080830552465702, ((0, -1), (-1, 0), (-1, 0), (0, -1)), 'GVADFX', 'GFDAVX') 52.44 sec.
192 (0.031720430107526884, ((0, -1), (-1, 0), (-1, 0), (-1, 0)), 'AVXDGF', 'GFDXVA') 44.99 sec.
193 (0.031201334816462735, ((-1, 0), (0, 1), (0, 1), (0, 1)), 'GFVADX', 'AVDGFX') 53.75 sec.
194 (0.031210604375231737, ((-1, 0), (0, 1), (0, 1), (1, 0)), 'XFGVAD', 'GFDXVA') 52.99 sec.
195 (0.031942899517982945, ((-1, 0), (0, 1), (0, 1), (0, -1)), 'VFAXDG', 'GFDXVA') 75.82 sec.
196 (0.031043752317389692, ((-1, 0), (0, 1), (0, 1), (-1, 0)), 'VFDGAX', 'FDAXVG') 83.26 sec.
197 (0.03049684835001854, ((-1, 0), (0, 1), (1, 0), (0, 1)), 'FVDXGA', 'GXFAVD') 45.58 sec.
198 (0.03147015202076381, ((-1, 0), (0, 1), (1, 0), (1, 0)), 'AFGXVD', 'XFDAVG') 105.70 sec.
199 (0.03147942157953281, ((-1, 0), (0, 1), (1, 0), (0, -1)), 'DVAGFX', 'AVXGFD') 112.89 sec.
200 (0.031460882461994806, ((-1, 0), (0, 1), (1, 0), (-1, 0)), 'DAXGFV', 'DXFAVG') 98.05 sec.
201 (0.03167408231368187, ((-1, 0), (0, 1), (0, -1), (0, 1)), 'VFADGX', 'AFGXVD') 61.02 sec.
202 (0.03103448275862069, ((-1, 0), (0, 1), (0, -1), (1, 0)), 'GXAVFD', 'AXDGVF') 67.74 sec.
203 (0.03121987393400074, ((-1, 0), (0, 1), (0, -1), (0, -1)), 'GAVDFX', 'FVXGDA') 74.97 sec.
204 (0.031025213199851687, ((-1, 0), (0, 1), (0, -1), (-1, 0)), 'VFAGDX', 'XVGAFD') 112.85 sec.
205 (0.031099369670003707, ((-1, 0), (0, 1), (-1, 0), (0, 1)), 'GAXDFV', 'AVDXFG') 90.92 sec.
206 (0.03114571746384872, ((-1, 0), (0, 1), (-1, 0), (1, 0)), 'DAGXFV', 'XVFDGA') 61.09 sec.
207 (0.030672969966629587, ((-1, 0), (0, 1), (-1, 0), (0, -1)), 'ADXVFG', 'XVAGFD') 55.16 sec.
208 (0.03140526510938079, ((-1, 0), (0, 1), (-1, 0), (-1, 0)), 'VFDAGX', 'XDGAVF') 74.89 sec.
209 (0.031136447905079717, ((-1, 0), (1, 0), (0, 1), (0, 1)), 'VFAXGD', 'DVFXAG') 89.91 sec.
210 (0.03114571746384872, ((-1, 0), (1, 0), (0, 1), (1, 0)), 'XGDVFA', 'XGDAVF') 44.78 sec.
211 (0.030913978494623656, ((-1, 0), (1, 0), (0, 1), (0, -1)), 'VGDXFA', 'DFXGVA') 66.41 sec.
212 (0.03078420467185762, ((-1, 0), (1, 0), (0, 1), (-1, 0)), 'AFDVGX', 'GVADFX') 73.38 sec.
213 (0.031525769373377824, ((-1, 0), (1, 0), (1, 0), (0, 1)), 'VGAXFD', 'FVGAXD') 44.07 sec.
214 (0.0314330737856878, ((-1, 0), (1, 0), (1, 0), (1, 0)), 'DFAXGV', 'GDAFVX') 43.84 sec.
215 (0.031460882461994806, ((-1, 0), (1, 0), (1, 0), (0, -1)), 'VFGXAD', 'FXDGVA') 93.89 sec.
216 (0.031043752317389692, ((-1, 0), (1, 0), (1, 0), (-1, 0)), 'XGVDFA', 'GFDAVX') 64.86 sec.
217 (0.03133110863922877, ((-1, 0), (1, 0), (0, -1), (0, 1)), 'AGXVFD', 'GVDXFA') 64.26 sec.
218 (0.031581386725991846, ((-1, 0), (1, 0), (0, -1), (1, 0)), 'AFVDGX', 'FVDGXA') 113.79 sec.
219 (0.03136818687430478, ((-1, 0), (1, 0), (0, -1), (0, -1)), 'XFDGVA', 'AFXGVD') 49.73 sec.
220 (0.03210048201705599, ((-1, 0), (1, 0), (0, -1), (-1, 0)), 'GFVDAX', 'GADFVX') 77.52 sec.
221 (0.030867630700778644, ((-1, 0), (1, 0), (-1, 0), (0, 1)), 'AGXDFV', 'AXVDFG') 49.95 sec.
222 (0.031349647756766776, ((-1, 0), (1, 0), (-1, 0), (1, 0)), 'AVXGFD', 'XVFGDA') 42.71 sec.
223 (0.031080830552465702, ((-1, 0), (1, 0), (-1, 0), (0, -1)), 'DFVGXA', 'AVFDGX') 63.90 sec.
224 (0.031043752317389692, ((-1, 0), (1, 0), (-1, 0), (-1, 0)), 'DXAFGV', 'XVFGAD') 49.83 sec.
225 (0.03125695216907675, ((-1, 0), (0, -1), (0, 1), (0, 1)), 'DVGAFX', 'FVDAXG') 85.10 sec.
226 (0.03141453466814979, ((-1, 0), (0, -1), (0, 1), (1, 0)), 'GVXDFA', 'XFGDVA') 56.75 sec.
227 (0.030802743789395626, ((-1, 0), (0, -1), (0, 1), (0, -1)), 'XDVAFG', 'DVAGFX') 113.99 sec.
228 (0.03096959584723767, ((-1, 0), (0, -1), (0, 1), (-1, 0)), 'GVDAFX', 'DFVAXG') 49.75 sec.
229 (0.03136818687430478, ((-1, 0), (0, -1), (1, 0), (0, 1)), 'VADGFX', 'AVDXFG') 77.92 sec.
230 (0.030830552465702633, ((-1, 0), (0, -1), (1, 0), (1, 0)), 'DXGVFA', 'DFVGXA') 50.11 sec.
231 (0.03096959584723767, ((-1, 0), (0, -1), (1, 0), (0, -1)), 'AGVDFX', 'AVXGFD') 85.50 sec.
232 (0.031210604375231737, ((-1, 0), (0, -1), (1, 0), (-1, 0)), 'DXGVFA', 'XFAGVD') 77.81 sec.
233 (0.031192065257693732, ((-1, 0), (0, -1), (0, -1), (0, 1)), 'VFDXAG', 'FXDGVA') 42.60 sec.
234 (0.031015943641082684, ((-1, 0), (0, -1), (0, -1), (1, 0)), 'DGXAFV', 'DFXGAV') 42.76 sec.
235 (0.030756395995550613, ((-1, 0), (0, -1), (0, -1), (0, -1)), 'GADXFV', 'GFAXVD') 78.27 sec.
236 (0.031173526140155727, ((-1, 0), (0, -1), (0, -1), (-1, 0)), 'VFDXGA', 'FXDAVG') 85.46 sec.
237 (0.03045977011494253, ((-1, 0), (0, -1), (-1, 0), (0, 1)), 'XGADFV', 'AFDXVG') 42.60 sec.
238 (0.03151649981460882, ((-1, 0), (0, -1), (-1, 0), (1, 0)), 'XGDAFV', 'ADXGVF') 113.99 sec.
239 (0.03191509084167594, ((-1, 0), (0, -1), (-1, 0), (0, -1)), 'GFXAVD', 'AFGXVD') 113.32 sec.
240 (0.03203559510567297, ((-1, 0), (0, -1), (-1, 0), (-1, 0)), 'XFAVDG', 'XFDGVA') 85.39 sec.
241 (0.03139599555061179, ((-1, 0), (-1, 0), (0, 1), (0, 1)), 'XFGVAD', 'GADFVX') 71.10 sec.
242 (0.031451612903225803, ((-1, 0), (-1, 0), (0, 1), (1, 0)), 'XGDAVF', 'GVXDFA') 63.40 sec.
243 (0.031127178346310715, ((-1, 0), (-1, 0), (0, 1), (0, -1)), 'VXADFG', 'AFGDXV') 113.82 sec.
244 (0.031062291434927697, ((-1, 0), (-1, 0), (0, 1), (-1, 0)), 'AFGVXD', 'DVXGFA') 49.37 sec.
245 (0.03088616981831665, ((-1, 0), (-1, 0), (1, 0), (0, 1)), 'GFADVX', 'GXADFV') 49.51 sec.
246 (0.0310715609936967, ((-1, 0), (-1, 0), (1, 0), (1, 0)), 'GFXAVD', 'FAXGVD') 56.46 sec.
247 (0.031210604375231737, ((-1, 0), (-1, 0), (1, 0), (0, -1)), 'GVAXDF', 'VFGDXA') 66.97 sec.
248 (0.03096959584723767, ((-1, 0), (-1, 0), (1, 0), (-1, 0)), 'DFGAXV', 'AFGDVX') 59.81 sec.
249 (0.03129403040415276, ((-1, 0), (-1, 0), (0, -1), (0, 1)), 'XFDAVG', 'GXAFVD') 112.56 sec.
250 (0.031099369670003707, ((-1, 0), (-1, 0), (0, -1), (1, 0)), 'XFDVGA', 'AVDGFX') 58.15 sec.
251 (0.03085836114200964, ((-1, 0), (-1, 0), (0, -1), (0, -1)), 'AVDGFX', 'DXAGFV') 81.23 sec.
252 (0.030876900259547646, ((-1, 0), (-1, 0), (0, -1), (-1, 0)), 'XFDAVG', 'GVFAXD') 74.71 sec.
253 (0.031201334816462735, ((-1, 0), (-1, 0), (-1, 0), (0, 1)), 'DFVAXG', 'XVDGFA') 51.75 sec.
254 (0.03128476084538376, ((-1, 0), (-1, 0), (-1, 0), (1, 0)), 'GVADFX', 'XVDGFA') 80.56 sec.
255 (0.03203559510567297, ((-1, 0), (-1, 0), (-1, 0), (0, -1)), 'VDGXFA', 'XFDGVA') 133.64 sec.
256 (0.031525769373377824, ((-1, 0), (-1, 0), (-1, 0), (-1, 0)), 'VFGADX', 'GFADVX') 59.02 sec.

We have two interesting results:

060 (0.06449758991472006, ((0, 1), (-1, 0), (0, -1), (-1, 0)), 'GFADVX', 'DFXGVA') 146.05 sec.
071 (0.06449758991472006, ((1, 0), (0, 1), (1, 0), (0, -1)), 'XVDAFG', 'AVGXFD') 67.41 sec.

Last step

Decryption with the parameters of #60:

In [16]:
# initial grid configuration
letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'

# row labels, column labels
labels = ['GFADVX', 'DFXGVA']

# direction of dot on each quadrant
d = [[(0, 1), (-1, 0)], [(0, -1), (-1, 0)]]

cipher = Cipher(letters, d, labels)
k0 =cipher.decrypt(crypto)
print(k0)
WJAB95DBWWJDW457MBZ5A7WJ5BALJW0XD88WJAB80P5WJAB807LA7LWJAB098APA0QBWJA7LWJDWJDBZ5Q7M54DBWJ58DBW85DP5BXD88OA88L8QWOA88BAFT57OA8895L0759YB14A7LWJ5O0Q7MOA88J5D8WJ5X5P54OA88D9DW5WJ5T70WW5MJQ4WOA88B8DFT57A7WJ5945DBWABJD88X04L5W95X045WJ5X8AFT54BZDW5Y0Q4800TWJDWABW0MDYZY5DBWD7MO5BWQ7BFDWJ5MJ0O5P54X40ZDF8DOB0M551WJ0QLJABJ0Q8M80P5DLDA7ABJD8870WL0D807LZY90MYODTA7LOJA85AB8551BJD41W0WJ5TABBF08MW0WJ5JD7MDBB70OWJ5BFD40XWJAB57F0Q7W548AT5DBO04MOA888A595WO557Z5D7MZYW40Q985M804M
In [17]:
len(set(k0))
Out[17]:
22

The crypto has 22 different characters. We do a transliteration (I do not have statistical data for a 36-letter alphabet):

In [18]:
alpha26 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
t = ''
alpha = {}
idx = 0
for c in k0:
    if c not in alpha:
        alpha[c] = alpha26[idx]
        idx += 1
    t += alpha[c]
print(t)
ABCDEFGDAABGAHFIJDKFCIABFDCLBAMNGOOABCDOMPFABCDOMILCILABCDMEOCPCMQDABCILABGABGDKFQIJFHGDABFOGDAOFGPFDNGOORCOOLOQARCOODCSTFIRCOOEFLMIFEUDVHCILABFRMQIJRCOOBFGOABFNFPFHRCOOGEGAFABFTIMAAFJBQHARCOODOGSTFICIABFEHFGDACDBGOONMHLFAEFNMHFABFNOCSTFHDKGAFUMQHOMMTABGACDAMJGUKUFGDAGIJRFDAQIDSGABFJBMRFPFHNHMKGSOGRDMJFFVABMQLBCDBMQOJOMPFGLGCICDBGOOIMALMGOMILKUEMJURGTCILRBCOFCDOFFVDBGHVAMABFTCDDSMOJAMABFBGIJGDDIMRABFDSGHMNABCDFISMQIAFHOCTFGDRMHJRCOOOCFEFARFFIKFGIJKUAHMQEOFJOMHJ

Loading the ccrypto module: a personal module written in C interfaced with Python.
The only function used here is RS_substitution, a MASC solver using a simulated annealing algorithm (It's my favorite algorithm!).

For a Python version of this function see http://bribes.org/crypto/substitution_mono.html (in French, sorry).

In [19]:
from ccrypto import *
load_qf_base('logf4g_en.txt') # Statistics for the English language (log quadrigram frequencies)
In [20]:
RS_substitution(t)
Out[20]:
[4578.81787109375,
 'THISBEARNDMGOFLVUWCKYPZQJX',
 'THISBEASTTHATRENDSMEINTHESIGHTOFALLTHISLOVETHISLONGINGTHISOBLIVIOUSTHINGTHATHASMEUNDERASTHELASTLEAVESFALLWILLGLUTWILLSICKENWILLBEGONEBYSPRINGTHEWOUNDWILLHEALTHEFEVERWILLABATETHEKNOTTEDHURTWILLSLACKENINTHEBREASTISHALLFORGETBEFORETHEFLICKERSMATEYOURLOOKTHATISTODAYMYEASTANDWESTUNSCATHEDHOWEVERFROMACLAWSODEEPTHOUGHISHOULDLOVEAGAINISHALLNOTGOALONGMYBODYWAKINGWHILEISLEEPSHARPTOTHEKISSCOLDTOTHEHANDASSNOWTHESCAROFTHISENCOUNTERLIKEASWORDWILLLIEBETWEENMEANDMYTROUBLEDLORD']

It's a poem by Edna St. Vincent Millay: This beast that rends me in the sight of all


Le 9/01/2018 - Contact : Rossignol@bribes.org