]> AND Private Git Repository - 16dcc.git/blob - evalPRNG/calculeStopTime.py
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
fzf
[16dcc.git] / evalPRNG / calculeStopTime.py
1 import random as rn
2 import numpy as np 
3 from math import *
4
5  
6 def bin(elem,n):
7     """Convertit un nombre en binaire"""
8     q = -1
9     res =[0 for i in range(n)]
10     i = 1
11     while q != 0:
12         q = elem // 2
13         r = elem % 2
14         res[n-i] =  r
15         elem = q
16         i+=1
17     return res
18
19 def dec(ch,n):
20     l = len(ch)
21     acc = 0
22     for i in range(l):
23         if ch[i]==1 :
24             acc = acc + 2**(n-i-1)        
25     return acc
26
27 """
28 def MarkovMatrixUnPas(fbin,n,p2n,lp2nm1):
29     MM = np.zeros(p2n*p2n).reshape((p2n,p2n))
30     # diagonal
31     for i in lp2nm1 :
32         ib = bin(i,n)
33         MM[i,i] += 0.5
34         image = fbin[tuple(ib)]
35         for j in range(n):
36             ipb =[_ for _ in ib]
37             ipb[j] = image[j]
38             MM[i, dec(ipb,n)] +=float(1)/(2*n)
39     return MM
40 """
41
42 def MarkovMatrixUnPas(fbin,n,p2n,lp2nm1):
43     MM = np.zeros(p2n*p2n).reshape((p2n,p2n))
44     # diagonal
45     for i in lp2nm1 :
46         ib = bin(i,n)
47         #MM[i,i] += 0.5
48         image = fbin[tuple(ib)]
49         for j in range(n):
50             ipb =[_ for _ in ib]
51             ipb[j] = image[j]
52             MM[i, dec(ipb,n)] +=float(1)/(n)
53     return MM
54
55
56
57
58 """
59 def MarkovMatrixSaut(fbin,n,p2n,lp2nm1):
60     MM = np.zeros(p2n*p2n).reshape((p2n,p2n))
61     # diagonal
62     for i in lp2nm1 :
63         ib = bin(i,n)
64         MM[i,i] += 0.5
65         image = fbin[tuple(ib)]
66         for j in lp2nm1:
67             st = bin(j,n)
68             ipb =[_ for _ in ib]
69             for k in range(n):
70                 if st[k] == 1 :
71                     ipb[k] = image[k]
72             MM[i, dec(ipb,n)] +=float(1)/(2*2**n)
73     return MM
74 """
75
76 def MarkovMatrixSaut(fbin,n,p2n,lp2nm1):
77     MM = np.zeros(p2n*p2n).reshape((p2n,p2n))
78     # diagonal
79     for i in lp2nm1 :
80         ib = bin(i,n)
81         #MM[i,i] += 0.5
82         image = fbin[tuple(ib)]
83         for j in lp2nm1:
84             st = bin(j,n)
85             ipb =[_ for _ in ib]
86             for k in range(n):
87                 if st[k] == 1 :
88                     ipb[k] = image[k]
89             MM[i, dec(ipb,n)] +=float(1)/(2**n)
90     return MM
91
92                 
93
94     
95
96     # f is the binary function
97     # b is the number to iterate
98     # x0 is the intial binary conf
99     xp = [e for e in x]
100     #print "************************"
101     #print "x0     ", xp
102     for j in xrange(b):
103         if rn.randint(0,1) == 1:
104
105             st = rn.randint(0,n-1)
106             #print "x["+str(st)+"]="+str(xp[st])+"->"+str(image[st])
107             xp[st] = image[st]
108         #print "xp     ",xp
109     return xp
110     
111         
112
113 ## n'est pas un circuit hmiltonien
114 lf= []
115 #lf +=[ [13, 10, 9, 14, 3, 11, 1, 12, 15, 4, 7, 5, 2, 6, 0, 8]] #4
116 #lf += [[29, 22, 25, 30, 19, 27, 24, 16, 21, 6, 5, 28, 23, 26, 1, 17, 31, 12, 15, 8, 10, 14, 13, 9, 3, 2, 7, 20, 11, 18, 0, 4],[29, 22, 21, 30, 19, 27, 24, 28, 7, 20, 5, 4, 23, 26, 25, 17, 31, 12, 15, 8, 10, 14, 13, 9, 3, 2, 1, 6, 11, 18, 0,16]] # essai des 2 elements à 5
117
118
119
120
121
122
123
124 #f += [[29, 22, 25, 30, 19, 27, 24, 16, 21, 6, 5, 28, 23, 26, 1, 17, 31, 12, 15, 8, 10, 14, 13, 9, 3, 2, 7, 20, 11, 18, 0, 4]] #5
125 lf +=  [[55, 60, 45, 44, 58, 62, 61, 48, 53, 50, 52, 36, 59, 34, 33, 49, 15, 42, 47, 46, 35, 10, 57, 56, 7, 54, 39, 37, 51, 2, 1, 40, 63, 26, 25, 30, 19, 27, 17, 28, 31, 20, 23, 21, 18, 22, 16, 24, 13, 12, 29, 8, 43, 14, 41, 0, 5, 38, 4, 6, 11, 3, 9, 32]] #6
126
127
128 lf += [[111, 94, 93, 116, 122, 90, 125, 88, 115, 126, 119, 84, 123, 98, 81, 120, 109, 106, 105, 110, 99, 107, 104, 72, 71, 118, 117, 96, 103, 102, 113, 64, 79, 86, 95, 124, 83, 91, 121, 24, 85, 22, 69, 20, 19, 114, 17, 112, 77, 76, 13, 108, 74, 10, 9, 73, 67, 66, 101, 100, 75, 82, 97, 0, 127, 54, 57, 62, 51, 59, 56, 48, 53, 38, 37, 60, 55, 58, 33, 49, 63, 44, 47, 40, 42, 46, 45, 41, 35, 34, 39, 52, 43, 50, 32, 36, 29, 28, 61, 92, 26, 18, 89, 25, 87, 30, 23, 4, 27, 2, 16, 80, 31, 78, 15, 14, 3, 11, 8, 12, 5, 70, 21, 68, 7, 6, 65, 1]] #7
129 lf += [[223, 190, 249, 254, 187, 251, 233, 232, 183, 230, 247, 180, 227, 178, 240, 248, 237, 236, 253, 172, 203, 170, 201, 168, 229, 166, 165, 244, 163, 242, 241, 192, 215, 220, 205, 216, 218, 222, 221, 208, 213, 210, 212, 214, 219, 211, 217, 209, 239, 202, 207, 140, 139, 234, 193, 204, 135, 196, 199, 132, 194, 130, 225, 200, 159, 62, 185, 252, 59, 250, 169, 56, 191, 246, 245, 52, 243, 50, 176, 48, 173, 238, 189, 44, 235, 42, 137, 184, 231, 38, 37, 228, 35, 226, 177, 224, 151, 156, 141, 152, 154, 158, 157, 144, 149, 146, 148, 150, 155, 147, 153, 145, 175, 206, 143, 136, 11, 142, 129, 8, 7, 198, 197, 4, 195, 2, 161, 160, 255, 124, 109, 108, 122, 126, 125, 112, 117, 114, 116, 100, 123, 98, 97, 113, 79, 106, 111, 110, 99, 74, 121, 120, 71, 118, 103, 101, 115, 66, 65, 104, 127, 90, 89, 94, 83, 91, 81, 92, 95, 84, 87, 85, 82, 86, 80, 88, 77, 76, 93, 72, 107, 78, 105, 64, 69, 102, 68, 70, 75, 67, 73, 96, 55, 58, 45, 188, 51, 186, 61, 40, 119, 182, 181, 53, 179, 54, 33, 49, 15, 174, 47, 60, 171, 46, 57, 32, 167, 6, 36, 164, 43, 162, 1, 0, 63, 26, 25, 30, 19, 27, 17, 28, 31, 20, 23, 21, 18, 22, 16, 24, 13, 10, 29, 14, 3, 138, 41, 12, 39, 134, 133, 5, 131, 34, 9, 128]]#8
130
131 """
132
133 # 14 = (1,1,1,0) = f(0,0,0,0)
134 #  6 = (0,1,1,0) = f(0,0,0,1)
135 #....
136 # 8  = (1,0,0,0) = f(1,1,1,1)
137
138
139 def traite_f(f):
140     n = int(log(len(f))/log(2))
141     #nbre d'elements
142     p2n = int(pow(2,n))
143     lp2nm1 = range(p2n)
144     # pour eviter de le calculer a chaque fois
145     # fbin est la fonction (representee comme un dico) 
146     # qui au tuple binaire (x3,x2,x1,x0) associe 
147     # le nombre f(x3,x2,x1,x0)
148     fbin={}
149     for j in range(len(f)):
150         fbin[tuple(bin(j,n))] = bin(f[j],n)
151
152     MM = MarkovMatrixUnPas(fbin,n,p2n,lp2nm1)
153     M = np.zeros(p2n*p2n).reshape((p2n,p2n))
154     np.copyto(M,MM)
155     
156     MMs = MarkovMatrixSaut(fbin,n,p2n,lp2nm1)
157     Ms = np.zeros(p2n*p2n).reshape((p2n,p2n))
158     np.copyto(Ms,MMs)
159     
160
161     
162     error = 1
163     cpt = 2
164     while error > dev :
165         M = np.dot(M,MM)
166         error =max([sqrt(sum([(M[i,j] - float(1)/p2n)**2  for i in range(p2n)])) for j in range(p2n)])
167         #print cpt, error, M
168         cpt +=1
169     
170
171     error = 1
172     cpts = 2
173     while error > dev :
174         if n==4 and cpts==2: 
175             print Ms
176         Ms = np.dot(Ms,MMs)
177         error =max([sqrt(sum([(Ms[i,j] - float(1)/p2n)**2  for i in range(p2n)])) for j in range(p2n)])
178         #print cpt, error, M
179         cpts +=1
180
181
182
183     return n, cpt-1, cpts-1
184     
185
186
187 for f in lf: 
188     dev = 1E-8
189     n,cpt1,cpt2 = traite_f(f)
190     print f, n,cpt1,cpt2
191     print 8*n*n + 4*n*log(n+1)#,8*n*n + (n+2)*(log(n)+2)
192     print "Pour "+str(n)+" bits et pour eps="+str(dev)+", appels a rand moy pr 1 bit genere.",
193     print "En marchant:", cpt1*log(n)/(log(2)*n),
194     print "En sautant:", cpt2
195     
196