[BACK]Return to M.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / engine

Diff for /OpenXM_contrib2/asir2000/engine/M.c between version 1.3 and 1.10

version 1.3, 2000/08/22 05:04:04 version 1.10, 2018/03/29 01:32:51
Line 45 
Line 45 
  * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,   * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
  * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.   * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
  *   *
  * $OpenXM: OpenXM_contrib2/asir2000/engine/M.c,v 1.2 2000/08/21 08:31:25 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/engine/M.c,v 1.9 2001/10/09 01:36:10 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "base.h"  #include "base.h"
   
 void addum(mod,p1,p2,pr)  void addum(int mod,UM p1,UM p2,UM pr)
 int mod;  
 UM p1,p2,pr;  
 {  {
         register int *c1,*c2,*cr,i,dmax,dmin;    register int *c1,*c2,*cr,i,dmax,dmin;
   
         if ( DEG(p1) == -1 ) {    if ( DEG(p1) == -1 ) {
                 cpyum(p2,pr);      cpyum(p2,pr);
                 return;      return;
         }    }
         if ( DEG(p2) == -1 ) {    if ( DEG(p2) == -1 ) {
                 cpyum(p1,pr);      cpyum(p1,pr);
                 return;      return;
         }    }
         if ( DEG(p1) >= DEG(p2) ) {    if ( DEG(p1) >= DEG(p2) ) {
                 c1 = COEF(p1); c2 = COEF(p2); dmax = DEG(p1); dmin = DEG(p2);      c1 = COEF(p1); c2 = COEF(p2); dmax = DEG(p1); dmin = DEG(p2);
         } else {    } else {
                 c1 = COEF(p2); c2 = COEF(p1); dmax = DEG(p2); dmin = DEG(p1);      c1 = COEF(p2); c2 = COEF(p1); dmax = DEG(p2); dmin = DEG(p1);
         }    }
         for ( i = 0, cr = COEF(pr); i <= dmin; i++ )    for ( i = 0, cr = COEF(pr); i <= dmin; i++ )
                 cr[i] = ( c1[i] + c2[i] ) % mod;      cr[i] = ( c1[i] + c2[i] ) % mod;
         for ( ; i <= dmax; i++ )    for ( ; i <= dmax; i++ )
                 cr[i] = c1[i];      cr[i] = c1[i];
         if ( dmax == dmin )    if ( dmax == dmin )
                 degum(pr,dmax);      degum(pr,dmax);
         else    else
                 DEG(pr) = dmax;      DEG(pr) = dmax;
 }  }
   
 void subum(mod,p1,p2,pr)  void subum(int mod,UM p1,UM p2,UM pr)
 int mod;  
 UM p1,p2,pr;  
 {  {
         register int *c1,*c2,*cr,i;    register int *c1,*c2,*cr,i;
         int dmax,dmin;    int dmax,dmin;
   
         if ( DEG(p1) == -1 ) {    if ( DEG(p1) == -1 ) {
                 for ( i = DEG(pr) = DEG(p2), c2 = COEF(p2), cr = COEF(pr);      for ( i = DEG(pr) = DEG(p2), c2 = COEF(p2), cr = COEF(pr);
                           i >= 0; i-- )          i >= 0; i-- )
                         cr[i] = ( mod - c2[i] ) % mod;        cr[i] = ( mod - c2[i] ) % mod;
                 return;      return;
         }    }
         if ( DEG(p2) == -1 ) {    if ( DEG(p2) == -1 ) {
                 cpyum(p1,pr);      cpyum(p1,pr);
                 return;      return;
         }    }
         c1 = COEF(p1); c2 = COEF(p2); cr = COEF(pr);    c1 = COEF(p1); c2 = COEF(p2); cr = COEF(pr);
         if ( DEG(p1) >= DEG(p2) ) {    if ( DEG(p1) >= DEG(p2) ) {
                 dmax = DEG(p1); dmin = DEG(p2);      dmax = DEG(p1); dmin = DEG(p2);
                 for ( i = 0; i <= dmin; i++ )      for ( i = 0; i <= dmin; i++ )
                         cr[i] = ( c1[i] + mod - c2[i] ) % mod;        cr[i] = ( c1[i] + mod - c2[i] ) % mod;
                 for ( ; i <= dmax; i++ )      for ( ; i <= dmax; i++ )
                         cr[i] = c1[i];        cr[i] = c1[i];
         } else {    } else {
                 dmax = DEG(p2); dmin = DEG(p1);      dmax = DEG(p2); dmin = DEG(p1);
                 for ( i = 0; i <= dmin; i++ )      for ( i = 0; i <= dmin; i++ )
                         cr[i] = ( c1[i] + mod - c2[i] ) % mod;        cr[i] = ( c1[i] + mod - c2[i] ) % mod;
                 for ( ; i <= dmax; i++ )      for ( ; i <= dmax; i++ )
                         cr[i] = ( mod - c2[i] ) % mod;        cr[i] = ( mod - c2[i] ) % mod;
         }    }
         if ( dmax == dmin )    if ( dmax == dmin )
                 degum(pr,dmax);      degum(pr,dmax);
         else    else
                 DEG(pr) = dmax;      DEG(pr) = dmax;
 }  }
   
 void pwrum(mod,p,e,pr)  void pwrum(int mod,UM p,int e,UM pr)
 int mod,e;  
 UM p,pr;  
 {  {
         UM wt,ws;    UM wt,ws;
   
         if ( e == 0 ) {    if ( e == 0 ) {
                 DEG(pr) = 0; COEF(pr)[0] = 1;      DEG(pr) = 0; COEF(pr)[0] = 1;
         } else if ( DEG(p) < 0 )    } else if ( DEG(p) < 0 )
                 DEG(pr) = -1;      DEG(pr) = -1;
         else if ( e == 1 )    else if ( e == 1 )
                 cpyum(p,pr);      cpyum(p,pr);
         else if ( DEG(p) == 0 ) {    else if ( DEG(p) == 0 ) {
                 DEG(pr) = 0; COEF(pr)[0] = pwrm(mod,COEF(p)[0],e);      DEG(pr) = 0; COEF(pr)[0] = pwrm(mod,COEF(p)[0],e);
         } else {    } else {
                 wt = W_UMALLOC(DEG(p)*e); ws = W_UMALLOC(DEG(p)*e);      wt = W_UMALLOC(DEG(p)*e); ws = W_UMALLOC(DEG(p)*e);
                 pwrum(mod,p,e/2,wt);      pwrum(mod,p,e/2,wt);
                 if ( !(e%2) )      if ( !(e%2) )
                         mulum(mod,wt,wt,pr);        mulum(mod,wt,wt,pr);
                 else {      else {
                         mulum(mod,wt,wt,ws); mulum(mod,ws,p,pr);        mulum(mod,wt,wt,ws); mulum(mod,ws,p,pr);
                 }      }
         }    }
 }  }
   
 void gcdum(mod,p1,p2,pr)  void gcdum(int mod,UM p1,UM p2,UM pr)
 register int mod;  
 UM p1,p2,pr;  
 {  {
         register int inv;    register int inv;
         UM t1,t2,q,tum;    UM t1,t2,q,tum;
         int drem;    int drem;
   
         if ( DEG(p1) < 0 )    if ( DEG(p1) < 0 )
                 cpyum(p2,pr);      cpyum(p2,pr);
         else if ( DEG(p2) < 0 )    else if ( DEG(p2) < 0 )
                 cpyum(p1,pr);      cpyum(p1,pr);
         else {    else {
                 if ( DEG(p1) >= DEG(p2) ) {      if ( DEG(p1) >= DEG(p2) ) {
                         t1 = p1; t2 = p2;        t1 = p1; t2 = p2;
                 } else {      } else {
                         t1 = p2; t2 = p1;        t1 = p2; t2 = p1;
                 }      }
                 q = W_UMALLOC(DEG(t1));      q = W_UMALLOC(DEG(t1));
                 while ( ( drem = divum(mod,t1,t2,q) ) >= 0 ) {      while ( ( drem = divum(mod,t1,t2,q) ) >= 0 ) {
                         tum = t1; t1 = t2; t2 = tum; DEG(t2) = drem;        tum = t1; t1 = t2; t2 = tum; DEG(t2) = drem;
                 }      }
                 inv = invm(COEF(t2)[DEG(t2)],mod);      inv = invm(COEF(t2)[DEG(t2)],mod);
                 mulsum(mod,t2,inv,pr);      mulsum(mod,t2,inv,pr);
         }    }
 }  }
   
 void eucum(mod,f1,f2,a,b)  void eucum(int mod,UM f1,UM f2,UM a,UM b)
 register int mod;  
 UM f1,f2,a,b;  
 {  {
         UM g1,g2,a1,a2,a3,wm,q,tum;    UM g1,g2,a1,a2,a3,wm,q,tum;
         int d,dr;    int d,dr;
   
         d = DEG(f1) + DEG(f2) + 10;    d = DEG(f1) + DEG(f2) + 10;
         g1 = W_UMALLOC(d); g2 = W_UMALLOC(d); a1 = W_UMALLOC(d);    g1 = W_UMALLOC(d); g2 = W_UMALLOC(d); a1 = W_UMALLOC(d);
         a2 = W_UMALLOC(d); a3 = W_UMALLOC(d); wm = W_UMALLOC(d);    a2 = W_UMALLOC(d); a3 = W_UMALLOC(d); wm = W_UMALLOC(d);
         q = W_UMALLOC(d);    q = W_UMALLOC(d);
         DEG(a1) = 0; COEF(a1)[0] = 1; DEG(a2) = -1;    DEG(a1) = 0; COEF(a1)[0] = 1; DEG(a2) = -1;
         cpyum(f1,g1); cpyum(f2,g2);    cpyum(f1,g1); cpyum(f2,g2);
         while ( 1 ) {    while ( 1 ) {
                 dr = divum(mod,g1,g2,q); tum = g1; g1 = g2; g2 = tum;      dr = divum(mod,g1,g2,q); tum = g1; g1 = g2; g2 = tum;
                 if ( ( DEG(g2) = dr ) == -1 )      if ( ( DEG(g2) = dr ) == -1 )
                         break;        break;
                 mulum(mod,a2,q,wm); subum(mod,a1,wm,a3); dr = divum(mod,a3,f2,q);      mulum(mod,a2,q,wm); subum(mod,a1,wm,a3); dr = divum(mod,a3,f2,q);
                 tum = a1; a1 = a2; a2 = a3; a3 = tum; DEG(a3) = dr;      tum = a1; a1 = a2; a2 = a3; a3 = tum; DEG(a3) = dr;
         }    }
         if ( COEF(g1)[0] != 1 )    if ( COEF(g1)[0] != 1 )
                 mulsum(mod,a2,invm(COEF(g1)[0],mod),a);      mulsum(mod,a2,invm(COEF(g1)[0],mod),a);
         else    else
                 cpyum(a2,a);      cpyum(a2,a);
         mulum(mod,a,f1,wm);    mulum(mod,a,f1,wm);
         if ( DEG(wm) >= 0 )    if ( DEG(wm) >= 0 )
                 COEF(wm)[0] = ( COEF(wm)[0] + mod - 1 ) % mod;      COEF(wm)[0] = ( COEF(wm)[0] + mod - 1 ) % mod;
         else {    else {
                 DEG(wm) = 0; COEF(wm)[0] = mod - 1;      DEG(wm) = 0; COEF(wm)[0] = mod - 1;
         }    }
         divum(mod,wm,f2,q); mulsum(mod,q,mod-1,b);    divum(mod,wm,f2,q); mulsum(mod,q,mod-1,b);
   #if 0
     t1 = W_UMALLOC(d);
     t2 = W_UMALLOC(d);
     t3 = W_UMALLOC(d);
     mulum(mod,a,f1,t1);
     mulum(mod,b,f2,t2);
     addum(mod,t1,t2,t3);
   #endif
 }  }
   
 void sqfrum(index,count,f,nindex,dcr,pl)  void eucum2(int mod,UM f1,UM f2,UM a,UM b)
 int index,count,*nindex;  
 P f;  
 struct oDUM **dcr;  
 ML *pl;  
 {  {
         int i,j,m,n,d,dt,mod;    UM gk,gk1,gk2,ak,ak1,ak2,bk,bk1,bk2,q,t,wm1,wm2,wz;
         UM wf,wdf,ws,wt,wgcd,mf,mgcd;    int d,inv;
         UM *l;    UM t1,t2;
         struct oDUM *dc;  
         ML tp;  
   
         n = UDEG(f);    d = 2*(DEG(f1) + DEG(f2));
         wf = W_UMALLOC(n);    gk = W_UMALLOC(d); gk1 = W_UMALLOC(d); gk2 = W_UMALLOC(d);
         wdf = W_UMALLOC(n);    ak = W_UMALLOC(d); ak1 = W_UMALLOC(d); ak2 = W_UMALLOC(d);
         ws = W_UMALLOC(n);    bk = W_UMALLOC(d); bk1 = W_UMALLOC(d); bk2 = W_UMALLOC(d);
         wt = W_UMALLOC(n);    q = W_UMALLOC(d); wm1 = W_UMALLOC(d); wm2 = W_UMALLOC(d);
         wgcd = W_UMALLOC(n);    wz = W_UMALLOC(d);
   
     t1 = UMALLOC(1000);
     t2 = UMALLOC(1000);
     cpyum(f1,t1);
     cpyum(f2,t2);
   
         mf = W_UMALLOC(n);    DEG(ak) = 0; COEF(ak)[0] = 1;
         mgcd = W_UMALLOC(n);    DEG(ak1) = -1;
     DEG(bk) = -1;
     DEG(bk1) = 0; COEF(bk1)[0] = 1;
   
         for ( j = 0, d = n; j < count && d; ) {    cpyum(f1,gk); cpyum(f2,gk1);
                 m = lprime[index++];  
                 if ( !m )  
                         error("sqfrum : lprime[] exhausted.");  
                 if ( rem(NM((Q)COEF(DC(f))),m) == 0 ) continue;  
   
                 ptoum(m,f,wf);    while ( 1 ) {
                 diffum(m,wf,wdf);      /* ak*f1+bk*f2 = gk, ak1*f1+bk1*f2 = gk1 */
                 cpyum(wf,wt); cpyum(wdf,ws);      cpyum(gk,gk2);
                 gcdum(m,wt,ws,wgcd);      DEG(gk2) = divum(mod,gk2,gk1,q);
                 dt = DEG(wgcd);      /* gk2 = gk - q*gk1 */
       if ( DEG(gk2) == -1 )
         break;
       /* ak2 = ak - q*ak1, bk2 = bk - q*bk1 */
       mulum(mod,ak1,q,wm1); subum(mod,ak,wm1,ak2);
       mulum(mod,bk1,q,wm1); subum(mod,bk,wm1,bk2);
   
                 if ( dt < d ) {      /* shift */
                         d = dt;      t = ak; ak = ak1; ak1 = ak2; ak2 = t;
                         mod = m;      t = bk; bk = bk1; bk1 = bk2; bk2 = t;
                         cpyum(wf,mf); cpyum(wgcd,mgcd);      t = gk; gk = gk1; gk1 = gk2; gk2 = t;
                 }    }
                 j++;    /* ak1*f1+bk1*f2 = gk1 = GCD(f1,f2) */
         }    mulum(mod,ak1,t1,wm1);
         *nindex = index;    mulum(mod,bk1,t2,wm2);
     addum(mod,wm1,wm2,wz);
     if ( DEG(wz) != 0 )
       error("euc 1");
   
         sqfrummain(mod,mf,mgcd,&dc);    DEG(ak1) = divum(mod,ak1,f2,q);
         *dcr = dc;    DEG(bk1) = divum(mod,bk1,f1,q);
     mulum(mod,ak1,f1,wm1);
     mulum(mod,bk1,f2,wm2);
     addum(mod,wm1,wm2,wz);
     if ( DEG(wz) != 0 )
       error("euc 2");
   
         for ( n = 0; dc[n].f; n++ );  
         *pl = tp = MLALLOC(n+1);  
         tp->n = n;  
         tp->mod = mod;  
   
         for ( i = 0, l = (UM *)COEF(tp); dc[i].f; i++ ) {    if ( COEF(wz)[0] != 1 ) {
                 l[i] = UMALLOC(DEG(dc[i].f)*dc[i].n);      inv = invm(COEF(wz)[0],mod);
                 pwrum(mod,dc[i].f,dc[i].n,l[i]);      mulsum(mod,ak1,inv,a);
         }      mulsum(mod,bk1,inv,b);
         l[i] = 0;    } else {
       cpyum(ak1,a);
       cpyum(bk1,b);
     }
 }  }
   
 void sqfrummain(mod,p,gcd,dcp)  void sqfrum(int index,int count,P f,int *nindex,struct oDUM **dcr,ML *pl)
 int mod;  
 UM p,gcd;  
 struct oDUM **dcp;  
 {  {
         int i,j,n;    int i,j,m,n,d,dt,mod;
         UM wp,wdp,wc,wd,ws,wt,wq;    UM wf,wdf,ws,wt,wgcd,mf,mgcd;
         struct oDUM *dc;    UM *l;
         UM *f;    struct oDUM *dc;
     ML tp;
   
         i = DEG(p);    n = UDEG(f);
     wf = W_UMALLOC(n);
     wdf = W_UMALLOC(n);
     ws = W_UMALLOC(n);
     wt = W_UMALLOC(n);
     wgcd = W_UMALLOC(n);
   
         wp = W_UMALLOC(i);    mf = W_UMALLOC(n);
         wdp = W_UMALLOC(i);    mgcd = W_UMALLOC(n);
         wt = W_UMALLOC(i);  
         ws = W_UMALLOC(i);  
         wc = W_UMALLOC(i);  
         wd = W_UMALLOC(i);  
         wq =  W_UMALLOC(i);  
   
         f = (UM *) ALLOCA((i+2)*sizeof(UM));    for ( j = 0, d = n; j < count && d; ) {
       m = get_lprime(index++);
       if ( rem(NM((Q)COEF(DC(f))),m) == 0 ) continue;
   
         cpyum(p,wp);      ptoum(m,f,wf);
         diffum(mod,wp,wdp);      diffum(m,wf,wdf);
       cpyum(wf,wt); cpyum(wdf,ws);
       gcdum(m,wt,ws,wgcd);
       dt = DEG(wgcd);
   
         cpyum(wp,wt);      if ( dt < d ) {
         divum(mod,wt,gcd,wc);        d = dt;
         mod = m;
         cpyum(wf,mf); cpyum(wgcd,mgcd);
       }
       j++;
     }
     *nindex = index;
   
         cpyum(wdp,wt);    sqfrummain(mod,mf,mgcd,&dc);
         divum(mod,wt,gcd,ws);    *dcr = dc;
   
         diffum(mod,wc,wt);    for ( n = 0; dc[n].f; n++ );
         subum(mod,ws,wt,wd);    *pl = tp = MLALLOC(n+1);
     tp->n = n;
     tp->mod = mod;
   
         for ( i = 1; DEG(wd) >= 0; i++ ) {    for ( i = 0, l = (UM *)COEF(tp); dc[i].f; i++ ) {
                 cpyum(wc,ws); cpyum(wd,wt);      l[i] = UMALLOC(DEG(dc[i].f)*dc[i].n);
                 gcdum(mod,ws,wt,wq);      pwrum(mod,dc[i].f,dc[i].n,l[i]);
                 if ( DEG(wq) > 0 ) {    }
                         f[i] = UMALLOC(DEG(wq));    l[i] = 0;
                         cpyum(wq,f[i]);  }
   
                         cpyum(wc,ws);  void sqfrummain(int mod,UM p,UM gcd,struct oDUM **dcp)
                         divum(mod,ws,f[i],wc);  {
                         divum(mod,wd,f[i],ws);    int i,j,n;
                         diffum(mod,wc,wt);    UM wp,wdp,wc,wd,ws,wt,wq;
                         subum(mod,ws,wt,wd);    struct oDUM *dc;
                 } else {    UM *f;
                         f[i] = 0;  
                         cpyum(wd,ws);  
                         diffum(mod,wc,wt);  
                         subum(mod,ws,wt,wd);  
                 }  
   
         }  
   
         if ( DEG(wc) > 0 ) {    i = DEG(p);
                 DEG(wq) = 0;  
                 COEF(wq)[0] = invm(COEF(wc)[DEG(wc)],mod);  
                 f[i] = UMALLOC(DEG(wc));  
                 mulum(mod,wc,wq,f[i]);  
                 f[i+1] = 0;  
                 n = i + 1;  
         } else {  
                 f[i] = 0;  
                 n = i;  
         }  
   
         for ( i = 1, j = 0; i < n; i++ )  
                 if ( f[i] ) j++;  
   
         *dcp = dc = (struct oDUM *) CALLOC(j+1,sizeof(struct oDUM));    wp = W_UMALLOC(i);
     wdp = W_UMALLOC(i);
     wt = W_UMALLOC(i);
     ws = W_UMALLOC(i);
     wc = W_UMALLOC(i);
     wd = W_UMALLOC(i);
     wq =  W_UMALLOC(i);
   
         for ( i = 1, j = 0; i < n; i++ )    f = (UM *) ALLOCA((i+2)*sizeof(UM));
                 if ( f[i] ) {  
                         dc[j].n = i;    cpyum(p,wp);
                         dc[j].f = f[i];    diffum(mod,wp,wdp);
                         j++;  
                 }    cpyum(wp,wt);
         dc[j].n = 0;    divum(mod,wt,gcd,wc);
         dc[j].f = 0;  
     cpyum(wdp,wt);
     divum(mod,wt,gcd,ws);
   
     diffum(mod,wc,wt);
     subum(mod,ws,wt,wd);
   
     for ( i = 1; DEG(wd) >= 0; i++ ) {
       cpyum(wc,ws); cpyum(wd,wt);
       gcdum(mod,ws,wt,wq);
       if ( DEG(wq) > 0 ) {
         f[i] = UMALLOC(DEG(wq));
         cpyum(wq,f[i]);
   
         cpyum(wc,ws);
         divum(mod,ws,f[i],wc);
         divum(mod,wd,f[i],ws);
         diffum(mod,wc,wt);
         subum(mod,ws,wt,wd);
       } else {
         f[i] = 0;
         cpyum(wd,ws);
         diffum(mod,wc,wt);
         subum(mod,ws,wt,wd);
       }
   
     }
   
     if ( DEG(wc) > 0 ) {
       DEG(wq) = 0;
       COEF(wq)[0] = invm(COEF(wc)[DEG(wc)],mod);
       f[i] = UMALLOC(DEG(wc));
       mulum(mod,wc,wq,f[i]);
       f[i+1] = 0;
       n = i + 1;
     } else {
       f[i] = 0;
       n = i;
     }
   
     for ( i = 1, j = 0; i < n; i++ )
       if ( f[i] ) j++;
   
     *dcp = dc = (struct oDUM *) CALLOC(j+1,sizeof(struct oDUM));
   
     for ( i = 1, j = 0; i < n; i++ )
       if ( f[i] ) {
         dc[j].n = i;
         dc[j].f = f[i];
         j++;
       }
     dc[j].n = 0;
     dc[j].f = 0;
 }  }
   
 void cpyum(p1,p2)  void cpyum(UM p1,UM p2)
 UM p1,p2;  
 {  {
         register int *c1,*c2,i;    register int *c1,*c2,i;
   
         for ( i = DEG(p2) = DEG(p1), c1 = COEF(p1), c2 = COEF(p2);    for ( i = DEG(p2) = DEG(p1), c1 = COEF(p1), c2 = COEF(p2);
                   i >= 0; i-- )        i >= 0; i-- )
                 c2[i] = c1[i];      c2[i] = c1[i];
 }  }
   
 void degum(f,n)  void clearum(UM p,int n)
 UM f;  
 int n;  
 {  {
         register int i,*c;    DEG(p) = -1;
     bzero(COEF(p),(n+1)*sizeof(int));
   }
   
         for ( i = n, c = COEF(f); ( i >= 0 ) && ( c[i] == 0 ); i-- );  void degum(UM f,int n)
         DEG(f) = i;  {
     register int i,*c;
   
     for ( i = n, c = COEF(f); ( i >= 0 ) && ( c[i] == 0 ); i-- );
     DEG(f) = i;
 }  }
   
 int deg(v,p)  int deg(V v,P p)
 V v;  
 P p;  
 {  {
         if ( !p )    if ( !p )
                 return ( -1 );      return ( -1 );
         else if ( NUM(p) )    else if ( NUM(p) )
                 return ( 0 );      return ( 0 );
         else if ( VR(p) != v )    else if ( VR(p) != v )
                 return ( 0 );      return ( 0 );
         else if ( PL(NM(DEG(DC(p)))) > 1 ) {    else if ( PL(NM(DEG(DC(p)))) > 1 ) {
                 error("degree too large");      error("degree too large");
                 return ( -1 );      return ( -1 );
         } else    } else
                 return ( UDEG(p) );      return ( UDEG(p) );
 }  }
   
 LUM LUMALLOC(n,bound)  LUM LUMALLOC(int n,int bound)
 int n,bound;  
 {  {
         LUM p;    LUM p;
         int **c;    int **c;
         int i;    int i;
   
         p = (LUM)MALLOC(TRUESIZE(oLUM,n,int *));    p = (LUM)MALLOC(TRUESIZE(oLUM,n,int *));
         DEG(p) = n;    DEG(p) = n;
         for ( i = 0, c = (int **)COEF(p); i <= n; i++ ) {    for ( i = 0, c = (int **)COEF(p); i <= n; i++ ) {
                 c[i] = (int *)MALLOC_ATOMIC((bound+1)*sizeof(int));      c[i] = (int *)MALLOC_ATOMIC((bound+1)*sizeof(int));
                 bzero((char *)c[i],(bound+1)*sizeof(int));      bzero((char *)c[i],(bound+1)*sizeof(int));
         }    }
         return p;    return p;
 }  }
   
 void mullum(mod,n,f1,f2,fr)  /* dx = deg in x, dy = deg in y, c[i] <-> the coef of y^i (poly in x) */
 int mod,n;  
 LUM f1,f2,fr;  BM BMALLOC(int dx,int dy)
 {  {
         int max;    BM p;
         register int i,j,**p1,**p2,*px;    UM *c;
         int *w,*w1,*w2;    int i;
   
         p1 = (int **)COEF(f1); p2 = (int **)COEF(f2);    p = (BM)MALLOC(TRUESIZE(oBM,dy,UM));
         w = W_ALLOC(2*(n+1)); w1 = W_ALLOC(DEG(f1)); w2 = W_ALLOC(DEG(f2));    DEG(p) = dy;
         for ( i = DEG(f1); i >= 0; i-- ) {    for ( i = 0, c = (UM *)COEF(p); i <= dy; i++ ) {
                 for ( j = n - 1, px = p1[i]; ( j >= 0 ) && ( px[j] == 0 ); j-- );      c[i] = UMALLOC(dx);
                 w1[i] = ( j == -1 ? 0 : 1 );      clearum(c[i],dx);
         }    }
         for ( i = DEG(f2); i >= 0; i-- ) {    return p;
                 for ( j = n - 1, px = p2[i]; ( j >= 0 ) && ( px[j] == 0 ); j-- );  
                 w2[i] = ( j == -1 ? 0 : 1 );  
         }  
         for ( j = DEG(fr) = DEG(f1) + DEG(f2); j >= 0; j-- ) {  
                 for ( i = n - 1, px = COEF(fr)[j]; i >= 0; i-- )  
                         px[i] = 0;  
                 for ( max = MIN(DEG(f1),j), i = MAX(0,j-DEG(f2)); i <= max; i++ )  
                         if ( w1[i] != 0 && w2[j - i] != 0 ) {  
                                 mulpadic(mod,n,p1[i],p2[j - i],w); addpadic(mod,n,w,px);  
                         }  
         }  
 }  }
   
 void cpylum(bound,p,r)  void mullum(int mod,int n,LUM f1,LUM f2,LUM fr)
 int bound;  
 LUM p,r;  
 {  {
         register int i,j;    int max;
         register int **pp,**ppr;    register int i,j,**p1,**p2,*px;
     int *w,*w1,*w2;
   
         DEG(r) = DEG(p);    p1 = (int **)COEF(f1); p2 = (int **)COEF(f2);
         for ( i = 0, pp = COEF(p), ppr = COEF(r);    w = W_ALLOC(2*(n+1)); w1 = W_ALLOC(DEG(f1)); w2 = W_ALLOC(DEG(f2));
                 i <= DEG(p); i++ )    for ( i = DEG(f1); i >= 0; i-- ) {
                 for ( j = 0; j < bound; j++ )      for ( j = n - 1, px = p1[i]; ( j >= 0 ) && ( px[j] == 0 ); j-- );
                         ppr[i][j] = pp[i][j];      w1[i] = ( j == -1 ? 0 : 1 );
     }
     for ( i = DEG(f2); i >= 0; i-- ) {
       for ( j = n - 1, px = p2[i]; ( j >= 0 ) && ( px[j] == 0 ); j-- );
       w2[i] = ( j == -1 ? 0 : 1 );
     }
     for ( j = DEG(fr) = DEG(f1) + DEG(f2); j >= 0; j-- ) {
       for ( i = n - 1, px = COEF(fr)[j]; i >= 0; i-- )
         px[i] = 0;
       for ( max = MIN(DEG(f1),j), i = MAX(0,j-DEG(f2)); i <= max; i++ )
         if ( w1[i] != 0 && w2[j - i] != 0 ) {
           mulpadic(mod,n,p1[i],p2[j - i],w); addpadic(mod,n,w,px);
         }
     }
 }  }
   
 void pwrlum(mod,bound,p,n,r)  void cpylum(int bound,LUM p,LUM r)
 int mod,bound,n;  
 LUM p,r;  
 {  {
         LUM t,s;    register int i,j;
     register int **pp,**ppr;
   
         if ( n == 0 ) {    DEG(r) = DEG(p);
                 DEG(r) = 0;    for ( i = 0, pp = COEF(p), ppr = COEF(r);
                 COEF(r)[0][0] = 1;      i <= DEG(p); i++ )
         } else if ( DEG(p) < 0 )      for ( j = 0; j < bound; j++ )
                 DEG(r) = -1;        ppr[i][j] = pp[i][j];
         else if ( n == 1 )  
                 cpylum(bound,p,r);  
         else {  
                 W_LUMALLOC(DEG(p)*n,bound,t);  
                 pwrlum(mod,bound,p,n/2,t);  
                 if ( !(n%2) )  
                         mullum(mod,bound,t,t,r);  
                 else {  
                         W_LUMALLOC(DEG(p)*n,bound,s);  
                         mullum(mod,bound,t,t,s);  
                         mullum(mod,bound,s,p,r);  
                 }  
         }  
 }  }
   
 int **almat(n,m)  int isequalum(UM f1,UM f2)
 int n,m;  
 {  {
         int **mat,i;    int i;
   
         mat = (int **)MALLOC(n*sizeof(int *));    if ( DEG(f1) < 0 )
         for ( i = 0; i < n; i++ )      if ( DEG(f2) < 0 )
                 mat[i] = (int *)CALLOC(m,sizeof(int));        return 1;
         return mat;      else
         return 0;
     else if ( DEG(f2) < 0 )
       return 0;
     else {
       if ( DEG(f1) != DEG(f2) )
         return 0;
       for ( i = 0; i <= DEG(f1); i++ )
         if ( COEF(f1)[i] != COEF(f2)[i] )
           break;
       if ( i < DEG(f1) )
         return 0;
       else
         return 1;
     }
 }  }
   
 void mini(mod,f,fr)  void pwrlum(int mod,int bound,LUM p,int n,LUM r)
 register int mod;  
 UM f,fr;  
 {  {
         register int i,j,**c,*ptr;    LUM t,s;
         int d,dr,dm,n;  
         UM w,q;  
   
         n = DEG(f); c = (int **)ALLOCA(n*sizeof(int *));    if ( n == 0 ) {
         for ( i = 0; i < n; i++ ) {      DEG(r) = 0;
                 c[i] = (int *)ALLOCA(n*sizeof(int));      COEF(r)[0][0] = 1;
                 bzero((char *)c[i],(int)(n*sizeof(int)));    } else if ( DEG(p) < 0 )
         }      DEG(r) = -1;
         w = W_UMALLOC( mod + n + 10 ); q = W_UMALLOC( mod + n + 10 );    else if ( n == 1 )
         for ( i = 1; ( d = ( mod * i ) ) < n; i++ ) c[d][i - 1] = 1;      cpylum(bound,p,r);
         DEG(w) = d;    else {
         for ( j = 0; j < d; j++ )      W_LUMALLOC(DEG(p)*n,bound,t);
                 COEF(w)[j] = 0;      pwrlum(mod,bound,p,n/2,t);
         COEF(w)[d] = 1;      if ( !(n%2) )
         for ( ; (i < n) && ((dr = divum(mod,w,f,q)) >= 0); i++ ) {        mullum(mod,bound,t,t,r);
                 for ( j = dr; j >= 0; j-- )      else {
                         COEF(w)[j + mod] = c[j][i - 1] = COEF(w)[j];        W_LUMALLOC(DEG(p)*n,bound,s);
                 for ( j = mod - 1; j >= 0; j-- )        mullum(mod,bound,t,t,s);
                         COEF(w)[j] = 0;        mullum(mod,bound,s,p,r);
                 DEG(w) = dr + mod;      }
         }    }
         for ( i = 1; i < n; i++ )  
                 c[i][i - 1] = ( c[i][i - 1] + mod - 1 ) % mod;  
         if ( ( dm = minimain(mod,n,n - 1,c) ) != -1 )  
                 for ( i = 0, ptr = COEF(fr), ptr[0] = 0; i <= dm; i++ )  
                         ptr[i + 1] = c[0][i];  
         else  
                 COEF(fr)[0] = 1;  
         DEG(fr) = dm + 1;  
 }  }
   
 int minimain(mod,n,m,c)  int **almat(int n,int m)
 register int mod;  
 int n,m;  
 register int **c;  
 {  {
         register int *ptr,*ci,*p;    int **mat,i;
         register int i,l,a,j,b,inv;  
         int *tmp;  
   
         for ( j = 0; j < m; j++ ) {    mat = (int **)MALLOC(n*sizeof(int *));
                 for ( i = j; (n > i) && !c[i][j]; i++ );    for ( i = 0; i < n; i++ )
                 if ( i == n ) {      mat[i] = (int *)CALLOC(m,sizeof(int));
                         for ( i = j, j = j - 1; j >= 0; j-- )    return mat;
                                 c[0][j] = c[j][i];  
                         c[0][i] = mod - 1;  
                         return( i );  
                 }  
                 if ( i != j ) {  
                         tmp = c[i]; c[i] = c[j]; c[j] = tmp;  
                 }  
                 ptr = c[j]; inv = invm((ptr[j] + mod) % mod,mod);  
                 for ( l = j, p = ptr+l; l < m; l++ ) {  
                         a = (*p * inv) % mod;  
                         *p++ = (a<0?a+mod:a);  
                 }  
                 for ( i = 0; i < n; i++ )  
                         if ( (a = -c[i][j]) && (i != j) ) {  
                                 for ( l = j+1, p = ptr+l, ci = c[i]+l; l < m; l++ ) {  
                                         b = (*p++ * a + *ci) % mod;  
                                         *ci++ = (b<0?b+mod:b);  
                                 }  
                                 c[i][j] = 0;  
                         }  
         }  
         return (-1);  
 }  }
   
 #if defined(__GNUC__) || defined(THINK_C)  void mini(int mod,UM f,UM fr)
   {
     register int i,j,**c,*ptr;
     int d,dr,dm,n;
     UM w,q;
   
     n = DEG(f); c = (int **)ALLOCA(n*sizeof(int *));
     for ( i = 0; i < n; i++ ) {
       c[i] = (int *)ALLOCA(n*sizeof(int));
       bzero((char *)c[i],(int)(n*sizeof(int)));
     }
     w = W_UMALLOC( mod + n + 10 ); q = W_UMALLOC( mod + n + 10 );
     for ( i = 1; ( d = ( mod * i ) ) < n; i++ ) c[d][i - 1] = 1;
     DEG(w) = d;
     for ( j = 0; j < d; j++ )
       COEF(w)[j] = 0;
     COEF(w)[d] = 1;
     for ( ; (i < n) && ((dr = divum(mod,w,f,q)) >= 0); i++ ) {
       for ( j = dr; j >= 0; j-- )
         COEF(w)[j + mod] = c[j][i - 1] = COEF(w)[j];
       for ( j = mod - 1; j >= 0; j-- )
         COEF(w)[j] = 0;
       DEG(w) = dr + mod;
     }
     for ( i = 1; i < n; i++ )
       c[i][i - 1] = ( c[i][i - 1] + mod - 1 ) % mod;
     if ( ( dm = minimain(mod,n,n - 1,c) ) != -1 )
       for ( i = 0, ptr = COEF(fr), ptr[0] = 0; i <= dm; i++ )
         ptr[i + 1] = c[0][i];
     else
       COEF(fr)[0] = 1;
     DEG(fr) = dm + 1;
   }
   
   int minimain(int mod,int n,int m,int **c)
   {
     register int *ptr,*ci,*p;
     register int i,l,a,j,b,inv;
     int *tmp;
   
     for ( j = 0; j < m; j++ ) {
       for ( i = j; (n > i) && !c[i][j]; i++ );
       if ( i == n ) {
         for ( i = j, j = j - 1; j >= 0; j-- )
           c[0][j] = c[j][i];
         c[0][i] = mod - 1;
         return( i );
       }
       if ( i != j ) {
         tmp = c[i]; c[i] = c[j]; c[j] = tmp;
       }
       ptr = c[j]; inv = invm((ptr[j] + mod) % mod,mod);
       for ( l = j, p = ptr+l; l < m; l++ ) {
         a = (*p * inv) % mod;
         *p++ = (a<0?a+mod:a);
       }
       for ( i = 0; i < n; i++ )
         if ( (a = -c[i][j]) && (i != j) ) {
           for ( l = j+1, p = ptr+l, ci = c[i]+l; l < m; l++ ) {
             b = (*p++ * a + *ci) % mod;
             *ci++ = (b<0?b+mod:b);
           }
           c[i][j] = 0;
         }
     }
     return (-1);
   }
   
   #if defined(__GNUC__)
 const  const
 #endif  #endif
 int sprime[] = {  int sprime[] = {
         2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,    2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,
         53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,    53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,
         127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,    127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,
         199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,    199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,
         283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,    283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,
         383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,    383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,
         467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,    467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,
         577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,    577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,
         661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,    661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,
         769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,    769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,
         877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,    877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,
         983,991,997,1009,1013,1019,1021,1031,1033,1039,1049,1051,1061,1063,1069,    983,991,997,1009,1013,1019,1021,1031,1033,1039,1049,1051,1061,1063,1069,
         1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,    1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,
         1193,1201,1213,1217,1223,1229,1231,1237,1249,1259,1277,1279,1283,1289,1291,    1193,1201,1213,1217,1223,1229,1231,1237,1249,1259,1277,1279,1283,1289,1291,
         1297,1301,1303,1307,1319,1321,1327,1361,1367,1373,1381,1399,1409,1423,1427,    1297,1301,1303,1307,1319,1321,1327,1361,1367,1373,1381,1399,1409,1423,1427,
         1429,1433,1439,1447,1451,1453,1459,1471,1481,1483,1487,1489,1493,1499,1511,    1429,1433,1439,1447,1451,1453,1459,1471,1481,1483,1487,1489,1493,1499,1511,
         1523,1531,1543,1549,1553,1559,1567,1571,1579,1583,1597,1601,1607,1609,1613,    1523,1531,1543,1549,1553,1559,1567,1571,1579,1583,1597,1601,1607,1609,1613,
         1619,1621,1627,1637,1657,1663,1667,1669,1693,1697,1699,1709,1721,1723,1733,    1619,1621,1627,1637,1657,1663,1667,1669,1693,1697,1699,1709,1721,1723,1733,
         1741,1747,1753,1759,1777,1783,1787,1789,1801,1811,1823,1831,1847,1861,1867,    1741,1747,1753,1759,1777,1783,1787,1789,1801,1811,1823,1831,1847,1861,1867,
         1871,1873,1877,1879,1889,1901,1907,1913,1931,1933,1949,1951,1973,1979,1987,    1871,1873,1877,1879,1889,1901,1907,1913,1931,1933,1949,1951,1973,1979,1987,
         1993,1997,1999,2003,2011,2017,2027,2029,2039,2053,2063,2069,2081,2083,2087,    1993,1997,1999,2003,2011,2017,2027,2029,2039,2053,2063,2069,2081,2083,2087,
         2089,2099,2111,2113,2129,2131,2137,2141,2143,2153,2161,2179,2203,2207,2213,    2089,2099,2111,2113,2129,2131,2137,2141,2143,2153,2161,2179,2203,2207,2213,
         2221,2237,2239,2243,2251,2267,2269,2273,2281,2287,2293,2297,2309,2311,2333,    2221,2237,2239,2243,2251,2267,2269,2273,2281,2287,2293,2297,2309,2311,2333,
         2339,2341,2347,2351,2357,2371,2377,2381,2383,2389,2393,2399,2411,2417,2423,    2339,2341,2347,2351,2357,2371,2377,2381,2383,2389,2393,2399,2411,2417,2423,
         2437,2441,2447,2459,2467,2473,2477,2503,2521,2531,2539,2543,2549,2551,2557,    2437,2441,2447,2459,2467,2473,2477,2503,2521,2531,2539,2543,2549,2551,2557,
         2579,2591,2593,2609,2617,2621,2633,2647,2657,2659,2663,2671,2677,2683,2687,    2579,2591,2593,2609,2617,2621,2633,2647,2657,2659,2663,2671,2677,2683,2687,
         2689,2693,2699,2707,2711,2713,2719,2729,2731,2741,2749,2753,2767,2777,2789,    2689,2693,2699,2707,2711,2713,2719,2729,2731,2741,2749,2753,2767,2777,2789,
         2791,2797,2801,2803,2819,2833,2837,2843,2851,2857,2861,2879,2887,2897,2903,    2791,2797,2801,2803,2819,2833,2837,2843,2851,2857,2861,2879,2887,2897,2903,
         2909,2917,2927,2939,2953,2957,2963,2969,2971,2999,3001,3011,3019,3023,3037,    2909,2917,2927,2939,2953,2957,2963,2969,2971,2999,3001,3011,3019,3023,3037,
         3041,3049,3061,3067,3079,3083,3089,3109,3119,3121,3137,3163,3167,3169,3181,    3041,3049,3061,3067,3079,3083,3089,3109,3119,3121,3137,3163,3167,3169,3181,
         3187,3191,3203,3209,3217,3221,3229,3251,3253,3257,3259,3271,3299,3301,3307,    3187,3191,3203,3209,3217,3221,3229,3251,3253,3257,3259,3271,3299,3301,3307,
         3313,3319,3323,3329,3331,3343,3347,3359,3361,3371,3373,3389,3391,3407,3413,    3313,3319,3323,3329,3331,3343,3347,3359,3361,3371,3373,3389,3391,3407,3413,
         3433,3449,3457,3461,3463,3467,3469,3491,3499,3511,3517,3527,3529,3533,3539,    3433,3449,3457,3461,3463,3467,3469,3491,3499,3511,3517,3527,3529,3533,3539,
         3541,3547,3557,3559,3571,3581,3583,3593,3607,3613,3617,3623,3631,3637,3643,    3541,3547,3557,3559,3571,3581,3583,3593,3607,3613,3617,3623,3631,3637,3643,
         3659,3671,3673,3677,3691,3697,3701,3709,3719,3727,3733,3739,3761,3767,3769,    3659,3671,3673,3677,3691,3697,3701,3709,3719,3727,3733,3739,3761,3767,3769,
         3779,3793,3797,3803,3821,3823,3833,3847,3851,3853,3863,3877,3881,3889,3907,    3779,3793,3797,3803,3821,3823,3833,3847,3851,3853,3863,3877,3881,3889,3907,
         3911,3917,3919,3923,3929,3931,3943,3947,3967,3989,4001,4003,4007,4013,4019,    3911,3917,3919,3923,3929,3931,3943,3947,3967,3989,4001,4003,4007,4013,4019,
         4021,4027,4049,4051,4057,4073,4079,4091,4093,4099,4111,4127,4129,4133,4139,    4021,4027,4049,4051,4057,4073,4079,4091,4093,4099,4111,4127,4129,4133,4139,
         4153,4157,4159,4177,4201,4211,4217,4219,4229,4231,4241,4243,4253,4259,4261,    4153,4157,4159,4177,4201,4211,4217,4219,4229,4231,4241,4243,4253,4259,4261,
         4271,4273,4283,4289,4297,4327,4337,4339,4349,4357,4363,4373,4391,4397,4409,    4271,4273,4283,4289,4297,4327,4337,4339,4349,4357,4363,4373,4391,4397,4409,
         4421,4423,4441,4447,4451,4457,4463,4481,4483,4493,4507,4513,4517,4519,4523,    4421,4423,4441,4447,4451,4457,4463,4481,4483,4493,4507,4513,4517,4519,4523,
         4547,4549,4561,4567,4583,4591,4597,4603,4621,4637,4639,4643,4649,4651,4657,    4547,4549,4561,4567,4583,4591,4597,4603,4621,4637,4639,4643,4649,4651,4657,
         4663,4673,4679,4691,4703,4721,4723,4729,4733,4751,4759,4783,4787,4789,4793,    4663,4673,4679,4691,4703,4721,4723,4729,4733,4751,4759,4783,4787,4789,4793,
         4799,4801,4813,4817,4831,4861,4871,4877,4889,4903,4909,4919,4931,4933,4937,    4799,4801,4813,4817,4831,4861,4871,4877,4889,4903,4909,4919,4931,4933,4937,
         4943,4951,4957,4967,4969,4973,4987,4993,4999,5003,5009,5011,5021,5023,5039,    4943,4951,4957,4967,4969,4973,4987,4993,4999,5003,5009,5011,5021,5023,5039,
         5051,5059,5077,5081,5087,5099,5101,5107,5113,5119,5147,5153,5167,5171,5179,    5051,5059,5077,5081,5087,5099,5101,5107,5113,5119,5147,5153,5167,5171,5179,
         5189,5197,5209,5227,5231,5233,5237,5261,5273,5279,5281,5297,5303,5309,5323,    5189,5197,5209,5227,5231,5233,5237,5261,5273,5279,5281,5297,5303,5309,5323,
         5333,5347,5351,5381,5387,5393,5399,5407,5413,5417,5419,5431,5437,5441,5443,    5333,5347,5351,5381,5387,5393,5399,5407,5413,5417,5419,5431,5437,5441,5443,
         5449,5471,5477,5479,5483,5501,5503,5507,5519,5521,5527,5531,5557,5563,5569,    5449,5471,5477,5479,5483,5501,5503,5507,5519,5521,5527,5531,5557,5563,5569,
         5573,5581,5591,5623,5639,5641,5647,5651,5653,5657,5659,5669,5683,5689,5693,    5573,5581,5591,5623,5639,5641,5647,5651,5653,5657,5659,5669,5683,5689,5693,
         5701,5711,5717,5737,5741,5743,5749,5779,5783,5791,5801,5807,5813,5821,5827,    5701,5711,5717,5737,5741,5743,5749,5779,5783,5791,5801,5807,5813,5821,5827,
         5839,5843,5849,5851,5857,5861,5867,5869,5879,5881,5897,5903,5923,5927,5939,    5839,5843,5849,5851,5857,5861,5867,5869,5879,5881,5897,5903,5923,5927,5939,
         5953,5981,5987,6007,6011,6029,6037,6043,6047,6053,6067,6073,6079,6089,6091,    5953,5981,5987,6007,6011,6029,6037,6043,6047,6053,6067,6073,6079,6089,6091,
         6101,6113,6121,6131,6133,6143,6151,6163,6173,6197,6199,6203,6211,6217,6221,    6101,6113,6121,6131,6133,6143,6151,6163,6173,6197,6199,6203,6211,6217,6221,
         6229,6247,6257,6263,6269,6271,6277,6287,6299,6301,6311,6317,6323,6329,6337,    6229,6247,6257,6263,6269,6271,6277,6287,6299,6301,6311,6317,6323,6329,6337,
         6343,6353,6359,6361,6367,6373,6379,6389,6397,6421,6427,6449,6451,6469,6473,    6343,6353,6359,6361,6367,6373,6379,6389,6397,6421,6427,6449,6451,6469,6473,
         6481,6491,6521,6529,6547,6551,6553,6563,6569,6571,6577,6581,6599,6607,6619,    6481,6491,6521,6529,6547,6551,6553,6563,6569,6571,6577,6581,6599,6607,6619,
         6637,6653,6659,6661,6673,6679,6689,6691,6701,6703,6709,6719,6733,6737,6761,    6637,6653,6659,6661,6673,6679,6689,6691,6701,6703,6709,6719,6733,6737,6761,
         6763,6779,6781,6791,6793,6803,6823,6827,6829,6833,6841,6857,6863,6869,6871,    6763,6779,6781,6791,6793,6803,6823,6827,6829,6833,6841,6857,6863,6869,6871,
         6883,6899,6907,6911,6917,6947,6949,6959,6961,6967,6971,6977,6983,6991,6997,    6883,6899,6907,6911,6917,6947,6949,6959,6961,6967,6971,6977,6983,6991,6997,
         7001,7013,7019,7027,7039,7043,7057,7069,7079,7103,7109,7121,7127,7129,7151,    7001,7013,7019,7027,7039,7043,7057,7069,7079,7103,7109,7121,7127,7129,7151,
         7159,7177,7187,7193,7207,7211,7213,7219,7229,7237,7243,7247,7253,7283,7297,    7159,7177,7187,7193,7207,7211,7213,7219,7229,7237,7243,7247,7253,7283,7297,
         7307,7309,7321,7331,7333,7349,7351,7369,7393,7411,7417,7433,7451,7457,7459,    7307,7309,7321,7331,7333,7349,7351,7369,7393,7411,7417,7433,7451,7457,7459,
         7477,7481,7487,7489,7499,7507,7517,7523,7529,7537,7541,7547,7549,7559,7561,    7477,7481,7487,7489,7499,7507,7517,7523,7529,7537,7541,7547,7549,7559,7561,
         7573,7577,7583,7589,7591,7603,7607,7621,7639,7643,7649,7669,7673,7681,7687,    7573,7577,7583,7589,7591,7603,7607,7621,7639,7643,7649,7669,7673,7681,7687,
         7691,7699,7703,7717,7723,7727,7741,7753,7757,7759,7789,7793,7817,7823,7829,    7691,7699,7703,7717,7723,7727,7741,7753,7757,7759,7789,7793,7817,7823,7829,
         7841,7853,7867,7873,7877,7879,7883,7901,7907,7919,7927,7933,7937,7949,7951,    7841,7853,7867,7873,7877,7879,7883,7901,7907,7919,7927,7933,7937,7949,7951,
         7963,7993,8009,8011,8017,8039,8053,8059,8069,8081,8087,8089,8093,8101,8111,    7963,7993,8009,8011,8017,8039,8053,8059,8069,8081,8087,8089,8093,8101,8111,
         8117,8123,8147,8161,8167,8171,8179,8191,8209,8219,8221,8231,8233,8237,8243,    8117,8123,8147,8161,8167,8171,8179,8191,8209,8219,8221,8231,8233,8237,8243,
         8263,8269,8273,8287,8291,8293,8297,8311,8317,8329,8353,8363,8369,8377,8387,    8263,8269,8273,8287,8291,8293,8297,8311,8317,8329,8353,8363,8369,8377,8387,
         8389,8419,8423,8429,8431,8443,8447,8461,8467,8501,8513,8521,8527,8537,8539,    8389,8419,8423,8429,8431,8443,8447,8461,8467,8501,8513,8521,8527,8537,8539,
         8543,8563,8573,8581,8597,8599,8609,8623,8627,8629,8641,8647,8663,8669,8677,    8543,8563,8573,8581,8597,8599,8609,8623,8627,8629,8641,8647,8663,8669,8677,
         8681,8689,8693,8699,8707,8713,8719,8731,8737,8741,8747,8753,8761,8779,8783,    8681,8689,8693,8699,8707,8713,8719,8731,8737,8741,8747,8753,8761,8779,8783,
         8803,8807,8819,8821,8831,8837,8839,8849,8861,8863,8867,8887,8893,8923,8929,    8803,8807,8819,8821,8831,8837,8839,8849,8861,8863,8867,8887,8893,8923,8929,
         8933,8941,8951,8963,8969,8971,8999,9001,9007,9011,9013,9029,9041,9043,9049,    8933,8941,8951,8963,8969,8971,8999,9001,9007,9011,9013,9029,9041,9043,9049,
         9059,9067,9091,9103,9109,9127,9133,9137,9151,9157,9161,9173,9181,9187,9199,    9059,9067,9091,9103,9109,9127,9133,9137,9151,9157,9161,9173,9181,9187,9199,
         9203,9209,9221,9227,9239,9241,9257,9277,9281,9283,9293,9311,9319,9323,9337,    9203,9209,9221,9227,9239,9241,9257,9277,9281,9283,9293,9311,9319,9323,9337,
         9341,9343,9349,9371,9377,9391,9397,9403,9413,9419,9421,9431,9433,9437,9439,    9341,9343,9349,9371,9377,9391,9397,9403,9413,9419,9421,9431,9433,9437,9439,
         9461,9463,9467,9473,9479,9491,9497,9511,9521,9533,9539,9547,9551,9587,9601,    9461,9463,9467,9473,9479,9491,9497,9511,9521,9533,9539,9547,9551,9587,9601,
         9613,9619,9623,9629,9631,9643,9649,9661,9677,9679,9689,9697,9719,9721,9733,    9613,9619,9623,9629,9631,9643,9649,9661,9677,9679,9689,9697,9719,9721,9733,
         9739,9743,9749,9767,9769,9781,9787,9791,9803,9811,9817,9829,9833,9839,9851,    9739,9743,9749,9767,9769,9781,9787,9791,9803,9811,9817,9829,9833,9839,9851,
         9857,9859,9871,9883,9887,9901,9907,9923,9929,9931,9941,9949,9967,9973,10007,    9857,9859,9871,9883,9887,9901,9907,9923,9929,9931,9941,9949,9967,9973,10007,
         10009,10037,10039,10061,10067,10069,10079,10091,10093,10099,    10009,10037,10039,10061,10067,10069,10079,10091,10093,10099,
         10103,10111,10133,10139,10141,10151,10159,10163,10169,10177,    10103,10111,10133,10139,10141,10151,10159,10163,10169,10177,
         10181,10193,10211,10223,10243,10247,10253,10259,10267,10271,    10181,10193,10211,10223,10243,10247,10253,10259,10267,10271,
         10273,10289,10301,10303,10313,10321,10331,10333,10337,10343,    10273,10289,10301,10303,10313,10321,10331,10333,10337,10343,
         10357,10369,10391,10399,10427,10429,10433,10453,10457,10459,    10357,10369,10391,10399,10427,10429,10433,10453,10457,10459,
         10463,10477,10487,10499,10501,10513,10529,10531,10559,10567,    10463,10477,10487,10499,10501,10513,10529,10531,10559,10567,
         10589,10597,10601,10607,10613,10627,10631,10639,10651,10657,    10589,10597,10601,10607,10613,10627,10631,10639,10651,10657,
         10663,10667,10687,10691,10709,10711,10723,10729,10733,10739,    10663,10667,10687,10691,10709,10711,10723,10729,10733,10739,
         10753,10771,10781,10789,10799,10831,10837,10847,10853,10859,    10753,10771,10781,10789,10799,10831,10837,10847,10853,10859,
         10861,10867,10883,10889,10891,10903,10909,10937,10939,10949,    10861,10867,10883,10889,10891,10903,10909,10937,10939,10949,
         10957,10973,10979,10987,10993,11003,11027,11047,11057,11059,    10957,10973,10979,10987,10993,11003,11027,11047,11057,11059,
         11069,11071,11083,11087,11093,11113,11117,11119,11131,11149,    11069,11071,11083,11087,11093,11113,11117,11119,11131,11149,
         11159,11161,11171,11173,11177,11197,11213,11239,11243,11251,    11159,11161,11171,11173,11177,11197,11213,11239,11243,11251,
         11257,11261,11273,11279,11287,11299,11311,11317,11321,11329,    11257,11261,11273,11279,11287,11299,11311,11317,11321,11329,
         11351,11353,11369,11383,11393,11399,11411,11423,11437,11443,    11351,11353,11369,11383,11393,11399,11411,11423,11437,11443,
         11447,11467,11471,11483,11489,11491,11497,11503,11519,11527,    11447,11467,11471,11483,11489,11491,11497,11503,11519,11527,
         11549,11551,11579,11587,11593,11597,11617,11621,11633,11657,    11549,11551,11579,11587,11593,11597,11617,11621,11633,11657,
         11677,11681,11689,11699,11701,11717,11719,11731,11743,11777,    11677,11681,11689,11699,11701,11717,11719,11731,11743,11777,
         11779,11783,11789,11801,11807,11813,11821,11827,11831,11833,    11779,11783,11789,11801,11807,11813,11821,11827,11831,11833,
         11839,11863,11867,11887,11897,11903,11909,11923,11927,11933,    11839,11863,11867,11887,11897,11903,11909,11923,11927,11933,
         11939,11941,11953,11959,11969,11971,11981,11987,12007,12011,    11939,11941,11953,11959,11969,11971,11981,11987,12007,12011,
         12037,12041,12043,12049,12071,12073,12097,12101,12107,12109,    12037,12041,12043,12049,12071,12073,12097,12101,12107,12109,
         12113,12119,12143,12149,12157,12161,12163,12197,12203,12211,    12113,12119,12143,12149,12157,12161,12163,12197,12203,12211,
         12227,12239,12241,12251,12253,12263,12269,12277,12281,12289,    12227,12239,12241,12251,12253,12263,12269,12277,12281,12289,
         12301,12323,12329,12343,12347,12373,12377,12379,12391,12401,    12301,12323,12329,12343,12347,12373,12377,12379,12391,12401,
         12409,12413,12421,12433,12437,12451,12457,12473,12479,12487,    12409,12413,12421,12433,12437,12451,12457,12473,12479,12487,
         12491,12497,12503,12511,12517,12527,12539,12541,12547,12553,    12491,12497,12503,12511,12517,12527,12539,12541,12547,12553,
         12569,12577,12583,12589,12601,12611,12613,12619,12637,12641,    12569,12577,12583,12589,12601,12611,12613,12619,12637,12641,
         12647,12653,12659,12671,12689,12697,12703,12713,12721,12739,    12647,12653,12659,12671,12689,12697,12703,12713,12721,12739,
         12743,12757,12763,12781,12791,12799,12809,12821,12823,12829,    12743,12757,12763,12781,12791,12799,12809,12821,12823,12829,
         12841,12853,12889,12893,12899,12907,12911,12917,12919,12923,    12841,12853,12889,12893,12899,12907,12911,12917,12919,12923,
         12941,12953,12959,12967,12973,12979,12983,13001,13003,13007,    12941,12953,12959,12967,12973,12979,12983,13001,13003,13007,
         13009,13033,13037,13043,13049,13063,13093,13099,13103,13109,    13009,13033,13037,13043,13049,13063,13093,13099,13103,13109,
         13121,13127,13147,13151,13159,13163,13171,13177,13183,13187,    13121,13127,13147,13151,13159,13163,13171,13177,13183,13187,
         13217,13219,13229,13241,13249,13259,13267,13291,13297,13309,    13217,13219,13229,13241,13249,13259,13267,13291,13297,13309,
         13313,13327,13331,13337,13339,13367,13381,13397,13399,13411,    13313,13327,13331,13337,13339,13367,13381,13397,13399,13411,
         13417,13421,13441,13451,13457,13463,13469,13477,13487,13499,    13417,13421,13441,13451,13457,13463,13469,13477,13487,13499,
         13513,13523,13537,13553,13567,13577,13591,13597,13613,13619,    13513,13523,13537,13553,13567,13577,13591,13597,13613,13619,
         13627,13633,13649,13669,13679,13681,13687,13691,13693,13697,    13627,13633,13649,13669,13679,13681,13687,13691,13693,13697,
         13709,13711,13721,13723,13729,13751,13757,13759,13763,13781,    13709,13711,13721,13723,13729,13751,13757,13759,13763,13781,
         13789,13799,13807,13829,13831,13841,13859,13873,13877,13879,    13789,13799,13807,13829,13831,13841,13859,13873,13877,13879,
         13883,13901,13903,13907,13913,13921,13931,13933,13963,13967,    13883,13901,13903,13907,13913,13921,13931,13933,13963,13967,
         13997,13999,14009,14011,14029,14033,14051,14057,14071,14081,    13997,13999,14009,14011,14029,14033,14051,14057,14071,14081,
         14083,14087,14107,14143,14149,14153,14159,14173,14177,14197,    14083,14087,14107,14143,14149,14153,14159,14173,14177,14197,
         14207,14221,14243,14249,14251,14281,14293,14303,14321,14323,    14207,14221,14243,14249,14251,14281,14293,14303,14321,14323,
         14327,14341,14347,14369,14387,14389,14401,14407,14411,14419,    14327,14341,14347,14369,14387,14389,14401,14407,14411,14419,
         14423,14431,14437,14447,14449,14461,14479,14489,14503,14519,    14423,14431,14437,14447,14449,14461,14479,14489,14503,14519,
         14533,14537,14543,14549,14551,14557,14561,14563,14591,14593,    14533,14537,14543,14549,14551,14557,14561,14563,14591,14593,
         14621,14627,14629,14633,14639,14653,14657,14669,14683,14699,    14621,14627,14629,14633,14639,14653,14657,14669,14683,14699,
         14713,14717,14723,14731,14737,14741,14747,14753,14759,14767,    14713,14717,14723,14731,14737,14741,14747,14753,14759,14767,
         14771,14779,14783,14797,14813,14821,14827,14831,14843,14851,    14771,14779,14783,14797,14813,14821,14827,14831,14843,14851,
         14867,14869,14879,14887,14891,14897,14923,14929,14939,14947,    14867,14869,14879,14887,14891,14897,14923,14929,14939,14947,
         14951,14957,14969,14983,15013,15017,15031,15053,15061,15073,    14951,14957,14969,14983,15013,15017,15031,15053,15061,15073,
         15077,15083,15091,15101,15107,15121,15131,15137,15139,15149,    15077,15083,15091,15101,15107,15121,15131,15137,15139,15149,
         15161,15173,15187,15193,15199,15217,15227,15233,15241,15259,    15161,15173,15187,15193,15199,15217,15227,15233,15241,15259,
         15263,15269,15271,15277,15287,15289,15299,15307,15313,15319,    15263,15269,15271,15277,15287,15289,15299,15307,15313,15319,
         15329,15331,15349,15359,15361,15373,15377,15383,15391,15401,    15329,15331,15349,15359,15361,15373,15377,15383,15391,15401,
         15413,15427,15439,15443,15451,15461,15467,15473,15493,15497,    15413,15427,15439,15443,15451,15461,15467,15473,15493,15497,
         15511,15527,15541,15551,15559,15569,15581,15583,15601,15607,    15511,15527,15541,15551,15559,15569,15581,15583,15601,15607,
         15619,15629,15641,15643,15647,15649,15661,15667,15671,15679,    15619,15629,15641,15643,15647,15649,15661,15667,15671,15679,
         15683,15727,15731,15733,15737,15739,15749,15761,15767,15773,    15683,15727,15731,15733,15737,15739,15749,15761,15767,15773,
         15787,15791,15797,15803,15809,15817,15823,15859,15877,15881,    15787,15791,15797,15803,15809,15817,15823,15859,15877,15881,
         15887,15889,15901,15907,15913,15919,15923,15937,15959,15971,    15887,15889,15901,15907,15913,15919,15923,15937,15959,15971,
         15973,15991,16001,16007,16033,16057,16061,16063,16067,16069,    15973,15991,16001,16007,16033,16057,16061,16063,16067,16069,
         16073,16087,16091,16097,16103,16111,16127,16139,16141,16183,    16073,16087,16091,16097,16103,16111,16127,16139,16141,16183,
         16187,16189,16193,16217,16223,16229,16231,16249,16253,16267,    16187,16189,16193,16217,16223,16229,16231,16249,16253,16267,
         16273,16301,16319,16333,16339,16349,16361,16363,16369,16381,    16273,16301,16319,16333,16339,16349,16361,16363,16369,16381,
         0    0
 };  };
   
 #include "prime.h"  

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.10

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>