- Timestamp:
- Jun 20, 2007, 11:39:25 AM (17 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- 07e8ae3b1877436cb95506c90d799438d558c703
- Parents:
- f7aaec31bd73e9e5b3b2bd84ee5ff4fab2de4691
- Location:
- kernel
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/kutil.cc
rf7aaec3 r1e579c6 2 2 * Computer Algebra System SINGULAR * 3 3 ****************************************/ 4 /* $Id: kutil.cc,v 1.5 8 2007-05-24 10:02:43 wienand Exp $ */4 /* $Id: kutil.cc,v 1.59 2007-06-20 09:39:23 wienand Exp $ */ 5 5 /* 6 6 * ABSTRACT: kernel: utils for kStd … … 1055 1055 pSetm(Lp.lcm); 1056 1056 assume(!strat->sugarCrit); 1057 if (pHasNotCF(p,strat->S[i]) && nIs One(nGcd(0, pGetCoeff(p), currRing)) && nIsOne(nGcd(0, pGetCoeff(strat->S[i]), currRing)))1057 if (pHasNotCF(p,strat->S[i]) && nIsUnit(pGetCoeff(p)) && nIsUnit(pGetCoeff(strat->S[i]))) 1058 1058 { 1059 1059 #ifdef KDEBUG … … 1245 1245 #endif 1246 1246 1247 voidenterOneStrongPoly (int i,poly p,int ecart, int isFromQ,kStrategy strat, int atR = -1)1248 { 1249 longd, s, t;1247 BOOLEAN enterOneStrongPoly (int i,poly p,int ecart, int isFromQ,kStrategy strat, int atR = -1) 1248 { 1249 number d, s, t; 1250 1250 assume(i<=strat->sl); 1251 1251 LObject Lp; 1252 1252 poly m1, m2, erg, gcd; 1253 1253 1254 XGCD(d, s, t, (long) pGetCoeff(p), (long) pGetCoeff(strat->S[i])); 1255 1254 d = nExtGcd(pGetCoeff(p), pGetCoeff(strat->S[i]), &s, &t); 1255 1256 if (nIsOne(d) || nIsZero(s) || nIsZero(t)) 1257 { 1258 nDelete(&d); 1259 nDelete(&s); 1260 nDelete(&t); 1261 return FALSE; 1262 } 1256 1263 1257 1264 k_GetStrongLeadTerms(p, strat->S[i], currRing, m1, m2, gcd, strat->tailRing); 1258 1265 1259 pSetCoeff0(m1, nInit(s));1260 pSetCoeff0(m2, nInit(t));1261 pSetCoeff0(gcd, nInit(d));1266 pSetCoeff0(m1, s); 1267 pSetCoeff0(m2, t); 1268 pSetCoeff0(gcd, d); 1262 1269 1263 1270 … … 1323 1330 enterL(&strat->L,&strat->Ll,&strat->Lmax,h,posx); 1324 1331 } 1332 return TRUE; 1325 1333 } 1326 1334 #endif … … 2600 2608 { 2601 2609 // Print("j:%d, Ll:%d\n",j,strat->Ll); 2602 if (((unsigned long) pGetCoeff(h) % (unsigned long) pGetCoeff(strat->S[j]) != 0) &&2603 ((unsigned long) pGetCoeff(strat->S[j]) % (unsigned long) pGetCoeff(h) != 0))2604 { 2605 new_pair=TRUE;2606 enterOneStrongPoly(j,h,ecart,isFromQ,strat, atR);2610 // if (((unsigned long) pGetCoeff(h) % (unsigned long) pGetCoeff(strat->S[j]) != 0) && 2611 // ((unsigned long) pGetCoeff(strat->S[j]) % (unsigned long) pGetCoeff(h) != 0)) 2612 { 2613 if (enterOneStrongPoly(j,h,ecart,isFromQ,strat, atR)) 2614 new_pair=TRUE; 2607 2615 } 2608 2616 } … … 2728 2736 assume (rField_is_Ring(currRing)); 2729 2737 // enter also zero divisor * poly, if this is non zero and of smaller degree 2730 enterExtendedSpoly(h, strat);2738 if (!(rField_is_Domain(currRing))) enterExtendedSpoly(h, strat); 2731 2739 initenterpairsRing(h, k, ecart, 0, strat, atR); 2732 2740 initenterstrongPairs(h, k, ecart, 0, strat, atR); -
kernel/numbers.cc
rf7aaec3 r1e579c6 2 2 * Computer Algebra System SINGULAR * 3 3 *****************************************/ 4 /* $Id: numbers.cc,v 1. 9 2007-05-11 10:48:04 wienand Exp $ */4 /* $Id: numbers.cc,v 1.10 2007-06-20 09:39:24 wienand Exp $ */ 5 5 6 6 /* … … 29 29 #include "rmodulon.h" 30 30 #endif 31 #ifdef HAVE_RINGZ 32 #include "rintegers.h" 33 #endif 31 34 32 35 //static int characteristic = 0; … … 49 52 BOOLEAN (*nDivBy)(number a,number b); 50 53 int (*nComp)(number a,number b); 54 BOOLEAN (*nIsUnit)(number a); 55 number (*nGetUnit)(number a); 56 number (*nExtGcd)(number a, number b, number *s, number *t); 51 57 #endif 52 58 BOOLEAN (*nGreater)(number a,number b); … … 107 113 BOOLEAN ndDivBy(number a, number b) { return TRUE; } 108 114 int ndComp(number a, number b) { return 0; } 115 BOOLEAN ndIsUnit(number a) { return TRUE; } 116 number ndGetUnit (number a) { return nCopy(a); } 117 number ndExtGcd (number a, number b, number *s, number *t) { return nInit(1); } 109 118 #endif 110 119 … … 127 136 { 128 137 nr2mSetExp(c, r); 138 } 139 #endif 140 #ifdef HAVE_RINGZ 141 /*----------------------ring Z / 2^m----------------*/ 142 else if (rField_is_Ring_Z(r)) 143 { 144 nrzSetExp(c, r); 129 145 } 130 146 #endif … … 185 201 nComp = r->cf->nComp; 186 202 nDivBy = r->cf->nDivBy; 203 nIsUnit = r->cf->nIsUnit; 204 nGetUnit = r->cf->nGetUnit; 205 nExtGcd = r->cf->nExtGcd; 187 206 #endif 188 207 nGreater = r->cf->nGreater; … … 267 286 n->nComp = ndComp; 268 287 n->nDivBy = ndDivBy; 288 n->nIsUnit = ndIsUnit; 289 n->nGetUnit = ndGetUnit; 290 n->nExtGcd = ndExtGcd; 269 291 #endif 270 292 if (rField_is_Extension(r)) … … 338 360 n->nLcm = nr2mLcm; 339 361 n->nGcd = nr2mGcd; 340 // n->nGetUnit = nr2mGetUnit; //TODO OLIVER 362 n->nIsUnit = nr2mIsUnit; 363 n->nGetUnit = nr2mGetUnit; 364 n->nExtGcd = nr2mExtGcd; 341 365 n->nName= ndName; 342 366 #ifdef LDEBUG … … 376 400 n->nLcm = nrnLcm; 377 401 n->nGcd = nrnGcd; 378 // n->nGetUnit = nrnGetUnit; //TODO OLIVER 402 n->nIsUnit = nrnIsUnit; 403 n->nGetUnit = nrnGetUnit; 404 n->nExtGcd = nrnExtGcd; 379 405 n->nName= ndName; 380 406 #ifdef LDEBUG 381 407 n->nDBTest=nrnDBTest; 408 #endif 409 } 410 #endif 411 #ifdef HAVE_RINGZ 412 /* -------------- Z ----------------------- */ 413 else if (rField_is_Ring_Z(r)) 414 { 415 n->nInit = nrzInit; 416 n->nCopy = ndCopy; 417 n->nInt = nrzInt; 418 n->nAdd = nrzAdd; 419 n->nSub = nrzSub; 420 n->nMult = nrzMult; 421 n->nDiv = nrzDiv; 422 n->nIntDiv = nrzIntDiv; 423 n->nExactDiv= nrzDiv; 424 n->nNeg = nrzNeg; 425 n->nInvers= nrzInvers; 426 n->nDivBy = nrzDivBy; 427 n->nComp = nrzComp; 428 n->nGreater = nrzGreater; 429 n->nEqual = nrzEqual; 430 n->nIsZero = nrzIsZero; 431 n->nIsOne = nrzIsOne; 432 n->nIsMOne = nrzIsMOne; 433 n->nGreaterZero = nrzGreaterZero; 434 n->nWrite = nrzWrite; 435 n->nRead = nrzRead; 436 n->nPower = nrzPower; 437 n->cfSetMap = nrzSetMap; 438 n->nNormalize = nDummy2; 439 n->nLcm = nrzLcm; 440 n->nGcd = nrzGcd; 441 n->nIsUnit = nrzIsUnit; 442 n->nGetUnit = nrzGetUnit; 443 n->nExtGcd = nrzExtGcd; 444 n->nName= ndName; 445 #ifdef LDEBUG 446 n->nDBTest=nrzDBTest; 382 447 #endif 383 448 } -
kernel/numbers.h
rf7aaec3 r1e579c6 4 4 * Computer Algebra System SINGULAR * 5 5 ****************************************/ 6 /* $Id: numbers.h,v 1. 8 2007-05-11 10:48:04 wienand Exp $ */6 /* $Id: numbers.h,v 1.9 2007-06-20 09:39:24 wienand Exp $ */ 7 7 /* 8 8 * ABSTRACT: interface to coefficient aritmetics … … 49 49 #ifdef HAVE_RINGS 50 50 extern int (*nComp)(number a,number b); 51 extern BOOLEAN (*nIsUnit)(number a); 52 extern number (*nGetUnit)(number a); 53 extern number (*nExtGcd)(number a, number b, number *s, number *t); 51 54 #endif 52 55 // always use in the form n=nNeg(n) ! -
kernel/polys.cc
rf7aaec3 r1e579c6 2 2 * Computer Algebra System SINGULAR * 3 3 ****************************************/ 4 /* $Id: polys.cc,v 1. 19 2007-05-23 07:47:30wienand Exp $ */4 /* $Id: polys.cc,v 1.20 2007-06-20 09:39:24 wienand Exp $ */ 5 5 6 6 /* … … 689 689 } 690 690 691 #ifdef HAVE_RINGS //HACK TODO Oliver692 number nGetUnit(number k) {693 number unit = nIntDiv(k, nGcd(k, 0, currRing));694 number gcd = nGcd(unit, 0, currRing);695 if (!nIsOne(gcd))696 {697 number tmp = nMult(unit, unit);698 number gcd_new = nGcd(tmp, 0, currRing);699 while (gcd_new != gcd)700 {701 gcd = gcd_new;702 tmp = nMult(tmp, unit);703 gcd_new = nGcd(tmp, 0, currRing);704 }705 unit = nAdd(unit, nIntDiv(0, gcd_new));706 }707 // Print("k = %d ; unit = %d ; gcd = %d", k, unit, gcd);708 return unit;709 }710 #endif711 712 691 /*2 713 692 *divides p1 by its leading coefficient … … 720 699 if (rField_is_Ring(currRing)) 721 700 { 722 if ( p1!=NULL)701 if ((p1!=NULL) && rField_has_Units(currRing)) 723 702 { 724 703 k = nGetUnit(pGetCoeff(p1)); … … 726 705 { 727 706 c = nDiv(pGetCoeff(p1), k); 707 nDelete(pGetCoeff(p1)); 728 708 pSetCoeff0(p1, c); 729 709 h = pNext(p1); … … 731 711 { 732 712 c = nDiv(pGetCoeff(h), k); 733 pSetCoeff(h, c); 713 nDelete(pGetCoeff(h)); 714 pSetCoeff0(h, c); 734 715 pIter(h); 735 716 } 736 nDelete(&k);737 }738 return;739 }717 } 718 nDelete(&k); 719 } 720 return; 740 721 } 741 722 else -
kernel/polys.h
rf7aaec3 r1e579c6 4 4 * Computer Algebra System SINGULAR * 5 5 ****************************************/ 6 /* $Id: polys.h,v 1.1 0 2007-05-11 10:48:05wienand Exp $ */6 /* $Id: polys.h,v 1.11 2007-06-20 09:39:24 wienand Exp $ */ 7 7 /* 8 8 * ABSTRACT - all basic methods to manipulate polynomials of the … … 256 256 */ 257 257 258 number nGetUnit(number k);258 // number nGetUnit(number k); 259 259 #endif 260 260 -
kernel/polys1.cc
rf7aaec3 r1e579c6 2 2 * Computer Algebra System SINGULAR * 3 3 ****************************************/ 4 /* $Id: polys1.cc,v 1.2 8 2007-05-23 07:47:30wienand Exp $ */4 /* $Id: polys1.cc,v 1.29 2007-06-20 09:39:24 wienand Exp $ */ 5 5 6 6 /* … … 483 483 #ifdef HAVE_RINGS 484 484 if (rField_is_Ring(currRing)) { 485 if ( ph!=NULL)485 if ((ph!=NULL) && rField_has_Units(currRing)) 486 486 { 487 487 number k = nGetUnit(pGetCoeff(ph)); -
kernel/ring.h
rf7aaec3 r1e579c6 7 7 * ABSTRACT - the interpreter related ring operations 8 8 */ 9 /* $Id: ring.h,v 1.2 1 2007-05-24 13:42:17 SingularExp $ */9 /* $Id: ring.h,v 1.22 2007-06-20 09:39:24 wienand Exp $ */ 10 10 11 11 /* includes */ … … 99 99 #endif 100 100 101 #ifdef HAVE_RINGPTOM 102 inline BOOLEAN rField_is_Ring_PtoM(ring r=currRing) 103 { return (r->ringtype == 3); } 104 #endif 105 106 #ifdef HAVE_RINGZ 107 inline BOOLEAN rField_is_Ring_Z(ring r=currRing) 108 { return (r->ringtype == 4); } 109 #endif 110 101 111 #ifdef HAVE_RINGS 102 112 inline BOOLEAN rField_is_Ring(ring r=currRing) … … 104 114 105 115 inline BOOLEAN rField_is_Domain(ring r=currRing) 106 { return (r->ringtype < 0); } 116 { return (r->ringtype == 4 || r->ringtype == 0); } 117 118 inline BOOLEAN rField_has_Units(ring r=currRing) 119 { return ((r->ringtype == 1) || (r->ringtype == 2) || (r->ringtype == 3)); } 107 120 #endif 108 121 -
kernel/ringgb.cc
rf7aaec3 r1e579c6 2 2 * Computer Algebra System SINGULAR * 3 3 ****************************************/ 4 /* $Id: ringgb.cc,v 1.1 5 2007-05-19 13:59:03wienand Exp $ */4 /* $Id: ringgb.cc,v 1.16 2007-06-20 09:39:25 wienand Exp $ */ 5 5 /* 6 6 * ABSTRACT: ringgb interface … … 256 256 } 257 257 } 258 Print(" Yes!\nzero-spoly --> 0?"); 259 for (i = 0; i < IDELEMS(GI); i++) 258 if (!(rField_is_Domain())) 260 259 { 261 f = plain_zero_spoly(GI->m[i]); 262 nf = ringNF(f, GI, currRing); 263 if (nf != NULL) { 264 Print("spoly("); 265 wrp(GI->m[i]); 266 Print(", "); 267 wrp(0); 268 Print(") = "); 269 wrp(h); 270 Print(" --> "); 271 wrp(nf); 272 PrintLn(); 273 return(0); 274 } 275 pDelete(&f); 276 pDelete(&nf); 277 Print("-"); 260 Print(" Yes!\nzero-spoly --> 0?"); 261 for (i = 0; i < IDELEMS(GI); i++) 262 { 263 f = plain_zero_spoly(GI->m[i]); 264 nf = ringNF(f, GI, currRing); 265 if (nf != NULL) { 266 Print("spoly("); 267 wrp(GI->m[i]); 268 Print(", "); 269 wrp(0); 270 Print(") = "); 271 wrp(h); 272 Print(" --> "); 273 wrp(nf); 274 PrintLn(); 275 return(0); 276 } 277 pDelete(&f); 278 pDelete(&nf); 279 Print("-"); 280 } 278 281 } 279 282 Print(" Yes!"); -
kernel/rintegers.cc
rf7aaec3 r1e579c6 2 2 * Computer Algebra System SINGULAR * 3 3 ****************************************/ 4 /* $Id: rintegers.cc,v 1. 1 2007-06-19 10:47:30wienand Exp $ */4 /* $Id: rintegers.cc,v 1.2 2007-06-20 09:39:25 wienand Exp $ */ 5 5 /* 6 6 * ABSTRACT: numbers modulo n … … 22 22 #ifdef HAVE_RINGZ 23 23 24 typedef MP_INT *int_number; 25 24 26 /* 25 27 * Multiply two numbers … … 27 29 number nrzMult (number a, number b) 28 30 { 29 mpz_t erg;30 mpz_init(erg); 31 mpz_mul(erg, ( mpz_t) &a, (mpz_t) &b);31 int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 32 mpz_init(erg); 33 mpz_mul(erg, (int_number) a, (int_number) b); 32 34 return (number) erg; 33 35 } … … 38 40 number nrzLcm (number a,number b,ring r) 39 41 { 40 mpz_t erg; 41 mpz_init(erg); 42 return (number) erg;//TODO 42 int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 43 mpz_init(erg); 44 mpz_lcm(erg, (int_number) a, (int_number) b); 45 return (number) erg; 43 46 } 44 47 … … 49 52 number nrzGcd (number a,number b,ring r) 50 53 { 51 mpz_t erg; 52 mpz_init(erg); 53 return (number) erg;//TODO 54 int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 55 mpz_init(erg); 56 mpz_gcd(erg, (int_number) a, (int_number) b); 57 return (number) erg; 58 } 59 60 /* 61 * Give the largest non unit k, such that a = x * k, b = y * k has 62 * a solution and r, s, s.t. k = s*a + t*b 63 */ 64 number nrzExtGcd (number a, number b, number *s, number *t) 65 { 66 int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 67 int_number bs = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 68 int_number bt = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 69 mpz_init(erg); 70 mpz_init(bs); 71 mpz_init(bt); 72 mpz_gcdext(erg, bs, bt, (int_number) a, (int_number) b); 73 *s = (number) bs; 74 *t = (number) bt; 75 return (number) erg; 54 76 } 55 77 56 78 void nrzPower (number a, int i, number * result) 57 79 { 58 mpz_t erg; 59 mpz_init(erg); 60 return (number) erg;/TODO 80 int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 81 mpz_init(erg); 82 mpz_pow_ui(erg, (int_number) a, i); 83 *result = (number) erg; 61 84 } 62 85 … … 66 89 number nrzInit (int i) 67 90 { 68 mpz_t erg;91 int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 69 92 mpz_init_set_si(erg, i); 70 93 return (number) erg; 71 94 } 72 95 96 void nrzDelete(number *a, const ring r) 97 { 98 mpz_clear((int_number) *a); 99 omFree((ADDRESS) *a); 100 } 101 73 102 /* 74 103 * convert a number to int (-p/2 .. p/2) … … 76 105 int nrzInt(number &n) 77 106 { 78 return (int) mpz_get_si( &n)107 return (int) mpz_get_si( (__mpz_struct*) &n); 79 108 } 80 109 81 110 number nrzAdd (number a, number b) 82 111 { 83 mpz_t erg;84 mpz_init(erg); 85 mpz_add(erg, ( mpz_t) a, (mpz_t) b);112 int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 113 mpz_init(erg); 114 mpz_add(erg, (int_number) a, (int_number) b); 86 115 return (number) erg; 87 116 } … … 89 118 number nrzSub (number a, number b) 90 119 { 91 mpz_t erg; 92 mpz_init(erg); 93 mpz_sub(erg, (mpz_t) a, (mpz_t) b); 94 return (number) erg; 120 int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 121 mpz_init(erg); 122 mpz_sub(erg, (int_number) a, (int_number) b); 123 return (number) erg; 124 } 125 126 number nrzGetUnit (number a) 127 { 128 int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 129 mpz_init_set_si(erg, 1); 130 return (number) erg; 131 } 132 133 BOOLEAN nrzIsUnit (number a) 134 { 135 return 0 == mpz_cmpabs_ui((int_number) a, 1); 95 136 } 96 137 97 138 BOOLEAN nrzIsZero (number a) 98 139 { 99 return 0 == mpz_cmpabs_ui(( mpz_t) a, 0);140 return 0 == mpz_cmpabs_ui((int_number) a, 0); 100 141 } 101 142 102 143 BOOLEAN nrzIsOne (number a) 103 144 { 104 return 0 == mpz_cmp_si(( mpz_t) a, 1);145 return 0 == mpz_cmp_si((int_number) a, 1); 105 146 } 106 147 107 148 BOOLEAN nrzEqual (number a,number b) 108 149 { 109 return 0 == mpz_cmp(( mpz_t) a, (mpz_t) b);150 return 0 == mpz_cmp((int_number) a, (int_number) b); 110 151 } 111 152 112 153 BOOLEAN nrzGreater (number a,number b) 113 154 { 114 return 0 < mpz_cmp(( mpz_t) a, (mpz_t) b);155 return 0 < mpz_cmp((int_number) a, (int_number) b); 115 156 } 116 157 117 158 int nrzComp(number a, number b) 118 159 { 119 return 2;//TODO 160 if (nrnEqual(a, b)) return 0; 161 if (nrnDivBy(a, b)) return -1; 162 if (nrnDivBy(b, a)) return 1; 163 return 2; 120 164 } 121 165 122 166 BOOLEAN nrzDivBy (number a,number b) 123 167 { 124 return FALSE;//TODO168 return mpz_divisible_p((int_number) a, (int_number) b) > 0;//TODO 125 169 } 126 170 127 171 BOOLEAN nrzGreaterZero (number k) 128 172 { 129 return 0 <= mpz_cmp_si((mpz_t) a, 0); 173 return 0 <= mpz_cmp_si((int_number) k, 0); 174 } 175 176 BOOLEAN nrzIsMOne (number a) 177 { 178 return 0 == mpz_cmp_si((int_number) a, 1); 130 179 } 131 180 132 181 number nrzDiv (number a,number b) 133 182 { 134 return (number)0; //TODO 183 int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 184 int_number r = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 185 mpz_init(erg); 186 mpz_tdiv_qr(erg, r, (int_number) a, (int_number) b); 187 if (!nrzIsZero((number) r)) 188 { 189 WarnS("Division by non divisible element."); 190 WarnS("Result is without remainder."); 191 } 192 mpz_clear(r); 193 omFree(r); 194 return (number) erg; 135 195 } 136 196 137 197 number nrzIntDiv (number a,number b) 138 198 { 139 return (number)0; //TODO 199 int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 200 mpz_init(erg); 201 mpz_tdiv_q(erg, (int_number) a, (int_number) b); 202 return (number) erg; 140 203 } 141 204 142 205 number nrzInvers (number c) 143 206 { 144 return (number)0; //TODO 207 if (!nrzIsUnit((number) c)) 208 { 209 WarnS("Non invertible element."); 210 return (number)0; //TODO 211 } 212 int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 213 mpz_init(erg); 214 mpz_set(erg, (int_number) c); 215 return (number) erg; 145 216 } 146 217 147 218 number nrzNeg (number c) 148 219 { 149 return (number)0; //TODO 220 int_number erg = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 221 mpz_init(erg); 222 mpz_mul_si(erg, (int_number) c, -1); 223 return (number) erg; 150 224 } 151 225 … … 177 251 void nrzWrite (number &a) 178 252 { 179 if ((NATNUMBER)a > (nrzModul >>1)) StringAppend("-%d",(int)(-((NATNUMBER)a))); 180 else StringAppend("%d",(int)((NATNUMBER)a)); 181 } 182 183 char* nrzEati(char *s, int *i) 184 { 185 186 if (((*s) >= '0') && ((*s) <= '9')) 187 { 188 (*i) = 0; 189 do 190 { 191 (*i) *= 10; 192 (*i) += *s++ - '0'; 193 if ((*i) >= (MAX_INT_VAL / 10)) (*i) = (*i) % nrzModul; 194 } 195 while (((*s) >= '0') && ((*s) <= '9')); 196 if ((*i) >= nrzModul) (*i) = (*i) % nrzModul; 197 } 198 else (*i) = 1; 253 char *s,*z; 254 if (a==NULL) 255 { 256 StringAppendS("o"); 257 } 258 else 259 { 260 int l=mpz_sizeinbase((int_number) a, 10); 261 if (a->s<2) l=si_max(l,mpz_sizeinbase((int_number) a,10)); 262 l+=2; 263 s=(char*)omAlloc(l); 264 z=mpz_get_str(s,10,(int_number) a); 265 StringAppendS(z); 266 omFreeSize((ADDRESS)s,l); 267 } 268 } 269 270 /*2 271 * extracts a long integer from s, returns the rest (COPY FROM longrat0.cc) 272 */ 273 char * nlEatLongC(char *s, MP_INT *i) 274 { 275 char * start=s; 276 277 while (*s >= '0' && *s <= '9') s++; 278 if (*s=='\0') 279 { 280 mpz_set_str(i,start,10); 281 } 282 else 283 { 284 char c=*s; 285 *s='\0'; 286 mpz_set_str(i,start,10); 287 *s=c; 288 } 199 289 return s; 200 290 } 201 291 202 char* nrzRead (char *s, number *a) 203 { 204 int z; 205 int n=1; 206 207 s = nrzEati(s, &z); 208 if ((*s) == '/') 209 { 210 s++; 211 s = nrzEati(s, &n); 212 } 213 if (n == 1) 214 *a = (number)z; 215 else 216 *a = nrzDiv((number)z,(number)n); 292 char * nrzRead (char *s, number *a) 293 { 294 int_number z = (int_number) omAlloc(sizeof(MP_INT)); // evtl. spaeter mit bin 295 { 296 mpz_init(z); 297 s = nlEatLongC(s, z); 298 } 299 *a = (number) z; 217 300 return s; 218 301 } -
kernel/rintegers.h
rf7aaec3 r1e579c6 4 4 * Computer Algebra System SINGULAR * 5 5 ****************************************/ 6 /* $Id: rintegers.h,v 1. 1 2007-06-19 10:47:30wienand Exp $ */6 /* $Id: rintegers.h,v 1.2 2007-06-20 09:39:25 wienand Exp $ */ 7 7 /* 8 8 * ABSTRACT: numbers modulo n … … 24 24 BOOLEAN nrzIsOne (number a); 25 25 BOOLEAN nrzIsMOne (number a); 26 BOOLEAN nrzIsUnit (number a); 27 number nrzGetUnit (number a); 26 28 number nrzDiv (number a, number b); 27 29 number nrzIntDiv (number a,number b); … … 34 36 number nrzLcm (number a,number b, ring r); 35 37 number nrzGcd (number a,number b,ring r); 38 number nrzExtGcd (number a, number b, number *s, number *t); 36 39 nMapFunc nrzSetMap (ring src, ring dst); 37 40 void nrzWrite (number &a); … … 43 46 void nrzSetExp(int c, ring r); 44 47 void nrzInitExp(int c, ring r); 48 void nrzDelete(number *a, const ring r); 45 49 46 50 #endif -
kernel/rmodulo2m.cc
rf7aaec3 r1e579c6 2 2 * Computer Algebra System SINGULAR * 3 3 ****************************************/ 4 /* $Id: rmodulo2m.cc,v 1.1 1 2007-05-23 07:47:31wienand Exp $ */4 /* $Id: rmodulo2m.cc,v 1.12 2007-06-20 09:39:25 wienand Exp $ */ 5 5 /* 6 6 * ABSTRACT: numbers modulo 2^m … … 80 80 } 81 81 82 /* 83 * Give the largest non unit k, such that a = x * k, b = y * k has 84 * a solution. 85 */ 86 number nr2mExtGcd (number a, number b, number *s, number *t) 87 { 88 NATNUMBER res = 0; 89 if ((NATNUMBER) a == 0 && (NATNUMBER) b == 0) return (number) 1; 90 while ((NATNUMBER) a % 2 == 0 && (NATNUMBER) b % 2 == 0) 91 { 92 a = (number) ((NATNUMBER) a / 2); 93 b = (number) ((NATNUMBER) b / 2); 94 res++; 95 } 96 if ((NATNUMBER) b % 2 == 0) 97 { 98 *t = NULL; 99 *s = nr2mInvers(a); 100 return (number) ((1L << res));// * (NATNUMBER) a); // (2**res)*a a ist Einheit 101 } 102 else 103 { 104 *s = NULL; 105 *t = nr2mInvers(b); 106 return (number) ((1L << res));// * (NATNUMBER) b); // (2**res)*b b ist Einheit 107 } 108 } 109 82 110 void nr2mPower (number a, int i, number * result) 83 111 { … … 126 154 { 127 155 return nr2mSubM(a,b); 156 } 157 158 BOOLEAN nr2mIsUnit (number a) 159 { 160 return ((NATNUMBER) a % 2 == 1); 161 } 162 163 number nr2mGetUnit (number k) 164 { 165 if (k == NULL) 166 return (number) 1; 167 NATNUMBER tmp = (NATNUMBER) k; 168 while (tmp % 2 == 0) 169 tmp = tmp / 2; 170 return (number) tmp; 128 171 } 129 172 … … 372 415 else 373 416 { 374 WarnS("nInit Charfailed");417 WarnS("nInitExp failed"); 375 418 } 376 419 } -
kernel/rmodulo2m.h
rf7aaec3 r1e579c6 4 4 * Computer Algebra System SINGULAR * 5 5 ****************************************/ 6 /* $Id: rmodulo2m.h,v 1. 6 2007-05-11 10:48:05 wienand Exp $ */6 /* $Id: rmodulo2m.h,v 1.7 2007-06-20 09:39:25 wienand Exp $ */ 7 7 /* 8 8 * ABSTRACT: numbers modulo 2^m … … 24 24 BOOLEAN nr2mIsOne (number a); 25 25 BOOLEAN nr2mIsMOne (number a); 26 BOOLEAN nr2mIsUnit (number a); 27 number nr2mGetUnit (number a); 26 28 number nr2mDiv (number a, number b); 27 29 number nr2mIntDiv (number a,number b); … … 34 36 number nr2mLcm (number a,number b, ring r); 35 37 number nr2mGcd (number a,number b,ring r); 38 number nr2mExtGcd (number a, number b, number *s, number *t); 36 39 nMapFunc nr2mSetMap (ring src, ring dst); 37 40 void nr2mWrite (number &a); -
kernel/rmodulon.cc
rf7aaec3 r1e579c6 2 2 * Computer Algebra System SINGULAR * 3 3 ****************************************/ 4 /* $Id: rmodulon.cc,v 1. 5 2007-05-23 07:47:31wienand Exp $ */4 /* $Id: rmodulon.cc,v 1.6 2007-06-20 09:39:25 wienand Exp $ */ 5 5 /* 6 6 * ABSTRACT: numbers modulo n … … 139 139 } 140 140 141 number nrnGetUnit (number k) 142 { 143 number unit = nrnIntDiv(k, nrnGcd(k, 0, currRing)); 144 number gcd = nrnGcd(unit, 0, currRing); 145 if (!nrnIsOne(gcd)) 146 { 147 number tmp = nrnMult(unit, unit); 148 number gcd_new = nrnGcd(tmp, 0, currRing); 149 while (gcd_new != gcd) 150 { 151 gcd = gcd_new; 152 tmp = nrnMult(tmp, unit); 153 gcd_new = nrnGcd(tmp, 0, currRing); 154 } 155 unit = nrnAdd(unit, nrnIntDiv(0, gcd_new)); 156 } 157 // Print("k = %d ; unit = %d ; gcd = %d", k, unit, gcd); 158 return unit; 159 } 160 141 161 BOOLEAN nrnIsZero (number a) 142 162 { … … 147 167 { 148 168 return 1 == (NATNUMBER)a; 169 } 170 171 BOOLEAN nrnIsUnit (number a) 172 { 173 return nrnIsOne(nrnGcd(0, a, currRing)); 149 174 } 150 175 … … 238 263 //#endif 239 264 265 /* 266 * Give the largest non unit k, such that a = x * k, b = y * k has 267 * a solution and r, s, s.t. k = s*a + t*b 268 */ 269 number nrnExtGcd (number a, number b, number *s, number *t) 270 { 271 long bs; 272 long bt; 273 long d; 274 XGCD(d, bs, bt, (long) a, (long) b); 275 *s = nrnInit(bs); 276 *t = nrnInit(bt); 277 return (number) d; 278 } 279 240 280 NATNUMBER InvModN(NATNUMBER a) 241 281 { -
kernel/rmodulon.h
rf7aaec3 r1e579c6 4 4 * Computer Algebra System SINGULAR * 5 5 ****************************************/ 6 /* $Id: rmodulon.h,v 1. 3 2007-05-11 10:48:05 wienand Exp $ */6 /* $Id: rmodulon.h,v 1.4 2007-06-20 09:39:25 wienand Exp $ */ 7 7 /* 8 8 * ABSTRACT: numbers modulo n … … 28 28 BOOLEAN nrnIsOne (number a); 29 29 BOOLEAN nrnIsMOne (number a); 30 BOOLEAN nrnIsUnit (number a); 31 number nrnGetUnit (number a); 30 32 number nrnDiv (number a, number b); 31 33 number nrnIntDiv (number a,number b); … … 38 40 number nrnLcm (number a,number b, ring r); 39 41 number nrnGcd (number a,number b,ring r); 42 number nrnExtGcd (number a, number b, number *s, number *t); 40 43 nMapFunc nrnSetMap (ring src, ring dst); 41 44 void nrnWrite (number &a); -
kernel/structs.h
rf7aaec3 r1e579c6 4 4 * Computer Algebra System SINGULAR * 5 5 ****************************************/ 6 /* $Id: structs.h,v 1.3 8 2007-05-11 10:48:05 wienand Exp $ */6 /* $Id: structs.h,v 1.39 2007-06-20 09:39:25 wienand Exp $ */ 7 7 /* 8 8 * ABSTRACT … … 273 273 #ifdef HAVE_RINGS 274 274 int (*nComp)(number a,number b); 275 BOOLEAN (*nIsUnit)(number a); 276 number (*nGetUnit)(number a); 277 number (*nExtGcd)(number a, number b, number *s, number *t); 275 278 #endif 276 279 number (*nNeg)(number a);
Note: See TracChangeset
for help on using the changeset viewer.