[BACK]Return to tk_jack.rr CVS log [TXT][DIR] Up to [local] / OpenXM / src / asir-contrib / packages / src

File: [local] / OpenXM / src / asir-contrib / packages / src / tk_jack.rr (download)

Revision 1.7, Mon Feb 1 05:50:23 2016 UTC (8 years, 3 months ago) by takayama
Branch: MAIN
CVS Tags: HEAD
Changes since 1.6: +3 -3 lines

#define -->  #ifdef  (bug fix)

/*
$OpenXM: OpenXM/src/asir-contrib/packages/src/tk_jack.rr,v 1.7 2016/02/01 05:50:23 takayama Exp $
Koev-Edelman for higher order derivatives.
Series solution obtained by an interpolation and Koev-Edelman evaluation.
Previous version: misc-2011/10/wishart/Prog/mh.rr
*/
#define USE_MODULE 1
module tk_jack$
localf permutation;
localf mysum;
localf partition_a;
localf partition;
localf plength;
localf ptrans;
localf ptrans0;
localf huk;
localf hdk;
localf jjk;
localf ppoch;
localf qk;
localf bb;
localf beta;
localf enum_hstrip;
localf xn;
localf jack;
localf zonal;
localf mhgj;
localf mh_t;
localf mh_t2;
localf mtest1;
localf mtest1b;
localf mtest2;
localf mtest3;
localf q3_10;
localf q3_5;
localf mtest4;
localf mtest4b;
localf nk;
localf plength2;
localf myeq;
localf genDarray;
localf check1;
localf pListPartition;
localf pListPartition2;
localf pExec_0;
localf pListHS;
localf pListHS2;
localf hsExec_0;
localf pmn;
localf pExec_darray;
localf genDarray2;
localf isHStrip;
localf hsExec_beta;
localf genBeta;
localf checkBeta1;
localf checkBeta2;
localf psublen;
localf genJack;
localf checkJack1;
localf mhdiff;
localf checkJack2;
localf listJack;
localf showStatic;

static Alpha$
Alpha=2$
static Darray$
Darray=0$
static Parray$
Parray=0$
static M_qk$
M_qk=0$
static M_kap$
static M_n$  /* digits */
static M_m$  /* | | <= M_m */
static M_plist$ /* to save a list. asir only */
static M_pExec$
M_kap=0$
M_n=0$
M_m=0$
M_plist=0$
M_pExec=0$
static HS_mu$
static HS_n$
static HS_plist$
static HS_hsExec$
HS_mu=0$
HS_n=0$
HS_plist=0$
HS_hsExec=0$
static P_pki$
static P_pmn$
P_pki=0$
P_pmn=0$
static DR_parray$
DR_parray=0$
static M_beta$   /* M_beta[0][*] value of beta_{kappa,mu}, M_beta[1][*] N_mu */
static M_beta_pt$
static M_beta_kap$
M_beta=0$
M_beta_pt=0$
M_beta_kap=0$
static M_jack$ 
static M_df$ /* Compute differentials? */
static M_2n$ /* 2^N */
M_jack=0$
M_df=0$
M_2n=0$


/* cf. base_permutation */
def permutation(N) {
  if (N == 1) return([newvect(1,[0])]);
  A=[];
  AA = permutation(N-1);
  M = length(AA);
  for (I=0; I<M; I++) {
    PP = AA[I];
    for (J=0; J<N; J++) {
      P = newvect(N); 
      for (K=0,KK=0; K<N; K++) {
        if (K == J) {
          P[K] = N-1; KK++;
        }else{
          P[K] = PP[K-KK];
        }
      }
      A = cons(P,A);
    }
  }
  return(reverse(A));
}

def mysum(L) {
  N=length(L);
  S=0;
  for (I=0; I<N; I++) S += L[I];
  return(S);
}
/*
 x_0+...+x_{N-1} <= K
*/
def partition_a(N,K) {
  Ans = [];
  if (N < 1) return([]);
  if (N == 1)  {
    for (I=0; I<=K; I++) {
       Ans=cons([I],Ans);
    }
    return( reverse(Ans) );
  }else{
    K1 = partition_a(N-1,K);
    Ans = [];
    for (I=0; I<length(K1); I++) {
      P = K1[I];
      Psize = mysum(P); Plast=P[N-2];
      for (J=0; J<=K-Psize; J++) {
         if (J <= Plast) {
            Ans=cons(append(P,[J]),Ans);
         }
       }      
     }
     return(reverse(Ans));
  }
}

/*
 x_0+...+x_{N-1} = K
*/
def partition(N,K) {
  P = partition_a(N,K);
  Ans=[];
  for (I=0; I<length(P); I++) {
    if (mysum(P[I]) == K) Ans=cons(P[I],Ans);
  }
  return(Ans);
}

/*
 (3,2,2,0,0) --> 3
*/
def plength(P) {
  for (I=0; I<length(P); I++) {
    if (P[I] == 0) return(I);
  }
  return(length(P));
}

/*  
 ptrans(P)  returns P'
*/
def ptrans(P) {
  L = length(P);
  if (type(P) == 4) P = newvect(L,P);
  else P = matrix_clone(P);
  return(ptrans0(P));
}
def ptrans0(P) {
  if (length(P) == 0) return [];
  if (P[0] == 0) return [];
  L = plength(P);
  for (I=0; I<L; I++) {
    P[I] -= 1;
  }
  return( cons(L,ptrans0(P)) );
}
/*
  upper hook length
  h_kappa^*(K)
*/
def huk(K,I,J) {
  /* extern Alpha; */
  A=Alpha;
  /*printf("h^k(%a,%a,%a,%a)\n",K,I,J,A);*/
  Kp = ptrans(K);
  H=Kp[J-1]-I+A*(K[I-1]-J+1);
  return(H);
} 

/*
  lower hook length
  h^kappa_*(K)
*/
def hdk(K,I,J) {
  /* extern Alpha; */
  A = Alpha;
  /*printf("h_k(%a,%a,%a,%a)\n",K,I,J,A);*/
  Kp = ptrans(K);
  H=Kp[J-1]-I+1+A*(K[I-1]-J);
  return(H);
} 
/*
  j_kappa.  cf. Stanley.
*/
def jjk(K) {
  /* extern Alpha; */
  A=Alpha;
  V=1;
  L=plength(K);
  for (I=0; I<L; I++) {
    for (J=0; J<K[I]; J++) {
      V *= huk(K,I+1,J+1)*hdk(K,I+1,J+1);
    }
  }
  return(V);
}
/*
  (a)_kappa^\alpha, Pochhammer symbol
  Note that  ppoch(a,[n]) = (a)_n, Alpha=2
*/
def ppoch(A,K) {
  /* extern Alpha; */
  V = 1;
  L=plength(K);
  for (I=0; I<L; I++) {
    for (J=0; J<K[I]; J++) {
      II = I+1; JJ = J+1;
      V *= (A-(II-1)/Alpha+JJ-1);
    }
  }
  return(V);
}
/* Q_kappa
*/
def qk(K,A,B) {
  /* extern Alpha; */
  P = length(A);
  Q = length(B);
  V = Alpha^(mysum(K))/jjk(K);
  for (I=0; I<P; I++) V = V*ppoch(A[I],K);
  for (I=0; I<Q; I++) V = V/ppoch(B[I],K);
  return(V);
}

/*
 B^nu_{kappa,mu}(i,j)
 bb(N,K,M,I,J)
*/
def bb(N,K,M,I,J) {
  Kp = ptrans(K);
  Mp = ptrans(M);
/*  printf("K=%a, Kp=%a\n",K,Kp);
  printf("M=%a, Mp=%a\n",M,Mp); */
  if ((length(Kp) < J) || (length(Mp) < J)) return(hdk(N,I,J));
  if (Kp[J-1] == Mp[J-1]) return(huk(N,I,J));
  else return(hdk(N,I,J));
}
/*
  beta_{kappa,mu}
  beta(K,M)
*/
def beta(K,M) {
  V = 1;

  L=plength(K);
  for (I=0; I<L; I++) {
    for (J=0; J<K[I]; J++) {
      II = I+1; JJ = J+1;
      V *= bb(K,K,M,II,JJ);
      /* printf("%a,%a,%a\n",I,J,V); */
    }
  }

  L=plength(M);
  for (I=0; I<L; I++) {
    for (J=0; J<M[I]; J++) {
      II = I+1; JJ = J+1;
      V /= bb(M,K,M,II,JJ);
      /* printf("%a,%a,%a\n",I,J,V); */
    }
  }

  return(V);
}
/*
  enumerate horizontal strip of kappa.
  K_i >= M_i >=K_{i+1}
*/
def enum_hstrip(K) {
  if (plength(K) == 1) {
    Ans=[];
    for (I=0; I<=K[0]; I++) Ans=cons([I],Ans);
    return(Ans);
  }
  if (type(K) != 4) K = vtol(K);
  L = enum_hstrip(cdr(K));
  Ans = [];
  for (I=K[1]; I<=K[0]; I++) {
    for (J=0; J<length(L); J++) {
      Ans = cons(cons(I,L[J]),Ans);
    }
  }
}
def xn(N) {
  Ans=[];
  for (I=1; I<=N; I++) {
    Ans = cons(util_v(x,[I]),Ans);
  }
  return reverse(Ans);
}
/*
  zonal([n],1);
  zonal([2,1],2);
*/
/*
   previous name of the zonal() was jack(). 
*/
def zonal(K,N) {
  /* extern Alpha; */
  if (length(K) == 0) return(1);
  if (K[0] == 0) return(1);
  if (N == 1) {
     F=util_v(x,[1])^mysum(K);
     L=plength(K);
     for (I=0; I<L; I++) {
       for (J=0; J<K[I]; J++) {
         II = I+1; JJ = J+1;
         F *= (N-(II-1)+Alpha*(JJ-1));
       }
     }
     return(F);
  }
  F = 0;
  P = enum_hstrip(K);
  for (I=0; I<length(P); I++) {
    M = P[I];
    F += zonal(M,N-1)*util_v(x,[N])^(mysum(K)-mysum(M))*beta(K,M);
  }
  return(F);
}
def jack(K,N,A) {
  Alpha = A;
  F=zonal(K,N);
  A = 2; /* default value */
  return(F);
}

/*
 cf. w1m.rr 
  matrix hypergeometric by jack
  N variables, up to degree M.
*/
def mhgj(A,B,N,M) {
  F = 0;
  P = partition_a(N,M);
  for (I=0; I<length(P); I++) {
     K = P[I];
     F += qk(K,A,B)*zonal(K,N);
  }
  return(F);
}

def mh_t(A,B,N,M) {
  /* extern M_qk; */
  /* printf("P_pmn=%a\n",P_pmn); */
  genJack(M,N);
  /* printf(" P_pmn=%a\n",P_pmn); */
  M_qk = newvect(P_pmn);
  /* printf("P_pmn=%a, M_qk=%a\n",P_pmn,M_qk); */
  F = 0;
  for (K=0; K<P_pmn; K++) {
     Kap = Parray[K];
     M_qk[K] = qk(Kap,A,B);
     F += M_qk[K]*M_jack[N][0][K];
  }
  return(F);
}
def mh_t2(J) {
  /* extern M_qk; */
  if (type(M_qk) == 0) error("Call mh_t first.");
  F = 0; 
  for (K=0; K<P_pmn; K++) {
     F += M_qk[K]*M_jack[M_n][J][K];
  }
  return(F);
}

/* passed */
def mtest1() {
  F=mhgj([3/2],[3/2+10/2],2,3);
  F=base_replace(F,[[x_1,y_0],[x_2,y_1]]);
  /* load w1m.rr */
  G=mhg(4,4,10,2)[0]; /* upto degree 4, n=10, 2 variables */
  return(F-G);
}
def mtest1b() {
  N=3;  M=6; M_df=1;
  F=mh_t([3/2],[3/2+10/2],N,M);
  Rule=[];
  printf("mh_t=%a\n",deval(base_replace(F,Rule)));
  for (I=1; I<=N; I++) {
    Rule=cons([util_v(x,[I]),deval(I/10)],Rule);
  }
  printf("Rule=%a\n",Rule);
  for (J=0; J<2^N; J++) 
	/* %% printf("J=%a, D^J mh_t=%a\n",J,deval(base_replace(mhdiff(F,J,N),Rule))); */
	printf("J=%a, D^J mh_t2=%a\n",J,deval(base_replace(mh_t2(J),Rule)));
/*
J=0, D^J mh_t=1.15017
J=1, D^J mh_t=0.267
J=2, D^J mh_t=0.269995
J=3, D^J mh_t=0.0603364
J=4, D^J mh_t=0.273035
J=5, D^J mh_t=0.0610073
J=6, D^J mh_t=0.0616832
J=7, D^J mh_t=0.0132583  by diff %%

J=0, D^J mh_t2=1.15017
J=1, D^J mh_t2=0.267
J=2, D^J mh_t2=0.269995
J=3, D^J mh_t2=0.0603364
J=4, D^J mh_t2=0.273035
J=5, D^J mh_t2=0.0610073
J=6, D^J mh_t2=0.0616832
J=7, D^J mh_t2=0.0132583 by table diff
*/
}

def mtest2() {
  F=mhgj([3/2],[3/2+9/2],2,5);
  F=base_replace(F,[[x_1,y_0],[x_2,y_1]]);
  /* load w1m.rr */
  G=mhg(5,5,9,2)[0]; /* upto degree 5, n=9, 2 variables */
  return(F-G);
}

/* passed when the mtest3(Deg)[0] == 0 or close to 0 
  mtest3(1); mtest3(2); ...
*/
def mtest3(Deg) {
  N=10; M=3; /* M number of variables */
  F=mhgj([(M+1)/2],[(M+1)/2+N/2],M,Deg);
  F=base_replace(F,[[x_1,y_0],[x_2,y_1],[x_3,y_2]]);
  /* load w1m.rr */
  G=mhg(Deg,Deg+1,N,M)[0]; 
  return([F-G,F]);
}

/* The quotient of (3.10) of Koev-Edelman K=kappa, M=mu, SK=k */
def q3_10(K,M,SK) {
  /* extern Alpha;*/
  Mp = ptrans(M);
  ML = M; if (type(ML) != 4) ML=vtol(ML); 
  N = newvect(plength(ML),ML); N[SK-1] = N[SK-1]-1; N = vtol(N);
  T = SK-Alpha*M[SK-1];
  Q = T+1; 
  V = Alpha;
  for (R=1; R<=SK; R++) {
    Ur = Q-R+Alpha*K[R-1];
    V *= Ur/(Ur+Alpha-1);
  }
  for (R=1; R<=SK-1; R++) {
    Vr = T-R+Alpha*M[R-1];
    V *= (Vr+Alpha)/Vr;
  }
  for (R=1; R<=M[SK-1]-1; R++) {
    Wr = Mp[R-1]-T-Alpha*R;
    V *= (Wr+Alpha)/Wr;
  }
  return(V);
}

def q3_5(A,B,K,I) {
  /* extern Alpha; */
  Kp = ptrans(K);
  P=length(A); Q = length(B);
  C = -(I-1)/Alpha+K[I-1]-1;
  D = K[I-1]*Alpha-I;

  V=1; 

  for (J=1; J<=P; J++)  {
     V *= (A[J-1]+C);
  }
  for (J=1; J<=Q; J++) {
     V /= (B[J-1]+C);
  }

  for (J=1; J<=K[I-1]-1; J++) {
     Ej = D-J*Alpha+Kp[J-1];
     Gj = Ej+1;
     V *= (Gj-Alpha)*Ej/(Gj*(Ej+Alpha));
  } 
  for (J=1; J<=I-1; J++) {
     Fj=K[J-1]*Alpha-J-D;
     Hj=Fj+Alpha;
     Lj=Hj*Fj;
     V *= (Lj-Fj)/(Lj+Hj);
  }
  return(V);
}

def mtest4() {
  A=[3/2];B=[3/2+10/2];
  K=[3,2];I=2; Ki=[3,1];
  V1=q3_5(A,B,K,I);
  V2=qk(K,A,B)/qk(Ki,A,B);
  return([V1,V2]);
}
def mtest4b() {
  K=[3,2]; 
  M=[2,1]; N=[2,0]; SK=2;
  V1=q3_10(K,M,SK);
  V2=beta(K,N)/beta(K,M);
  return([V1,V2]);
}

/* nk in (4.1),
*/
def nk(KK) {
  /* extern Darray; */
  N = plength(KK);
  if (N == 0) return(0);
  if (N == 1) return(KK[0]);
  K = newvect(plength(KK)); 
  for (I=0; I<N; I++) K[I] = KK[I];
  if (type(K) != 4) K = vtol(K);
  Kpp = reverse(K);
  Ki = car(Kpp);
  Kpp = reverse(cdr(Kpp));  /* K = (Kpp,Ki) */
  return(Darray[nk(Kpp)]+Ki-1);
}
def plength2(P1,P2) {
  S1 = plength(P1); S2 = plength(P2);
  if (S1 > S2) return(1);
  else if (S1 == S2) {
    S1=mysum(P1); S2=mysum(P2);
    if(S1 > S2) return(1);
    else if (S1 == S2) return(0);
    else return(-1);
  }
  else return(-1);
}
def myeq(P1,P2) {
  if (plength(P1) != plength(P2)) return(0);
  for (I=0; I<plength(P1); I++) {
    if (P1[I] != P2[I]) return(0);
  }
  return(1);
}
/*
  M is a degree, N is a number of variables
  genDarray(3,3);
  N(0)=0;
  N(1)=1;
  N(2)=2;
  N(3)=3;
  N(1,1)=4;  D[1] = 4
  N(2,1)=5;  D[2] = 5;
  N(1,1,1)=6; D[4] = 6;
  still buggy.
*/
def genDarray(M,N) {
  /*extern Darray;
  extern Parray; */
  L = partition_a(N,M);
  L = qsort(newvect(length(L),L),tk_jack.plength2);
  Pmn = length(L);
  printf("Degree M = %a, N of vars N = %a, Pmn=%a\n",M,N,Pmn);
  printf("L=%a\n",L);
  if (Darray==0) Darray=newvect(Pmn+1);
  Nk = newvect(Pmn+1);
  for (I=0; I<Pmn; I++) Nk[I] = I;
  for (I=0; I<Pmn; I++) {
     K = L[I]; /* N_K = I; D[N_K] = N_(K,1) */
     Ksize = plength(K);
     Kone=newvect(Ksize+1); for(J=0; J<Ksize; J++) Kone[J]=K[J]; Kone[Ksize] = 1;
     /* if (myeq(K,[1,1])) printf("I=%a,Kone=%a\n",I,Kone); */
     for (J=0; J<Pmn; J++) {
        if (myeq(L[J],Kone)) Darray[I] = J; /* J is the next of I */
     }
  }
  printf("Darray=%a\n",Darray);
  Parray = L;
}

def check1() {
  /* extern Darray;
  extern Parray; */
  L = Parray;
  for ( I=0; I<length(L); I++) {
    P=L[I]; Psize = plength(P);
    PP=newvect(Psize+1); for(J=0; J<Psize; J++) PP[J]=P[J]; PP[Psize] = 1;
    if ((Psize==0) || (PP[Psize] <= PP[Psize-1])) {
      printf("Darray(nk(%a)=%a)=%a  == (nk(%a)=%a)?\n",P,nk(P),Darray[nk(P)],PP,nk(PP)); 
      /* Darray[nk(P)] = nk(PP); */
    }     
  }
}

/*
Prob: how to generate Parray and Darray efficiently.
genDarray(4,3); check1() have error message.
*/


def pListPartition(M,N) {
  /* initialize */
  M_n = N;
  M_m = M;
  M_kap = newvect(M_n+1);
  M_plist = [];
  /* end of initialize */
  (*M_pExec)();  /* exec for 0 */
  for (I=1; I<=M_n; I++) { 
    pListPartition2(M_m,1,I,M_m);
  }
  M_plist = reverse(M_plist);
  return(1);
}

/*
  Enumerate all such that
  Less >= M_kap[From], ..., M_kap[To],  |(M_kap[From],...,M_kap[To])|<=M, 
*/
def pListPartition2(Less,From,To,M) {
  if (To < From) {
     (*M_pExec)(); return(0);
  }
  for (I=1; (I<=Less) && (I<=M) ; I++) {
    M_kap[From] = I;
    R = pListPartition2(I,From+1,To,M-I);
  } 
  return(1);
}

/*
  Implement works for partition here.
*/
#ifdef USE_MODULE
M_pExec=tk_jack.pExec_0$
#else
M_pExec=pExec_0$
#endif
def pExec_0() {
  M_plist = cons(cdr(vtol(M_kap)),M_plist);
  printf("pExec:%a\n", M_kap);
}

/* Test.
  Compare pListPartition(4,3);  genDarray(4,3);
  Compare pListPartition(5,3);  genDarray(5,3);

*/

/*
  List all horizontal strips.
  Kap[0] is a dummy, Start from Kap[1].
*/
def pListHS(Kap,N) {
  HS_n = N;
  HS_mu = newvect(N+1);
  HS_plist = [];
  pListHS2(1,N,Kap);
  HS_plist = reverse(HS_plist);
}

def pListHS2(From,To,Kap) {
  if (To <From) {(*HS_hsExec)(); return(0);}
  if (From == HS_n) More=0; else More=Kap[From+1];
  for (I=Kap[From]; I>= More; I--) {
    HS_mu[From] = I;
    pListHS2(From+1,To,Kap);
  } 
  return(1);
}

def hsExec_0() {
  HS_plist = cons(cdr(vtol(HS_mu)),HS_plist);
  printf("hsExec: %a\n",HS_mu);
}


/*
  pListHS([0,4,2,1],3);
*/

/* The number of partitions <= M, with N parts.
  (0,0,...,0) is excluded.
*/
def pmn(M,N) {
  Min_m_n = (M>N?N:M);
  P_pki=newmat(Min_m_n+1,M+1);
  for (I=1; I<=M; I++) P_pki[1][I] = 1;
  for (K=1; K<=Min_m_n; K++) P_pki[K][0] = 0;
  S = M;
  for (K=2; K<=Min_m_n; K++) {
    for (I=1; I<=M; I++) {
      if (I-K < 0) T=0; else T=P_pki[K][I-K];
      P_pki[K][I] = P_pki[K-1][I-1]+T;
      S += P_pki[K][I];
    }
  }
  P_pmn=S;
  printf("pmn(%a,%a), P_pmn=%a\n",M,N,P_pmn);
  return(S);
}

def pExec_darray() {
  pExec_0();
  K = cdr(vtol(M_kap));
  Parray[DR_parray] = K;
  DR_parray++;
}
def genDarray2(M,N) {
  /* extern Darray;
  extern Parray;
  extern M_pExec; */
  Pmn = pmn(M,N)+1;
  printf("Degree M = %a, N of vars N = %a, Pmn+1=%a\n",M,N,Pmn);
  Darray=newvect(Pmn);
  Parray=newvect(Pmn); DR_parray=0;
#ifdef USE_MODULE
  M_pExec = tk_jack.pExec_darray;  
#else
  M_pExec = pExec_darray;  
#endif
  pListPartition(M,N);  /* pExec_darray() is executed for all partitions */
  L = Parray;

  Nk = newvect(Pmn+1);
  for (I=0; I<Pmn; I++) Nk[I] = I;
  for (I=0; I<Pmn; I++) {
     K = L[I]; /* N_K = I; D[N_K] = N_(K,1) */
     Ksize = plength(K);
     Kone=newvect(Ksize+1); for(J=0; J<Ksize; J++) Kone[J]=K[J]; Kone[Ksize] = 1;
     for (J=0; J<Pmn; J++) {
        if (myeq(L[J],Kone)) Darray[I] = J; /* J is the next of I */
     }
  }
  printf("Darray=%a\n",Darray);
}

def isHStrip(Kap,Nu) {
  N1 = plength(Kap); N2 = plength(Nu);
  if (N2 > N1) return(0);
  for (I=0; I<N2; I++) {
    if (I >= N1-1) P = 0; else P=Kap[I+1]; 
    if (Kap[I] < Nu[I]) return(0);
    if (Nu[I]  < P) return(0);
  }
  return(1);
}
def hsExec_beta() {
  hsExec_0();
  /* printf("M_beta_pt=%a\n",M_beta_pt); */
  Mu = cdr(vtol(HS_mu));
  if (M_beta_pt == 0) {
    M_beta[0][0] = 1; M_beta[1][0] = nk(Mu); 
    M_beta_pt++; return;
  }

  N = HS_n;
  Nmu = nk(Mu);
  M_beta[1][M_beta_pt] = Nmu;
  Kapt = ptrans(M_beta_kap);
  /* Mu, Nu are exchanged in this code. cf. the K-E paper  */
  Nu = newvect(N,Mu);
  for (I=0; I<N; I++) {
    Nu[I]++;
    if (!isHStrip(M_beta_kap,Nu)) {Nu[I]--; continue;}
    Nnu = nk(Nu);
    Nut = ptrans(Nu);
    Done=0;
    for (J=M_beta_pt-1; J>=0; J--) {
      if (M_beta[1][J] == Nnu) {
         K=I+1;
         /* Check other conditions. */
         RRMax = Nu[I]-1;
         if ((plength(Kapt) < RRMax) || (plength(Nut) < RRMax)) {
             printf(" is not taken (length). \n"); break;
         }
         OK=1; 
         for (RR=0; RR<RRMax; RR++) {
            if (Kapt[RR] != Nut[RR]) { OK=0; break;}
         }
         if (!OK) {printf(" is not taken.\n"); break; }
         printf("Found at J=%a, K=%a, Nu=%a, Mu=%a, q3_10(Kap,Nu,K)=%a\n",
                J,K,Nu,Mu,q3_10(M_beta_kap,Nu,K));
         /* check done. */
         M_beta[0][M_beta_pt]=M_beta[0][J]*q3_10(M_beta_kap,Nu,K);
         Done = 1; break;
      } 
    }
    if (Done) break; else Nu[I]--;
  }
  if (!Done) { M_beta[0][M_bea_pt] = nn; printf("Not found\n"); /* error("Not found."); */ }
  M_beta_pt++;
}
def genBeta(Kap) {
  /* extern M_beta;
  extern M_beta_pt;
  extern M_beta_kap;
  extern HS_hsExec;
  extern P_pmn; */
  printf("Kappa=%a, P_pmn=%a\n",Kap,P_pmn);
  M_beta = newmat(2,P_pmn+1);
  M_beta_pt = 0;
  N = plength(Kap);
  for (I=0; I<=P_pmn; I++) for (J=0; J<2; J++) M_beta[J][I] = nan;
#ifdef USE_MODULE
  HS_hsExec = tk_jack.hsExec_beta;
#else
  HS_hsExec = hsExec_beta;
#endif
  M_beta_kap = Kap;
  pListHS(cons(0,Kap),N);
}
/*
  genDarray2(4,3);
  genBeta([2,2,0]);
  genBeta([2,1,1]);
*/

