Path: blob/main/sage/codePermutation.py
1017 views
from time import process_time1import sys23#adaptation au cas permutations seulement et ménage de printemps4n=45# j'ai supprimé min, max qui existent à priori déjà67ll=Permutations(n) # liste des permutations sous forme de partition ordonnée89# paires I,J de même cardinal avec min I < min J10def ijsubsets(n,k):11l = []12for x in Subsets(n,2*k):13x2 = x.symmetric_difference(Set([min(x)]))14for y in Subsets(x2,k):15x3 = x.symmetric_difference(y)16l.append([sorted(x3),sorted(y)])17return l1819vv=[a for k in range(1,n//2+1) for a in ijsubsets(n,k)]20# liste des couples (I,J) d'ensembles de taille k2122## 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"2324def rotEven(l):25aux=l[0];26lastInd=027for i in range(2,len(l),2):28l[i-2]=l[i]29lastInd=i30l[lastInd]=aux3132## 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.33## renvoie un booléen3435def poissonB(p1,p2,IJ):36p1red=[] #intersection de p1 avec I \cup J37p2red=[] #intersection de p2 avec I \cup J38nextSet=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 J39IUJ=IJ[0]+IJ[1]40for i in range(len(p1)):41if p1[i] in IJ[nextSet]:42p1red+=[p1[i]]43nextSet= (nextSet+1)%2 # on a trouvé un élément de l'un : on change pour trouver un élément de l'autre44elif p1[i] in IJ[(nextSet+1)%2]:45return False # si on rencontre un élément qui n'est pas du bon ensemble, on s'arrête aussitôt de calculer46if p2[i] in IUJ:47p2red+=[p2[i]] # on continue de calculer l'intersection de p2 avec IUJ48if len(p1red)!=len(p2red) or len(p1red)!=len(IUJ):49return False50else:51i1=p1red[1] # on prend le min52if not(i1==min(IUJ)):53return False54p1Circ=[p1red[i] for i in range(-1,len(p1red)-1)] # on effectue la transformation circulaire de p1red55rotEven(p1Circ) # on décale les indices des éléments de I56rotEven(p1Circ) # et encore une fois57return p2red==p1Circ585960# 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 longueur61def testGuillaume(p1,p2,I,J):62nbJmIp1=0 # différence du nombre d'éléments de J et du nombre d'éléments de I vus dans p1 à l'instant t63nbImJp2=0 # différence du nombre d'éléments de I et du nombre d'éléments de J vus dans p2 à l'instant t64for i in range(len(p1)):65if p1[i] in J:66nbJmIp1 += 167elif p1[i] in I:68nbJmIp1 += -169if p2[i] in I:70nbImJp2 += 171elif p2[i] in J:72nbImJp2 += -173if nbJmIp1<0 or nbImJp2<0:74return False75return True7677# fonction qui teste si deux partttions ordonénes sont dans la diagonale78def testDiag(p1,p2,I,J):79nbImJp1=0 # différence du nombre d'éléments de J et du nombre d'éléments de I vus dans p1 à l'instant t80nbJmIp2=0 # différence du nombre d'éléments de I et du nombre d'éléments de J vus dans p2 à l'instant t81for i in range(len(p1)):82for j in p1[i]:83if j in I:84nbImJp1 += 185elif j in J:86nbImJp1 += -187if nbImJp1>0:88return True89for i in range(len(p2)):90for k in p2[i]:91if k in J:92nbJmIp2 += 193elif k in I:94nbJmIp2 += -195if nbJmIp2>0:96return True97return False9899# test direct de partitions ordonnées100def test(p1,p2):101for [I,J] in vv:102if not(testDiag(p1,p2,I,J)):103return False104return True105106## fonction qui vérifie le critère poisson sur toutes les permutations107## affiche toutes les paires de permutations comparables pour l'ordre faible, mais pas dans la diagonale108#vv : liste des (I,J)109#ll : liste des permutations110#n : n courant111##n=5, affiche 90112## le test avec n=6 et ll=permutations met 140sec, affiche 3312113## le test avec n=7 et ll=ordre faible met quelques heures, affiche 122 400114## après benchmark, affiche115## pour n= 7116## longueur de vv 175117## ll et vv initialisés118## longueur de ll 672697119## ... décompte jusque 647630 --> à quoi correspond-il ?120## la condition poisson est bien vérifiée partout !121## 16.345780801000018 250.77963907799997 267.125419879122## pour n=8, le calcul s'interrompt au moment de l'initialisation de la liste ll123## /usr/share/sagemath/bin/sage-python : ligne 2 : 46739 Processus arrêté sage -python "$@"124125def poissMain(n):126print("pour n=",n)127start=process_time()128good=1129vv=[a for k in range(2,n//2+1) for a in ijsubsets(n,k)]130print("longueur de vv",len(vv))131ll=[i for i in Permutations(n).weak_lattice().relations()]132print("ll et vv initialisés")133print("longueur de ll",len(ll))134middle=process_time()135count=0136for [x,y] in ll:137if x!=y:138np=0 # indique le nombre d'éléments sur lesquels un test poisson qui échoue139IJ=[] # paire des IJ qui font échouer140for [I,J] in vv: #on teste sur tous les (I,J)141if testGuillaume(x,y,I,J) :142good=0 # good vaut 1 quand x et y sont dans la diagonale143IJ+=[[I,J]]; # ajout de la paire problématique144if good==0 : # échoue le test, mais pas pour les inversions145poissonV=[]146poissonF=[]147for ij in IJ:148if poissonB(x,y,[ij[0], ij[1]]):149poissonV+=[[Set(ij[0]), Set(ij[1])]]150else:151poissonF+=[[Set(ij[0]), Set(ij[1])]]152if len(poissonF)!=0:153np=len(poissonF)154for ij in poissonF:155abloc=False156for ab in poissonV:157if ab[0].issubset(ij[0]) and ab[1].issubset(ij[1]):158abloc=True159if abloc:160np-=1161else:162print(x,y, poissonV, poissonF, ij)163if np!=0:164print("il y a un hic")165count=count+1166if count%1000==0:167print(count)168print (count)169if np==0:170print("la condition poisson est bien vérifiée partout !")171end=process_time()172print(middle-start,end-middle, end-start)173174175176# fonction qui génère tous les couples qu'il nous faut177def ordreFaible(n):178l_perm=[]179p=Permutations(n)180for x in p:181for y in x.permutohedron_greater():182# if y!=x:183# décommenter quand on cherche les motifs poissons184l_perm+=[[x,y]]185return l_perm186187188## fonction comme la précédente, mais avec une autre manière de générer ll189#vv : liste des (I,J)190#ll : liste des permutations191#n : n courant192# si la conjecture est vraie, on doit retrouver le même nombre que précédemment193# un peu moins efficace que la version Main sur la création de paires194## pour n= 4195## longueur de vv 3196## longueur de ll 127197## nbre de couples qui ne sont pas dans la diagonale : 2198## à comparer avec 2199## la condition poisson est bien vérifiée partout !200## 0.001861265999999695 0.000726762000000214 0.002588027999999909201## pour n=5202## longueur de vv 15203## longueur de ll 1779204## nbre de couples qui ne sont pas dans la diagonale : 90205## à comparer avec 90206## la condition poisson est bien vérifiée partout !207## 0.031438687999999715 0.05062205200000047 0.08206074000000019208## pour n= 6209##longueur de vv 55210##longueur de ll 30991211## nbre de couples qui ne sont pas dans la diagonale : 3312212## à comparer avec 3312213## la condition poisson est bien vérifiée partout !214## 1.0201610000003711 3.5473550360002264 4.5675160360005975215## pour n=7216## longueur de vv 175217## longueur de ll 667657218## nbre de couples qui ne sont pas dans la diagonale : 122400219## à comparer avec 122400220## la condition poisson est bien vérifiée partout !221## 73.30185978400004 263.410195403 336.71205518700003222## pour n=8223## longueur de vv 525224## longueur de ll 17 511 003225## ...226## 17511003227## la condition poisson est bien vérifiée partout !228## 8506.674139542 21494.009500223 30000.683639764997229230def poissFaible(n):231with open('poissonFFseul'+str(n)+'.txt', 'w') as f:232sys.stdout=f233print("pour n=",n)234start=process_time()235vv=[a for k in range(2,n//2+1) for a in ijsubsets(n,k)]236print("longueur de vv",len(vv))237ll=ordreFaible(n)238print("longueur de ll",len(ll))239middle=process_time()240good=1241count=0242for [x,y] in ll:243good=1244np=0 # indique le nombre d'éléments sur lesquels un test poisson qui échoue245IJ=[] # paire des IJ qui font échouer246for [I,J] in vv: #on teste sur tous les (I,J)247if testGuillaume(x,y,I,J) :248good=0 # good vaut 1 quand x et y sont dans la diagonale249IJ+=[[I,J]]; # ajout de la paire problématique250# print("x=", x,", y= ",y,", IJ=", IJ)251if good==0 : # échoue le test, mais pas pour les inversions252poissonV=[]253poissonF=[]254for ij in IJ:255if poissonB(x,y,[ij[0], ij[1]]):256poissonV+=[[Set(ij[0]), Set(ij[1])]]257else:258poissonF+=[[Set(ij[0]), Set(ij[1])]]259if len(poissonF)!=0:260np=len(poissonF)261for ij in poissonF:262abloc=False263for ab in poissonV:264if ab[0].issubset(ij[0]) and ab[1].issubset(ij[1]):265abloc=True266if abloc:267np-=1268else:269print(x,y, poissonV, poissonF, ij)270if np!=0:271print("il y a un hic")272print("x=",x," , y=",y,", poissonV=",poissonV,", poissonF=", poissonF)273# print("="*10)274count=count+1275## print("x=", x, ", y=", y, ", poissonV=", poissonV, "poissonF=", poissonF)276print ("nbre de couples qui ne sont pas dans la diagonale :",count)277diag=[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 diagonale278wo=[1, 1, 3, 17, 151, 1899, 31711, 672697, 17551323, 549500451, 20246665349, 864261579999, 42190730051687, 2329965898878307] # OEIS A007767 : nombre d'intervalles de l'ordre faible279print("à comparer avec",wo[n]-diag[n])280if np==0:281print("la condition poisson est bien vérifiée partout !")282end=process_time()283print(middle-start,end-middle, end-start)284285# fonction qui renvoie la liste des [I,J] vérifiant la conjecture d'Hugues286# fonction cassée à réparer... (test n=4)287288def IJreduit(n):289vvDeb=[a for k in range(2,n//2+1) for a in ijsubsets(n,k)]290nbx= 0 # nombre de x vu dans l'intervalle [1,t] où t est la position courante291nby= 0 # nombre de y vu dans l'intervalle [1,t] où t est la position courante292vvFin=[]293for [x,y] in vvDeb:294nbx= 0 # nombre de x vu dans l'intervalle [1,t] où t est la position courante295nby= 0 # nombre de y vu dans l'intervalle [1,t] où t est la position courante296cond=True297for t in range(min(x)+1, min(y)):298if t in x:299cond=False300break301if cond:302for t in range(min(y),n+1):303if t in x :304nbx+=1305if t in y:306nby+=1307if nbx>=nby:308cond=False309break310if cond:311vvFin+=[[x,y]] # si la condition d'Hugues est vérifié, on l'ajoute à la liste312return vvFin313314315# procédure qui vérifie si la conjecture est vérifiée avec un argument de dénombrement316# sage:poissOracle(3)317# n= 3318# On veut trouver 0 paires319# longueur de vv 0320# longueur de ll 11321# nbre de couples qui vérifie poisson : 0322# 0.0008505190000960283 0.00012186299977656745 0.0009723819998725958323# sage:poissOracle(4)324# n= 4325# On veut trouver 2 paires326# longueur de vv 1327# longueur de ll 127328# nbre de couples qui vérifie poisson : 2329## nombre de paires (I,J) utilisées : 1330## [[[1, 4], [2, 3]]]331## 0.0018400100000235398 0.00047271399989767815 0.002312723999921218332# sage: poissOracle(5)333# n= 5334# On veut trouver 90 paires335## longueur de vv 5336## longueur de ll 1779337## nbre de couples qui vérifie poisson : 90338## nombre de paires (I,J) utilisées : 5339## [[[2, 5], [3, 4]], [[1, 5], [2, 4]], [[1, 4], [2, 3]], [[1, 5], [2, 3]], [[1, 5], [3, 4]]]340## 0.034213825000051656 0.025045007000016994 0.05925883200006865341# sage: poissOracle(6)342# n= 6343# On veut trouver 3312 paires344## longueur de vv 17345## longueur de ll 30991346## nbre de couples qui vérifie poisson : 3312347## nombre de paires (I,J) utilisées : 17348## [[[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]]]349## 0.9965422919999583 1.4687693739999759 2.465311665999934350# sage: poissOracle(7)351# n= 7352# On veut trouver 122400 paires353# longueur de vv 49354# longueur de ll 667657355# trouvés : 100000356# nbre de couples qui vérifie poisson : 122400357# nombre de paires (I,J) utilisées : 49358# [[[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]]]359# 79.87540812600014 119.49560694699994 199.37101507300008360# n= 8 (lancé à 21h43)361# On veut trouver 4818450 paires362# longueur de vv 131363# longueur de ll 17511003364# trouvés : 100000365# ....trouvés : 4800000366# nbre de couples qui vérifie poisson : 4818450367# nombre de paires (I,J) utilisées : 131368# [[[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]]]369# 8680.734895293 6312.357728191999 14993.092623484998370##(précedemment : 8506.674139542 21494.009500223 30000.683639764997)371# n= 10372# On veut trouver 9669901098 paires373# longueur de vv 869374# arrêté le calcul de ll au bout de 2h...375376377def poissOracle(n):378print("n=",n)379diag=[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 diagonale380wo=[1, 1, 3, 17, 151, 1899, 31711, 672697, 17551323, 549500451, 20246665349, 864261579999, 42190730051687, 2329965898878307] # OEIS A007767 : nombre d'intervalles de l'ordre faible381print("On veut trouver ",wo[n]-diag[n]," paires")382start=process_time()383vv=IJreduit(n)384print("longueur de vv",len(vv))385ll=ordreFaible(n)386print("longueur de ll",len(ll))387middle=process_time()388good=1389count=0390IJ=[]391for [x,y] in ll:392good=1393for [I,J] in vv: #on teste sur tous les (I,J)394if poissonB(x,y,[I,J]):395good=0 # good vaut 0 quand x et y vérifie la condition de poisson forte396if [I,J] not in IJ:397IJ+=[[I,J]]398break399if good==0:400count=count+1401if count%100000==0:402print("trouvés :",count)403print ("nbre de couples qui vérifie poisson :",count)404end=process_time()405print("nombre de paires (I,J) utilisées : ",len(IJ))406print(IJ)407print(middle-start,end-middle, end-start)408409## fonction qui renvoie les sous-ensembles de [I,J] vérifiant la condition de Hugues410411412413def goodSubset(I,J):414aux=[[A,B] for k in range(2,len(I)) for A in Combinations(I,k).list() for B in Combinations(J,k).list() ]415nba=0416nbb=0417res=[]418for [A,B] in aux:419if min(A)>min(B):420cond=False421else:422nba= 0 # nombre de x vu dans l'intervalle [1,t] où t est la position courante423nbb= 0 # nombre de y vu dans l'intervalle [1,t] où t est la position courante424cond=True425for t in range(min(A)+1, min(B)):426if t in A:427cond=False428break429if cond:430for t in range(min(B),n+1):431if t in A :432nba+=1433if t in B:434nbb+=1435if nba>=nbb:436cond=False437break438if cond:439res+=[[A,B]] # si la condition d'Hugues est vérifié, on l'ajoute à la liste440return res441442443## 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 poisson444## bug --> à voir !445446def poissTGV(n):447print("pour n=",n)448diag=[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 diagonale449wo=[1, 1, 3, 17, 151, 1899, 31711, 672697, 17551323, 549500451, 20246665349, 864261579999, 42190730051687, 2329965898878307] # OEIS A007767 : nombre d'intervalles de l'ordre faible450print("On veut trouver ",wo[n]-diag[n]," paires")451start=process_time()452vv=[a for a in ijsubsets(n,n//2)]453print("longueur de vv",len(vv))454ll=ordreFaible(n)455print("longueur de ll",len(ll))456middle=process_time()457good=True # vaut True si la paire est dans la diagonale458count=0459poisson=False # a-t-on trouvé un poisson460for [x,y] in ll:461good=True462poisson=False463for [I,J] in vv: #on teste sur tous les (I,J)464if testGuillaume(x,y,I,J) :465count+=1466# print("x=",x,", y=",y,", [I,J]=",[I,J])467good=False # good vaut 1 quand x et y sont dans la diagonale468if poissonB(x,y,[I,J]):469poisson=True470## print("poisson avec ",[I,J])471else:472## print("pas de poisson avec [I,J]")473for AB in goodSubset(I,J):474if poissonB(x,y,AB):475poisson=True476## print("poisson avec ",AB)477break478if not(poisson):479print("cas sans sous-poisson trouvé pour x=",x," et y=",y, "[I,J]=",I,J)480break481print ("nbre de couples qui ne sont pas dans la diagonale :",count)482end=process_time()483print(middle-start,end-middle, end-start)484485## fonction qui compte le nombre de couples dans la diagonale en fonction de leurs dimensions486487def nbDiag(n):488print("n=",n)489diag=[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 diagonale490print("On veut trouver ",diag[n]," paires")491start=process_time()492vv=IJreduit(n)493# print("longueur de vv",len(vv))494ll=ordreFaible(n)495# print(ll)496middle=process_time()497good=1498count=0499for [x,y] in ll:500# print(x,y)501good=1502for [I,J] in vv: #on teste sur tous les (I,J)503if poissonB(x,y,[I,J]):504good=0 # good vaut 0 quand x et y vérifie la condition de poisson forte505break506if good==1:507count=count+1508if count%100000==0:509print("trouvés :",count)510# print(good)511print ("nbre de couples danns la diagonale :",count)512end=process_time()513print(middle-start,end-middle, end-start)514515516517