diff --git a/kron general web nov 25.ipynb b/kron general web nov 25.ipynb new file mode 100644 index 0000000..23cd897 --- /dev/null +++ b/kron general web nov 25.ipynb @@ -0,0 +1,424 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [], + "source": [ + "import itertools\n", + "from sage.interfaces.latte import *\n", + "from time import time\n", + "\n", + "\n", + "# marginal conditions for cr polytope\n", + "# requires 1-dimensional marginals sum to the parts of the partitions\n", + "def mars_cr(lap,mup,nu): #construct marginal conditions\n", + " pp=len(lap) \n", + " qq=len(mup)\n", + " # we don't need to assume p<=q, we swap them below if not already the case.\n", + " if pp<=qq:\n", + " p=pp\n", + " q=qq\n", + " la=lap\n", + " mu=mup\n", + " else:\n", + " p=qq\n", + " q=pp\n", + " la=mup\n", + " mu=mup\n", + "\n", + " r=len(nu)\n", + " f={} # we create an empty dictionary to add ineqs to. this is not necessary but possibly useful for calling them.\n", + " f['nu1']=[-nu[0]]+[i+1 for i in range(p)]+[0]*((p*q)*(r-1)) # sum of jy_j equals nu1 \n", + " for i in range(1,r): #sum of other nu marginals\n", + " f['nu'+str(i+1)]=[-nu[i]]+[0]*(p+(p*q*(i-1)))+[1]*(p*q)+[0]*(p*q*(r-i-1))\n", + " for i in range(p): #sum of variables that give lambda marginals\n", + " f['la'+str(i+1)]=[-la[i]]+[0]*i+[1]*(p-i)+([0]*(q*i)+[1]*q+[0]*(q*(p-i-1)))*(r-1)\n", + " for i in range(q): #sum of variables that give nu marginals\n", + " f['mu'+str(i+1)]=[-mu[i]]+[0]*min(p,i)+[1]*max(0,p-i)+([0]*i+[1]+[0]*(q-i-1))*(p*(r-1))\n", + " eqs=list(f.values())\n", + " return eqs\n", + "\n", + "def L(la,mu,nu): # affine space in variables y_j, a_ij with marginals prescribed by mars_cr()\n", + " return Polyhedron(eqns=mars_cr(la,mu,nu)) \n", + "\n", + "# next we construct the column-row inequalities\n", + "def ineq_dic(pp,qq,r): \n", + " if pp<=qq:\n", + " p=pp\n", + " q=qq\n", + " else:\n", + " p=qq\n", + " q=pp\n", + " f={}\n", + " \n", + "#column inequalities - these are constructed as vectors to give to sage in the format [b | a] to denote ax\\geq b.\n", + "#c_(i,j) denotes the inequality with j terms from colummn i\n", + " for i in range(q-1): # picture the augmented matrix of stacked p x q matrices and y variables in the bottom level\n", + " for j in range((r-1)*p): \n", + " a=floor(j/p)\n", + " b=j%p\n", + " if i<=p-1: #first we do the inequalities in which y_j appears (column index at most p)\n", + " l1=[0]+[0]*i+[1]+[0]*(p-i-1) # selects entry from bottom row of matrix\n", + " else:\n", + " l1=[0]+[0]*p \n", + " l2=([0]*i+[1,-1]+[0]*(q-2-i))*p*a # levels where we sum the entire column \n", + " l3=[0]*((p-1-b)*q+(i+1))+[-1]+[0]*(q-2-i) #this is the level where the last term lives for given j, first construct every row (reading down) up to first [0 -1] pattern\n", + " l4=([0]*i+[1,-1]+[0]*(q-2-i))*b # next all the rows in the bottom with [1,-1] pattern\n", + " l5=[0]*p*q*(r-2-a) # 0's for the rest of the levels\n", + " f['c_'+str((i+1,j+1))]=l1+l2+l3+l4+l5 # put it all together\n", + " \n", + " for i in range(p-1): #row inequalities are similar\n", + " for j in range((r-1)*q):\n", + " a=floor(j/q)\n", + " b=j%q\n", + " l1=[0]+[0]*i+[1]+[0]*(p-i-1) # selects entry from right column of augmented matrix\n", + " l2=([0]*q*i+[1]*q+[-1]*q+[0]*(p-2-i)*q)*a #constructs complete blocks/levels\n", + " l3=[0]*(i*q+(q-b))+[1]*(b)+[0]*(q-b-1)+[-1]*(b+1) #this is the block where we end for given j, first up to column with 1's and -1's\n", + " l4=[0]*(q*(p-2-i)+p*q*(r-2-a)) #then the 0 rows in the left of that block and the rest of the blocks\n", + " f['r_'+str((i+1,j+1))]=l1+l2+l3+l4 # put it all together\n", + " \n", + " for i in range(p*q*(r-1)): #now positivity conditions\n", + " f['p_'+str(i)]=[0]*(p+i+1)+[1]+[0]*(p*q*(r-1)-i-1)\n", + "\n", + " if p==q:\n", + " f['yp']=[0]*p+[1]+(p*q*(r-1))*[0]\n", + " return f\n", + "\n", + "def ineqs(p,q,r):\n", + " return list(ineq_dic(p,q,r).values())\n", + "\n", + "def CR_cone(p,q,r): #cone with CR inequalities only, no marginals\n", + " return Polyhedron(ieqs=ineqs(p,q,r))\n", + "\n", + "#CR polytope -- first version\n", + "def CR_poly(la,mu,nu): \n", + " p=len(la)\n", + " q=len(mu)\n", + " r=len(nu)\n", + " #code is written with the assumption that p<=q, this will handle it otherwise\n", + " if p>q: \n", + " p,q=q,p\n", + " la,mu=mu,la\n", + " return Polyhedron(ieqs=ineqs(p,q,r), eqns=mars_cr(la,mu,nu)) #Also works: CR_cone(p,q,r).intersection(L(la,mu,nu)) , but is slower\n", + "\n", + "def bar(nu): # for the case with r=2\n", + " return [nu[0]+1,nu[1]-1]\n", + "\n", + "def g_two_row(la,mu,nu): # ojo! just for the case r=2\n", + " return CR_poly(la,mu,nu).integral_points_count()-CR_poly(la,mu,bar(nu)).integral_points_count()\n", + "\n", + "def krontuples(p,q,r,n): # we generate all the triples of prescribed length (p,q,r) for a given n\n", + " pParts=[x for x in Partitions(n).list() if len(x)==p] \n", + " qParts=[x for x in Partitions(n).list() if len(x)==q]\n", + " rParts=[x for x in Partitions(n).list() if len(x)==r] \n", + " if p==q==r: # next do some elimination of redundant triples\n", + " combos_pqr=list(itertools.combinations_with_replacement(pParts,3)) \n", + " return [(d[0],d[1],d[2]) for d in combos_pqr] \n", + " elif p==q: #\n", + " combos_pq=list(itertools.combinations_with_replacement(pParts,2)) \n", + " return [(d[0],d[1],t) for d in combos_pq for t in rParts] \n", + " elif p==r: #\n", + " combos_pr=list(itertools.combinations_with_replacement(pParts,2)) \n", + " return [(d[0],t,d[1]) for d in combos_pr for t in qParts]\n", + " elif q==r: #\n", + " combos_qr=list(itertools.combinations_with_replacement(qParts,2)) \n", + " return [(t,d[0],d[1]) for d in combos_qr for t in pParts]\n", + " else:\n", + " return [(s,t,u) for s in pParts for t in qParts for u in rParts]\n", + "\n", + "def cr_ct(la,mu,nu): # counts integral points in the CR polytope -- will automatically use LattE when dimension is high enough.\n", + " return CR_poly(la,mu,nu).integral_points_count()\n", + "\n", + "\n", + "########## DIMENSION LOWERING FUNCTIONS ##################\n", + "# Some small optimizations -- eliminating variables that are guaranteed to be zero by the shape of the matrices in the CR-polytope\n", + "#\n", + "# Gives indices of variables that get zeroed out: \n", + "def null_set(p,q,r):\n", + " inds=[]\n", + " for k in range(r-1):\n", + " for j in range(p):\n", + " for x in range(p+k*p*q+(k+2)*p+1-j+j*q, p+k*p*q+(j+1)*q+1):\n", + " inds.append(x) \n", + " return inds\n", + "\n", + "#Delete these variables from each inequality vector\n", + "def short_ineqs(p,q,r):\n", + " out=[x for x in ineqs(p,q,r)]\n", + " for x in out:\n", + " for i in sorted(null_set(p,q,r), reverse=True):\n", + " del x[i]\n", + " return out\n", + "\n", + "#Delete the variables from each marginal condition vector\n", + "def short_mars_cr(lap,mup,nu):\n", + " pp=len(lap) \n", + " qq=len(mup)\n", + " if pp<=qq:\n", + " p=pp\n", + " q=qq\n", + " la=lap\n", + " mu=mup\n", + " else:\n", + " p=qq\n", + " q=pp\n", + " la=mup\n", + " mu=mup\n", + " r=len(nu)\n", + " out=[x for x in mars_cr(la,mu,nu)]\n", + " for x in out:\n", + " for i in sorted(null_set(p,q,r), reverse=True):\n", + " del x[i]\n", + " return out\n", + "\n", + "#CR polytope -- slightly lower dimensional ambient space in some cases\n", + "def CR_tope(la,mu,nu):\n", + " p=len(la)\n", + " q=len(mu)\n", + " r=len(nu)\n", + " #Some code is written with the assumption that p<=q, this will handle it otherwise\n", + " if p>q: \n", + " p,q=q,p\n", + " la,mu=mu,la\n", + " return Polyhedron(ieqs=short_ineqs(p,q,r), eqns=short_mars_cr(la,mu,nu))\n", + "\n", + "def cr_t(la,mu,nu): # point coint with the dimension reduction\n", + " return CR_tope(la,mu,nu).integral_points_count()\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "31" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#cr_t([31,29],[28,18,14],[31,29])\n", + "cr_t([7,2,1],[7,2,1],[7,2,1])" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A 10-dimensional polyhedron in QQ^20 defined as the convex hull of 208 vertices 0.02801203727722168\n", + "2834\n", + "1.6020300388336182\n" + ] + } + ], + "source": [ + "start=time()\n", + "X=CR_tope([20,10,5,5],[24,10,3,3],[25,15])\n", + "print(X, time()-start)\n", + "print(X.integral_points_count())\n", + "print(time()-start)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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wCOPPMKnn37KggULTKdICLn++us566yzKCws/PF9N998M6eccgpjxowxWGaGbrNKyPD5fACcccYZhkvEtMGDB9OhQwfatGljOkUMmz59Og0bNuSWW26hdu3aZGRkkJ+fbzpLDGvRogUfffQR69atA2DFihV88skntG/f3nCZGbrNKiHBdV2GDBlCixYtSE5ONp0jBk2YMIFly5axePFi0ykSAjZs2MCwYcMYMmQIjz32GF988QX33nsvVatWpWfPnqbzxJCHH34Yn89H/fr1iY2NxbZtnnvuObp162Y6zQiNOQkJd999NytXruSTTz4xnSIGbd26lfvuu48PPviAatWqmc6REOA4Dg0bNuT5558HICMjg9WrVzNs2DCNuSg2ceJExo4dy7hx40hKSmL58uXcf//91KlTh169epnOCzqNOTHunnvuYfr06cyfP5/zzjvPdI4YtHTpUnbv3k2DBg1+fJ9t28yfP5/XX3+dkpISYmNjDRZKsJ1zzjkkJib+5H2XX345U6ZMMVQkoeDBBx/kkUceoWvXrgCkpKSwefNmhg4dqjEnEkyu63LPPffw9ttvM3fuXOrVq2c6SQxr3bo1q1at+sn7+vTpQ/369Xn44Yc15KJQ8+bNf3Zk0bp167jgggsMFUkoOHLkCDExP33Yf2xsrI4mEQm2wYMHM27cOKZNm0bNmjXZuXMnAAkJCVSvXt1wnZhQs2bNnz1mskaNGtSqVUuPpYxSf/zjH2nWrBnPP/88t956K1988QV5eXnk5eWZThODOnbsyHPPPcf5559PUlISX375Ja+88gp9+/Y1nWaEjiYRYzwezy++f8SIEfTu3Tu4MRKyrrrqKh1NEuVmzJjBo48+yvr166lXrx5DhgxhwIABprPEoKKiIv785z/z9ttvs3v3burUqUO3bt34y1/+QpUqVUznBZ3GnIiIiEgY0zlzIiIiImFMY05EREQkjGnMiYiIiIQxjTkRERGRMKYxJyIiIhLGNOZEREREwpjGnIiIiEgY05gTERERCWMacyIiIiJhTGNOREREJIxpzImIiIiEsf8DtPs4zKTM7fIAAAAASUVORK5CYII=", + "text/plain": [ + "Graphics object consisting of 5 graphics primitives" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x=CR_tope([5,5,5],[5,5,5],[10,5]);x.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "Graphics object consisting of 6 graphics primitives" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x=CR_tope([5,5,5],[5,5,5],[9,6]);x.plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(37/12*t^2 + 5/2*t + 1,\n", + " 37/12*t^2 + 5/2*t + 5/12,\n", + " 37/12*t^2 + 5/2*t + 2/3,\n", + " 37/12*t^2 + 5/2*t + 3/4,\n", + " 37/12*t^2 + 5/2*t + 2/3,\n", + " 37/12*t^2 + 5/2*t + 5/12)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x=CR_tope([5,5,5],[5,5,5],[8,7])\n", + "x.change_ring(QQ)\n", + "import PyNormaliz\n", + "#x.ehrhart_quasipolynomial(engine='normaliz') #requires \"backend='normaliz'\" when constructing the polytope" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "s = SymmetricFunctions(QQ).schur()\n", + "h = SymmetricFunctions(QQ).h()\n", + "\n", + "#counts cr polytope points using symmetric functions -- for comparison\n", + "def cr_sym(la,mu,nu):\n", + " p=s(la).itensor(s(mu))\n", + " return p.scalar(h(nu))\n", + "\n", + "#computes kronecker coefficient using symmetric functions -- for comparison\n", + "def g_sym(la,mu,nu):\n", + " p=s(la).itensor(s(mu)) #synonym with .kronecker_product(), .inner_tensor(), .inner_product()\n", + " return p.scalar(s(nu))\n", + "\n", + "def g(la,mu,nu):\n", + " jt_exp=Partition(nu).jacobi_trudi().determinant()\n", + " #print(jt_exp)\n", + " supp=jt_exp.support()\n", + " jt_dict={p : jt_exp.coefficient(p) for p in supp}\n", + " #for p in supp: #to see individual cr counts\n", + " # print(p)\n", + " # print(cr_t(la,mu,p))\n", + " return sum(jt_dict[p]*cr_t(la,mu,p) for p in jt_dict)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[13, 1, 1] [13, 1, 1] [13, 1, 1]\n", + "h[13, 1, 1] - h[13, 2] - h[14, 1] + h[15]\n", + "Kronecker coefficient is: 1\n", + "[13, 1, 1] [9, 5, 1] [9, 5, 1]\n", + "h[9, 5, 1] - h[9, 6] - h[10, 4, 1] + h[11, 4]\n", + "Kronecker coefficient is: 4\n", + "[12, 2, 1] [12, 2, 1] [8, 6, 1]\n", + "h[8, 6, 1] - h[8, 7] - h[9, 5, 1] + h[10, 5]\n", + "Kronecker coefficient is: 0\n", + "[12, 2, 1] [9, 3, 3] [8, 5, 2]\n", + "h[8, 5, 2] - h[8, 6, 1] - h[9, 4, 2] + h[9, 6] + h[10, 4, 1] - h[10, 5]\n", + "Kronecker coefficient is: 5\n", + "[11, 3, 1] [10, 4, 1] [9, 5, 1]\n", + "h[9, 5, 1] - h[9, 6] - h[10, 4, 1] + h[11, 4]\n", + "Kronecker coefficient is: 20\n", + "[11, 3, 1] [7, 6, 2] [7, 4, 4]\n", + "h[7, 4, 4] - h[7, 5, 3] - h[8, 4, 3] + h[8, 5, 2] + h[9, 3, 3] - h[9, 4, 2]\n", + "Kronecker coefficient is: 11\n", + "[11, 2, 2] [9, 3, 3] [5, 5, 5]\n", + "h[5, 5, 5] - 2*h[6, 5, 4] + h[6, 6, 3] + h[7, 4, 4] - h[7, 5, 3]\n", + "Kronecker coefficient is: 1\n", + "[10, 4, 1] [9, 4, 2] [9, 3, 3]\n", + "h[9, 3, 3] - h[9, 4, 2] - h[10, 3, 2] + h[10, 4, 1] + h[11, 2, 2] - h[11, 3, 1]\n", + "Kronecker coefficient is: 32\n", + "[10, 3, 2] [9, 5, 1] [7, 5, 3]\n", + "h[7, 5, 3] - h[7, 6, 2] - h[8, 4, 3] + h[8, 6, 1] + h[9, 4, 2] - h[9, 5, 1]\n", + "Kronecker coefficient is: 33\n", + "[9, 5, 1] [9, 4, 2] [8, 5, 2]\n", + "h[8, 5, 2] - h[8, 6, 1] - h[9, 4, 2] + h[9, 6] + h[10, 4, 1] - h[10, 5]\n", + "Kronecker coefficient is: 78\n", + "[9, 4, 2] [8, 6, 1] [8, 5, 2]\n", + "h[8, 5, 2] - h[8, 6, 1] - h[9, 4, 2] + h[9, 6] + h[10, 4, 1] - h[10, 5]\n", + "Kronecker coefficient is: 68\n", + "[9, 3, 3] [7, 6, 2] [7, 6, 2]\n", + "h[7, 6, 2] - h[7, 7, 1] - h[8, 5, 2] + h[8, 7] + h[9, 5, 1] - h[9, 6]\n", + "Kronecker coefficient is: 35\n", + "[8, 5, 2] [7, 7, 1] [5, 5, 5]\n", + "h[5, 5, 5] - 2*h[6, 5, 4] + h[6, 6, 3] + h[7, 4, 4] - h[7, 5, 3]\n", + "Kronecker coefficient is: 3\n", + "[7, 6, 2] [7, 4, 4] [6, 5, 4]\n", + "h[6, 5, 4] - h[6, 6, 3] - h[7, 4, 4] + h[7, 6, 2] + h[8, 4, 3] - h[8, 5, 2]\n", + "Kronecker coefficient is: 33\n" + ] + } + ], + "source": [ + "for x in krontuples(3,3,3,15)[::99]:\n", + " print(x[0], x[1], x[2])\n", + " print(f'Kronecker coefficient is: {g(x[0],x[1],x[2])}')\n", + " #print(g(x[0],x[1],x[2]))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "SageMath 10.7", + "language": "sage", + "name": "sagemath" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}