You are on page 1of 6

︠b117a8d3-0781-4693-80a1-a2fc5f844f42︠

#decide si X es menor a Y en gale


def gale(X,Y):
n=len(X);
c=0;
for i in range(0,n):
if X[i]<=Y[i]:
c=c+1;
if c==n:
o=True;
else:
o=False;
return o
#brinda el conjunto de buenos pares de X
def gpset(X):
U=X[0];
L=X[1];
A=list()
for j in range(0,len(U)):
for i in range(0,len(L)):
if i<=j:
if U[j]-L[i]<=j-i:
T=list();
A.append([U[j],L[i]])
return A
# decide si (a,b) es un buen par de X
def gp(a,b,X):
s=[a,b];
if s in gpset(X):
o=True;
else:
o=False;
return o
#obtiene el par de U_m-U_n y L_m-L_n
def resta(N,M):
Un=N[0];
Um=M[0];
Ln=N[1]
Lm=M[1]
A=[x for x in Um if x not in Un];
B=[x for x in Lm if x not in Ln];
return A+B
#obtiene los LPMs que son cocientes de M y de rango n-1
def matr(M):
n=len(M[0]);
MM=list();
U=M[0];
L=M[1];
for y in gpset(M):
U1=[x for x in U if x not in [y[0]]];
L1=[x for x in L if x not in [y[1]]];
N=[U1,L1];
MM.append(N);
return MM
#elimina elementos repetidos de una lista
def limp(X):
Y=list();
for x in X:
if x not in Y:
Y.append(x);
return Y

#obtiene los cocientes de un LPM M


def quotiens(M):
k=len(M[0]);
f=[M];
g=[M];
while k>0:
for i in g:
f=f+matr(i);
f=limp(f)
g=f;
k=k-1
return f
#decide si N es cociente de M
def quo(N,M):
if N in quotiens(M):
r=True;
else:
r=False;
return r
#obtiene los LPMs de conjunto s [n]
def matroids(n):
A=Set(srange(1,n+1,1));
pA=list(subsets(A));
l=len(A);
L=list();
for i in pA:
for j in pA:
if len(i)==len(j):
if gale(i,j)==True:
g=[i,j];
L.append(g)

return L

def pmrel(n):
elm=matroids(n);
rel=list();
for i in elm:
for j in elm:
if quo(i,j)==True:
rel.append([i,j])
O=rel
return O

#rango de un lpm
def rankm(M):
r=len(M[0])
return r
#añade a cada elemento de una lista de banderas un siguiente elemento M tal que la
nueva secuencia es una bandera
def pms(Q,n):
elms=matroids(n)
O=list();
for i in Q:
u=i[-1];
rku=rankm(u)+1
for j in elms:
rkj=rankm(j)
if rku==rkj:
if quo(u,j)==True:
j1=i+[j]
O.append(j1)
return O

#obtiene banderas de conjunto s [n]


def pm(n):
Q=[[[[],[]]]];
while len(Q[-1])!=n+1:
Q=pms(Q,n)
O=Q
return O

#obtiene las bases de [A,B]


def LPM(A,B,m):
k=len(A);
T=Set(srange(1,m+1,1));
ST=list(subsets(T));
L=list()
for i in ST:
if len(i)==k:
if gale(A,i)==True and gale(i,B)==True:
L.append(i);
return L

#obtiene el politopo de un LPM


def pLPFM(lpfm):
L=lpfm[-1];
ll=L[-1];
l=ll[-1];
Pol=list();
for i in lpfm:
pol=list();
mat=LPM(i[0],i[1],l)
for j in mat:
v=zero_vector(l);
for k in j:
v[k-1]=1;
pol.append(v);
Pol.append(pol);
return Pol

#obtiene el politopo de una bandera


def LPpoly(x):
L=x[-1];
ll=L[-1];
l=ll[-1];
U=pLPFM(x);
poli=Polyhedron(vertices = [zero_vector(l)]);
for i in U:
p=Polyhedron(vertices = i);
poli=poli+p;
return poli

t=[[[1],[4]],[[1,4],[3,4]],[[1,3,4],[2,3,4]],[[1,2,3,4],[1,2,3,4]]];
t1=[[[1],[3]],[[1,2],[2,3]],[[1,2,3],[1,2,3]]];
#pLPFM(t)
#u=LPpoly(t)
#u
#u.dim()
#u.ehrhart_polynomial()
#u.plot()

#obtiene la lista de PE de las banderas de conjunto [n]


def ep(n):
L=list();
for i in pm(n):
del i[0];
k=LPpoly(i);
s=k.dim();
if s!=0:
f=k.ehrhart_polynomial();
else:
f=1
L.append(f)
return L

#brinda un vector de ceros


def cerolist(n):
v=list();
for i in range(0,n):
v.append(0);
#for i in range(0,k):
# v[i]=k-i;
return v

t=[[[],[]],[[2],[4]],[[1,2],[3,4]],[[1,2,4],[2,3,4]],[[1,2,3,4],[1,2,3,4]]];
t1=[[[],[]],[[1],[3]],[[1,2],[2,3]],[[1,2,3],[1,2,3]]];

#calcula las permutaciones de [u,v]


def per(F):
umat=F[-1];
n=len(umat[0]);
o=list();
u=cerolist(n);
l=cerolist(n);
S=list(srange(1,n+1));
checku=list();
checkl=list();
for i in range(1,len(F)):
x=F[i];
U=x[0];
for j in U:
if j in checku:
continue;
else:
u[j-1]=n-(i-1)
checku.append(j);
for i in range(1,len(F)):
x=F[i];
L=x[1];
for j in L:
if j in checkl:
continue;
else:
l[j-1]=n-(i-1)
checkl.append(j);

u=Permutation(u);
v=Permutation(l);
o=[v,u]
return o

#calcula len(u)-len(v)
def plen(F):
l=per(F)
A=l[1];
a=A.length()
B=l[0];
b=B.length()
k=a-b
return k

s=pm(3)
b1=0
c1=0
b2=0
c2=0
b3=0
c3=0
c4=0
b4=0

a=1+2
a

for i in s:
#print('#',c)
#print(i)
u=LPpoly(i);
x=u.dim()
y=plen(i)
if x!=y and x==4:
#per(i)
c4=c4+1
#print(per(i),x,y);

if x==4:
#per(i)
#print('dimQ(v,u)=',x,'l(u)-l(v)=',y);
b4=b4+1

#b3=b3+1
#print('hay', b1, '1-dimensionales y', c1, 'son toricos' )
#print('hay', b2, '2-dimensionales y', c2, 'son toricos' )

#print('hay', b4, '4-dimensionales y', c4, 'son toricos' )


︡28e708c9-6fac-4d88-80d7-0cbc76fa8912︡

You might also like