Annotation of OpenXM/src/kan96xx/Kan/order.c, Revision 1.1
1.1 ! maekawa 1: #include <stdio.h>
! 2: #include "datatype.h"
! 3: #include "stackm.h"
! 4: #include "extern.h"
! 5: #include "extern2.h"
! 6:
! 7: /* The format of order.
! 8: Example: graded lexicographic order
! 9: x_{N-1} x_{N-2} ... x_0 D_{N-1} .... D_{0}
! 10: 1 1 1 1 1
! 11: 1 0 0 0 0
! 12: 0 1 0 0 0
! 13: ..............................................
! 14:
! 15: (ringp->order)[i][j] should be (ringp->order)[i*2*N+j].
! 16: All order matrix is generated by functions in smacro.sm1
! 17: */
! 18:
! 19: static void warningOrder(char *s);
! 20: static void errorOrder(char *s);
! 21:
! 22: void setOrderByMatrix(order,n,c,l,omsize)
! 23: int order[];
! 24: int n,c,l,omsize;
! 25: {
! 26: int i,j;
! 27: int *Order;
! 28: extern struct ring *CurrentRingp;
! 29:
! 30: switch_mmLarger("default");
! 31: /* q-case */
! 32: if ( l-c > 0) {
! 33: switch_mmLarger("qmatrix");
! 34: }
! 35:
! 36: Order = (int *)sGC_malloc(sizeof(int)*(2*n)*(omsize));
! 37: if (Order == (int *)NULL) errorOrder("No memory.");
! 38: CurrentRingp->order = Order;
! 39: CurrentRingp->orderMatrixSize = omsize;
! 40: for (i=0; i<omsize; i++) {
! 41: for (j=0; j<2*n; j++) {
! 42: Order[i*2*n+j] = order[i*2*n+j];
! 43: }
! 44: }
! 45: }
! 46:
! 47: void showRing(level,ringp)
! 48: int level;
! 49: struct ring *ringp;
! 50: {
! 51: int i,j;
! 52: FILE *fp;
! 53: char tmp[100];
! 54: int N,M,L,C,NN,MM,LL,CC;
! 55: char **TransX,**TransD;
! 56: int *Order;
! 57: int P;
! 58: char *mtype;
! 59: extern char *F_isSameComponent;
! 60: fp = stdout;
! 61:
! 62: N=ringp->n; M = ringp->m; L = ringp->l; C = ringp->c;
! 63: NN=ringp->nn; MM = ringp->mm; LL = ringp->ll; CC = ringp->cc;
! 64: TransX = ringp->x; TransD = ringp->D;
! 65: Order = ringp->order;
! 66: P = ringp->p;
! 67:
! 68:
! 69: fprintf(fp,"\n---------- the current ring ---- name: %s------\n",ringp->name);
! 70: fprintf(fp,"Characteristic is %d. ",P);
! 71: fprintf(fp,"N0=%d N=%d NN=%d M=%d MM=%d L=%d LL=%d C=%d CC=%d omsize=%d\n",N0,N,NN,M,MM,L,LL,C,CC,ringp->orderMatrixSize);
! 72: fprintf(fp,"\n");
! 73:
! 74: /* print identifier names */
! 75: if (N-M >0) {
! 76: fprintf(fp,"Differential variables: ");
! 77: for (i=M; i<N; i++) fprintf(fp," %4s ",TransX[i]);
! 78: for (i=M; i<N; i++) fprintf(fp," %4s ",TransD[i]);
! 79: fprintf(fp,"\n");
! 80: fprintf(fp,"where ");
! 81: for (i=M; i<N; i++) {
! 82: fprintf(fp," %s %s - %s %s = 1, ",TransD[i],TransX[i],
! 83: TransX[i],TransD[i]);
! 84: }
! 85: fprintf(fp,"\n\n");
! 86: }
! 87: if (M-L >0) {
! 88: fprintf(fp,"Difference variables: ");
! 89: for (i=L; i<M; i++) fprintf(fp," %4s ",TransX[i]);
! 90: for (i=L; i<M; i++) fprintf(fp," %4s ",TransD[i]);
! 91: fprintf(fp,"\n");
! 92: fprintf(fp,"where ");
! 93: for (i=L; i<M; i++) {
! 94: fprintf(fp," %s %s - %s %s = %s, ",TransD[i],TransX[i],
! 95: TransX[i],TransD[i],
! 96: TransD[i]);
! 97: }
! 98: fprintf(fp,"\n\n");
! 99: }
! 100: if (L-C >0) {
! 101: fprintf(fp,"q-Difference variables: ");
! 102: for (i=C; i<L; i++) fprintf(fp," %4s ",TransX[i]);
! 103: for (i=C; i<L; i++) fprintf(fp," %4s ",TransD[i]);
! 104: fprintf(fp,"\n");
! 105: fprintf(fp,"where ");
! 106: for (i=C; i<L; i++) {
! 107: fprintf(fp," %s %s = %s %s %s, ",TransD[i],TransX[i],
! 108: TransX[0],
! 109: TransX[i],TransD[i]);
! 110: }
! 111: fprintf(fp,"\n\n");
! 112: }
! 113: if (C>0) {
! 114: fprintf(fp,"Commutative variables: ");
! 115: for (i=0; i<C; i++) fprintf(fp," %4s ",TransX[i]);
! 116: for (i=0; i<C; i++) fprintf(fp," %4s ",TransD[i]);
! 117: fprintf(fp,"\n\n");
! 118: }
! 119:
! 120: if (strcmp(F_isSameComponent,"x") == 0) {
! 121: fprintf(fp,"Integral or summation or graduation variables are : ");
! 122: for (i=CC; i<C; i++) fprintf(fp," %4s ",TransX[i]);
! 123: for (i=LL; i<L; i++) fprintf(fp," %4s ",TransX[i]);
! 124: for (i=MM; i<M; i++) fprintf(fp," %4s ",TransX[i]);
! 125: for (i=NN; i<N; i++) fprintf(fp," %4s ",TransX[i]);
! 126: fprintf(fp,"\n");
! 127: }else if (strcmp(F_isSameComponent,"xd") == 0) {
! 128: fprintf(fp,"Graduation variables are : ");
! 129: for (i=CC; i<C; i++) fprintf(fp," %4s ",TransX[i]);
! 130: for (i=LL; i<L; i++) fprintf(fp," %4s ",TransX[i]);
! 131: for (i=MM; i<M; i++) fprintf(fp," %4s ",TransX[i]);
! 132: for (i=NN; i<N; i++) fprintf(fp," %4s ",TransX[i]);
! 133: for (i=CC; i<C; i++) fprintf(fp," %4s ",TransD[i]);
! 134: for (i=LL; i<L; i++) fprintf(fp," %4s ",TransD[i]);
! 135: for (i=MM; i<M; i++) fprintf(fp," %4s ",TransD[i]);
! 136: for (i=NN; i<N; i++) fprintf(fp," %4s ",TransD[i]);
! 137: fprintf(fp,"\n");
! 138: }else {
! 139: fprintf(fp,"Unknown graduation variable specification.\n\n");
! 140: }
! 141: fprintf(fp,"The homogenization variable is : ");
! 142: fprintf(fp," %4s ",TransD[0]);
! 143: fprintf(fp,"\n");
! 144:
! 145:
! 146:
! 147: fprintf(fp,"-------------------------------------------\n");
! 148: fprintf(fp,"Output order : ");
! 149: for (i=0; i<2*N; i++) {
! 150: if (ringp->outputOrder[i] < N) {
! 151: fprintf(fp,"%s ",TransX[ringp->outputOrder[i]]);
! 152: }else{
! 153: fprintf(fp,"%s ",TransD[(ringp->outputOrder[i])-N]);
! 154: }
! 155: }
! 156: fprintf(fp,"\n");
! 157:
! 158: if (ringp->multiplication == mpMult_poly) {
! 159: mtype = "poly";
! 160: }else if (ringp->multiplication == mpMult_diff) {
! 161: mtype = "diff";
! 162: }else if (ringp->multiplication == mpMult_difference) {
! 163: mtype = "difference";
! 164: }else {
! 165: mtype = "unknown";
! 166: }
! 167: fprintf(fp,"Multiplication function --%s(%xH).\n",
! 168: mtype,(unsigned int) ringp->multiplication);
! 169: if (ringp->schreyer) {
! 170: fprintf(fp,"schreyer=1, gbListTower=");
! 171: printObjectList((struct object *)(ringp->gbListTower));
! 172: fprintf(fp,"\n");
! 173: }
! 174:
! 175: if (level) printOrder(ringp);
! 176:
! 177: if (ringp->next != (struct ring *)NULL) {
! 178: fprintf(fp,"\n\n-------- The next ring is .... --------------\n");
! 179: showRing(level,ringp->next);
! 180: }
! 181: }
! 182:
! 183: /***************************************************************
! 184: functions related to order
! 185: ******************************************************************/
! 186: #define xtoi(k) ((N-1)-(k))
! 187: #define dtoi(k) ((2*N-1)-(k))
! 188: #define itox(k) ((N-1)-(k))
! 189: #define itod(k) ((2*N-1)-(k))
! 190: #define isX(i) (i<N? 1: 0)
! 191: #define isD(i) (i<N? 0: 1)
! 192: /****************************************************
! 193: i : 0 1 N-1 N 2N-1
! 194: x :x_{N-1} x_{N-2} x_0
! 195: d : D_{N-1} D_{0}
! 196: if (isX(i)) x_{itox(i)}
! 197: if (isD(i)) D_{itod(i)}
! 198: ******************************************************/
! 199: /* xtoi(0):N-1 xtoi(1):N-2 ....
! 200: dtoi(0):2N-1 dtoi(1):2N-2 ...
! 201: itod(N):N-1 dtoi(N-1):N ...
! 202: */
! 203:
! 204: void printOrder(ringp)
! 205: struct ring *ringp;
! 206: {
! 207: int i,j;
! 208: FILE *fp;
! 209: char tmp[100];
! 210: int N,M,L,C,NN,MM,LL,CC;
! 211: char **TransX,**TransD;
! 212: int *Order;
! 213: int P;
! 214: int omsize;
! 215: extern char *F_isSameComponent;
! 216:
! 217: N=ringp->n; M = ringp->m; L = ringp->l; C = ringp->c;
! 218: NN=ringp->nn; MM = ringp->mm; LL = ringp->ll; CC = ringp->cc;
! 219: TransX = ringp->x; TransD = ringp->D;
! 220: Order = ringp->order;
! 221: P = ringp->p;
! 222: omsize = ringp->orderMatrixSize;
! 223:
! 224: fp = stdout;
! 225:
! 226:
! 227: for (i=0; i<2*N; i++) printf("%4d",i);
! 228: fprintf(fp,"\n");
! 229:
! 230: /* print variables names */
! 231: for (i=0; i<N; i++) {
! 232: sprintf(tmp,"x%d",N-1-i);
! 233: fprintf(fp,"%4s",tmp);
! 234: }
! 235: for (i=0; i<N; i++) {
! 236: sprintf(tmp,"D%d",N-1-i);
! 237: fprintf(fp,"%4s",tmp);
! 238: }
! 239: fprintf(fp,"\n");
! 240:
! 241: /* print identifier names */
! 242: for (i=0; i<N; i++) fprintf(fp,"%4s",TransX[itox(i)]);
! 243: for (i=N; i<2*N; i++) fprintf(fp,"%4s",TransD[itod(i)]);
! 244: fprintf(fp,"\n");
! 245:
! 246: /* print D: differential DE: differential, should be eliminated
! 247: E: difference
! 248: Q: q-difference
! 249: C: commutative
! 250: */
! 251: if (strcmp(F_isSameComponent,"x")== 0 || strcmp(F_isSameComponent,"xd")==0) {
! 252: for (i=0; i<N; i++) {
! 253: if ((NN<=itox(i)) && (itox(i)<N)) fprintf(fp,"%4s","DE");
! 254: if ((M<=itox(i)) && (itox(i)<NN)) fprintf(fp,"%4s","D");
! 255: if ((MM<=itox(i)) && (itox(i)<M)) fprintf(fp,"%4s","EE");
! 256: if ((L<=itox(i)) && (itox(i)<MM)) fprintf(fp,"%4s","E");
! 257: if ((LL<=itox(i)) && (itox(i)<L)) fprintf(fp,"%4s","QE");
! 258: if ((C<=itox(i)) && (itox(i)<LL)) fprintf(fp,"%4s","Q");
! 259: if ((CC<=itox(i)) && (itox(i)<C)) fprintf(fp,"%4s","CE");
! 260: if ((0<=itox(i)) && (itox(i)<CC)) fprintf(fp,"%4s","C");
! 261: }
! 262: }
! 263: if (strcmp(F_isSameComponent,"x")==0) {
! 264: for (i=N; i<2*N; i++) {
! 265: if ((M<=itod(i)) && (itod(i)<N)) fprintf(fp,"%4s","D");
! 266: if ((L<=itod(i)) && (itod(i)<M)) fprintf(fp,"%4s","E");
! 267: if ((C<=itod(i)) && (itod(i)<L)) fprintf(fp,"%4s","Q");
! 268: if ((0<=itod(i)) && (itod(i)<C)) fprintf(fp,"%4s","C");
! 269: }
! 270: }else if (strcmp(F_isSameComponent,"xd")==0) {
! 271: for (i=N; i<2*N; i++) {
! 272: if ((NN<=itod(i)) && (itod(i)<N)) fprintf(fp,"%4s","DE");
! 273: if ((M<=itod(i)) && (itod(i)<NN)) fprintf(fp,"%4s","D");
! 274: if ((MM<=itod(i)) && (itod(i)<M)) fprintf(fp,"%4s","EE");
! 275: if ((L<=itod(i)) && (itod(i)<MM)) fprintf(fp,"%4s","E");
! 276: if ((LL<=itod(i)) && (itod(i)<L)) fprintf(fp,"%4s","QE");
! 277: if ((C<=itod(i)) && (itod(i)<LL)) fprintf(fp,"%4s","Q");
! 278: if ((CC<=itod(i)) && (itod(i)<C)) fprintf(fp,"%4s","CE");
! 279: if ((0<=itod(i)) && (itod(i)<CC)) fprintf(fp,"%4s","C");
! 280: }
! 281: } else {
! 282: fprintf(fp,"Unknown graduation variable type.\n");
! 283: }
! 284: fprintf(fp,"\n");
! 285:
! 286: for (i=0; i< omsize; i++) {
! 287: for (j=0; j<2*N; j++) {
! 288: fprintf(fp,"%4d", Order[i*2*N+j]);
! 289: }
! 290: fprintf(fp,"\n");
! 291: }
! 292: fprintf(fp,"\n");
! 293:
! 294: }
! 295:
! 296: struct object oGetOrderMatrix(struct ring *ringp)
! 297: {
! 298: struct object rob,ob2;
! 299: int n,i,j,m;
! 300: int *om;
! 301: n = ringp->n;
! 302: m = ringp->orderMatrixSize;
! 303: om = ringp->order;
! 304: if (m<=0) m = 1;
! 305: rob = newObjectArray(m);
! 306: for (i=0; i<m; i++) {
! 307: ob2 = newObjectArray(2*n);
! 308: for (j=0; j<2*n; j++) {
! 309: putoa(ob2,j,KpoInteger(om[2*n*i+j]));
! 310: }
! 311: putoa(rob,i,ob2);
! 312: }
! 313: return(rob);
! 314: }
! 315:
! 316:
! 317: int mmLarger_matrix(ff,gg)
! 318: POLY ff; POLY gg;
! 319: {
! 320: int exp[2*N0]; /* exponents */
! 321: int i,k;
! 322: int sum,flag;
! 323: int *Order;
! 324: int N;
! 325: MONOMIAL f,g;
! 326: struct ring *rp;
! 327: int in2;
! 328: int *from, *to;
! 329: int omsize;
! 330:
! 331: if (ff == POLYNULL ) {
! 332: if (gg == POLYNULL) return( 2 );
! 333: else return( 0 );
! 334: }
! 335: if (gg == POLYNULL) {
! 336: if (ff == POLYNULL) return( 2 );
! 337: else return( 1 );
! 338: }
! 339: f = ff->m; g=gg->m;
! 340:
! 341: rp = f->ringp;
! 342: Order = rp->order;
! 343: N = rp->n;
! 344: from = rp->from;
! 345: to = rp->to;
! 346: omsize = rp->orderMatrixSize;
! 347:
! 348: flag = 1;
! 349: for (i=N-1,k=0; i>=0; i--,k++) {
! 350: exp[k] = (f->e[i].x) - (g->e[i].x);
! 351: exp[k+N] = (f->e[i].D) - (g->e[i].D);
! 352: if ((exp[k] != 0) || (exp[k+N] != 0)) flag =0;
! 353: }
! 354: if (flag==1) return(2);
! 355: /* exp > 0 <---> f>g
! 356: exp = 0 <---> f=g
! 357: exp < 0 <---> f<g
! 358: */
! 359: for (i=0; i< omsize; i++) {
! 360: sum = 0; in2 = i*2*N;
! 361: /* for (k=0; k<2*N; k++) sum += exp[k]*Order[in2+k]; */
! 362: for (k=from[i]; k<to[i]; k++) sum += exp[k]*Order[in2+k];
! 363: if (sum > 0) return(1);
! 364: if (sum < 0) return(0);
! 365: }
! 366: return(2);
! 367: }
! 368:
! 369: /* This should be used in case of q */
! 370: int mmLarger_qmatrix(ff,gg)
! 371: POLY ff; POLY gg;
! 372: {
! 373: int exp[2*N0]; /* exponents */
! 374: int i,k;
! 375: int sum,flag;
! 376: int *Order;
! 377: int N;
! 378: MONOMIAL f,g;
! 379: int omsize;
! 380:
! 381: if (ff == POLYNULL ) {
! 382: if (gg == POLYNULL) return( 2 );
! 383: else return( 0 );
! 384: }
! 385: if (gg == POLYNULL) {
! 386: if (ff == POLYNULL) return( 2 );
! 387: else return( 1 );
! 388: }
! 389: f = ff->m; g = gg->m;
! 390: Order = f->ringp->order;
! 391: N = f->ringp->n;
! 392: omsize = f->ringp->orderMatrixSize;
! 393:
! 394: flag = 1;
! 395: for (i=N-1,k=0; i>=0; i--,k++) {
! 396: exp[k] = (f->e[i].x) - (g->e[i].x);
! 397: exp[k+N] = (f->e[i].D) - (g->e[i].D);
! 398: if ((exp[k] != 0) || (exp[k+N] != 0)) flag =0;
! 399: }
! 400: if (flag==1) return(2);
! 401: /* exp > 0 <---> f>g
! 402: exp = 0 <---> f=g
! 403: exp < 0 <---> f<g
! 404: */
! 405: for (i=0; i< omsize; i++) {
! 406: sum = 0;
! 407: /* In case of q, you should do as follows */
! 408: for (k=0; k<N-1; k++) sum += exp[k]*Order[i*2*N+k]; /* skip k= N-1 -->q */
! 409: for (k=N; k<2*N-1; k++) sum += exp[k]*Order[i*2*N+k]; /* SKip k= 2*N-1 */
! 410: if (sum > 0) return(1);
! 411: else if (sum < 0) return(0);
! 412: }
! 413: if (exp[N-1] > 0) return(1);
! 414: else if (exp[N-1] < 0) return(0);
! 415: else return(2);
! 416: }
! 417:
! 418: /* x(N-1)>x(N-2)>....>D(N-1)>....>D(0) */
! 419: mmLarger_pureLexicographic(f,g)
! 420: POLY f;
! 421: POLY g;
! 422: {
! 423: int i,r;
! 424: int n;
! 425: MONOMIAL fm,gm;
! 426: /* Note that this function ignores the order matrix of the given
! 427: ring. */
! 428: if (f == POLYNULL ) {
! 429: if (g == POLYNULL) return( 2 );
! 430: else return( 0 );
! 431: }
! 432: if (g == POLYNULL) {
! 433: if (f == POLYNULL) return( 2 );
! 434: else return( 1 );
! 435: }
! 436:
! 437:
! 438: fm = f->m; gm = g->m;
! 439: n = fm->ringp->n;
! 440: for (i=n-1; i>=0; i--) {
! 441: r = (fm->e[i].x) - (gm->e[i].x);
! 442: if (r > 0) return(1);
! 443: else if (r < 0) return(0);
! 444: else ;
! 445: }
! 446:
! 447: for (i=n-1; i>=0; i--) {
! 448: r = (fm->e[i].D) - (gm->e[i].D);
! 449: if (r > 0) return(1);
! 450: else if (r < 0) return(0);
! 451: else ;
! 452: }
! 453:
! 454: return(2);
! 455:
! 456: }
! 457:
! 458:
! 459: void setFromTo(ringp)
! 460: struct ring *ringp;
! 461: {
! 462: int n;
! 463: int i,j,oasize;
! 464: if (ringp->order == (int *)NULL) errorOrder("setFromTo(); no order matrix.");
! 465: n = (ringp->n)*2;
! 466: oasize = ringp->orderMatrixSize;
! 467: ringp->from = (int *)sGC_malloc(sizeof(int)*oasize);
! 468: ringp->to = (int *)sGC_malloc(sizeof(int)*oasize);
! 469: if (ringp->from == (int *)NULL || ringp->to == (int *)NULL) {
! 470: errorOrder("setFromTo(): No memory.");
! 471: }
! 472: for (i=0; i<oasize; i++) {
! 473: ringp->from[i] = 0; ringp->to[i] = n;
! 474: for (j=0; j<n; j++) {
! 475: if (ringp->order[i*n+j] != 0) {
! 476: ringp->from[i] = j;
! 477: break;
! 478: }
! 479: }
! 480: for (j=n-1; j>=0; j--) {
! 481: if (ringp->order[i*n+j] != 0) {
! 482: ringp->to[i] = j+1;
! 483: break;
! 484: }
! 485: }
! 486: }
! 487: }
! 488:
! 489: /* It ignores h and should be used with mmLarger_tower */
! 490: /* cf. mmLarger_matrix. h always must be checked at last. */
! 491: static int mmLarger_matrix_schreyer(ff,gg)
! 492: POLY ff; POLY gg;
! 493: {
! 494: int exp[2*N0]; /* exponents */
! 495: int i,k;
! 496: int sum,flag;
! 497: int *Order;
! 498: int N;
! 499: MONOMIAL f,g;
! 500: struct ring *rp;
! 501: int in2;
! 502: int *from, *to;
! 503: int omsize;
! 504:
! 505: if (ff == POLYNULL ) {
! 506: if (gg == POLYNULL) return( 2 );
! 507: else return( 0 );
! 508: }
! 509: if (gg == POLYNULL) {
! 510: if (ff == POLYNULL) return( 2 );
! 511: else return( 1 );
! 512: }
! 513: f = ff->m; g=gg->m;
! 514:
! 515: rp = f->ringp;
! 516: Order = rp->order;
! 517: N = rp->n;
! 518: from = rp->from;
! 519: to = rp->to;
! 520: omsize = rp->orderMatrixSize;
! 521:
! 522: flag = 1;
! 523: for (i=N-1,k=0; i>0; i--,k++) {
! 524: exp[k] = (f->e[i].x) - (g->e[i].x);
! 525: exp[k+N] = (f->e[i].D) - (g->e[i].D);
! 526: if ((exp[k] != 0) || (exp[k+N] != 0)) flag =0;
! 527: }
! 528: exp[N-1] = (f->e[0].x) - (g->e[0].x);
! 529: exp[2*N-1] = 0; /* f->e[0].D - g->e[0].D. Ignore h! */
! 530: if ((exp[N-1] != 0) || (exp[2*N-1] != 0)) flag =0;
! 531:
! 532: if (flag==1) return(2);
! 533: /* exp > 0 <---> f>g
! 534: exp = 0 <---> f=g
! 535: exp < 0 <---> f<g
! 536: */
! 537: for (i=0; i< omsize; i++) {
! 538: sum = 0; in2 = i*2*N;
! 539: /* for (k=0; k<2*N; k++) sum += exp[k]*Order[in2+k]; */
! 540: for (k=from[i]; k<to[i]; k++) sum += exp[k]*Order[in2+k];
! 541: if (sum > 0) return(1);
! 542: if (sum < 0) return(0);
! 543: }
! 544: return(2);
! 545: }
! 546:
! 547: int mmLarger_tower(POLY f,POLY g) {
! 548: struct object *gbList;
! 549: int r;
! 550: if (f == POLYNULL) {
! 551: if (g == POLYNULL) return(2);
! 552: else return(0);
! 553: }
! 554: if (g == POLYNULL) {
! 555: if (f == POLYNULL) return(2);
! 556: else return(1);
! 557: }
! 558: if (!(f->m->ringp->schreyer) || !(g->m->ringp->schreyer))
! 559: return(mmLarger_matrix(f,g));
! 560: /* modifiable: mmLarger_qmatrix */
! 561: gbList = (struct object *)(g->m->ringp->gbListTower);
! 562: if (gbList == NULL) return(mmLarger_matrix(f,g));
! 563: /* modifiable: mmLarger_qmatrix */
! 564: if (gbList->tag != Slist) {
! 565: warningOrder("mmLarger_tower(): gbList must be in Slist.\n");
! 566: return(1);
! 567: }
! 568: if (klength(gbList) ==0) return(mmLarger_matrix(f,g));
! 569: /* modifiable: mmLarger_qmatrix */
! 570:
! 571: r = mmLarger_tower3(f,g,gbList);
! 572: /* printf("mmLarger_tower3(%s,%s) --> %d\n",POLYToString(head(f),'*',1),POLYToString(head(g),'*',1),r); */
! 573: if (r == 2) { /* Now, compare by h */
! 574: if (f->m->e[0].D > g->m->e[0].D) return(1);
! 575: else if (f->m->e[0].D < g->m->e[0].D) return(0);
! 576: else return(2);
! 577: }else{
! 578: return(r);
! 579: }
! 580: }
! 581:
! 582: int mmLarger_tower3(POLY f,POLY g,struct object *gbList)
! 583: { /* gbList is assumed to be Slist */
! 584: int n,fv,gv,t,r,nn;
! 585: POLY fm;
! 586: POLY gm;
! 587: struct object gb;
! 588:
! 589: if (f == POLYNULL) {
! 590: if (g == POLYNULL) return(2);
! 591: else return(0);
! 592: }
! 593: if (g == POLYNULL) {
! 594: if (f == POLYNULL) return(2);
! 595: else return(1); /* It assumes the zero is the minimum element!! */
! 596: }
! 597: n = f->m->ringp->n;
! 598: nn = f->m->ringp->nn;
! 599: /* critical and modifiable */ /* m e_u > m e_v <==> m g_u > m g_v */
! 600: /* or equal and u < v */
! 601: fv = f->m->e[nn].x ; /* extract component (vector) number of f! */
! 602: gv = g->m->e[nn].x ;
! 603: if (fv == gv) { /* They have the same component number. */
! 604: return(mmLarger_matrix_schreyer(f,g));
! 605: }
! 606:
! 607: if (gbList == NULL) return(mmLarger_matrix_schreyer(f,g));
! 608: /* modifiable: mmLarger_qmatrix */
! 609: if (gbList->tag != Slist) {
! 610: warningOrder("mmLarger_tower(): gbList must be in Slist.\n");
! 611: return(1);
! 612: }
! 613: if (klength(gbList) ==0) return(mmLarger_matrix(f,g));
! 614: /* modifiable: mmLarger_qmatrix */
! 615: gb = car(gbList); /* each entry must be monomials */
! 616: if (gb.tag != Sarray) {
! 617: warningOrder("mmLarger_tower3(): car(gbList) must be an array.\n");
! 618: return(1);
! 619: }
! 620: t = getoaSize(gb);
! 621: if (t == 0) return(mmLarger_tower3(f,g,cdr(gbList)));
! 622:
! 623: fm = pmCopy(head(f)); fm->m->e[nn].x = 0; /* f is not modified. */
! 624: gm = pmCopy(head(g)); gm->m->e[nn].x = 0;
! 625: if (fv >= t || gv >= t) {
! 626: warningOrder("mmLarger_tower3(): incompatible input and gbList.\n");
! 627: printf("Length of gb is %d, f is %s, g is %s\n",t,KPOLYToString(f),
! 628: KPOLYToString(g));
! 629: return(1);
! 630: }
! 631: /* mpMult_poly is too expensive to call. @@@*/
! 632: r = mmLarger_tower3(mpMult_poly(fm,KopPOLY(getoa(gb,fv))),
! 633: mpMult_poly(gm,KopPOLY(getoa(gb,gv))),
! 634: cdr(gbList));
! 635: if (r != 2) return(r);
! 636: else if (fv == gv) return(2);
! 637: else if (fv > gv) return(0); /* modifiable */
! 638: else if (fv < gv) return(1); /* modifiable */
! 639: }
! 640:
! 641: static void warningOrder(s)
! 642: char *s;
! 643: {
! 644: fprintf(stderr,"Warning in order.c: %s\n",s);
! 645: }
! 646:
! 647: static void errorOrder(s)
! 648: char *s;
! 649: {
! 650: fprintf(stderr,"order.c: %s\n",s);
! 651: exit(14);
! 652: }
! 653:
! 654:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>