In [ ]:
# Code de Gray pour les mots binaires
In [1]:
def listGray(n):
if n == 0:
return [[]]
else:
rec = listGray(n-1)
return [[0] + b for b in rec] + [[1] + b for b in rec[::-1]]
In [2]:
listGray(1)
Out[2]:
In [3]:
listGray(2)
Out[3]:
In [4]:
listGray(3)
Out[4]:
In [5]:
listGray(4)
Out[5]:
In [6]:
N = 5
[(i, ZZ(i).digits(2, padto=N)[::-1], v)
for i, v in enumerate(listGray(N))]
Out[6]:
In [ ]:
In [ ]:
In [7]:
def binaryIterGray(n):
gr = [0]*n
pos = range(n+1)
yield gr
while pos[0] != n:
i = pos[0]
gr[i] = 1 - gr[i]
pos[0] = 0
pos[i] = pos[i+1]
pos[i+1] = i+1
yield gr
In [8]:
for gr in binaryIterGray(4):
print gr
Remarque: dans l'affichage précédent, les poids faibles sont à gauche. Voici la liste dans l'ordre naturel:
In [9]:
for gr in binaryIterGray(4):
print gr[::-1]
In [10]:
[l for l in binaryIterGray(3)] #bug
Out[10]:
In [11]:
[list(l) for l in binaryIterGray(3)]
Out[11]:
In [12]:
def binaryIterGrayInst(n):
gr = [0]*n
pos = range(n+1)
c = 0
yield gr
while pos[0] != n:
i = pos[0]
print (c.digits(2, padto=n)[::-1],
pos[n-1::-1], i, gr[::-1])
c += 1
gr[i] = 1 - gr[i]
pos[0] = 0
pos[i] = pos[i+1]
pos[i+1] = i+1
yield gr### Version instrumentée
In [ ]:
In [13]:
l = list(binaryIterGrayInst(4))
In [ ]:
In [2]:
def Changes(n):
if n < 1:
return
up = range(n-1)
down = range(n-2,-1,-1)
recur = Changes(n-1)
while True:
for x in down:
yield x
yield next(recur) + 1
for x in up:
yield x
yield next(recur)
def SJT(x):
try:
perm = list(x)
except:
perm = list(range(x))
n = len(perm)
yield perm
for x in Changes(n):
perm[x],perm[x+1] = perm[x+1],perm[x]
yield perm
In [4]:
list(Changes(1))
Out[4]:
In [5]:
list(Changes(2))
Out[5]:
In [6]:
list(Changes(3))
Out[6]:
In [7]:
list(Changes(4))
Out[7]:
In [16]:
L = [list(p) for p in SJT([1,2,3,4])]
L
Out[16]:
In [17]:
[L[4*i:4*i+4] for i in range(6)]
Out[17]:
In [ ]: