In [1]:
(None, None)
Out[1]:
In [2]:
def BTiter(n):
if n == 0:
yield None
else:
for i in range(n):
for g in BTiter(i):
for d in BTiter(n-i-1):
yield (g, d)
In [3]:
list(BTiter(3))
Out[3]:
In [4]:
[len(list(BTiter(i))) for i in range(10)]
Out[4]:
In [ ]:
In [ ]:
In [5]:
@cached_function
def catalan(n):
if n == 0:
return 1
else:
return sum(catalan(i)*catalan(n-1-i) for i in range(n))
In [6]:
[catalan(n) for n in range(10)]
Out[6]:
In [7]:
def BTunrank(n, r):
if n == 0:
if r == 0:
return None
else:
raise IndexError
iblock = 0
tailleg = catalan(iblock)
tailled = catalan(n - 1 - iblock)
while r >= tailleg * tailled:
r -= tailleg * tailled
iblock += 1
if iblock > n - 1:
raise IndexError
tailleg = catalan(iblock)
tailled = catalan(n - 1 - iblock)
# produit cartesien
igch = r // tailled
idte = r % tailled
return (BTunrank(iblock, igch), BTunrank(n - 1 - iblock, idte))
In [8]:
BTunrank(6, 67)
Out[8]:
In [9]:
[list(BTiter(N)) == [BTunrank(N, i) for i in range(catalan(N))]
for N in range(10)]
Out[9]:
In [10]:
catalan(50)
Out[10]:
In [11]:
x = randint(0, catalan(50))
In [12]:
x
Out[12]:
In [13]:
BTunrank(50, x)
Out[13]:
In [14]:
def prof(t):
if t is None:
return 0
else:
return 1 + max(prof(t[0]), prof(t[1]))
In [15]:
prof(BTunrank(50, x))
Out[15]:
In [16]:
def BTrandom(n):
return BTunrank(n, randint(0, catalan(n)-1))
In [17]:
BTrandom(10)
Out[17]:
In [18]:
rep = 100
1./rep*sum(prof(BTrandom(200)) for _ in range(100))
Out[18]:
In [19]:
def moy_prof(n):
rep = 100
return 1./rep*sum(prof(BTrandom(n)) for _ in range(100))
In [20]:
sum(point((i,moy_prof(i))) for i in [1,2,4,8,16,32,64,128,256])
Out[20]:
In [21]:
sum(point((log(i),log(moy_prof(i)))) for i in [1,2,4,8,16,32,64,128,256])
Out[21]:
In [22]:
[(log(1.*i),log(moy_prof(i))) for i in [1,2,4,8,16,32,64,128,256]]
Out[22]:
In [ ]: