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

Diff for /OpenXM/src/kan96xx/Kan/replace.c between version 1.1 and 1.3

version 1.1, 1999/10/08 02:12:02 version 1.3, 2001/05/04 01:06:25
Line 1 
Line 1 
   /* $OpenXM: OpenXM/src/kan96xx/Kan/replace.c,v 1.2 2000/01/16 07:55:41 takayama Exp $ */
 #include <stdio.h>  #include <stdio.h>
 #include "datatype.h"  #include "datatype.h"
 #include "extern2.h"  #include "extern2.h"
Line 5 
Line 6 
 static int badLRule(POLY set[],int num);  static int badLRule(POLY set[],int num);
   
 POLY mReplace(mm,lSideX,rSideX,sizex,lSideD,rSideD,sized,commutative)  POLY mReplace(mm,lSideX,rSideX,sizex,lSideD,rSideD,sized,commutative)
 POLY mm;       POLY mm;
 int lSideX[];       int lSideX[];
 POLY rSideX[];  /* Rule: a=lSideX[i], x_a ---> rSideX[i] */       POLY rSideX[];  /* Rule: a=lSideX[i], x_a ---> rSideX[i] */
 int sizex;       int sizex;
 int lSideD[];   /* Rule: b=lSideD[i], D_b ---> rSideD[i] */       int lSideD[];   /* Rule: b=lSideD[i], D_b ---> rSideD[i] */
 POLY rSideD[];       POLY rSideD[];
 int sized;       int sized;
 int commutative;       int commutative;
 {  {
 /* The function should be tuned by using a table. */    /* The function should be tuned by using a table. */
   POLY rp;    POLY rp;
   POLY fac;    POLY fac;
   int i;    int i;
Line 32  int commutative;
Line 33  int commutative;
     if (mp->e[i].D != 0) {      if (mp->e[i].D != 0) {
       flag = 1;        flag = 1;
       for (j=0; j<sized; j++) {        for (j=0; j<sized; j++) {
         if (lSideD[j] == i) {          if (lSideD[j] == i) {
           if (commutative) fac = pPower_poly(rSideD[j],mp->e[i].D);            if (commutative) fac = pPower_poly(rSideD[j],mp->e[i].D);
           else fac = pPower(rSideD[j],mp->e[i].D);            else fac = pPower(rSideD[j],mp->e[i].D);
           /* if negative, this does not work  well!! */            /* if negative, this does not work  well!! */
           flag = 0;            flag = 0;
           break;            break;
         }          }
       }        }
       if (flag) fac = cdd(1,i,mp->e[i].D,mp->ringp);        if (flag) fac = cdd(1,i,mp->e[i].D,mp->ringp);
       if (commutative) rp = ppMult_poly(fac,rp);        if (commutative) rp = ppMult_poly(fac,rp);
Line 50  int commutative;
Line 51  int commutative;
     if (mp->e[i].x != 0) {      if (mp->e[i].x != 0) {
       flag = 1;        flag = 1;
       for (j=0; j<sizex; j++) {        for (j=0; j<sizex; j++) {
         if (lSideX[j] == i) {          if (lSideX[j] == i) {
           if (commutative) fac = pPower_poly(rSideX[j],mp->e[i].x);            if (commutative) fac = pPower_poly(rSideX[j],mp->e[i].x);
           else fac = pPower(rSideX[j],mp->e[i].x);            else fac = pPower(rSideX[j],mp->e[i].x);
           /* if negative, this does not work well!! */            /* if negative, this does not work well!! */
           flag = 0;            flag = 0;
           break;            break;
         }          }
       }        }
       if (flag) fac = cxx(1,i,mp->e[i].x,mp->ringp);        if (flag) fac = cxx(1,i,mp->e[i].x,mp->ringp);
       if (commutative) rp = ppMult_poly(fac,rp);        if (commutative) rp = ppMult_poly(fac,rp);
Line 71  int commutative;
Line 72  int commutative;
   lRule[i] ---> rRule[i]    lRule[i] ---> rRule[i]
 */  */
 POLY replace(f,lRule,rRule,num)  POLY replace(f,lRule,rRule,num)
 POLY f;       POLY f;
 POLY lRule[];  /* lRule[i] must be x0 or ... or D{N-1} */       POLY lRule[];  /* lRule[i] must be x0 or ... or D{N-1} */
 POLY rRule[];       POLY rRule[];
 int num;       int num;
 {  {
   POLY rSideX[N0];    POLY rSideX[N0];
   POLY rSideD[N0];    POLY rSideD[N0];
Line 86  int num;
Line 87  int num;
   int n;    int n;
   
   /***printf("f=%s\n",POLYToString(f,'*',0));    /***printf("f=%s\n",POLYToString(f,'*',0));
   for (i=0; i<num; i++) {        for (i=0; i<num; i++) {
     printf("%s --> %s\n",POLYToString(lRule[i],'*',0),        printf("%s --> %s\n",POLYToString(lRule[i],'*',0),
            POLYToString(rRule[i],'*',0));        POLYToString(rRule[i],'*',0));
   }        }
   printf("\n"); ***/        printf("\n"); ***/
   
   if (f ISZERO) return(ZERO);    if (f ISZERO) return(ZERO);
   sizex = sized = 0;    sizex = sized = 0;
Line 103  int num;
Line 104  int num;
   for (i=0; i<n; i++) {    for (i=0; i<n; i++) {
     for (j=0; j<num; j++) {      for (j=0; j<num; j++) {
       if (lRule[j]->m->e[i].x == 1) {        if (lRule[j]->m->e[i].x == 1) {
         lSideX[sizex] = i;          lSideX[sizex] = i;
         rSideX[sizex] = rRule[j];          rSideX[sizex] = rRule[j];
         sizex++;          sizex++;
         if (sizex >= n) {          if (sizex >= n) {
           warningPoly(" replace(): too many x-rules . ");            warningPoly(" replace(): too many x-rules . ");
           sizex--;            sizex--;
         }          }
         break;          break;
       }        }
     }      }
   }    }
Line 118  int num;
Line 119  int num;
   for (i=0; i<n; i++) {    for (i=0; i<n; i++) {
     for (j=0; j<num; j++) {      for (j=0; j<num; j++) {
       if (lRule[j]->m->e[i].D == 1) {        if (lRule[j]->m->e[i].D == 1) {
         lSideD[sized] = i;          lSideD[sized] = i;
         rSideD[sized] = rRule[j];          rSideD[sized] = rRule[j];
         sized++;          sized++;
         if (sized >= n) {          if (sized >= n) {
           warningPoly(" replacen(): too many D-rules . ");            warningPoly(" replacen(): too many D-rules . ");
           sized--;            sized--;
         }          }
         break;          break;
       }        }
     }      }
   }    }
Line 142  int num;
Line 143  int num;
   
 /* For the dirty trick of mpMult_difference */  /* For the dirty trick of mpMult_difference */
 POLY replace_poly(f,lRule,rRule,num)  POLY replace_poly(f,lRule,rRule,num)
 POLY f;       POLY f;
 POLY lRule[];  /* lRule[i] must be x0 or ... or D{N-1} */       POLY lRule[];  /* lRule[i] must be x0 or ... or D{N-1} */
 POLY rRule[];       POLY rRule[];
 int num;       int num;
 {  {
   POLY rSideX[N0];    POLY rSideX[N0];
   POLY rSideD[N0];    POLY rSideD[N0];
Line 157  int num;
Line 158  int num;
   int n;    int n;
   
   /***printf("f=%s\n",POLYToString(f,'*',0));    /***printf("f=%s\n",POLYToString(f,'*',0));
   for (i=0; i<num; i++) {        for (i=0; i<num; i++) {
     printf("%s --> %s\n",POLYToString(lRule[i],'*',0),        printf("%s --> %s\n",POLYToString(lRule[i],'*',0),
            POLYToString(rRule[i],'*',0));        POLYToString(rRule[i],'*',0));
   }        }
   printf("\n"); ***/        printf("\n"); ***/
   
   if (f ISZERO) return(ZERO);    if (f ISZERO) return(ZERO);
   sizex = sized = 0;    sizex = sized = 0;
Line 174  int num;
Line 175  int num;
   for (i=0; i<n; i++) {    for (i=0; i<n; i++) {
     for (j=0; j<num; j++) {      for (j=0; j<num; j++) {
       if (lRule[j]->m->e[i].x == 1) {        if (lRule[j]->m->e[i].x == 1) {
         lSideX[sizex] = i;          lSideX[sizex] = i;
         rSideX[sizex] = rRule[j];          rSideX[sizex] = rRule[j];
         sizex++;          sizex++;
         if (sizex >= n) {          if (sizex >= n) {
           warningPoly(" replace(): too many x-rules . ");            warningPoly(" replace(): too many x-rules . ");
           sizex--;            sizex--;
         }          }
         break;          break;
       }        }
     }      }
   }    }
Line 189  int num;
Line 190  int num;
   for (i=0; i<n; i++) {    for (i=0; i<n; i++) {
     for (j=0; j<num; j++) {      for (j=0; j<num; j++) {
       if (lRule[j]->m->e[i].D == 1) {        if (lRule[j]->m->e[i].D == 1) {
         lSideD[sized] = i;          lSideD[sized] = i;
         rSideD[sized] = rRule[j];          rSideD[sized] = rRule[j];
         sized++;          sized++;
         if (sized >= n) {          if (sized >= n) {
           warningPoly(" replacen(): too many D-rules . ");            warningPoly(" replacen(): too many D-rules . ");
           sized--;            sized--;
         }          }
         break;          break;
       }        }
     }      }
   }    }
Line 212  int num;
Line 213  int num;
   
   
 static int badLRule(set,num)  static int badLRule(set,num)
 POLY set[];       POLY set[];
 int num;       int num;
 { int i;  { int i;
   for (i=0; i<num; i++) {   for (i=0; i<num; i++) {
     if (set[0] ISZERO) {     if (set[0] ISZERO) {
       return(1);       return(1);
     }     }
   }   }
   return(0);   return(0);
 }  }
   

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

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