[BACK]Return to poly4.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kan96xx / Kan

Diff for /OpenXM/src/kan96xx/Kan/poly4.c between version 1.8 and 1.12

version 1.8, 2003/08/19 08:02:10 version 1.12, 2003/08/24 05:19:42
Line 1 
Line 1 
 /* $OpenXM: OpenXM/src/kan96xx/Kan/poly4.c,v 1.7 2003/07/19 06:03:57 takayama Exp $ */  /* $OpenXM: OpenXM/src/kan96xx/Kan/poly4.c,v 1.11 2003/08/23 02:28:38 takayama Exp $ */
 #include <stdio.h>  #include <stdio.h>
 #include "datatype.h"  #include "datatype.h"
 #include "stackm.h"  #include "stackm.h"
Line 8 
Line 8 
 static void shell(int v[],int n);  static void shell(int v[],int n);
 static int degreeOfPrincipalPart(POLY f);  static int degreeOfPrincipalPart(POLY f);
 static int degreeOfInitW(POLY f,int w[]);  static int degreeOfInitW(POLY f,int w[]);
   static int degreeOfInitWS(POLY f,int w[],int s[]);
   
   
 static void shell(v,n)  static void shell(v,n)
Line 437  POLY POLYToInitW(f,w)
Line 438  POLY POLYToInitW(f,w)
      POLY f;       POLY f;
      int w[]; /* weight vector */       int w[]; /* weight vector */
 {  {
   POLY node;  
   struct listPoly nod;  
   POLY h;    POLY h;
   POLY g;    POLY g;
   int maxd;    int maxd;
   int dd;    int dd;
   node = &nod; node->next = POLYNULL; h = node;    h = POLYNULL;
   
     /*printf("1:%s\n",POLYToString(f,'*',1));*/
   if (f ISZERO) return(f);    if (f ISZERO) return(f);
   maxd = degreeOfInitW(f,w);    maxd = degreeOfInitW(f,w);
   g = pCopy(f); /* shallow copy */    g = f;
   while (!(f ISZERO)) {    while (!(f ISZERO)) {
     dd = degreeOfInitW(f,w);      dd = degreeOfInitW(f,w);
     if (dd > maxd) maxd = dd;      if (dd > maxd) maxd = dd;
Line 456  POLY POLYToInitW(f,w)
Line 456  POLY POLYToInitW(f,w)
   while (!(g ISZERO)) {    while (!(g ISZERO)) {
     dd = degreeOfInitW(g,w);      dd = degreeOfInitW(g,w);
     if (dd == maxd) {      if (dd == maxd) {
       h->next = g;        h = ppAdd(h,newCell(g->coeffp,g->m)); /* it might be slow. */
       h = h->next;  
     }      }
     g = g->next;      g = g->next;
   }    }
   h->next = POLYNULL;    /*printf("2:%s\n",POLYToString(h,'*',1));*/
   return(node->next);    return(h);
 }  }
   
   static int degreeOfInitWS(f,w,s)
        POLY f;
        int w[];
            int s[];
   {
     int n,i,dd;
     if (f ISZERO) {
       errorPoly("degreeOfInitWS(0,w) ");
     }
     if (s == (int *) NULL) return degreeOfInitW(f,w);
     n = f->m->ringp->n; dd = 0;
     for (i=0; i<n-1; i++) {
       dd += (f->m->e[i].D)*w[n+i];
       dd += (f->m->e[i].x)*w[i];
     }
     dd += s[(f->m->e[n-1].x)];
     return(dd);
   }
   
   POLY POLYToInitWS(f,w,s)
        POLY f;
        int w[]; /* weight vector */
            int s[]; /* shift vector */
   {
     POLY h;
     POLY g;
     int maxd;
     int dd;
     h = POLYNULL;
   
     /*printf("1s:%s\n",POLYToString(f,'*',1));*/
     if (f ISZERO) return(f);
     maxd = degreeOfInitWS(f,w,s);
     g = f;
     while (!(f ISZERO)) {
       dd = degreeOfInitWS(f,w,s);
       if (dd > maxd) maxd = dd;
       f = f->next;
     }
     while (!(g ISZERO)) {
       dd = degreeOfInitWS(g,w,s);
       if (dd == maxd) {
         h = ppAdd(h,newCell(g->coeffp,g->m)); /* it might be slow. */
       }
       g = g->next;
     }
     /*printf("2s:%s\n",POLYToString(h,'*',1));*/
     return(h);
   }
   
   int ordWsAll(f,w,s)
        POLY f;
        int w[]; /* weight vector */
            int s[]; /* shift vector */
   {
     int maxd;
     int dd;
   
     if (f ISZERO)  errorPoly("ordWsAll(0,w,s) ");
     maxd = degreeOfInitWS(f,w,s);
     while (!(f ISZERO)) {
       dd = degreeOfInitWS(f,w,s);
       if (dd > maxd) maxd = dd;
       f = f->next;
     }
     return maxd;
   }
   
   
 /*  /*
 1.The substitution  "ringp->multiplication = ...." is allowed only in  1.The substitution  "ringp->multiplication = ...." is allowed only in
   KsetUpRing(), so the check in KswitchFunction is not necessary.    KsetUpRing(), so the check in KswitchFunction is not necessary.
Line 539  int isTheSameRing(struct ring *rstack[],int rp, struct
Line 606  int isTheSameRing(struct ring *rstack[],int rp, struct
   
 /* s->1 */  /* s->1 */
 POLY goDeHomogenizeS(POLY f) {  POLY goDeHomogenizeS(POLY f) {
     POLY lRule[1];
     POLY rRule[1];
     struct ring *rp;
     POLY ans;
     /* printf("1:[%s]\n",POLYToString(f,'*',1)); */
     if (f == POLYNULL) return f;
     rp = f->m->ringp;
     if (rp->next == NULL) {
           lRule[0] = cxx(1,0,1,rp);
           rRule[0] = cxx(1,0,0,rp);
           ans=replace(f,lRule,rRule,1);
     }else{
           struct coeff *cp;
           POLY t;
           POLY nc;
       ans = POLYNULL;
           while (f != POLYNULL) {
             cp = f->coeffp;
             if (cp->tag == POLY_COEFF) {
                   t = goDeHomogenizeS((cp->val).f);
                   nc = newCell(polyToCoeff(t,f->m->ringp),monomialCopy(f->m));
                   ans = ppAddv(ans,nc);
                   f = f->next;
             }else{
                   ans = f; break;
             }
           }
     }
     /* printf("2:[%s]\n",POLYToString(ans,'*',1)); */
     return ans;
   }
   
   POLY goDeHomogenizeS_buggy(POLY f) {
   POLY node;    POLY node;
   POLY lastf;    POLY lastf;
   struct listPoly nod;    struct listPoly nod;
Line 546  POLY goDeHomogenizeS(POLY f) {
Line 646  POLY goDeHomogenizeS(POLY f) {
   POLY tf;    POLY tf;
   int gt,first;    int gt,first;
   
     printf("1:[%s]\n",POLYToString(f,'*',1));
   if (f == POLYNULL) return(POLYNULL);    if (f == POLYNULL) return(POLYNULL);
   node = &nod;    node = &nod;
   node->next = POLYNULL;    node->next = POLYNULL;
Line 575  POLY goDeHomogenizeS(POLY f) {
Line 676  POLY goDeHomogenizeS(POLY f) {
     }      }
     f = f->next;      f = f->next;
   }    }
     printf("2:[%s]\n",POLYToString(node->next,'*',1));
   return (node->next);    return (node->next);
 }  }
   
Line 598  POLY goHomogenize(POLY f,int u[],int v[],int ds[],int 
Line 700  POLY goHomogenize(POLY f,int u[],int v[],int ds[],int 
   message = 1;    message = 1;
   if (f == POLYNULL) return(POLYNULL);    if (f == POLYNULL) return(POLYNULL);
   rp = f->m->ringp;    rp = f->m->ringp;
     /*
   if ((rp->degreeShiftSize == 0) && (dssize > 0)) {    if ((rp->degreeShiftSize == 0) && (dssize > 0)) {
         warningPoly("You are trying to homogenize a polynomial with degree shift. However, the polynomial belongs to the ring without degreeShift option. It may cause a trouble in comparison in free module.\n");          warningPoly("You are trying to homogenize a polynomial with degree shift. However, the polynomial belongs to the ring without degreeShift option. It may cause a trouble in comparison in free module.\n");
   }    }
     */
   node = &nod;    node = &nod;
   node->next = POLYNULL;    node->next = POLYNULL;
   lastf = POLYNULL;    lastf = POLYNULL;
Line 652  POLY goHomogenize(POLY f,int u[],int v[],int ds[],int 
Line 756  POLY goHomogenize(POLY f,int u[],int v[],int ds[],int 
   h = node->next;    h = node->next;
   /*go-debug printf("m=%d, mp=%d\n",m,mp); */    /*go-debug printf("m=%d, mp=%d\n",m,mp); */
   while (h != POLYNULL) {    while (h != POLYNULL) {
     /*go-debug printf("Old: h=%d, s=%d\n",h->m->e[0].D,h->m->e[0].x); */      /*go-debug printf("Old: h=%d, s=%d\n",h->m->e[0].D,h->m->e[0].x);  */
     if (!onlyS) h->m->e[0].D += m;   /* h */      if (!onlyS) h->m->e[0].D += m;   /* h */
     h->m->e[0].x += -mp; /* H, s*/      h->m->e[0].x += -mp; /* H, s*/
     /*go-debug printf("New: h=%d, s=%d\n",h->m->e[0].D,h->m->e[0].x); */      /*go-debug printf("New: h=%d, s=%d\n",h->m->e[0].D,h->m->e[0].x); */

Legend:
Removed from v.1.8  
changed lines
  Added in v.1.12

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