def checkBeta1() {
  genDarray2(4,3);
  Kap = [2,2,0];
  printf("Kap=%a\n",Kap);
  genBeta(Kap);
  for (I=0; I<M_beta_pt; I++) {
    Mu = Parray[M_beta[1][I]];
    Beta_km = M_beta[0][I];
    printf("Mu=%a,",Mu);
    printf("Beta_km(by table)=%a, beta(Kap,Mu)=%a\n",Beta_km,beta(Kap,Mu));
  }
}
def checkBeta2() {
  genDarray2(3,3);
  Kap = [2,1,0];
  printf("Kap=%a\n",Kap);
  genBeta(Kap);
  for (I=0; I<M_beta_pt; I++) {
    Mu = Parray[M_beta[1][I]];
    Beta_km = M_beta[0][I];
    printf("Mu=%a,",Mu);
    printf("Beta_km(by table)=%a, beta(Kap,Mu)=%a\n",Beta_km,beta(Kap,Mu));
  }
}

def psublen(Kap,Mu) {
  L1 = plength(Kap);
  L2 = plength(Mu);
  if (L2 > L1) error("psub, length mismatches.");
  A = 0;
  for (I=0; I<L2; I++) {
    if (Kap[I] < Mu[I]) error("psub, not Kap >= Mu"); 
    A += Kap[I]-Mu[I];
  }
  for (I=L2; I<L1; I++) A += Kap[I];
  return(A);
}
/* Table of Jack polynomials
  Jack[1]* one variable.
  Jack[2]* two variables.
   ...
  Jack[M_n]* n variables.
  Jack[P][J]*  
       D^J(P variables jack of p variables). Example. J=001 d_1, 010 d_2, 100 d_3
       0<=J<=2^{M_n}-1
  Jack[P][J][nk(Kappa)]  Jack_Kappa, Kappa is a partition.
  0<=nk(Kappa)<=pmn(M_m,M_n)  
*/
def genJack(M,N) {
  /* extern M_jack;
  extern M_2n;
  extern P_pmn; */
  M_jack = newvect(N+1);
  M_2n = 2^N;
  Pmn = pmn(M,N);  /*P_pmn is initializeded. 
                     Warning. It is reset when pmn is called.*/
  for (I=0; I<=N; I++) M_jack[I] = newmat(M_2n,Pmn+1);
  genDarray2(M,N); /* Darray, Parray is initialized */
  for (I=1; I<=N; I++) (M_jack[I])[0][0] = 1; 
  if (M_df) {
    for (I=1; I<=N; I++) {
      for (J=1; J<M_2n; J++) (M_jack[I])[J][0] = 0;
    }
  }

  for (K=1; K<=M; K++) {
    (M_jack[1])[0][K] = zonal([K],1);
    if (M_df) {
      (M_jack[1])[1][K] = diff(zonal([K],1),x_1);
      for (J=2; J<M_2n; J++) (M_jack[1])[J][K] = 0;
    }
  }
  for (I=1; I<=N; I++) {
    for (K=M+1; K<Pmn+1; K++) {
      (M_jack[I])[0][K] = nn;
      if (M_df) {
        for (J=1; J<M_2n; J++) {
          if (J >= 2^I) (M_jack[I])[J][K] = 0;
	  else (M_jack[I])[J][K] = nn;
        }
      }
    }
  }

  /* Start to evaluate the entries of the table */
  for (K=1; K<=Pmn; K++) {
    Kap = Parray[K];
    L = plength(Kap);
    for (I=1; I<=L-1; I++) {
      (M_jack[I])[0][K] = 0;
      if (M_df) {
        for (J=1; J<M_2n; J++) (M_jack[I])[J][K] = 0;
      } 
    }
    printf("Kappa=%a\n",Kap);
    /* Enumerate horizontal strip of Kappa */
    genBeta(Kap);  /* M_beta_pt stores the number of hs */
    /* Nv is the number of variables */
    for (Nv = (L==1?2:L); Nv <= N; Nv++) {
      Jack = 0;
      for (H=0; H<M_beta_pt; H++) {
        Nk = M_beta[1][H];
        Mu = Parray[Nk];
        /* Beta_km = M_beta[0][H]; */
        Beta_km = beta(Kap,Mu); /* do not use the M_beta table. It's buggy. */
        printf("Nv(number of variables)=%a, Mu=%a, Beta_km=%a\n",Nv,Mu,Beta_km);
        P = psublen(Kap,Mu);
        Jack += (M_jack[Nv-1])[0][Nk]*Beta_km*util_v(x,[Nv])^P;
      }
      M_jack[Nv][0][K] = Jack;
      if (M_df) {
        /* The case of M_df > 0. */ 
        for (J=1; J<M_2n; J++) {
      Jack = 0;
      for (H=0; H<M_beta_pt; H++) {
        Nk = M_beta[1][H];
        Mu = Parray[Nk];
        /* Beta_km = M_beta[0][H]; */
        Beta_km = beta(Kap,Mu); /* do not use the M_beta table. It's buggy. */
        printf("M_df: Nv(number of variables)=%a, Mu=%a, Beta_km=%a\n",Nv,Mu,Beta_km);
        P = psublen(Kap,Mu);
        if (iand(J ,ishift(1,-(Nv-1)))) {
          JJ = iand(J, ixor(ishift(1,-(Nv-1)),0xffff));
          Jack += (M_jack[Nv-1])[JJ][Nk]*Beta_km*P*util_v(x,[Nv])^(P-1);
        }else{
          Jack += (M_jack[Nv-1])[J][Nk]*Beta_km*util_v(x,[Nv])^P;
        }
      }
      M_jack[Nv][J][K] = Jack;
        } /* end of J loop */
      }
    }
  }
}  

