Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
GuillaumeLaplante-Anfossi
GitHub Repository: GuillaumeLaplante-Anfossi/Poissons
Path: blob/main/sage/codePermutation.py
1017 views
1
from time import process_time
2
import sys
3
4
#adaptation au cas permutations seulement et ménage de printemps
5
n=4
6
# j'ai supprimé min, max qui existent à priori déjà
7
8
ll=Permutations(n) # liste des permutations sous forme de partition ordonnée
9
10
# paires I,J de même cardinal avec min I < min J
11
def ijsubsets(n,k):
12
l = []
13
for x in Subsets(n,2*k):
14
x2 = x.symmetric_difference(Set([min(x)]))
15
for y in Subsets(x2,k):
16
x3 = x.symmetric_difference(y)
17
l.append([sorted(x3),sorted(y)])
18
return l
19
20
vv=[a for k in range(1,n//2+1) for a in ijsubsets(n,k)]
21
# liste des couples (I,J) d'ensembles de taille k
22
23
## fonction auxiliaire (procédure) qui effectue une permutation circulaire sur les éléments d'indices pairs d'une liste an "avançant les éléments vers la gauche"
24
25
def rotEven(l):
26
aux=l[0];
27
lastInd=0
28
for i in range(2,len(l),2):
29
l[i-2]=l[i]
30
lastInd=i
31
l[lastInd]=aux
32
33
## fonction qui étant données deux permutations p1 et p2 de la forme partitions ordonnées et une paire de I,J vérifiant les conditions de Guillaume détermine si la condition poisson est vérifiée.
34
## renvoie un booléen
35
36
def poissonB(p1,p2,IJ):
37
p1red=[] #intersection de p1 avec I \cup J
38
p2red=[] #intersection de p2 avec I \cup J
39
nextSet=1 #permet de s'assurer de l'alternance voulue pour la condition poisson. Vaut 0 quand le prochain élément à voir est dans I et 1 quand il est dans J
40
IUJ=IJ[0]+IJ[1]
41
for i in range(len(p1)):
42
if p1[i] in IJ[nextSet]:
43
p1red+=[p1[i]]
44
nextSet= (nextSet+1)%2 # on a trouvé un élément de l'un : on change pour trouver un élément de l'autre
45
elif p1[i] in IJ[(nextSet+1)%2]:
46
return False # si on rencontre un élément qui n'est pas du bon ensemble, on s'arrête aussitôt de calculer
47
if p2[i] in IUJ:
48
p2red+=[p2[i]] # on continue de calculer l'intersection de p2 avec IUJ
49
if len(p1red)!=len(p2red) or len(p1red)!=len(IUJ):
50
return False
51
else:
52
i1=p1red[1] # on prend le min
53
if not(i1==min(IUJ)):
54
return False
55
p1Circ=[p1red[i] for i in range(-1,len(p1red)-1)] # on effectue la transformation circulaire de p1red
56
rotEven(p1Circ) # on décale les indices des éléments de I
57
rotEven(p1Circ) # et encore une fois
58
return p2red==p1Circ
59
60
61
# fonction qui teste si le couple de permutations p1/p2 vérifie la contre-condition de Guillaume (c'est à dire n'est pas dans la diagonale pour I,J en témoin). Les permutations sont supposées de même longueur
62
def testGuillaume(p1,p2,I,J):
63
nbJmIp1=0 # différence du nombre d'éléments de J et du nombre d'éléments de I vus dans p1 à l'instant t
64
nbImJp2=0 # différence du nombre d'éléments de I et du nombre d'éléments de J vus dans p2 à l'instant t
65
for i in range(len(p1)):
66
if p1[i] in J:
67
nbJmIp1 += 1
68
elif p1[i] in I:
69
nbJmIp1 += -1
70
if p2[i] in I:
71
nbImJp2 += 1
72
elif p2[i] in J:
73
nbImJp2 += -1
74
if nbJmIp1<0 or nbImJp2<0:
75
return False
76
return True
77
78
# fonction qui teste si deux partttions ordonénes sont dans la diagonale
79
def testDiag(p1,p2,I,J):
80
nbImJp1=0 # différence du nombre d'éléments de J et du nombre d'éléments de I vus dans p1 à l'instant t
81
nbJmIp2=0 # différence du nombre d'éléments de I et du nombre d'éléments de J vus dans p2 à l'instant t
82
for i in range(len(p1)):
83
for j in p1[i]:
84
if j in I:
85
nbImJp1 += 1
86
elif j in J:
87
nbImJp1 += -1
88
if nbImJp1>0:
89
return True
90
for i in range(len(p2)):
91
for k in p2[i]:
92
if k in J:
93
nbJmIp2 += 1
94
elif k in I:
95
nbJmIp2 += -1
96
if nbJmIp2>0:
97
return True
98
return False
99
100
# test direct de partitions ordonnées
101
def test(p1,p2):
102
for [I,J] in vv:
103
if not(testDiag(p1,p2,I,J)):
104
return False
105
return True
106
107
## fonction qui vérifie le critère poisson sur toutes les permutations
108
## affiche toutes les paires de permutations comparables pour l'ordre faible, mais pas dans la diagonale
109
#vv : liste des (I,J)
110
#ll : liste des permutations
111
#n : n courant
112
##n=5, affiche 90
113
## le test avec n=6 et ll=permutations met 140sec, affiche 3312
114
## le test avec n=7 et ll=ordre faible met quelques heures, affiche 122 400
115
## après benchmark, affiche
116
## pour n= 7
117
## longueur de vv 175
118
## ll et vv initialisés
119
## longueur de ll 672697
120
## ... décompte jusque 647630 --> à quoi correspond-il ?
121
## la condition poisson est bien vérifiée partout !
122
## 16.345780801000018 250.77963907799997 267.125419879
123
## pour n=8, le calcul s'interrompt au moment de l'initialisation de la liste ll
124
## /usr/share/sagemath/bin/sage-python : ligne 2 : 46739 Processus arrêté sage -python "$@"
125
126
def poissMain(n):
127
print("pour n=",n)
128
start=process_time()
129
good=1
130
vv=[a for k in range(2,n//2+1) for a in ijsubsets(n,k)]
131
print("longueur de vv",len(vv))
132
ll=[i for i in Permutations(n).weak_lattice().relations()]
133
print("ll et vv initialisés")
134
print("longueur de ll",len(ll))
135
middle=process_time()
136
count=0
137
for [x,y] in ll:
138
if x!=y:
139
np=0 # indique le nombre d'éléments sur lesquels un test poisson qui échoue
140
IJ=[] # paire des IJ qui font échouer
141
for [I,J] in vv: #on teste sur tous les (I,J)
142
if testGuillaume(x,y,I,J) :
143
good=0 # good vaut 1 quand x et y sont dans la diagonale
144
IJ+=[[I,J]]; # ajout de la paire problématique
145
if good==0 : # échoue le test, mais pas pour les inversions
146
poissonV=[]
147
poissonF=[]
148
for ij in IJ:
149
if poissonB(x,y,[ij[0], ij[1]]):
150
poissonV+=[[Set(ij[0]), Set(ij[1])]]
151
else:
152
poissonF+=[[Set(ij[0]), Set(ij[1])]]
153
if len(poissonF)!=0:
154
np=len(poissonF)
155
for ij in poissonF:
156
abloc=False
157
for ab in poissonV:
158
if ab[0].issubset(ij[0]) and ab[1].issubset(ij[1]):
159
abloc=True
160
if abloc:
161
np-=1
162
else:
163
print(x,y, poissonV, poissonF, ij)
164
if np!=0:
165
print("il y a un hic")
166
count=count+1
167
if count%1000==0:
168
print(count)
169
print (count)
170
if np==0:
171
print("la condition poisson est bien vérifiée partout !")
172
end=process_time()
173
print(middle-start,end-middle, end-start)
174
175
176
177
# fonction qui génère tous les couples qu'il nous faut
178
def ordreFaible(n):
179
l_perm=[]
180
p=Permutations(n)
181
for x in p:
182
for y in x.permutohedron_greater():
183
# if y!=x:
184
# décommenter quand on cherche les motifs poissons
185
l_perm+=[[x,y]]
186
return l_perm
187
188
189
## fonction comme la précédente, mais avec une autre manière de générer ll
190
#vv : liste des (I,J)
191
#ll : liste des permutations
192
#n : n courant
193
# si la conjecture est vraie, on doit retrouver le même nombre que précédemment
194
# un peu moins efficace que la version Main sur la création de paires
195
## pour n= 4
196
## longueur de vv 3
197
## longueur de ll 127
198
## nbre de couples qui ne sont pas dans la diagonale : 2
199
## à comparer avec 2
200
## la condition poisson est bien vérifiée partout !
201
## 0.001861265999999695 0.000726762000000214 0.002588027999999909
202
## pour n=5
203
## longueur de vv 15
204
## longueur de ll 1779
205
## nbre de couples qui ne sont pas dans la diagonale : 90
206
## à comparer avec 90
207
## la condition poisson est bien vérifiée partout !
208
## 0.031438687999999715 0.05062205200000047 0.08206074000000019
209
## pour n= 6
210
##longueur de vv 55
211
##longueur de ll 30991
212
## nbre de couples qui ne sont pas dans la diagonale : 3312
213
## à comparer avec 3312
214
## la condition poisson est bien vérifiée partout !
215
## 1.0201610000003711 3.5473550360002264 4.5675160360005975
216
## pour n=7
217
## longueur de vv 175
218
## longueur de ll 667657
219
## nbre de couples qui ne sont pas dans la diagonale : 122400
220
## à comparer avec 122400
221
## la condition poisson est bien vérifiée partout !
222
## 73.30185978400004 263.410195403 336.71205518700003
223
## pour n=8
224
## longueur de vv 525
225
## longueur de ll 17 511 003
226
## ...
227
## 17511003
228
## la condition poisson est bien vérifiée partout !
229
## 8506.674139542 21494.009500223 30000.683639764997
230
231
def poissFaible(n):
232
with open('poissonFFseul'+str(n)+'.txt', 'w') as f:
233
sys.stdout=f
234
print("pour n=",n)
235
start=process_time()
236
vv=[a for k in range(2,n//2+1) for a in ijsubsets(n,k)]
237
print("longueur de vv",len(vv))
238
ll=ordreFaible(n)
239
print("longueur de ll",len(ll))
240
middle=process_time()
241
good=1
242
count=0
243
for [x,y] in ll:
244
good=1
245
np=0 # indique le nombre d'éléments sur lesquels un test poisson qui échoue
246
IJ=[] # paire des IJ qui font échouer
247
for [I,J] in vv: #on teste sur tous les (I,J)
248
if testGuillaume(x,y,I,J) :
249
good=0 # good vaut 1 quand x et y sont dans la diagonale
250
IJ+=[[I,J]]; # ajout de la paire problématique
251
# print("x=", x,", y= ",y,", IJ=", IJ)
252
if good==0 : # échoue le test, mais pas pour les inversions
253
poissonV=[]
254
poissonF=[]
255
for ij in IJ:
256
if poissonB(x,y,[ij[0], ij[1]]):
257
poissonV+=[[Set(ij[0]), Set(ij[1])]]
258
else:
259
poissonF+=[[Set(ij[0]), Set(ij[1])]]
260
if len(poissonF)!=0:
261
np=len(poissonF)
262
for ij in poissonF:
263
abloc=False
264
for ab in poissonV:
265
if ab[0].issubset(ij[0]) and ab[1].issubset(ij[1]):
266
abloc=True
267
if abloc:
268
np-=1
269
else:
270
print(x,y, poissonV, poissonF, ij)
271
if np!=0:
272
print("il y a un hic")
273
print("x=",x," , y=",y,", poissonV=",poissonV,", poissonF=", poissonF)
274
# print("="*10)
275
count=count+1
276
## print("x=", x, ", y=", y, ", poissonV=", poissonV, "poissonF=", poissonF)
277
print ("nbre de couples qui ne sont pas dans la diagonale :",count)
278
diag=[1, 1, 3, 17, 149, 1809, 28399, 550297, 12732873, 343231361, 10576764251, 367054970721, 14173669352413, 602974492511377, 28027436035348359, 1413479599558432169, 76879014760731439889, 4486205132570631391617, 279595430611791210216883] # OEIS A213507 : nombre de couples de permutations dans la diagonale
279
wo=[1, 1, 3, 17, 151, 1899, 31711, 672697, 17551323, 549500451, 20246665349, 864261579999, 42190730051687, 2329965898878307] # OEIS A007767 : nombre d'intervalles de l'ordre faible
280
print("à comparer avec",wo[n]-diag[n])
281
if np==0:
282
print("la condition poisson est bien vérifiée partout !")
283
end=process_time()
284
print(middle-start,end-middle, end-start)
285
286
# fonction qui renvoie la liste des [I,J] vérifiant la conjecture d'Hugues
287
# fonction cassée à réparer... (test n=4)
288
289
def IJreduit(n):
290
vvDeb=[a for k in range(2,n//2+1) for a in ijsubsets(n,k)]
291
nbx= 0 # nombre de x vu dans l'intervalle [1,t] où t est la position courante
292
nby= 0 # nombre de y vu dans l'intervalle [1,t] où t est la position courante
293
vvFin=[]
294
for [x,y] in vvDeb:
295
nbx= 0 # nombre de x vu dans l'intervalle [1,t] où t est la position courante
296
nby= 0 # nombre de y vu dans l'intervalle [1,t] où t est la position courante
297
cond=True
298
for t in range(min(x)+1, min(y)):
299
if t in x:
300
cond=False
301
break
302
if cond:
303
for t in range(min(y),n+1):
304
if t in x :
305
nbx+=1
306
if t in y:
307
nby+=1
308
if nbx>=nby:
309
cond=False
310
break
311
if cond:
312
vvFin+=[[x,y]] # si la condition d'Hugues est vérifié, on l'ajoute à la liste
313
return vvFin
314
315
316
# procédure qui vérifie si la conjecture est vérifiée avec un argument de dénombrement
317
# sage:poissOracle(3)
318
# n= 3
319
# On veut trouver 0 paires
320
# longueur de vv 0
321
# longueur de ll 11
322
# nbre de couples qui vérifie poisson : 0
323
# 0.0008505190000960283 0.00012186299977656745 0.0009723819998725958
324
# sage:poissOracle(4)  
325
# n= 4
326
# On veut trouver 2 paires
327
# longueur de vv 1
328
# longueur de ll 127
329
# nbre de couples qui vérifie poisson : 2
330
## nombre de paires (I,J) utilisées : 1
331
## [[[1, 4], [2, 3]]]
332
## 0.0018400100000235398 0.00047271399989767815 0.002312723999921218
333
# sage: poissOracle(5)
334
# n= 5
335
# On veut trouver 90 paires
336
## longueur de vv 5
337
## longueur de ll 1779
338
## nbre de couples qui vérifie poisson : 90
339
## nombre de paires (I,J) utilisées : 5
340
## [[[2, 5], [3, 4]], [[1, 5], [2, 4]], [[1, 4], [2, 3]], [[1, 5], [2, 3]], [[1, 5], [3, 4]]]
341
## 0.034213825000051656 0.025045007000016994 0.05925883200006865
342
# sage: poissOracle(6)
343
# n= 6
344
# On veut trouver 3312 paires
345
## longueur de vv 17
346
## longueur de ll 30991
347
## nbre de couples qui vérifie poisson : 3312
348
## nombre de paires (I,J) utilisées : 17
349
## [[[3, 6], [4, 5]], [[2, 6], [3, 5]], [[2, 5], [3, 4]], [[2, 6], [3, 4]], [[2, 6], [4, 5]], [[1, 6], [2, 5]], [[1, 5], [2, 4]], [[1, 6], [2, 4]], [[1, 4], [2, 3]], [[1, 4, 6], [2, 3, 5]], [[1, 5], [2, 3]], [[1, 6], [2, 3]], [[1, 5, 6], [2, 3, 4]], [[1, 6], [3, 5]], [[1, 5], [3, 4]], [[1, 6], [3, 4]], [[1, 6], [4, 5]]]
350
## 0.9965422919999583 1.4687693739999759 2.465311665999934
351
# sage: poissOracle(7)
352
# n= 7
353
# On veut trouver 122400 paires
354
# longueur de vv 49
355
# longueur de ll 667657
356
# trouvés : 100000
357
# nbre de couples qui vérifie poisson : 122400
358
# nombre de paires (I,J) utilisées : 49
359
# [[[4, 7], [5, 6]], [[3, 7], [4, 6]], [[3, 6], [4, 5]], [[3, 7], [4, 5]], [[3, 7], [5, 6]], [[2, 7], [3, 6]], [[2, 6], [3, 5]], [[2, 7], [3, 5]], [[2, 5], [3, 4]], [[2, 5, 7], [3, 4, 6]], [[2, 6], [3, 4]], [[2, 7], [3, 4]], [[2, 6, 7], [3, 4, 5]], [[2, 7], [4, 6]], [[2, 6], [4, 5]], [[2, 7], [4, 5]], [[2, 7], [5, 6]], [[1, 7], [2, 6]], [[1, 6], [2, 5]], [[1, 7], [2, 5]], [[1, 5], [2, 4]], [[1, 5, 7], [2, 4, 6]], [[1, 6], [2, 4]], [[1, 7], [2, 4]], [[1, 4], [2, 3]], [[1, 4, 7], [2, 3, 6]], [[1, 4, 6], [2, 3, 5]], [[1, 4, 7], [2, 3, 5]], [[1, 5], [2, 3]], [[1, 5, 7], [2, 3, 6]], [[1, 6], [2, 3]], [[1, 7], [2, 3]], [[1, 6, 7], [2, 4, 5]], [[1, 6, 7], [2, 3, 5]], [[1, 5, 6], [2, 3, 4]], [[1, 5, 7], [2, 3, 4]], [[1, 6, 7], [2, 3, 4]], [[1, 7], [3, 6]], [[1, 6], [3, 5]], [[1, 7], [3, 5]], [[1, 5], [3, 4]], [[1, 5, 7], [3, 4, 6]], [[1, 6], [3, 4]], [[1, 7], [3, 4]], [[1, 6, 7], [3, 4, 5]], [[1, 7], [4, 6]], [[1, 6], [4, 5]], [[1, 7], [4, 5]], [[1, 7], [5, 6]]]
360
# 79.87540812600014 119.49560694699994 199.37101507300008
361
# n= 8 (lancé à 21h43)
362
# On veut trouver 4818450 paires
363
# longueur de vv 131
364
# longueur de ll 17511003
365
# trouvés : 100000
366
# ....trouvés : 4800000
367
# nbre de couples qui vérifie poisson : 4818450
368
# nombre de paires (I,J) utilisées : 131
369
# [[[5, 8], [6, 7]], [[4, 8], [5, 7]], [[4, 7], [5, 6]], [[4, 8], [5, 6]], [[4, 8], [6, 7]], [[3, 8], [4, 7]], [[3, 7], [4, 6]], [[3, 8], [4, 6]], [[3, 6], [4, 5]], [[3, 6, 8], [4, 5, 7]], [[3, 7], [4, 5]], [[3, 8], [4, 5]], [[3, 7, 8], [4, 5, 6]], [[3, 8], [5, 7]], [[3, 7], [5, 6]], [[3, 8], [5, 6]], [[3, 8], [6, 7]], [[2, 8], [3, 7]], [[2, 7], [3, 6]], [[2, 8], [3, 6]], [[2, 6], [3, 5]], [[2, 6, 8], [3, 5, 7]], [[2, 7], [3, 5]], [[2, 8], [3, 5]], [[2, 5], [3, 4]], [[2, 5, 8], [3, 4, 7]], [[2, 5, 7], [3, 4, 6]], [[2, 5, 8], [3, 4, 6]], [[2, 6], [3, 4]], [[2, 6, 8], [3, 4, 7]], [[2, 7], [3, 4]], [[2, 8], [3, 4]], [[2, 7, 8], [3, 5, 6]], [[2, 7, 8], [3, 4, 6]], [[2, 6, 7], [3, 4, 5]], [[2, 6, 8], [3, 4, 5]], [[2, 7, 8], [3, 4, 5]], [[2, 8], [4, 7]], [[2, 7], [4, 6]], [[2, 8], [4, 6]], [[2, 6], [4, 5]], [[2, 6, 8], [4, 5, 7]], [[2, 7], [4, 5]], [[2, 8], [4, 5]], [[2, 7, 8], [4, 5, 6]], [[2, 8], [5, 7]], [[2, 7], [5, 6]], [[2, 8], [5, 6]], [[2, 8], [6, 7]], [[1, 8], [2, 7]], [[1, 7], [2, 6]], [[1, 8], [2, 6]], [[1, 6], [2, 5]], [[1, 6, 8], [2, 5, 7]], [[1, 7], [2, 5]], [[1, 8], [2, 5]], [[1, 5], [2, 4]], [[1, 5, 8], [2, 4, 7]], [[1, 5, 7], [2, 4, 6]], [[1, 5, 8], [2, 4, 6]], [[1, 6], [2, 4]], [[1, 6, 8], [2, 4, 7]], [[1, 7], [2, 4]], [[1, 8], [2, 4]], [[1, 4], [2, 3]], [[1, 4, 8], [2, 3, 7]], [[1, 4, 7], [2, 3, 6]], [[1, 4, 8], [2, 3, 6]], [[1, 4, 6], [2, 3, 5]], [[1, 4, 6, 8], [2, 3, 5, 7]], [[1, 4, 7], [2, 3, 5]], [[1, 4, 8], [2, 3, 5]], [[1, 5], [2, 3]], [[1, 5, 8], [2, 3, 7]], [[1, 5, 7], [2, 3, 6]], [[1, 5, 8], [2, 3, 6]], [[1, 6], [2, 3]], [[1, 6, 8], [2, 3, 7]], [[1, 7], [2, 3]], [[1, 8], [2, 3]], [[1, 7, 8], [2, 5, 6]], [[1, 7, 8], [2, 4, 6]], [[1, 4, 7, 8], [2, 3, 5, 6]], [[1, 7, 8], [2, 3, 6]], [[1, 6, 7], [2, 4, 5]], [[1, 6, 8], [2, 4, 5]], [[1, 6, 7], [2, 3, 5]], [[1, 6, 8], [2, 3, 5]], [[1, 7, 8], [2, 4, 5]], [[1, 7, 8], [2, 3, 5]], [[1, 5, 6], [2, 3, 4]], [[1, 5, 6, 8], [2, 3, 4, 7]], [[1, 5, 7], [2, 3, 4]], [[1, 5, 8], [2, 3, 4]], [[1, 5, 7, 8], [2, 3, 4, 6]], [[1, 6, 7], [2, 3, 4]], [[1, 6, 8], [2, 3, 4]], [[1, 7, 8], [2, 3, 4]], [[1, 6, 7, 8], [2, 3, 4, 5]], [[1, 8], [3, 7]], [[1, 7], [3, 6]], [[1, 8], [3, 6]], [[1, 6], [3, 5]], [[1, 6, 8], [3, 5, 7]], [[1, 7], [3, 5]], [[1, 8], [3, 5]], [[1, 5], [3, 4]], [[1, 5, 8], [3, 4, 7]], [[1, 5, 7], [3, 4, 6]], [[1, 5, 8], [3, 4, 6]], [[1, 6], [3, 4]], [[1, 6, 8], [3, 4, 7]], [[1, 7], [3, 4]], [[1, 8], [3, 4]], [[1, 7, 8], [3, 5, 6]], [[1, 7, 8], [3, 4, 6]], [[1, 6, 7], [3, 4, 5]], [[1, 6, 8], [3, 4, 5]], [[1, 7, 8], [3, 4, 5]], [[1, 8], [4, 7]], [[1, 7], [4, 6]], [[1, 8], [4, 6]], [[1, 6], [4, 5]], [[1, 6, 8], [4, 5, 7]], [[1, 7], [4, 5]], [[1, 8], [4, 5]], [[1, 7, 8], [4, 5, 6]], [[1, 8], [5, 7]], [[1, 7], [5, 6]], [[1, 8], [5, 6]], [[1, 8], [6, 7]]]
370
# 8680.734895293 6312.357728191999 14993.092623484998
371
##(précedemment :  8506.674139542 21494.009500223 30000.683639764997)
372
# n= 10
373
# On veut trouver 9669901098 paires
374
# longueur de vv 869
375
# arrêté le calcul de ll au bout de 2h...
376
377
378
def poissOracle(n):
379
print("n=",n)
380
diag=[1, 1, 3, 17, 149, 1809, 28399, 550297, 12732873, 343231361, 10576764251, 367054970721, 14173669352413, 602974492511377, 28027436035348359, 1413479599558432169, 76879014760731439889, 4486205132570631391617, 279595430611791210216883] # OEIS A213507 : nombre de couples de permutations dans la diagonale
381
wo=[1, 1, 3, 17, 151, 1899, 31711, 672697, 17551323, 549500451, 20246665349, 864261579999, 42190730051687, 2329965898878307] # OEIS A007767 : nombre d'intervalles de l'ordre faible
382
print("On veut trouver ",wo[n]-diag[n]," paires")
383
start=process_time()
384
vv=IJreduit(n)
385
print("longueur de vv",len(vv))
386
ll=ordreFaible(n)
387
print("longueur de ll",len(ll))
388
middle=process_time()
389
good=1
390
count=0
391
IJ=[]
392
for [x,y] in ll:
393
good=1
394
for [I,J] in vv: #on teste sur tous les (I,J)
395
if poissonB(x,y,[I,J]):
396
good=0 # good vaut 0 quand x et y vérifie la condition de poisson forte
397
if [I,J] not in IJ:
398
IJ+=[[I,J]]
399
break
400
if good==0:
401
count=count+1
402
if count%100000==0:
403
print("trouvés :",count)
404
print ("nbre de couples qui vérifie poisson :",count)
405
end=process_time()
406
print("nombre de paires (I,J) utilisées : ",len(IJ))
407
print(IJ)
408
print(middle-start,end-middle, end-start)
409
410
## fonction qui renvoie les sous-ensembles de [I,J] vérifiant la condition de Hugues
411
412
413
414
def goodSubset(I,J):
415
aux=[[A,B] for k in range(2,len(I)) for A in Combinations(I,k).list() for B in Combinations(J,k).list() ]
416
nba=0
417
nbb=0
418
res=[]
419
for [A,B] in aux:
420
if min(A)>min(B):
421
cond=False
422
else:
423
nba= 0 # nombre de x vu dans l'intervalle [1,t] où t est la position courante
424
nbb= 0 # nombre de y vu dans l'intervalle [1,t] où t est la position courante
425
cond=True
426
for t in range(min(A)+1, min(B)):
427
if t in A:
428
cond=False
429
break
430
if cond:
431
for t in range(min(B),n+1):
432
if t in A :
433
nba+=1
434
if t in B:
435
nbb+=1
436
if nba>=nbb:
437
cond=False
438
break
439
if cond:
440
res+=[[A,B]] # si la condition d'Hugues est vérifié, on l'ajoute à la liste
441
return res
442
443
444
## Dernier essai d'accélération : utiliser le fait que si (I,J) bug pour la condition de Guillaume, alors un de ses sous-ensembles doit vérifier la condition poisson
445
## bug --> à voir !
446
447
def poissTGV(n):
448
print("pour n=",n)
449
diag=[1, 1, 3, 17, 149, 1809, 28399, 550297, 12732873, 343231361, 10576764251, 367054970721, 14173669352413, 602974492511377, 28027436035348359, 1413479599558432169, 76879014760731439889, 4486205132570631391617, 279595430611791210216883] # OEIS A213507 : nombre de couples de permutations dans la diagonale
450
wo=[1, 1, 3, 17, 151, 1899, 31711, 672697, 17551323, 549500451, 20246665349, 864261579999, 42190730051687, 2329965898878307] # OEIS A007767 : nombre d'intervalles de l'ordre faible
451
print("On veut trouver ",wo[n]-diag[n]," paires")
452
start=process_time()
453
vv=[a for a in ijsubsets(n,n//2)]
454
print("longueur de vv",len(vv))
455
ll=ordreFaible(n)
456
print("longueur de ll",len(ll))
457
middle=process_time()
458
good=True # vaut True si la paire est dans la diagonale
459
count=0
460
poisson=False # a-t-on trouvé un poisson
461
for [x,y] in ll:
462
good=True
463
poisson=False
464
for [I,J] in vv: #on teste sur tous les (I,J)
465
if testGuillaume(x,y,I,J) :
466
count+=1
467
# print("x=",x,", y=",y,", [I,J]=",[I,J])
468
good=False # good vaut 1 quand x et y sont dans la diagonale
469
if poissonB(x,y,[I,J]):
470
poisson=True
471
## print("poisson avec ",[I,J])
472
else:
473
## print("pas de poisson avec [I,J]")
474
for AB in goodSubset(I,J):
475
if poissonB(x,y,AB):
476
poisson=True
477
## print("poisson avec ",AB)
478
break
479
if not(poisson):
480
print("cas sans sous-poisson trouvé pour x=",x," et y=",y, "[I,J]=",I,J)
481
break
482
print ("nbre de couples qui ne sont pas dans la diagonale :",count)
483
end=process_time()
484
print(middle-start,end-middle, end-start)
485
486
## fonction qui compte le nombre de couples dans la diagonale en fonction de leurs dimensions
487
488
def nbDiag(n):
489
print("n=",n)
490
diag=[1, 1, 3, 17, 149, 1809, 28399, 550297, 12732873, 343231361, 10576764251, 367054970721, 14173669352413, 602974492511377, 28027436035348359, 1413479599558432169, 76879014760731439889, 4486205132570631391617, 279595430611791210216883] # OEIS A213507 : nombre de couples de permutations dans la diagonale
491
print("On veut trouver ",diag[n]," paires")
492
start=process_time()
493
vv=IJreduit(n)
494
# print("longueur de vv",len(vv))
495
ll=ordreFaible(n)
496
# print(ll)
497
middle=process_time()
498
good=1
499
count=0
500
for [x,y] in ll:
501
# print(x,y)
502
good=1
503
for [I,J] in vv: #on teste sur tous les (I,J)
504
if poissonB(x,y,[I,J]):
505
good=0 # good vaut 0 quand x et y vérifie la condition de poisson forte
506
break
507
if good==1:
508
count=count+1
509
if count%100000==0:
510
print("trouvés :",count)
511
# print(good)
512
print ("nbre de couples danns la diagonale :",count)
513
end=process_time()
514
print(middle-start,end-middle, end-start)
515
516
517