2019-02-04 14:43:31 +01:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
|
|
import numpy as np
|
|
|
|
|
2019-03-01 09:53:32 +01:00
|
|
|
N=10
|
|
|
|
p = 0.2
|
2019-02-04 14:43:31 +01:00
|
|
|
P = np.random.rand(N)
|
2019-03-01 09:53:32 +01:00
|
|
|
X = np.zeros(N,dtype='int')
|
|
|
|
for i in range(N):
|
|
|
|
if P[i] > p:
|
|
|
|
X[i] = 1
|
2019-02-04 14:43:31 +01:00
|
|
|
|
2019-03-01 09:53:32 +01:00
|
|
|
X=[0,1,0,0,1,0,0,0,0,0]
|
|
|
|
print(X)
|
2019-02-04 14:43:31 +01:00
|
|
|
|
2019-03-01 09:53:32 +01:00
|
|
|
def binary(n,m,b=2):
|
2019-02-04 14:43:31 +01:00
|
|
|
"""
|
|
|
|
Convertie un nombre décimal en sa version binaire tronqué à m bits.
|
|
|
|
"""
|
2019-03-01 09:53:32 +01:00
|
|
|
binaire= np.floor(n*b**m) # on se décale dans les entiers et on floor
|
|
|
|
|
|
|
|
return binaire,np.binary_repr(int(binaire))
|
2019-02-04 14:43:31 +01:00
|
|
|
|
2019-03-01 09:53:32 +01:00
|
|
|
def arithm(X,p):
|
2019-02-04 14:43:31 +01:00
|
|
|
l=[0]
|
|
|
|
h= [1]
|
|
|
|
for x in X:
|
|
|
|
if x == 0:
|
2019-03-01 09:53:32 +01:00
|
|
|
h.append(l[-1]+p*(h[-1]-l[-1]))
|
2019-02-04 14:43:31 +01:00
|
|
|
l.append(l[-1])
|
|
|
|
else:
|
2019-03-01 09:53:32 +01:00
|
|
|
l.append(l[-1]+p*(h[-1]-l[-1]))
|
2019-02-04 14:43:31 +01:00
|
|
|
h.append(h[-1])
|
|
|
|
|
|
|
|
lmb = (l[-1]+h[-1])/2
|
2019-03-01 09:53:32 +01:00
|
|
|
|
2019-02-04 14:43:31 +01:00
|
|
|
mu = int(-np.log2(h[-1]-l[-1]))+1
|
2019-03-01 09:53:32 +01:00
|
|
|
code = binary(lmb,mu)
|
|
|
|
return code,lmb,mu
|
|
|
|
|
|
|
|
def arithm_pratique(X,p):
|
|
|
|
l = [0] # borne inférieur
|
|
|
|
h =[1] # borne supérieur
|
|
|
|
f = 0 # follow
|
|
|
|
c =[] # code
|
|
|
|
for k in range(len(X)):
|
|
|
|
print("for loop")
|
|
|
|
if X[k] == 0:
|
|
|
|
l.append(l[-1])
|
|
|
|
h.append(l[-1]+p*(h[-1]-l[-1]))
|
|
|
|
else:
|
|
|
|
l.append(l[-1]+p*(h[-1]-l[-1]))
|
|
|
|
h.append(h[-1])
|
|
|
|
print(X[k])
|
|
|
|
print(l[-3:])
|
|
|
|
print(h[-3:])
|
|
|
|
while ((l[-1]>=0 and h[-1]<0.5)
|
|
|
|
or (l[-1]>=0.5 and h[-1]<1)
|
|
|
|
or (l[-1]>= 0.25 and h[-1]<0.75)):
|
|
|
|
print(" loop")
|
|
|
|
if (l[-1]>=0 and h[-1]<0.5):
|
|
|
|
print(" case 1")
|
|
|
|
c += [0]+[1]*f
|
|
|
|
l[-1] *=2
|
|
|
|
h[-1] *=2
|
|
|
|
elif (l[-1]>=0.5 and h[-1]<1):
|
|
|
|
print(" case 2")
|
|
|
|
c += [1]+[0]*f
|
|
|
|
l[-1] = 2*l[-1]-1
|
|
|
|
h[-1] = 2*h[-1]-1
|
|
|
|
elif (l[-1]>= 0.25 and h[-1]<0.75):
|
|
|
|
print(" case 3")
|
|
|
|
f +=1
|
|
|
|
l[-1] = 2*l[-1]-0.5
|
|
|
|
h[-1] = 2*h[-1]-0.5
|
|
|
|
return c
|
|
|
|
|
|
|
|
#print(arithm(X,p))
|
|
|
|
print(arithm_pratique(X,p))
|