/* checkJack1(3,3) --> buggy when we use genBeta 
*/
def checkJack1(M,N) {
  genJack(M,N);
  for (I=1; I<=N; I++) {
    for (K=0; K<=P_pmn; K++) {
       printf("Nv=%a,Kap=%a, TableJack-Jack=%a\n",
              I,Parray[K],M_jack[I][0][K]-zonal(Parray[K],I));
    }
  }
  Rule=[];
  for (I=1; I<=N; I++) {
    Rule=cons([util_v(x,[I]),deval(I/10)],Rule);
  }
  printf("Rule=%a\n",Rule);
  for (I=1; I<=N; I++) {
    for (K=0; K<=P_pmn; K++) {
       printf("Nv=%a,Kap=%a, Jack=%a\n",
              I,Parray[K],base_replace(M_jack[I][0][K],Rule));
    }
  }
}
def mhdiff(F,J,N) {
  for (I=1; I<=N; I++) {
    if (iand(J,ishift(1,-(I-1)))) F = diff(F,util_v(x,[I]));
  } 
  return(F);
}
/*
 checkJack2(3,3), checkJack2(6,3), checkJack2(6,4);
*/
def checkJack2(M,N) {
  /* extern M_df; */
  M_df=1;
  genJack(M,N);
  for (I=1; I<=N; I++) {
    for (K=1; K<=P_pmn; K++) {
       Jack=zonal(Parray[K],I);
       for (J=0; J<M_2n; J++) {
         T = M_jack[I][J][K]-mhdiff(Jack,J,M_n);
         printf("Nv=%a, J(diff)=%a, Kap=%a, TableJack-Jack=%a\n",
                I,J,Parray[K],T);
         if (T != 0) error("checkJack2");
       }
    }
  }
  Rule=[];
  for (I=1; I<=N; I++) {
    Rule=cons([util_v(x,[I]),deval(I/10)],Rule);
  }
  printf("Rule=%a\n",Rule);
  for (I=1; I<=N; I++) {
    for (K=0; K<=P_pmn; K++) {
      for (J=0; J<M_2n; J++) 
      printf("Nv=%a,J(diff)=%a, Kap=%a, D^J Jack=%a\n",
              I,J,Parray[K],base_replace(M_jack[I][J][K],Rule));
    }
  }
}

def listJack(M,N) {
  genJack(M,N);
  printf("\\begin{eqnarray*}\n");
  for (K=0; K<=P_pmn; K++) {
    Kap = Parray[K];
    printf("J_{%a}(x_1,x_2,x_3)&=&  %a\\\\\n",Kap,print_tex_form(poly_sort(M_jack[3][0][K])));
  }
  printf("\\end{eqnarray*}\n");
}

def showStatic() {
  return [M_qk,M_kap,M_jack,Parray,P_pmn];
}

endmodule$
end$