Changeset b3af93 in git
- Timestamp:
- Aug 21, 2009, 12:55:46 PM (14 years ago)
- Branches:
- (u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', '0604212ebb110535022efecad887940825b97c3f')
- Children:
- 355201433267f3df667ea913a9d3487335c99191
- Parents:
- 43c57185bbe2457782485ecda44d8025a86ca320
- Location:
- kernel
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/longalg.cc
r43c5718 rb3af93 2 2 * Computer Algebra System SINGULAR * 3 3 ****************************************/ 4 /* $Id: longalg.cc,v 1.4 7 2009-08-14 17:14:30Singular Exp $ */4 /* $Id: longalg.cc,v 1.48 2009-08-21 10:55:46 Singular Exp $ */ 5 5 /* 6 6 * ABSTRACT: algebraic numbers 7 * convention: A) minpoly==0: n->z, n->n are from Z[a] resp. Z/p[a],8 * no common div., L(n->n) >0 (or n->n==NULL)9 * B) minpoly!=NULL: n->z from k[a], n->n==NULL10 7 */ 11 8 … … 31 28 naIdeal naI=NULL; 32 29 30 int naNumbOfPar; 33 31 napoly naMinimalPoly; 34 32 #define naParNames (currRing->parameter) 33 #define napNormalize(p) p_Normalize(p,nacRing) 35 34 static int naIsChar0; 36 35 static int naPrimeM; … … 49 48 static number (*nacGcd)(number a, number b, const ring r); 50 49 static number (*nacLcm)(number a, number b, const ring r); 50 static void (*nacDelete)(number *a, const ring r); 51 51 number (*nacInit)(int i); 52 52 static int (*nacInt)(number &n); … … 66 66 static int napExpi(int i, napoly a, napoly b); 67 67 ring nacRing; 68 static inline void naNormalize0(number &pp) 69 { 70 lnumber p = (lnumber)pp; 71 if ((p!=NULL) && (p->z!=NULL)) 72 { 73 naNormalize(pp); 74 } 75 } 68 76 69 77 #define napCopy(p) (napoly)p_Copy((poly)p,nacRing) … … 106 114 } 107 115 116 naNumbOfPar=rPar(r); 108 117 if (i == 1) 109 118 { … … 137 146 nacGcd = nacRing->cf->nGcd; 138 147 nacLcm = nacRing->cf->nLcm; 148 nacDelete = nacRing->cf->cfDelete; 139 149 nacMult = nacRing->cf->nMult; 140 150 nacDiv = nacRing->cf->nDiv; … … 153 163 { 154 164 if (naIsChar0) 155 nlDBTest( napGetCoeff(p), "", 0);165 nlDBTest(pGetCoeff(p), "", 0); 156 166 pIter(p); 157 167 } … … 162 172 163 173 #define napInit(i) (napoly)p_ISet(i,nacRing) 164 #define napSetCoeff(p,n) p_SetCoeff(p,n,nacRing);174 #define napSetCoeff(p,n) {nacDelete(&pGetCoeff(p),nacRing);pGetCoeff(p)=n;} 165 175 #define napDelete1(p) p_LmDelete((poly *)p, nacRing) 166 176 #define nap_Copy(p,r) (napoly)p_Copy((poly)p,r->algring) … … 178 188 { 179 189 napoly a = (napoly)p_Init(nacRing); 180 napGetCoeff(a) = z;190 pGetCoeff(a) = z; 181 191 return a; 182 192 } … … 193 203 194 204 /*3 205 * returns ph * z 206 */ 207 static void napMultN(napoly p, number z) 208 { 209 number t; 210 211 while (p!=NULL) 212 { 213 t = nacMult(pGetCoeff(p), z); 214 nacNormalize(t); 215 nacDelete(&pGetCoeff(p),nacRing); 216 pGetCoeff(p) = t; 217 pIter(p); 218 } 219 } 220 221 /*3 195 222 * division with rest; f = g*q + r, returns r and destroy f 196 223 */ … … 201 228 qq = (napoly)p_Init(nacRing); 202 229 pNext(qq) = NULL; 203 p_Normalize(g,nacRing);204 p_Normalize(f,nacRing);230 napNormalize(g); 231 napNormalize(f); 205 232 a = f; 206 233 do … … 208 235 napSetExp(qq,1, napGetExp(a,1) - napGetExp(g,1)); 209 236 napSetm(qq); 210 napGetCoeff(qq) = nacDiv(napGetCoeff(a), napGetCoeff(g));211 napGetCoeff(qq) = nacNeg(napGetCoeff(qq));212 nacNormalize( napGetCoeff(qq));237 pGetCoeff(qq) = nacDiv(pGetCoeff(a), pGetCoeff(g)); 238 pGetCoeff(qq) = nacNeg(pGetCoeff(qq)); 239 nacNormalize(pGetCoeff(qq)); 213 240 h = napCopy(g); 214 241 napMultT(h, qq); 215 p_Normalize(h,nacRing);216 n _Delete(&napGetCoeff(qq),nacRing);242 napNormalize(h); 243 nacDelete(&pGetCoeff(qq),nacRing); 217 244 a = napAdd(a, h); 218 245 } … … 231 258 qq = (napoly)p_Init(nacRing); 232 259 pNext(qq) = b = NULL; 233 p_Normalize(g,nacRing);234 p_Normalize(f,nacRing);260 napNormalize(g); 261 napNormalize(f); 235 262 a = f; 236 263 do … … 238 265 napSetExp(qq,1, napGetExp(a,1) - napGetExp(g,1)); 239 266 p_Setm(qq,nacRing); 240 napGetCoeff(qq) = nacDiv(napGetCoeff(a), napGetCoeff(g));241 nacNormalize( napGetCoeff(qq));267 pGetCoeff(qq) = nacDiv(pGetCoeff(a), pGetCoeff(g)); 268 nacNormalize(pGetCoeff(qq)); 242 269 b = napAdd(b, napCopy(qq)); 243 napGetCoeff(qq) = nacNeg(napGetCoeff(qq));270 pGetCoeff(qq) = nacNeg(pGetCoeff(qq)); 244 271 h = napCopy(g); 245 272 napMultT(h, qq); 246 p_Normalize(h,nacRing);247 n _Delete(&napGetCoeff(qq),nacRing);273 napNormalize(h); 274 nacDelete(&pGetCoeff(qq),nacRing); 248 275 a = napAdd(a, h); 249 276 } … … 270 297 if (napGetExp(x,1)==0) 271 298 { 272 if (!nacIsOne( napGetCoeff(x)))273 { 274 nacNormalize( napGetCoeff(x));275 t = nacInvers( napGetCoeff(x));299 if (!nacIsOne(pGetCoeff(x))) 300 { 301 nacNormalize(pGetCoeff(x)); 302 t = nacInvers(pGetCoeff(x)); 276 303 nacNormalize(t); 277 n _Delete(&napGetCoeff(x),nacRing);278 napGetCoeff(x) = t;304 nacDelete(&pGetCoeff(x),nacRing); 305 pGetCoeff(x) = t; 279 306 } 280 307 return x; … … 288 315 if (napGetExp(r,1)==0) 289 316 { 290 nacNormalize( napGetCoeff(r));291 t = nacInvers( napGetCoeff(r));317 nacNormalize(pGetCoeff(r)); 318 t = nacInvers(pGetCoeff(r)); 292 319 nacNormalize(t); 293 320 t = nacNeg(t); 294 qa=p_Mult_nn(qa,t,nacRing); p_Normalize(qa,nacRing);295 n _Delete(&t,nacRing);296 p_Normalize(qa,nacRing);321 napMultN(qa, t); 322 nacDelete(&t,nacRing); 323 napNormalize(qa); 297 324 p_Delete(&x,nacRing); 298 325 p_Delete(&r,nacRing); … … 310 337 q = napMult(q, qa); 311 338 q = napAdd(q, napInit(1)); 312 nacNormalize( napGetCoeff(r));313 t = nacInvers( napGetCoeff(r));314 q=p_Mult_nn(q,t,nacRing); p_Normalize(q,nacRing);315 p_Normalize(q,nacRing);316 n _Delete(&t,nacRing);339 nacNormalize(pGetCoeff(r)); 340 t = nacInvers(pGetCoeff(r)); 341 napMultN(q, t); 342 napNormalize(q); 343 nacDelete(&t,nacRing); 317 344 p_Delete(&x,nacRing); 318 345 p_Delete(&r,nacRing); … … 338 365 q = napNeg(q); 339 366 q = napAdd(q, qa); 340 nacNormalize( napGetCoeff(r));341 t = nacInvers( napGetCoeff(r));367 nacNormalize(pGetCoeff(r)); 368 t = nacInvers(pGetCoeff(r)); 342 369 //nacNormalize(t); 343 q=p_Mult_nn(q,t,nacRing); p_Normalize(q,nacRing);344 p_Normalize(q,nacRing);345 n _Delete(&t,nacRing);370 napMultN(q, t); 371 napNormalize(q); 372 nacDelete(&t,nacRing); 346 373 p_Delete(&x,nacRing); 347 374 p_Delete(&r,nacRing); … … 406 433 if (has_denom) 407 434 { 408 number den=n _GetDenom(napGetCoeff(p), nacRing);435 number den=nacRing->cf->cfGetDenom(pGetCoeff(p), nacRing); 409 436 kl=!n_IsOne(den,nacRing); 410 437 n_Delete(&den, nacRing); … … 412 439 if (kl) StringAppendS("("); 413 440 //StringAppendS("-1"); 414 nacWrite( napGetCoeff(p));441 nacWrite(pGetCoeff(p)); 415 442 if (kl) StringAppendS(")"); 416 443 } … … 422 449 BOOLEAN wroteCoeff=FALSE; 423 450 if ((napIsConstant(p)) 424 || ((!nacIsOne( napGetCoeff(p)))425 && (!nacIsMOne( napGetCoeff(p)))))451 || ((!nacIsOne(pGetCoeff(p))) 452 && (!nacIsMOne(pGetCoeff(p))))) 426 453 { 427 nacWrite( napGetCoeff(p));454 nacWrite(pGetCoeff(p)); 428 455 wroteCoeff=(currRing->ShortOut==0); 429 456 } 430 else if (nacIsMOne( napGetCoeff(p)))457 else if (nacIsMOne(pGetCoeff(p))) 431 458 { 432 459 StringAppendS("-"); 433 460 } 434 461 int i; 435 for (i = 0; i < rPar(currRing); i++)462 for (i = 0; i < naNumbOfPar; i++) 436 463 { 437 464 if (napGetExp(p,i+1) > 0) … … 453 480 if (p==NULL) 454 481 break; 455 if (nacGreaterZero( napGetCoeff(p)))482 if (nacGreaterZero(pGetCoeff(p))) 456 483 StringAppendS("+"); 457 484 } … … 496 523 if ((*s >= '0') && (*s <= '9')) 497 524 { 498 s = nacRead(s, & napGetCoeff(a));499 if (nacIsZero( napGetCoeff(a)))525 s = nacRead(s, &pGetCoeff(a)); 526 if (nacIsZero(pGetCoeff(a))) 500 527 { 501 528 napDelete1(&a); … … 505 532 } 506 533 else 507 napGetCoeff(a) = nacInit(1);534 pGetCoeff(a) = nacInit(1); 508 535 i = 0; 509 536 const char *olds=s; … … 513 540 if (olds == s) 514 541 i++; 515 else if (*s == '\0') 542 else if (*s == '\0') 516 543 { 517 544 *b = a; 518 545 return s; 519 546 } 520 if (i >= rPar(currRing))547 if (i >= naNumbOfPar) 521 548 break; 522 549 } … … 530 557 else 531 558 i = 0; 532 if ((*s == '\0') || (i >= rPar(currRing)))559 if ((*s == '\0') || (i >= naNumbOfPar)) 533 560 break; 534 561 } … … 585 612 586 613 p = ph; 587 if (nacIsOne( napGetCoeff(p)))614 if (nacIsOne(pGetCoeff(p))) 588 615 return; 589 h = nacCopy( napGetCoeff(p));616 h = nacCopy(pGetCoeff(p)); 590 617 pIter(p); 591 618 do 592 619 { 593 d=nacGcd( napGetCoeff(p), h, nacRing);620 d=nacGcd(pGetCoeff(p), h, nacRing); 594 621 if(nacIsOne(d)) 595 622 { 596 n _Delete(&h,nacRing);597 n _Delete(&d,nacRing);623 nacDelete(&h,nacRing); 624 nacDelete(&d,nacRing); 598 625 return; 599 626 } 600 n _Delete(&h,nacRing);627 nacDelete(&h,nacRing); 601 628 h = d; 602 629 pIter(p); … … 604 631 while (p!=NULL); 605 632 h = nacInvers(d); 606 n _Delete(&d,nacRing);633 nacDelete(&d,nacRing); 607 634 p = ph; 608 635 while (p!=NULL) 609 636 { 610 d = nacMult( napGetCoeff(p), h);611 n _Delete(&napGetCoeff(p),nacRing);612 napGetCoeff(p) = d;637 d = nacMult(pGetCoeff(p), h); 638 nacDelete(&pGetCoeff(p),nacRing); 639 pGetCoeff(p) = d; 613 640 pIter(p); 614 641 } 615 n _Delete(&h,nacRing);642 nacDelete(&h,nacRing); 616 643 } 617 644 … … 627 654 while (p!=NULL) 628 655 { 629 d = nacLcm(h, napGetCoeff(p), nacRing);630 n _Delete(&h,nacRing);656 d = nacLcm(h, pGetCoeff(p), nacRing); 657 nacDelete(&h,nacRing); 631 658 h = d; 632 659 pIter(p); … … 635 662 { 636 663 p = ph; 637 p=p_Mult_nn(p,h,nacRing);p_Normalize(p,nacRing); 638 n_Delete(&h,nacRing); 664 while (p!=NULL) 665 { 666 d=nacMult(h, pGetCoeff(p)); 667 nacDelete(&pGetCoeff(p),nacRing); 668 nacNormalize(d); 669 pGetCoeff(p) = d; 670 pIter(p); 671 } 672 nacDelete(&h,nacRing); 639 673 } 640 674 napContent(ph); … … 646 680 if (!naIsChar0) 647 681 return napInit(1); 648 x = nacCopy( napGetCoeff(a));682 x = nacCopy(pGetCoeff(a)); 649 683 if (nacIsOne(x)) 650 684 return napInitz(x); … … 652 686 { 653 687 pIter(a); 654 y = nacGcd(x, napGetCoeff(a), nacRing);655 n _Delete(&x,nacRing);688 y = nacGcd(x, pGetCoeff(a), nacRing); 689 nacDelete(&x,nacRing); 656 690 x = y; 657 691 if (nacIsOne(x)) … … 660 694 do 661 695 { 662 y = nacGcd(x, napGetCoeff(b), nacRing);663 n _Delete(&x,nacRing);696 y = nacGcd(x, pGetCoeff(b), nacRing); 697 nacDelete(&x,nacRing); 664 698 x = y; 665 699 if (nacIsOne(x)) … … 679 713 napoly g, x, y, h; 680 714 if ((a==NULL) 681 || ((pNext(a)==NULL)&&(nacIsZero( napGetCoeff(a)))))715 || ((pNext(a)==NULL)&&(nacIsZero(pGetCoeff(a))))) 682 716 { 683 717 if ((b==NULL) 684 || ((pNext(b)==NULL)&&(nacIsZero( napGetCoeff(b)))))718 || ((pNext(b)==NULL)&&(nacIsZero(pGetCoeff(b))))) 685 719 { 686 720 return napInit(1); … … 690 724 else 691 725 if ((b==NULL) 692 || ((pNext(b)==NULL)&&(nacIsZero( napGetCoeff(b)))))726 || ((pNext(b)==NULL)&&(nacIsZero(pGetCoeff(b))))) 693 727 { 694 728 return napCopy(a); … … 722 756 { 723 757 napCleardenom(y); 724 if (!nacIsOne(napGetCoeff(g))) 725 { 726 y=p_Mult_nn(y,napGetCoeff(g),nacRing); 727 p_Normalize(y,nacRing); 728 } 758 if (!nacIsOne(pGetCoeff(g))) 759 napMultN(y, pGetCoeff(g)); 729 760 napDelete1(&g); 730 761 return y; … … 747 778 if (!naIsChar0) x = napInit(1); 748 779 else x = napGcd0(g,h); 749 for (i=( rPar(currRing)-1); i>=0; i--)780 for (i=(naNumbOfPar-1); i>=0; i--) 750 781 { 751 782 napSetExp(x,i+1, napExpi(i,a,b)); … … 767 798 while (b!=NULL) 768 799 { 769 d = nacLcm(h, napGetCoeff(b), nacRing);770 n _Delete(&h,nacRing);800 d = nacLcm(h, pGetCoeff(b), nacRing); 801 nacDelete(&h,nacRing); 771 802 h = d; 772 803 pIter(b); … … 789 820 { 790 821 j++; 791 if (j > rPar(currRing))822 if (j > naNumbOfPar) 792 823 return 1; 793 824 } … … 811 842 { 812 843 /* h = lt(q)/lt(naI->liste[i])*/ 813 napGetCoeff(h) = nacCopy(napGetCoeff(q));814 for (j= rPar(currRing); j>0; j--)844 pGetCoeff(h) = nacCopy(pGetCoeff(q)); 845 for (j=naNumbOfPar; j>0; j--) 815 846 napSetExp(h,j, napGetExp(q,j) - napGetExp(naI->liste[i],j)); 816 847 p_Setm(h,nacRing); … … 929 960 if ((l!=NULL)&&(l->n==NULL)&&(napIsConstant(l->z))) 930 961 { 931 return nacInt( napGetCoeff(l->z));962 return nacInt(pGetCoeff(l->z)); 932 963 } 933 964 return 0; … … 987 1018 988 1019 /*2 1020 * addition; lu:= la + lb 1021 */ 1022 number naAdd(number la, number lb) 1023 { 1024 napoly x, y; 1025 lnumber lu; 1026 lnumber a = (lnumber)la; 1027 lnumber b = (lnumber)lb; 1028 if (a==NULL) return naCopy(lb); 1029 if (b==NULL) return naCopy(la); 1030 omCheckAddrSize(a,sizeof(snumber)); 1031 omCheckAddrSize(b,sizeof(snumber)); 1032 lu = (lnumber)omAllocBin(rnumber_bin); 1033 if (b->n!=NULL) x = napMultCopy(a->z, b->n); 1034 else x = napCopy(a->z); 1035 if (a->n!=NULL) y = napMultCopy(b->z, a->n); 1036 else y = napCopy(b->z); 1037 lu->z = napAdd(x, y); 1038 if (lu->z==NULL) 1039 { 1040 omFreeBin((ADDRESS)lu, rnumber_bin); 1041 return (number)NULL; 1042 } 1043 if (a->n!=NULL) 1044 { 1045 if (b->n!=NULL) x = napMultCopy(a->n, b->n); 1046 else x = napCopy(a->n); 1047 } 1048 else 1049 { 1050 if (b->n!=NULL) x = napCopy(b->n); 1051 else x = NULL; 1052 } 1053 //if (x!=NULL) 1054 //{ 1055 // if (napIsConstant(x)) 1056 // { 1057 // number inv=nacInvers(pGetCoeff(x)); 1058 // napMultN(lu->z,inv); 1059 // nacDelete(&inv,nacRing); 1060 // napDelete(&x); 1061 // } 1062 //} 1063 lu->n = x; 1064 lu->s = FALSE; 1065 if (lu->n!=NULL) 1066 { 1067 number luu=(number)lu; 1068 naNormalize0(luu); 1069 lu=(lnumber)luu; 1070 } 1071 naTest((number)lu); 1072 return (number)lu; 1073 } 1074 1075 /*2 1076 * subtraction; r:= la - lb 1077 */ 1078 number naSub(number la, number lb) 1079 { 1080 lnumber lu; 1081 1082 if (lb==NULL) return naCopy(la); 1083 if (la==NULL) 1084 { 1085 lu = (lnumber)naCopy(lb); 1086 lu->z = napNeg(lu->z); 1087 return (number)lu; 1088 } 1089 1090 lnumber a = (lnumber)la; 1091 lnumber b = (lnumber)lb; 1092 1093 omCheckAddrSize(a,sizeof(snumber)); 1094 omCheckAddrSize(b,sizeof(snumber)); 1095 1096 napoly x, y; 1097 lu = (lnumber)omAllocBin(rnumber_bin); 1098 if (b->n!=NULL) x = napMultCopy(a->z, b->n); 1099 else x = napCopy(a->z); 1100 if (a->n!=NULL) y = napMult(napCopy(b->z), napCopyNeg(a->n)); 1101 else y = napCopyNeg(b->z); 1102 lu->z = napAdd(x, y); 1103 if (lu->z==NULL) 1104 { 1105 omFreeBin((ADDRESS)lu, rnumber_bin); 1106 return (number)NULL; 1107 } 1108 if (a->n!=NULL) 1109 { 1110 if (b->n!=NULL) x = napMultCopy(a->n, b->n); 1111 else x = napCopy(a->n); 1112 } 1113 else 1114 { 1115 if (b->n!=NULL) x = napCopy(b->n); 1116 else x = NULL; 1117 } 1118 //if (x!=NULL) 1119 //{ 1120 // if (napIsConstant(x)) 1121 // { 1122 // number inv=nacInvers(pGetCoeff(x)); 1123 // napMultN(lu->z,inv); 1124 // nacDelete(&inv,nacRing); 1125 // napDelete(&x); 1126 // } 1127 //} 1128 lu->n = x; 1129 lu->s = FALSE; 1130 if (lu->n!=NULL) 1131 { 1132 number luu=(number)lu; 1133 naNormalize0(luu); 1134 lu=(lnumber)luu; 1135 } 1136 naTest((number)lu); 1137 return (number)lu; 1138 } 1139 1140 /*2 989 1141 * multiplication; r:= la * lb 990 1142 */ … … 1044 1196 } 1045 1197 } 1046 if ((x!=NULL) && (napIsConstant(x)) && nacIsOne( napGetCoeff(x)))1198 if ((x!=NULL) && (napIsConstant(x)) && nacIsOne(pGetCoeff(x))) 1047 1199 p_Delete(&x,nacRing); 1048 1200 lo->n = x; … … 1057 1209 lo->s = 0; 1058 1210 number luu=(number)lo; 1059 naNormalize (luu);1211 naNormalize0(luu); 1060 1212 lo=(lnumber)luu; 1061 1213 } … … 1091 1243 naNormalize(nres); 1092 1244 1093 // p_Delete(&res->n,nacRing);1245 //napDelete(&res->n); 1094 1246 naTest(nres); 1095 1247 return nres; … … 1144 1296 } 1145 1297 } 1146 if ((napIsConstant(x)) && nacIsOne( napGetCoeff(x)))1298 if ((napIsConstant(x)) && nacIsOne(pGetCoeff(x))) 1147 1299 p_Delete(&x,nacRing); 1148 1300 lo->n = x; … … 1196 1348 lo->z = napInit(1); 1197 1349 x = b->z; 1198 if ((!napIsConstant(x)) || !nacIsOne( napGetCoeff(x)))1350 if ((!napIsConstant(x)) || !nacIsOne(pGetCoeff(x))) 1199 1351 x = napCopy(x); 1200 1352 else … … 1215 1367 while (x!=NULL) 1216 1368 { 1217 nacNormalize( napGetCoeff(x));1369 nacNormalize(pGetCoeff(x)); 1218 1370 pIter(x); 1219 1371 } … … 1224 1376 { 1225 1377 number luu=(number)lo; 1226 naNormalize (luu);1378 naNormalize0(luu); 1227 1379 lo=(lnumber)luu; 1228 1380 } … … 1252 1404 if ((zb!=NULL) && (zb->z!=NULL)) 1253 1405 { 1254 return (nacGreaterZero( napGetCoeff(zb->z))||(!napIsConstant(zb->z)));1406 return (nacGreaterZero(pGetCoeff(zb->z))||(!napIsConstant(zb->z))); 1255 1407 } 1256 1408 /* else */ return FALSE; … … 1353 1505 return NULL; 1354 1506 int i; 1355 char *s=(char *)omAlloc(4* rPar(currRing));1507 char *s=(char *)omAlloc(4* naNumbOfPar); 1356 1508 char *t=(char *)omAlloc(8); 1357 1509 s[0]='\0'; 1358 for (i = 0; i <= rPar(currRing)- 1; i++)1510 for (i = 0; i <= naNumbOfPar - 1; i++) 1359 1511 { 1360 1512 if (napGetExp(ph->z,i+1) > 0) … … 1417 1569 if (a->n==NULL) 1418 1570 { 1419 if (napIsConstant(a->z)) 1571 if (napIsConstant(a->z)) 1420 1572 { 1421 1573 #ifdef LDEBUG 1422 1574 if (a->z==NULL) return FALSE; 1423 else 1424 #endif 1425 return nacIsOne( napGetCoeff(a->z));1575 else 1576 #endif 1577 return nacIsOne(pGetCoeff(a->z)); 1426 1578 } 1427 1579 else return FALSE; … … 1435 1587 else 1436 1588 { 1437 t = nacSub( napGetCoeff(x), napGetCoeff(y));1589 t = nacSub(pGetCoeff(x), pGetCoeff(y)); 1438 1590 if (!nacIsZero(t)) 1439 1591 { 1440 n _Delete(&t,nacRing);1592 nacDelete(&t,nacRing); 1441 1593 return FALSE; 1442 1594 } 1443 1595 else 1444 n _Delete(&t,nacRing);1596 nacDelete(&t,nacRing); 1445 1597 } 1446 1598 pIter(x); … … 1476 1628 if (a->n==NULL) 1477 1629 { 1478 if (napIsConstant(a->z)) return nacIsMOne( napGetCoeff(a->z));1630 if (napIsConstant(a->z)) return nacIsMOne(pGetCoeff(a->z)); 1479 1631 /*else return FALSE;*/ 1480 1632 } … … 1504 1656 if (a==NULL) return naCopy(b); 1505 1657 if (b==NULL) return naCopy(a); 1506 1658 1507 1659 lnumber x, y; 1508 1660 lnumber result = (lnumber)omAlloc0Bin(rnumber_bin); … … 1510 1662 x = (lnumber)a; 1511 1663 y = (lnumber)b; 1512 if (( rPar(currRing)== 1) && (naMinimalPoly!=NULL))1664 if ((naNumbOfPar == 1) && (naMinimalPoly!=NULL)) 1513 1665 { 1514 1666 if (pNext(x->z)!=NULL) … … 1528 1680 napoly rz=napGcd(x->z, y->z); 1529 1681 CanonicalForm F, G, R; 1530 R=convSingPFactoryP(rz,nacRing); 1531 p_Normalize(x->z,nacRing);1532 F=convSingPFactoryP(x->z,nacRing)/R; 1533 p_Normalize(y->z,nacRing);1534 G=convSingPFactoryP(y->z,nacRing)/R; 1682 R=convSingPFactoryP(rz,nacRing); 1683 napNormalize(x->z); 1684 F=convSingPFactoryP(x->z,nacRing)/R; 1685 napNormalize(y->z); 1686 G=convSingPFactoryP(y->z,nacRing)/R; 1535 1687 F = gcd( F, G ); 1536 if (F.isOne()) 1688 if (F.isOne()) 1537 1689 result->z= rz; 1538 1690 else 1539 1691 { 1540 1692 p_Delete(&rz,nacRing); 1541 result->z=convFactoryPSingP( F*R, 1542 p_Normalize(result->z,nacRing);1693 result->z=convFactoryPSingP( F*R,nacRing ); 1694 napNormalize(result->z); 1543 1695 } 1544 1696 } … … 1550 1702 1551 1703 /*2 1552 * rPar(currRing)= 1:1704 * naNumbOfPar = 1: 1553 1705 * clears denominator algebraic case; 1554 1706 * tries to simplify ratio transcendental case; … … 1556 1708 * cancels monomials 1557 1709 * occuring in denominator 1558 * and enumerator ? rPar(currRing)!= 1;1710 * and enumerator ? naNumbOfPar != 1; 1559 1711 * 1560 */ 1712 * #defines for Factory: 1713 * FACTORY_GCD_TEST: do not apply built in gcd for 1714 * univariate polynomials, always use Factory 1715 */ 1716 //#define FACTORY_GCD_TEST 1561 1717 void naNormalize(number &pp) 1562 1718 { … … 1592 1748 while(x!=NULL) 1593 1749 { 1594 nacNormalize( napGetCoeff(x));1750 nacNormalize(pGetCoeff(x)); 1595 1751 pIter(x); 1596 1752 } … … 1602 1758 while(y!=NULL) 1603 1759 { 1604 nacNormalize( napGetCoeff(y));1760 nacNormalize(pGetCoeff(y)); 1605 1761 pIter(y); 1606 1762 } … … 1609 1765 /* collect all denoms from y and multiply x and y by it */ 1610 1766 number n=napLcm(y); 1611 x=p_Mult_nn(x,n,nacRing);p_Normalize(x,nacRing);1612 y=p_Mult_nn(y,n,nacRing);p_Normalize(y,nacRing);1613 n _Delete(&n,nacRing);1767 napMultN(x,n); 1768 napMultN(y,n); 1769 nacDelete(&n,nacRing); 1614 1770 while(x!=NULL) 1615 1771 { 1616 nacNormalize( napGetCoeff(x));1772 nacNormalize(pGetCoeff(x)); 1617 1773 pIter(x); 1618 1774 } … … 1620 1776 while(y!=NULL) 1621 1777 { 1622 nacNormalize( napGetCoeff(y));1778 nacNormalize(pGetCoeff(y)); 1623 1779 pIter(y); 1624 1780 } … … 1628 1784 { 1629 1785 int i; 1630 for (i= rPar(currRing)-1; i>=0; i--)1786 for (i=naNumbOfPar-1; i>=0; i--) 1631 1787 { 1632 1788 napoly xx=x; … … 1650 1806 if (napIsConstant(y)) /* i.e. => simplify to (1/c)*z / monom */ 1651 1807 { 1652 if (nacIsOne( napGetCoeff(y)))1808 if (nacIsOne(pGetCoeff(y))) 1653 1809 { 1654 1810 napDelete1(&y); … … 1657 1813 return; 1658 1814 } 1659 number h1 = nacInvers( napGetCoeff(y));1815 number h1 = nacInvers(pGetCoeff(y)); 1660 1816 nacNormalize(h1); 1661 x=p_Mult_nn(x,h1,nacRing);p_Normalize(x,nacRing);1662 n _Delete(&h1,nacRing);1817 napMultN(x, h1); 1818 nacDelete(&h1,nacRing); 1663 1819 napDelete1(&y); 1664 1820 p->n = NULL; … … 1666 1822 return; 1667 1823 } 1668 if (rPar(currRing) == 1) /* apply built-in gcd */ 1824 #ifndef FACTORY_GCD_TEST 1825 if (naNumbOfPar == 1) /* apply built-in gcd */ 1669 1826 { 1670 1827 napoly x1,y1; … … 1704 1861 { 1705 1862 number n=napLcm(y); 1706 x=p_Mult_nn(x,n,nacRing);p_Normalize(x,nacRing);1707 y=p_Mult_nn(y,n,nacRing);p_Normalize(y,nacRing);1708 n _Delete(&n,nacRing);1863 napMultN(x,n); 1864 napMultN(y,n); 1865 nacDelete(&n,nacRing); 1709 1866 while(x!=NULL) 1710 1867 { 1711 nacNormalize( napGetCoeff(x));1868 nacNormalize(pGetCoeff(x)); 1712 1869 pIter(x); 1713 1870 } … … 1715 1872 while(y!=NULL) 1716 1873 { 1717 nacNormalize( napGetCoeff(y));1874 nacNormalize(pGetCoeff(y)); 1718 1875 pIter(y); 1719 1876 } … … 1722 1879 if (pNext(y)==NULL) 1723 1880 { 1724 if (nacIsOne( napGetCoeff(y)))1881 if (nacIsOne(pGetCoeff(y))) 1725 1882 { 1726 1883 if (napGetExp(y,1)==0) … … 1734 1891 } 1735 1892 } 1893 #endif /* FACTORY_GCD_TEST */ 1736 1894 #ifdef HAVE_FACTORY 1895 #ifndef FACTORY_GCD_TEST 1737 1896 else 1897 #endif 1738 1898 { 1739 1899 napoly xx,yy; … … 1751 1911 x=p->z; 1752 1912 y=p->n; 1753 if(!nacGreaterZero( napGetCoeff(y)))1913 if(!nacGreaterZero(pGetCoeff(y))) 1754 1914 { 1755 1915 x=napNeg(x); 1756 1916 y=napNeg(y); 1757 1917 } 1758 number g=nacCopy( napGetCoeff(x));1918 number g=nacCopy(pGetCoeff(x)); 1759 1919 pIter(x); 1760 1920 while (x!=NULL) 1761 1921 { 1762 number d=nacGcd(g, napGetCoeff(x), nacRing);1922 number d=nacGcd(g,pGetCoeff(x), nacRing); 1763 1923 if(nacIsOne(d)) 1764 1924 { 1765 n _Delete(&g,nacRing);1766 n _Delete(&d,nacRing);1925 nacDelete(&g,nacRing); 1926 nacDelete(&d,nacRing); 1767 1927 naTest(pp); 1768 1928 return; 1769 1929 } 1770 n _Delete(&g,nacRing);1930 nacDelete(&g,nacRing); 1771 1931 g = d; 1772 1932 pIter(x); … … 1774 1934 while (y!=NULL) 1775 1935 { 1776 number d=nacGcd(g, napGetCoeff(y), nacRing);1936 number d=nacGcd(g,pGetCoeff(y), nacRing); 1777 1937 if(nacIsOne(d)) 1778 1938 { 1779 n _Delete(&g,nacRing);1780 n _Delete(&d,nacRing);1939 nacDelete(&g,nacRing); 1940 nacDelete(&d,nacRing); 1781 1941 naTest(pp); 1782 1942 return; 1783 1943 } 1784 n _Delete(&g,nacRing);1944 nacDelete(&g,nacRing); 1785 1945 g = d; 1786 1946 pIter(y); … … 1790 1950 while (x!=NULL) 1791 1951 { 1792 number d = nacIntDiv( napGetCoeff(x),g);1952 number d = nacIntDiv(pGetCoeff(x),g); 1793 1953 napSetCoeff(x,d); 1794 1954 pIter(x); … … 1796 1956 while (y!=NULL) 1797 1957 { 1798 number d = nacIntDiv( napGetCoeff(y),g);1958 number d = nacIntDiv(pGetCoeff(y),g); 1799 1959 napSetCoeff(y,d); 1800 1960 pIter(y); 1801 1961 } 1802 n _Delete(&g,nacRing);1962 nacDelete(&g,nacRing); 1803 1963 naTest(pp); 1804 1964 } … … 1830 1990 while (xx!=NULL) 1831 1991 { 1832 bt = nacGcd(t, napGetCoeff(xx), nacRing);1833 r = nacMult(t, napGetCoeff(xx));1834 n _Delete(&napGetCoeff(xx),nacRing);1835 napGetCoeff(xx) = nacDiv(r, bt);1836 nacNormalize( napGetCoeff(xx));1837 n _Delete(&bt,nacRing);1838 n _Delete(&r,nacRing);1992 bt = nacGcd(t, pGetCoeff(xx), nacRing); 1993 r = nacMult(t, pGetCoeff(xx)); 1994 nacDelete(&pGetCoeff(xx),nacRing); 1995 pGetCoeff(xx) = nacDiv(r, bt); 1996 nacNormalize(pGetCoeff(xx)); 1997 nacDelete(&bt,nacRing); 1998 nacDelete(&r,nacRing); 1839 1999 pIter(xx); 1840 2000 } 1841 2001 } 1842 n _Delete(&t,nacRing);2002 nacDelete(&t,nacRing); 1843 2003 result->z = x; 1844 2004 #ifdef HAVE_FACTORY … … 1885 2045 naI->liste[i]=napCopy(h->z); 1886 2046 /* If it isn't normalized (lc = 1) do this */ 1887 if (!nacIsOne( napGetCoeff(naI->liste[i])))2047 if (!nacIsOne(pGetCoeff(naI->liste[i]))) 1888 2048 { 1889 2049 x=naI->liste[i]; 1890 nacNormalize( napGetCoeff(x));1891 a=nacCopy( napGetCoeff(x));2050 nacNormalize(pGetCoeff(x)); 2051 a=nacCopy(pGetCoeff(x)); 1892 2052 number aa=nacInvers(a); 1893 n _Delete(&a,nacRing);1894 x=p_Mult_nn(x,aa,nacRing);p_Normalize(x,nacRing);1895 n _Delete(&aa,nacRing);2053 nacDelete(&a,nacRing); 2054 napMultN(x,aa); 2055 nacDelete(&aa,nacRing); 1896 2056 } 1897 2057 } … … 1910 2070 int i=(int)((long)c); 1911 2071 if (i>(naPrimeM>>2)) i-=naPrimeM; 1912 napGetCoeff(l->z)=nlInit(i);2072 pGetCoeff(l->z)=nlInit(i); 1913 2073 l->n=NULL; 1914 2074 return (number)l; … … 1924 2084 l->s=0; 1925 2085 l->z=(napoly)p_Init(nacRing); 1926 napGetCoeff(l->z)=nlCopy(c);2086 pGetCoeff(l->z)=nlCopy(c); 1927 2087 l->n=NULL; 1928 2088 return (number)l; … … 1938 2098 l->s=2; 1939 2099 l->z=(napoly)p_Init(nacRing); 1940 napGetCoeff(l->z)=c; /* omit npCopy, because npCopy is a no-op */2100 pGetCoeff(l->z)=c; /* omit npCopy, because npCopy is a no-op */ 1941 2101 l->n=NULL; 1942 2102 return (number)l; … … 1956 2116 l->s=2; 1957 2117 l->z=(napoly)p_Init(nacRing); 1958 napGetCoeff(l->z)=n;2118 pGetCoeff(l->z)=n; 1959 2119 l->n=NULL; 1960 2120 return (number)l; … … 1973 2133 l->s=2; 1974 2134 l->z=(napoly)p_Init(nacRing); 1975 napGetCoeff(l->z)=n;2135 pGetCoeff(l->z)=n; 1976 2136 l->n=NULL; 1977 2137 return (number)l; … … 1991 2151 napSetExp(a,i,napGetExpFrom(p,i,napMapRing)); 1992 2152 p_Setm(a,nacRing); 1993 napGetCoeff(w) = nacMap(napGetCoeff(p));2153 pGetCoeff(w) = nacMap(pGetCoeff(p)); 1994 2154 loop 1995 2155 { … … 2001 2161 napSetExp(a,i,napGetExpFrom(p,i,napMapRing)); 2002 2162 p_Setm(a,nacRing); 2003 napGetCoeff(a) = nacMap(napGetCoeff(p));2163 pGetCoeff(a) = nacMap(pGetCoeff(p)); 2004 2164 } 2005 2165 pNext(a) = NULL; … … 2028 2188 not_null=FALSE; 2029 2189 } 2030 napGetCoeff(w) = nMap(napGetCoeff(p));2190 pGetCoeff(w) = nMap(pGetCoeff(p)); 2031 2191 p_Setm(w,nacRing); 2032 2192 pIter(p); … … 2039 2199 } 2040 2200 /* else continue*/ 2041 n _Delete(&(napGetCoeff(w)),nacRing);2201 nacDelete(&(pGetCoeff(w)),nacRing); 2042 2202 } 2043 2203 else … … 2080 2240 if (napGetExp(erg->n,1) >= napGetExp(naMinimalPoly,1)) 2081 2241 erg->n = napRemainder(erg->n, naMinimalPoly); 2082 if ((napIsConstant(erg->n)) && nacIsOne( napGetCoeff(erg->n)))2242 if ((napIsConstant(erg->n)) && nacIsOne(pGetCoeff(erg->n))) 2083 2243 p_Delete(&(erg->n),nacRing); 2084 2244 } … … 2201 2361 pan=(lnumber)pGetCoeff(p); 2202 2362 pan->s=2; 2203 pan->z=napInitz(nMap( napGetCoeff(za)));2363 pan->z=napInitz(nMap(pGetCoeff(za))); 2204 2364 pa=pan->z; 2205 2365 } 2206 2366 else 2207 2367 { 2208 pGetCoeff(p)=nMap( napGetCoeff(za));2368 pGetCoeff(p)=nMap(pGetCoeff(za)); 2209 2369 } 2210 2370 for(i=0;i<P;i++) … … 2270 2430 { 2271 2431 lnumber rr=(lnumber)omAlloc0Bin(rnumber_bin); 2272 rr->z=nap_Copy( naGetDenom0(x),r);2432 rr->z=nap_Copy(x->n,r); 2273 2433 rr->s = 2; 2274 2434 return (number)rr; … … 2276 2436 return r->cf->nInit(1); 2277 2437 } 2278 number naGetNumerator(number &n, const ring r) 2438 2439 number naNumerator(number &n, const ring r) 2279 2440 { 2280 2441 if (r==currRing) naNormalize(n); 2281 2442 lnumber x=(lnumber)n; 2282 if (x!=NULL) 2283 { 2284 lnumber rr=(lnumber)omAlloc0Bin(rnumber_bin); 2285 rr->z=nap_Copy(naGetNom0(x),r); 2286 rr->s = 2; 2287 return (number)rr; 2288 } 2289 return NULL; 2443 lnumber rr=(lnumber)omAlloc0Bin(rnumber_bin); 2444 rr->z=nap_Copy(x->z,r); 2445 rr->s = 2; 2446 return (number)rr; 2290 2447 } 2291 2448 … … 2305 2462 while(p!=NULL) 2306 2463 { 2307 if ((naIsChar0 && nlIsZero( napGetCoeff(p)))2308 || ((!naIsChar0) && npIsZero( napGetCoeff(p))))2464 if ((naIsChar0 && nlIsZero(pGetCoeff(p))) 2465 || ((!naIsChar0) && npIsZero(pGetCoeff(p)))) 2309 2466 { 2310 2467 Print("coeff 0 in %s:%d\n",f,l); … … 2322 2479 // return FALSE; 2323 2480 //} 2324 if (naIsChar0 && !(nlDBTest( napGetCoeff(p),f,l)))2481 if (naIsChar0 && !(nlDBTest(pGetCoeff(p),f,l))) 2325 2482 return FALSE; 2326 2483 pIter(p); 2327 2484 } 2328 p = naGetDenom0(x);2485 p = x->n; 2329 2486 while(p!=NULL) 2330 2487 { 2331 if (naIsChar0 && !(nlDBTest( napGetCoeff(p),f,l)))2488 if (naIsChar0 && !(nlDBTest(pGetCoeff(p),f,l))) 2332 2489 return FALSE; 2333 2490 pIter(p); … … 2336 2493 } 2337 2494 #endif 2338 //------------------------------------------------------------------------- 2339 /// static: Normalize: case mipo==0, result: n->z, n->n integer 2340 static void naNormalize_0(number n) 2341 { 2342 lnumber p = (lnumber) n; 2343 napoly x = p->z; 2344 napoly y = p->n; 2345 if (nacRing->cf->nNormalize!=nDummy2) 2346 { 2347 /* collect all denoms from x and multiply x and y by it */ 2348 number n; 2349 if (y!=NULL) 2350 { 2351 n=napLcm(y); 2352 x=p_Mult_nn(x,n,nacRing); p_Normalize(x,nacRing); 2353 y=p_Mult_nn(y,n,nacRing); p_Normalize(y,nacRing); 2354 n_Delete(&n,nacRing); 2355 } 2356 /* collect all denoms from x and multiply x and y by it */ 2357 n=napLcm(y); 2358 x=p_Mult_nn(x,n,nacRing); 2359 if (y!=NULL) { y=p_Mult_nn(y,n,nacRing); n_Delete(&n,nacRing); } 2360 else y=p_NSet(n,nacRing); 2361 p->n=y; 2362 // normalize all coeffs in x 2363 p_Normalize(x,nacRing); 2364 // normalize all coeffs in y 2365 p_Normalize(y,nacRing); 2366 } 2367 } 2368 /// return la+li 2369 number naAdd(number la, number lb) /* lu := la+lb */ 2370 { 2371 napoly x, y; 2372 lnumber lu; 2373 lnumber a = (lnumber)la; 2374 lnumber b = (lnumber)lb; 2375 if (a==NULL) return naCopy(lb); 2376 if (b==NULL) return naCopy(la); 2377 omCheckAddrSize(a,sizeof(snumber)); 2378 omCheckAddrSize(b,sizeof(snumber)); 2379 lu = (lnumber)omAllocBin(rnumber_bin); 2380 if (b->n!=NULL) x = pp_Mult_qq(a->z, b->n, nacRing); 2381 else x = p_Copy(a->z,nacRing); 2382 if (a->n!=NULL) y = pp_Mult_qq(b->z, a->n,nacRing); 2383 else y = p_Copy(b->z,nacRing); 2384 lu->z = p_Add_q(x, y,nacRing); 2385 if (lu->z==NULL) 2386 { 2387 omFreeBin((ADDRESS)lu, rnumber_bin); 2388 return (number)NULL; 2389 } 2390 if (a->n!=NULL) 2391 { 2392 if (b->n!=NULL) x = pp_Mult_qq(a->n, b->n,nacRing); 2393 else x = p_Copy(a->n,nacRing); 2394 } 2395 else 2396 { 2397 if (b->n!=NULL) x = p_Copy(b->n,nacRing); 2398 else x = NULL; 2399 } 2400 lu->n = x; 2401 lu->s = FALSE; 2402 if (lu->n!=NULL) 2403 { 2404 number luu=(number)lu; 2405 naNormalize_0(luu); 2406 lu=(lnumber)luu; 2407 } 2408 naTest((number)lu); 2409 return (number)lu; 2410 } 2411 2412 /// return la -lb 2413 number naSub(number la, number lb) /* lu := la-lb */ 2414 { 2415 number llb=naCopy(lb); 2416 llb=naNeg(llb); 2417 number res=naAdd(la,llb); 2418 naDelete(&llb,currRing); 2419 return res; 2420 } 2495 -
kernel/longalg.h
r43c5718 rb3af93 4 4 * Computer Algebra System SINGULAR * 5 5 ****************************************/ 6 /* $Id: longalg.h,v 1.1 5 2009-08-14 17:14:30Singular Exp $ */6 /* $Id: longalg.h,v 1.16 2009-08-21 10:55:46 Singular Exp $ */ 7 7 /* 8 8 * ABSTRACT: algebraic numbers … … 80 80 #define napSetm(p) p_Setm(p,currRing->algring) 81 81 #define nanumber lnumber 82 #define naGetNom0(na) (((nanumber)(na))->z)83 #define naGetDenom0(na) (((nanumber)(na))->n)84 82 napoly napRemainder(napoly f, const napoly g); 85 83 void napWrite(napoly l,const BOOLEAN denom=TRUE);
Note: See TracChangeset
for help on using the changeset viewer.