- Timestamp:
- Jul 11, 2014, 5:08:34 PM (10 years ago)
- Branches:
- (u'fieker-DuVal', '117eb8c30fc9e991c4decca4832b1d19036c4c65')(u'spielwiese', '38077648e7239f98078663eb941c3c979511150a')
- Children:
- 1234c77ed4ce613f813076f72fa15a303743e451312a931ca75e1ecf46c185282254d34874f9f4a4
- Parents:
- 653440a090c5b7f2086e19c2cadf27bb08f91644
- git-author:
- Hans Schoenemann <hannes@mathematik.uni-kl.de>2014-07-11 17:08:34+02:00
- git-committer:
- Hans Schoenemann <hannes@mathematik.uni-kl.de>2014-07-11 17:09:41+02:00
- Location:
- libpolys
- Files:
-
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
libpolys/coeffs/OPAE.cc
r653440 r6a1aa7 341 341 r->cfName = nAEName; 342 342 r->cfInpMult=nAEInpMult; //???? 343 r->cfInit_bigint= NULL; // nAEMap0;344 343 r->cfCoeffWrite=nAECoeffWrite; //???? 345 344 -
libpolys/coeffs/OPAEQ.cc
r653440 r6a1aa7 334 334 r->cfName = nAEQName; 335 335 r->cfInpMult=nAEQInpMult; //???? 336 r->cfInit_bigint= NULL; // nAEQMap0;337 336 r->cfCoeffWrite=nAEQCoeffWrite; //???? 338 337 -
libpolys/coeffs/OPAEp.cc
r653440 r6a1aa7 363 363 r->cfName = nAEpName; 364 364 r->cfInpMult=nAEpInpMult; //???? 365 r->cfInit_bigint= NULL; // nAEpMap0;366 365 r->cfCoeffWrite=nAEpCoeffWrite; //???? 367 366 -
libpolys/coeffs/coeffs.h
r653440 r6a1aa7 91 91 } LongComplexInfo; 92 92 93 94 enum n_coeffRep 95 { 96 n_rep_unknown=0, 97 n_rep_int, /**< (int), see modulop.h */ 98 n_rep_gap_rat, /**< (number), see longrat.h */ 99 n_rep_gap_gmp, /**< (), see rinteger.h, new impl. */ 100 n_rep_poly, /**< (poly), see algext.h */ 101 n_rep_rat_fct, /**< (fraction), see transext.h */ 102 n_rep_gmp, /**< (mpz_ptr), see rmodulon,h */ 103 n_rep_float, /**< (float), see shortfl.h */ 104 n_rep_gmp_float, /**< (gmp_float), see */ 105 n_rep_gmp_complex,/**< (gmp_complex), see gnumpc.h */ 106 n_rep_gf /**< (int), see ffields.h */ 107 }; 108 93 109 struct n_Procs_s 94 110 { … … 96 112 coeffs next; 97 113 int ref; 114 n_coeffRep rep; 98 115 n_coeffType type; 99 116 /// how many variables of factory are already used by this coeff … … 251 268 /// Inplace: a += b 252 269 void (*cfInpAdd)(number &a, number b, const coeffs r); 253 254 /// maps the bigint i (from dummy == coeffs_BIGINT!!!) into the255 /// coeffs dst256 /// TODO: to be exchanged with a map!!!257 number (*cfInit_bigint)(number i, const coeffs dummy, const coeffs dst);258 270 259 271 /// rational reconstruction: "best" rational a/b with a/b = p mod n … … 768 780 } 769 781 770 static inline number n_Init_bigint(number i, const coeffs dummy,771 const coeffs dst)772 {773 assume(dummy != NULL && dst != NULL); assume(dst->cfInit_bigint!=NULL);774 return dst->cfInit_bigint(i, dummy, dst);775 }776 777 782 static inline number n_RePart(number i, const coeffs cf) 778 783 { -
libpolys/coeffs/ffields.cc
r653440 r6a1aa7 798 798 } 799 799 } 800 if ( nCoeff_is_Zp(src,dst->m_nfCharP))800 if ((src->rep==n_rep_int) && nCoeff_is_Zp(src,dst->m_nfCharP)) 801 801 { 802 802 return nfMapP; /* Z/p -> GF(p,n) */ 803 803 } 804 if (src->rep==n_rep_gap_rat) /*Q, Z */ 805 return nlModP; 804 806 return NULL; /* default */ 805 807 } … … 832 834 r->is_field=TRUE; 833 835 r->is_domain=TRUE; 836 r->rep=n_rep_gf; 834 837 //r->cfInitChar=npInitChar; 835 838 r->cfKillChar=nfKillChar; … … 860 863 861 864 r->cfWriteLong = nfWriteLong; 862 r->cfInit_bigint = nlModP;863 865 r->cfRead = nfRead; 864 866 //r->cfNormalize=ndNormalize; -
libpolys/coeffs/gnumpc.cc
r653440 r6a1aa7 475 475 n->is_field=TRUE; 476 476 n->is_domain=TRUE; 477 n->rep=n_rep_gmp_complex; 477 478 478 479 n->cfKillChar = ngcKillChar; … … 516 517 517 518 n->cfSetChar=ngcSetChar; 518 519 n->cfInit_bigint=ngcMapQ;520 519 521 520 // we need to initialize n->nNULL at least for minpoly printing … … 624 623 { 625 624 assume( getCoeffType(r) == ID ); 626 assume( getCoeffType(aRing) == n_Q);625 assume( aRing->rep == n_rep_gap_rat); 627 626 628 627 if ( from != NULL ) … … 635 634 } 636 635 636 number ngcMapZ(number from, const coeffs aRing, const coeffs r) 637 { 638 assume( getCoeffType(r) == ID ); 639 assume( aRing->rep == n_rep_gap_gmp); 640 641 if ( from != NULL ) 642 { 643 if (SR_HDL(from) & SR_INT) 644 { 645 gmp_float f_i= gmp_float(SR_TO_INT(from)); 646 gmp_complex *res=new gmp_complex(f_i); 647 return (number)res; 648 } 649 gmp_float f_i=(mpz_ptr)from; 650 gmp_complex *res=new gmp_complex(f_i); 651 return (number)res; 652 } 653 else 654 return NULL; 655 } 656 637 657 static number ngcMapLongR(number from, const coeffs aRing, const coeffs r) 638 658 { … … 692 712 assume( getCoeffType(dst) == ID ); 693 713 694 if ( nCoeff_is_Q(src))714 if (src->rep==n_rep_gap_rat) /* Q, Z*/ 695 715 { 696 716 return ngcMapQ; 697 717 } 698 if (nCoeff_is_long_R(src)) 718 if (src->rep==n_rep_gap_gmp) /* Z */ 719 { 720 return ngcMapZ; 721 } 722 if ((src->rep==n_rep_gmp_float) && nCoeff_is_long_R(src)) 699 723 { 700 724 return ngcMapLongR; 701 725 } 702 if ( nCoeff_is_long_C(src))726 if ((src->rep==n_rep_gmp_complex) && nCoeff_is_long_C(src)) 703 727 { 704 728 return ngcCopyMap; 705 729 } 706 if ( nCoeff_is_R(src))730 if ((src->rep==n_rep_float) && nCoeff_is_R(src)) 707 731 { 708 732 return ngcMapR; 709 733 } 710 if ( nCoeff_is_Zp(src))734 if ((src->rep==n_rep_int) && nCoeff_is_Zp(src)) 711 735 { 712 736 return ngcMapP; -
libpolys/coeffs/gnumpfl.cc
r653440 r6a1aa7 413 413 n->is_field=TRUE; 414 414 n->is_domain=TRUE; 415 n->rep=n_rep_gmp_float; 415 416 416 417 n->cfKillChar = ndKillChar; /* dummy */ … … 443 444 n->cfSetMap = ngfSetMap; 444 445 n->cfCoeffWrite = ngfCoeffWrite; 445 n->cfInit_bigint = ngfMapQ;446 446 #ifdef LDEBUG 447 447 n->cfDBTest = ndDBTest; // not yet implemented: ngfDBTest … … 474 474 { 475 475 assume( getCoeffType(dst) == ID ); 476 assume( getCoeffType(src) == n_Q);476 assume( src->rep == n_rep_gap_rat ); 477 477 478 478 gmp_float *res=new gmp_float(numberFieldToFloat(from,QTOF,dst)); 479 479 return (number)res; 480 480 } 481 number ngfMapZ(number from, const coeffs aRing, const coeffs r) 482 { 483 assume( getCoeffType(r) == ID ); 484 assume( aRing->rep == n_rep_gap_gmp); 485 486 if ( from != NULL ) 487 { 488 if (SR_HDL(from) & SR_INT) 489 { 490 gmp_float f_i= gmp_float(SR_TO_INT(from)); 491 gmp_float *res=new gmp_float(f_i); 492 return (number)res; 493 } 494 gmp_float f_i=(mpz_ptr)from; 495 gmp_float *res=new gmp_float(f_i); 496 return (number)res; 497 } 498 else 499 return NULL; 500 } 501 481 502 482 503 static number ngfMapR(number from, const coeffs src, const coeffs dst) … … 510 531 assume( getCoeffType(dst) == ID ); 511 532 512 if ( nCoeff_is_Q(src))533 if (src->rep==n_rep_gap_rat) /*Q, Z*/ 513 534 { 514 535 return ngfMapQ; 515 536 } 516 if (nCoeff_is_long_R(src)) 537 if (src->rep==n_rep_gap_gmp) /*Q, Z*/ 538 { 539 return ngfMapZ; 540 } 541 if ((src->rep==n_rep_gmp_float) && nCoeff_is_long_R(src)) 517 542 { 518 543 return ndCopyMap; //ngfCopyMap; 519 544 } 520 if ( nCoeff_is_R(src))545 if ((src->rep==n_rep_float) && nCoeff_is_R(src)) 521 546 { 522 547 return ngfMapR; 523 548 } 524 if ( nCoeff_is_long_C(src))549 if ((src->rep==n_rep_gmp_complex) && nCoeff_is_long_C(src)) 525 550 { 526 551 return ngfMapC; 527 552 } 528 if ( nCoeff_is_Zp(src))553 if ((src->rep==n_rep_int) && nCoeff_is_Zp(src)) 529 554 { 530 555 return ngfMapP; … … 532 557 return NULL; 533 558 } 534 535 559 536 560 void ngfCoeffWrite (const coeffs r, BOOLEAN /*details*/) -
libpolys/coeffs/longrat.cc
r653440 r6a1aa7 144 144 z=nlShort3(z); 145 145 return z; 146 } 147 148 number nlMapZ(number from, const coeffs src, const coeffs dst) 149 { 150 if (SR_HDL(from) & SR_INT) 151 { 152 return from; 153 } 154 return nlMapGMP(from,src,dst); 146 155 } 147 156 … … 1288 1297 } 1289 1298 1290 // Map q \in QQ \to Zp1291 // src = Q , dst = Zp (or an extension of Zp?)1299 // Map q \in QQ or ZZ \to Zp or an extension of it 1300 // src = Q or Z, dst = Zp (or an extension of Zp) 1292 1301 number nlModP(number q, const coeffs Q, const coeffs Zp) 1293 1302 { … … 2168 2177 nMapFunc nlSetMap(const coeffs src, const coeffs dst) 2169 2178 { 2170 if ( getCoeffType(src)==n_Q /*nCoeff_is_Q(src) or coeffs_BIGINT*/)2179 if (src->rep==n_rep_gap_rat) /*Q, coeffs_BIGINT */ 2171 2180 { 2172 2181 return ndCopyMap; 2173 2182 } 2174 if ( nCoeff_is_Zp(src))2183 if ((src->rep==n_rep_int) && nCoeff_is_Zp(src)) 2175 2184 { 2176 2185 return nlMapP; 2177 2186 } 2178 if ( nCoeff_is_R(src))2187 if ((src->rep==n_rep_float) && nCoeff_is_R(src)) 2179 2188 { 2180 2189 return nlMapR; 2181 2190 } 2182 if ( nCoeff_is_long_R(src))2191 if ((src->rep==n_rep_gmp_float) && nCoeff_is_long_R(src)) 2183 2192 { 2184 2193 return nlMapLongR; /* long R -> Q */ 2185 2194 } 2186 2195 #ifdef HAVE_RINGS 2187 if ( nCoeff_is_Ring_Z(src) || nCoeff_is_Ring_PtoM(src) || nCoeff_is_Ring_ModN(src))2196 if (src->rep==n_rep_gmp) // nCoeff_is_Ring_Z(src) || nCoeff_is_Ring_PtoM(src) || nCoeff_is_Ring_ModN(src)) 2188 2197 { 2189 2198 return nlMapGMP; 2190 2199 } 2191 if (nCoeff_is_Ring_2toM(src)) 2200 if (src->rep==n_rep_gap_gmp) 2201 { 2202 return nlMapZ; 2203 } 2204 if ((src->rep==n_rep_int) && nCoeff_is_Ring_2toM(src)) 2192 2205 { 2193 2206 return nlMapMachineInt; … … 3020 3033 { 3021 3034 r->is_domain=TRUE; 3035 r->rep=n_rep_gap_rat; 3022 3036 3023 3037 //const int ch = (int)(long)(p); … … 3083 3097 r->cfInpMult=nlInpMult; 3084 3098 r->cfInpAdd=nlInpAdd; 3085 r->cfInit_bigint=nlCopyMap;3086 3099 r->cfCoeffWrite=nlCoeffWrite; 3087 3100 -
libpolys/coeffs/modulop.cc
r653440 r6a1aa7 457 457 r->is_field=TRUE; 458 458 r->is_domain=TRUE; 459 r->rep=n_rep_int; 459 460 460 461 r->ch = c; … … 503 504 //r->cfName = ndName; 504 505 r->cfInpMult=ndInpMult; 505 r->cfInit_bigint= nlModP; // npMap0;506 506 #ifdef NV_OPS 507 507 if (c>NV_MAX_PRIME) … … 690 690 } 691 691 692 number npMapZ(number from, const coeffs src, const coeffs dst) 693 { 694 if (SR_HDL(from) & SR_INT) 695 { 696 long f_i=SR_TO_INT(from); 697 return npInit(f_i,dst); 698 } 699 return npMapGMP(from,src,dst); 700 } 701 692 702 /*2 693 703 * convert from an machine long … … 710 720 { 711 721 #ifdef HAVE_RINGS 712 if ( nCoeff_is_Ring_2toM(src))722 if ((src->rep==n_rep_int) && nCoeff_is_Ring_2toM(src)) 713 723 { 714 724 return npMapMachineInt; 715 725 } 716 if ( nCoeff_is_Ring_Z(src) || nCoeff_is_Ring_PtoM(src) || nCoeff_is_Ring_ModN(src))726 if (src->rep==n_rep_gmp) //nCoeff_is_Ring_Z(src) || nCoeff_is_Ring_PtoM(src) || nCoeff_is_Ring_ModN(src)) 717 727 { 718 728 return npMapGMP; 719 729 } 720 #endif 721 if (nCoeff_is_Q(src)) 730 if (src->rep==n_rep_gap_gmp) //nCoeff_is_Ring_Z(src) 731 { 732 return npMapZ; 733 } 734 #endif 735 if (src->rep==n_rep_gap_rat) /* Q, Z */ 722 736 { 723 737 return nlModP; // npMap0; 724 738 } 725 if ( nCoeff_is_Zp(src) )739 if ((src->rep==n_rep_int) && nCoeff_is_Zp(src) ) 726 740 { 727 741 if (n_GetChar(src) == n_GetChar(dst)) … … 734 748 } 735 749 } 736 if ( nCoeff_is_long_R(src))750 if ((src->rep==n_rep_gmp_float) && nCoeff_is_long_R(src)) 737 751 { 738 752 return npMapLongR; -
libpolys/coeffs/mpr_complex.cc
r653440 r6a1aa7 444 444 if (SR_HDL(num) & SR_INT) 445 445 { 446 int nn = SR_TO_INT(num); 447 if((long)nn == SR_TO_INT(num)) 448 r = SR_TO_INT(num); 449 else 450 r = gmp_float(SR_TO_INT(num)); 446 r = gmp_float(SR_TO_INT(num)); 451 447 } 452 448 else … … 458 454 if (SR_HDL(num) & SR_INT) 459 455 { 460 int nn = SR_TO_INT(num); 461 if((long)nn == SR_TO_INT(num)) 462 r = SR_TO_INT(num); 463 else 464 r = gmp_float(SR_TO_INT(num)); 456 r = gmp_float(SR_TO_INT(num)); 465 457 } 466 458 else -
libpolys/coeffs/numbers.cc
r653440 r6a1aa7 79 79 number ndFarey(number,number,const coeffs r) 80 80 { 81 Werror("farey not implemented for (c=%d)",getCoeffType(r));81 Werror("farey not implemented for %s (c=%d)",r->cfCoeffString(r),getCoeffType(r)); 82 82 return NULL; 83 83 } 84 84 number ndChineseRemainder(number *,number *,int,BOOLEAN,const coeffs r) 85 85 { 86 Werror("ChineseRemainder not implemented for (c=%d)",getCoeffType(r));86 Werror("ChineseRemainder not implemented for %s (c=%d)",r->cfCoeffString(r),getCoeffType(r)); 87 87 return n_Init(0,r); 88 88 } … … 243 243 { 244 244 Werror("no conversion from factory"); 245 return NULL;246 }247 248 number ndInit_bigint(number, const coeffs, const coeffs)249 {250 Werror("no conversion from bigint to this field");251 245 return NULL; 252 246 } … … 338 332 n->cfGcd = ndGcd; 339 333 n->cfLcm = ndGcd; /* tricky, isn't it ?*/ 340 n->cfInit_bigint = ndInit_bigint;341 334 n->cfInitMPZ = ndInitMPZ; 342 335 n->cfMPZ = ndMPZ; -
libpolys/coeffs/rintegers.cc
r653440 r6a1aa7 3 3 ****************************************/ 4 4 /* 5 * ABSTRACT: numbers modulo n5 * ABSTRACT: numbers (integers) 6 6 */ 7 7 … … 29 29 omBin gmp_nrz_bin = omGetSpecBin(sizeof(mpz_t)); 30 30 31 #if SI_INTEGER_VARIANT == 2 31 32 /* 32 33 * Multiply two numbers … … 214 215 mpz_init(r); 215 216 mpz_tdiv_qr(erg, r, (int_number) a, (int_number) b); 216 if (!nrzIsZero((number) r, R))217 {218 WerrorS("Division by non divisible element.");219 WerrorS("Result is without remainder.");220 }217 //if (!nrzIsZero((number) r, R)) 218 //{ 219 // WerrorS("Division by non divisible element."); 220 // WerrorS("Result is without remainder."); 221 //} 221 222 mpz_clear(r); 222 223 omFreeBin(r, gmp_nrz_bin); … … 408 409 r->is_field=FALSE; 409 410 r->is_domain=TRUE; 411 r->rep=n_rep_gmp; 410 412 411 413 r->nCoeffIsEqual = ndCoeffIsEqual; … … 427 429 r->cfExtGcd = nrzExtGcd; // only for ring stuff 428 430 r->cfDivBy = nrzDivBy; // only for ring stuff 429 r->cfInit_bigint = nrzMapQ;430 431 //#endif 431 432 r->cfInpNeg = nrzNeg; … … 460 461 } 461 462 462 #endif 463 #elif SI_INTEGER_VARIANT == 3 464 465 //make sure that a small number is an immediate integer 466 //bascially coped from longrat.cc nlShort3 467 //TODO: is there any point in checking 0 first??? 468 //TODO: it is not clear that this works in 32/64 bit everywhere. 469 // too many hacks. 470 #ifdef LDEBUG 471 #define nrzTest(A) nrzDBTest(A,__FILE__,__LINE__,NULL) 472 BOOLEAN nrzDBTest (number x, const char *f, const int l, const coeffs); 473 #else 474 #define nrzTest(A) 475 #endif 476 477 #define CF_DEBUG 0 478 static inline number nrz_short(number x) 479 { 480 #if CF_DEBUG 481 StringAppendS("short("); 482 nrzWrite(x, NULL); 483 #endif 484 if (mpz_cmp_ui((int_number) x,(long)0)==0) 485 { 486 mpz_clear((int_number)x); 487 omFreeBin(x, gmp_nrz_bin); 488 #if CF_DEBUG 489 StringAppendS(")=0"); 490 #endif 491 return INT_TO_SR(0); 492 } 493 if (mpz_size1((int_number)x)<=MP_SMALL) 494 { 495 int ui=mpz_get_si((int_number)x); 496 if ((((ui<<3)>>3)==ui) 497 && (mpz_cmp_si((int_number)x,(long)ui)==0)) 498 { 499 mpz_clear((int_number)x); 500 omFreeBin(x, gmp_nrz_bin); 501 #if CF_DEBUG 502 StringAppendS(")=imm"); 503 #endif 504 return INT_TO_SR(ui); 505 } 506 } 507 #if CF_DEBUG 508 StringAppendS(")"); 509 #endif 510 return x; 511 } 512 513 514 515 516 /* 517 * Multiply two numbers 518 * check for 0, 1, -1 maybe 519 */ 520 #if CF_DEBUG 521 number _nrzMult(number, number, const coeffs); 522 number nrzMult(number a, number b, const coeffs R) 523 { 524 StringSetS("Mult: "); 525 nrzWrite(a, R); 526 StringAppendS(" by "); 527 nrzWrite(b, R); 528 number c = _nrzMult(a, b, R); 529 StringAppendS(" is "); 530 nrzWrite(c, R); 531 char * s = StringEndS(); 532 Print("%s\n", s); 533 omFree(s); 534 return c; 535 } 536 number _nrzMult (number a, number b, const coeffs R) 537 #else 538 number nrzMult (number a, number b, const coeffs R) 539 #endif 540 { 541 if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b)) { 542 //from longrat.cc 543 if (SR_TO_INT(a)==0) 544 return a; 545 if (SR_TO_INT(b)==0) 546 return b; 547 long r=(long)((unsigned long)(SR_HDL(a)-1L))*((unsigned long)(SR_HDL(b)>>1)); 548 if ((r/(SR_HDL(b)>>1))==(SR_HDL(a)-1L)) 549 { 550 number u=((number) ((r>>1)+SR_INT)); 551 // if (((((long)SR_HDL(u))<<1)>>1)==SR_HDL(u)) return (u); 552 return nrzInit(SR_HDL(u)>>2, R); 553 } 554 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 555 mpz_init(erg); 556 mpz_set_si(erg, SR_TO_INT(a)); 557 mpz_mul_si(erg, erg, SR_TO_INT(b)); 558 nrzTest((number)erg); 559 return (number) erg; 560 } 561 else if (n_Z_IS_SMALL(a)) 562 { 563 if (SR_TO_INT(a)==0) 564 return a; 565 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 566 mpz_init_set(erg, (int_number) b); 567 mpz_mul_si(erg, erg, SR_TO_INT(a)); 568 nrzTest((number)erg); 569 return (number) erg; 570 } 571 else if (n_Z_IS_SMALL(b)) 572 { 573 if (SR_TO_INT(b)==0) 574 return b; 575 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 576 mpz_init_set(erg, (int_number) a); 577 mpz_mul_si(erg, erg, SR_TO_INT(b)); 578 nrzTest((number)erg); 579 return (number) erg; 580 } 581 else 582 { 583 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 584 mpz_init(erg); 585 mpz_mul(erg, (int_number) a, (int_number) b); 586 nrzTest((number)erg); 587 return (number) erg; 588 } 589 } 590 591 592 static int int_gcd(int a, int b) 593 { 594 int r; 595 a = ABS(a); 596 b = ABS(b); 597 if (!a) return b; 598 if (!b) return a; 599 do 600 { 601 r = a % b; 602 a = b; 603 b = r; 604 } while (b); 605 return ABS(a); // % in c doeas not imply a signn 606 // it would be unlikely to see a negative here 607 // but who knows 608 } 609 610 /* 611 * Give the smallest non unit k, such that a * x = k = b * y has a solution 612 */ 613 number nrzLcm (number a, number b, const coeffs R) 614 { 615 PrintS("nrzLcm\n"); 616 int_number erg; 617 if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b)) 618 { 619 int g = int_gcd(SR_TO_INT(a), SR_TO_INT(b)); 620 return nrzMult(a, INT_TO_SR(SR_TO_INT(b)/g), R); 621 } 622 else if (n_Z_IS_SMALL(a)) 623 { 624 erg = (int_number) omAllocBin(gmp_nrz_bin); 625 mpz_init_set(erg, (int_number) b); 626 unsigned long g = mpz_gcd_ui(NULL, erg, (unsigned long) ABS(SR_TO_INT(a))); 627 mpz_mul_si(erg, erg, SR_TO_INT(a)/g); 628 } 629 else if (n_Z_IS_SMALL(b)) 630 { 631 erg = (int_number) omAllocBin(gmp_nrz_bin); 632 mpz_init_set(erg, (int_number) a); 633 unsigned long g = mpz_gcd_ui(NULL, erg, (unsigned long) ABS(SR_TO_INT(b))); 634 mpz_mul_si(erg, erg, SR_TO_INT(b)/g); 635 } 636 else 637 { 638 erg = (int_number) omAllocBin(gmp_nrz_bin); 639 mpz_init(erg); 640 mpz_lcm(erg, (int_number) a, (int_number) b); 641 } 642 return (number) erg; 643 } 644 645 /* 646 * Give the largest non unit k, such that a = x * k, b = y * k has 647 * a solution. 648 */ 649 number nrzGcd (number a,number b,const coeffs R) 650 { 651 if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b)) 652 { 653 int g = int_gcd(SR_TO_INT(a), SR_TO_INT(b)); 654 return INT_TO_SR(g); 655 } 656 else if (n_Z_IS_SMALL(a)) 657 { 658 if (a==INT_TO_SR(0)) 659 return nrzCopy(b, R); 660 unsigned long g = mpz_gcd_ui(NULL, (int_number)b, (unsigned long) ABS(SR_TO_INT(a))); 661 return INT_TO_SR( g); 662 } 663 else if (n_Z_IS_SMALL(b)) 664 { 665 if (b==INT_TO_SR(0)) 666 return nrzCopy(a, R); 667 unsigned long g = mpz_gcd_ui(NULL, (int_number)a, (unsigned long) ABS(SR_TO_INT(b))); 668 return INT_TO_SR(g); 669 } 670 else 671 { 672 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 673 mpz_init(erg); 674 mpz_gcd(erg, (int_number) a, (int_number) b); 675 return (number) erg; 676 } 677 } 678 679 /* 680 * Give the largest non unit k, such that a = x * k, b = y * k has 681 * a solution and r, s, s.t. k = s*a + t*b 682 */ 683 static int int_extgcd(int a, int b, int * u, int* x, int * v, int* y) 684 { 685 int q, r; 686 if (!a) 687 { 688 *u = 0; 689 *v = 1; 690 *x = -1; 691 *y = 0; 692 return b; 693 } 694 if (!b) 695 { 696 *u = 1; 697 *v = 0; 698 *x = 0; 699 *y = 1; 700 return a; 701 } 702 *u=1; 703 *v=0; 704 *x=0; 705 *y=1; 706 do 707 { 708 q = a/b; 709 r = a%b; 710 assume (q*b+r == a); 711 a = b; 712 b = r; 713 714 r = -(*v)*q+(*u); 715 (*u) =(*v); 716 (*v) = r; 717 718 r = -(*y)*q+(*x); 719 (*x) = (*y); 720 (*y) = r; 721 } while (b); 722 723 return a; 724 } 725 726 number nrzExtGcd (number a, number b, number *s, number *t, const coeffs) 727 { 728 if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b)) 729 { 730 int u, v, x, y; 731 int g = int_extgcd(SR_TO_INT(a), SR_TO_INT(b), &u, &v, &x, &y); 732 *s = INT_TO_SR(u); 733 *t = INT_TO_SR(v); 734 return INT_TO_SR(g); 735 } 736 else 737 { 738 mpz_t aa, bb; 739 if (n_Z_IS_SMALL(a)) 740 { 741 mpz_init_set_si(aa, SR_TO_INT(a)); 742 } 743 else 744 { 745 mpz_init_set(aa, (int_number) a); 746 } 747 if (n_Z_IS_SMALL(b)) 748 { 749 mpz_init_set_si(bb, SR_TO_INT(b)); 750 } 751 else 752 { 753 mpz_init_set(bb, (int_number) b); 754 } 755 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 756 int_number bs = (int_number) omAllocBin(gmp_nrz_bin); 757 int_number bt = (int_number) omAllocBin(gmp_nrz_bin); 758 mpz_init(erg); 759 mpz_init(bs); 760 mpz_init(bt); 761 mpz_gcdext(erg, bs, bt, aa, bb); 762 *s = nrz_short((number) bs); 763 *t = nrz_short((number) bt); 764 mpz_clear(aa); 765 mpz_clear(bb); 766 return nrz_short((number) erg); 767 } 768 } 769 #if CF_DEBUG 770 number _nrzXExtGcd(number, number, number *, number *, number *, number *, const coeffs); 771 number nrzXExtGcd(number a, number b, number *x, number * y, number * u, number * v, const coeffs R) 772 { 773 char * s; 774 StringSetS("XExtGcd: "); 775 nrzWrite(a, R); 776 StringAppendS(" by "); 777 nrzWrite(b, R); 778 number c = _nrzXExtGcd(a, b, x, y, u, v, R); 779 StringAppendS(" is "); 780 nrzWrite(c, R); 781 StringAppendS("[["); 782 nrzWrite(*x, R); 783 StringAppendS(", "); 784 nrzWrite(*y, R); 785 StringAppendS("], "); 786 nrzWrite(*u, R); 787 StringAppendS(", "); 788 nrzWrite(*v, R); 789 s=StringEndS(); 790 Print("%s]]\n", s); 791 omFree(s); 792 return c; 793 } 794 number _nrzXExtGcd (number a, number b, number *s, number *t, number *u, number *v, const coeffs ) 795 #else 796 number nrzXExtGcd (number a, number b, number *s, number *t, number *u, number *v, const coeffs ) 797 #endif 798 { 799 if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b)) 800 { 801 int uu, vv, x, y; 802 int g = int_extgcd(SR_TO_INT(a), SR_TO_INT(b), &uu, &vv, &x, &y); 803 *s = INT_TO_SR(uu); 804 *t = INT_TO_SR(vv); 805 *u = INT_TO_SR(x); 806 *v = INT_TO_SR(y); 807 return INT_TO_SR(g); 808 } 809 else 810 { 811 mpz_t aa, bb; 812 if (n_Z_IS_SMALL(a)) 813 { 814 mpz_init_set_si(aa, SR_TO_INT(a)); 815 } 816 else 817 { 818 mpz_init_set(aa, (int_number) a); 819 } 820 if (n_Z_IS_SMALL(b)) 821 { 822 mpz_init_set_si(bb, SR_TO_INT(b)); 823 } 824 else 825 { 826 mpz_init_set(bb, (int_number) b); 827 } 828 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 829 int_number bs = (int_number) omAllocBin(gmp_nrz_bin); 830 int_number bt = (int_number) omAllocBin(gmp_nrz_bin); 831 mpz_init(erg); 832 mpz_init(bs); 833 mpz_init(bt); 834 835 mpz_gcdext(erg, bs, bt, aa, bb); 836 837 int_number bu = (int_number) omAllocBin(gmp_nrz_bin); 838 int_number bv = (int_number) omAllocBin(gmp_nrz_bin); 839 840 mpz_init_set(bu, (int_number) bb); 841 mpz_init_set(bv, (int_number) aa); 842 843 mpz_clear(aa); 844 mpz_clear(bb); 845 assume(mpz_cmp_si(erg, 0)); 846 847 mpz_div(bu, bu, erg); 848 mpz_div(bv, bv, erg); 849 850 mpz_mul_si(bu, bu, -1); 851 *u = nrz_short((number) bu); 852 *v = nrz_short((number) bv); 853 854 *s = nrz_short((number) bs); 855 *t = nrz_short((number) bt); 856 return nrz_short((number) erg); 857 } 858 } 859 #if CF_DEBUG 860 number _nrzQuotRem(number, number, number *, const coeffs); 861 number nrzQuotRem(number a, number b, number * r, const coeffs R) 862 { 863 StringSetS("QuotRem: "); 864 nrzWrite(a, R); 865 StringAppendS(" by "); 866 nrzWrite(b, R); 867 number c = _nrzQuotRem(a, b, r, R); 868 StringAppendS(" is "); 869 nrzWrite(c, R); 870 if (r) { 871 StringAppendS("+R("); 872 nrzWrite(*r, R); 873 StringAppendS(")"); 874 } 875 char * s = StringEndS(); 876 Print("%s\n", s); 877 omFree(s); 878 return c; 879 } 880 number _nrzQuotRem (number a, number b, number * r, const coeffs ) 881 #else 882 number nrzQuotRem (number a, number b, number * r, const coeffs ) 883 #endif 884 { 885 assume(SR_TO_INT(b)); 886 if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b)) 887 { 888 if (r) 889 *r = INT_TO_SR(SR_TO_INT(a) % SR_TO_INT(b)); 890 return INT_TO_SR(SR_TO_INT(a)/SR_TO_INT(b)); 891 } 892 else if (n_Z_IS_SMALL(a)) 893 { 894 //a is small, b is not, so q=0, r=a 895 if (r) 896 *r = a; 897 return INT_TO_SR(0); 898 } 899 else if (n_Z_IS_SMALL(b)) 900 { 901 unsigned long rr; 902 int_number qq = (int_number) omAllocBin(gmp_nrz_bin); 903 mpz_init(qq); 904 mpz_t rrr; 905 mpz_init(rrr); 906 rr = mpz_divmod_ui(qq, rrr, (int_number) a, (unsigned long)ABS(SR_TO_INT(b))); 907 mpz_clear(rrr); 908 909 if (r) 910 *r = INT_TO_SR(rr); 911 if (SR_TO_INT(b)<0) 912 { 913 mpz_mul_si(qq, qq, -1); 914 } 915 return nrz_short((number)qq); 916 } 917 int_number qq = (int_number) omAllocBin(gmp_nrz_bin), 918 rr = (int_number) omAllocBin(gmp_nrz_bin); 919 mpz_init(qq); 920 mpz_init(rr); 921 mpz_divmod(qq, rr, (int_number)a, (int_number)b); 922 if (r) 923 *r = (number) rr; 924 else 925 { 926 mpz_clear(rr); 927 } 928 nrzTest((number)qq); 929 return (number) qq; 930 } 931 932 933 void nrzPower (number a, int i, number * result, const coeffs) 934 { 935 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 936 mpz_init(erg); 937 mpz_t aa; 938 if (n_Z_IS_SMALL(a)) 939 mpz_init_set_si(aa, SR_TO_INT(a)); 940 else 941 mpz_init_set(aa, (int_number) a); 942 mpz_pow_ui(erg, aa, i); 943 *result = nrz_short((number) erg); 944 } 945 946 /* 947 * create a number from int 948 * TODO: do not create an mpz if not necessary 949 */ 950 number nrzInit (long i, const coeffs) 951 { 952 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 953 mpz_init_set_si(erg, i); 954 return nrz_short((number) erg); 955 } 956 957 void nrzDelete(number *a, const coeffs) 958 { 959 if (*a == NULL) return; 960 if (n_Z_IS_SMALL(*a)==0) 961 { 962 mpz_clear((int_number) *a); 963 omFreeBin((ADDRESS) *a, gmp_nrz_bin); 964 } 965 *a = NULL; 966 } 967 968 number nrzCopy(number a, const coeffs) 969 { 970 if (n_Z_IS_SMALL(a)) return a; 971 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 972 mpz_init_set(erg, (int_number) a); 973 return (number) erg; 974 } 975 976 int nrzSize(number a, const coeffs) 977 { 978 if (a == NULL) return 0; 979 if (n_Z_IS_SMALL(a)) return 1; 980 return mpz_size1((int_number)a)+1; 981 } 982 983 /* 984 * convert a number to int 985 */ 986 int nrzInt(number &n, const coeffs) 987 { 988 if (n_Z_IS_SMALL(n)) return SR_TO_INT(n); 989 return (int) mpz_get_si( (int_number)n); 990 } 991 #if CF_DEBUG 992 number _nrzAdd(number, number, const coeffs); 993 number nrzAdd(number a, number b, const coeffs R) 994 { 995 StringSetS("Add: "); 996 nrzWrite(a, R); 997 StringAppendS(" to "); 998 nrzWrite(b, R); 999 number c = _nrzAdd(a, b, R); 1000 StringAppendS(" is "); 1001 nrzWrite(c, R); 1002 char * s = StringEndS(); 1003 Print("%s\n", s); 1004 omFree(s); 1005 return c; 1006 } 1007 number _nrzAdd (number a, number b, const coeffs R) 1008 #else 1009 number nrzAdd (number a, number b, const coeffs R) 1010 #endif 1011 { 1012 if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b)) 1013 { 1014 int c = SR_TO_INT(a) + SR_TO_INT(b); 1015 if (INT_IS_SMALL(c)) 1016 return INT_TO_SR(c); 1017 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 1018 mpz_init_set_si(erg, c); 1019 1020 nrzTest((number)erg); 1021 return (number) erg; 1022 } 1023 else if (n_Z_IS_SMALL(a)) 1024 { 1025 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 1026 mpz_init(erg); 1027 if (SR_TO_INT(a)>0) 1028 mpz_add_ui(erg, (int_number) b, (unsigned long)SR_TO_INT(a)); 1029 else 1030 mpz_sub_ui(erg, (int_number) b, (unsigned long)-(SR_TO_INT(a))); 1031 return nrz_short((number) erg); 1032 } 1033 else if (n_Z_IS_SMALL(b)) 1034 { 1035 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 1036 mpz_init(erg); 1037 if (SR_TO_INT(b)>0) 1038 mpz_add_ui(erg, (int_number) a, (unsigned long)SR_TO_INT(b)); 1039 else 1040 mpz_sub_ui(erg, (int_number) a, (unsigned long)-(SR_TO_INT(b))); 1041 return nrz_short((number) erg); 1042 } 1043 else 1044 { 1045 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 1046 mpz_init(erg); 1047 mpz_add(erg, (int_number) a, (int_number) b); 1048 return nrz_short((number) erg); 1049 } 1050 } 1051 1052 number nrzSub (number a, number b, const coeffs) 1053 { 1054 if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b)) 1055 { 1056 int c = SR_TO_INT(a) - SR_TO_INT(b); 1057 if (INT_IS_SMALL(c)) 1058 return INT_TO_SR(c); 1059 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 1060 mpz_init_set_si(erg, c); 1061 nrzTest((number)erg); 1062 return (number) erg; 1063 } 1064 else if (n_Z_IS_SMALL(a)) 1065 { 1066 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 1067 mpz_init(erg); 1068 1069 if (SR_TO_INT(a)>0) 1070 mpz_ui_sub(erg, (unsigned long)SR_TO_INT(a), (int_number) b); 1071 else 1072 { 1073 mpz_add_ui(erg, (int_number) b, (unsigned long)-SR_TO_INT(a)); 1074 mpz_neg(erg, erg); 1075 } 1076 return nrz_short((number) erg); 1077 } 1078 else if (n_Z_IS_SMALL(b)) 1079 { 1080 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 1081 mpz_init(erg); 1082 if (INT_TO_SR(b)>0) 1083 mpz_sub_ui(erg, (int_number) a, (unsigned long)SR_TO_INT(b)); 1084 else 1085 mpz_add_ui(erg, (int_number) a, (unsigned long)-SR_TO_INT(b)); 1086 return nrz_short((number) erg); 1087 } 1088 else 1089 { 1090 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 1091 mpz_init(erg); 1092 mpz_sub(erg, (int_number) a, (int_number) b); 1093 return nrz_short((number) erg); 1094 } 1095 } 1096 1097 number nrzGetUnit (number n, const coeffs r) 1098 { 1099 //if (n_Z_IS_SMALL(n)) 1100 //{ 1101 // if (SR_TO_INT(n)<0) 1102 // return INT_TO_SR(-1); 1103 // else 1104 // return INT_TO_SR(1); 1105 //} 1106 if (nrzGreaterZero(n, r)) 1107 return INT_TO_SR(1); 1108 else 1109 return INT_TO_SR(-1); 1110 } 1111 1112 number nrzAnn(number n, const coeffs) 1113 { 1114 if (SR_TO_INT(n)) // in Z: the annihilator of !=0 is 0 1115 return INT_TO_SR(0); 1116 else 1117 return INT_TO_SR(1); 1118 } 1119 1120 BOOLEAN nrzIsUnit (number a, const coeffs) 1121 { 1122 return ABS(SR_TO_INT(a))==1; 1123 } 1124 1125 BOOLEAN nrzIsZero (number a, const coeffs) 1126 { 1127 return a==INT_TO_SR(0); 1128 } 1129 1130 BOOLEAN nrzIsOne (number a, const coeffs) 1131 { 1132 return a==INT_TO_SR(1); 1133 } 1134 1135 BOOLEAN nrzIsMOne (number a, const coeffs) 1136 { 1137 return a==INT_TO_SR(-1); 1138 } 1139 1140 BOOLEAN nrzEqual (number a,number b, const coeffs) 1141 { 1142 if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b)) 1143 return a==b; 1144 else if (n_Z_IS_SMALL(a) || n_Z_IS_SMALL(b)) 1145 return FALSE; 1146 else 1147 return 0 == mpz_cmp((int_number) a, (int_number) b); 1148 } 1149 1150 BOOLEAN nrzGreater (number a,number b, const coeffs) 1151 { 1152 if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b)) 1153 return ((long)a)>((long)b); 1154 else if (n_Z_IS_SMALL(a)) 1155 return 0 > mpz_cmp_si((int_number)b,SR_TO_INT(a)); 1156 else if (n_Z_IS_SMALL(b)) 1157 return 0 < mpz_cmp_si((int_number)a,SR_TO_INT(b)); 1158 return 0 < mpz_cmp((int_number) a, (int_number) b); 1159 } 1160 1161 BOOLEAN nrzGreaterZero (number k, const coeffs C) 1162 { 1163 return nrzGreater(k, INT_TO_SR(0), C); 1164 } 1165 1166 int nrzDivComp(number a, number b, const coeffs r) 1167 { 1168 if (nrzDivBy(a, b, r)) 1169 { 1170 if (nrzDivBy(b, a, r)) return 2; 1171 return -1; 1172 } 1173 if (nrzDivBy(b, a, r)) return 1; 1174 return 0; 1175 } 1176 1177 BOOLEAN nrzDivBy (number a,number b, const coeffs) 1178 { 1179 if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b)) 1180 { 1181 return SR_TO_INT(a) %SR_TO_INT(b) ==0; 1182 } 1183 else if (n_Z_IS_SMALL(a)) 1184 { 1185 return a==INT_TO_SR(0); 1186 } 1187 else if (n_Z_IS_SMALL(b)) 1188 { 1189 return mpz_divisible_ui_p((int_number)a, (unsigned long)ABS(SR_TO_INT(b))) != 0; 1190 } 1191 else 1192 return mpz_divisible_p((int_number) a, (int_number) b) != 0; 1193 } 1194 1195 number nrzDiv (number a,number b, const coeffs R) 1196 { 1197 assume(SR_TO_INT(b)); 1198 if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b)) 1199 { 1200 //if (SR_TO_INT(a) % SR_TO_INT(b)) 1201 //{ 1202 // WerrorS("1:Division by non divisible element."); 1203 // WerrorS("Result is without remainder."); 1204 //} 1205 return INT_TO_SR(SR_TO_INT(a)/SR_TO_INT(b)); 1206 } 1207 else if (n_Z_IS_SMALL(a)) 1208 { 1209 //if (SR_TO_INT(a)) 1210 //{ 1211 // WerrorS("2:Division by non divisible element."); 1212 // WerrorS("Result is without remainder."); 1213 //} 1214 return INT_TO_SR(0); 1215 } 1216 else if (n_Z_IS_SMALL(b)) 1217 { 1218 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 1219 mpz_t r; 1220 mpz_init(r); 1221 mpz_init(erg); 1222 if (mpz_divmod_ui(erg, r, (int_number) a, (unsigned long)ABS(SR_TO_INT(b)))) { 1223 // WerrorS("3:Division by non divisible element."); 1224 // WerrorS("Result is without remainder."); 1225 } 1226 mpz_clear(r); 1227 if (SR_TO_INT(b)<0) 1228 mpz_neg(erg, erg); 1229 return nrz_short((number) erg); 1230 } 1231 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 1232 mpz_init(erg); 1233 mpz_t r; 1234 mpz_init(r); 1235 mpz_tdiv_qr(erg, r, (int_number) a, (int_number) b); 1236 #if CF_DEBUG 1237 StringSetS("division of"); 1238 nrzWrite(a, R); 1239 StringAppendS(" by "); 1240 nrzWrite(b, R); 1241 StringAppendS(" is "); 1242 number du; 1243 nrzWrite(du = (number)erg, R); 1244 StringAppendS(" rest "); 1245 nrzWrite(du = (number)r, R); 1246 char * s = StringEndS(); 1247 Print("%s\n", s); 1248 omFree(s); 1249 #endif 1250 1251 if (mpz_cmp_si(r, 0)!=0) 1252 { 1253 //WerrorS("4:Division by non divisible element."); 1254 //WerrorS("Result is without remainder."); 1255 } 1256 mpz_clear(r); 1257 return nrz_short((number) erg); 1258 } 1259 1260 number nrzExactDiv (number a,number b, const coeffs) 1261 { 1262 assume(SR_TO_INT(b)); 1263 mpz_t aa, bb; 1264 if (n_Z_IS_SMALL(a)) 1265 mpz_init_set_si(aa, SR_TO_INT(a)); 1266 else 1267 mpz_init_set(aa, (int_number) a); 1268 if (n_Z_IS_SMALL(b)) 1269 mpz_init_set_si(bb, SR_TO_INT(b)); 1270 else 1271 mpz_init_set(bb, (int_number) b); 1272 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 1273 mpz_init(erg); 1274 mpz_tdiv_q(erg, (int_number) aa, (int_number) bb); 1275 mpz_clear(aa); 1276 mpz_clear(bb); 1277 nrzTest((number)erg); 1278 return (number) erg; 1279 } 1280 1281 number nrzIntMod (number a,number b, const coeffs) 1282 { 1283 mpz_t aa, bb; 1284 assume(SR_TO_INT(b)); 1285 if (n_Z_IS_SMALL(a)) 1286 mpz_init_set_si(aa, SR_TO_INT(a)); 1287 else 1288 mpz_init_set(aa, (int_number) a); 1289 if (n_Z_IS_SMALL(b)) 1290 mpz_init_set_si(bb, SR_TO_INT(b)); 1291 else 1292 mpz_init_set(bb, (int_number) b); 1293 1294 mpz_t erg; 1295 mpz_init(erg); 1296 int_number r = (int_number) omAllocBin(gmp_nrz_bin); 1297 mpz_init(r); 1298 mpz_tdiv_qr(erg, r, (int_number) aa, (int_number) bb); 1299 mpz_clear(erg); 1300 mpz_clear(aa); 1301 mpz_clear(bb); 1302 1303 return nrz_short((number) r); 1304 } 1305 1306 number nrzInvers (number c, const coeffs r) 1307 { 1308 if (!nrzIsUnit((number) c, r)) 1309 { 1310 WerrorS("Non invertible element."); 1311 return (number)0; //TODO 1312 } 1313 return c; // has to be 1 or -1.... 1314 } 1315 1316 number nrzNeg (number c, const coeffs) 1317 { 1318 // nNeg inplace !!! 1319 if (n_Z_IS_SMALL(c)) 1320 return INT_TO_SR(-SR_TO_INT(c)); 1321 mpz_mul_si((int_number) c, (int_number) c, -1); 1322 return c; 1323 } 1324 1325 static number nrzFarey(number r, number N, const coeffs R) 1326 { 1327 number a0 = nrzCopy(N, R); 1328 number b0 = nrzInit(0, R); 1329 number a1 = nrzCopy(r, R); 1330 number b1 = nrzInit(1, R); 1331 number two = nrzInit(2, R); 1332 #if 0 1333 Print("Farey start with "); 1334 n_Print(r, R); 1335 Print(" mod "); 1336 n_Print(N, R); 1337 Print("\n"); 1338 #endif 1339 while (1) 1340 { 1341 number as = nrzMult(a1, a1, R); 1342 n_InpMult(as, two, R); 1343 if (nrzGreater(N, as, R)) 1344 { 1345 nrzDelete(&as, R); 1346 break; 1347 } 1348 nrzDelete(&as, R); 1349 number q = nrzDiv(a0, a1, R); 1350 number t = nrzMult(a1, q, R), 1351 s = nrzSub(a0, t, R); 1352 nrzDelete(&a0, R); 1353 a0 = a1; 1354 a1 = s; 1355 nrzDelete(&t, R); 1356 1357 t = nrzMult(b1, q, R); 1358 s = nrzSub(b0, t, R); 1359 nrzDelete(&b0, R); 1360 b0 = b1; 1361 b1 = s; 1362 nrzDelete(&t, R); 1363 nrzDelete(&q, R); 1364 } 1365 number as = nrzMult(b1, b1, R); 1366 n_InpMult(as, two, R); 1367 nrzDelete(&two, R); 1368 if (nrzGreater(as, N, R)) 1369 { 1370 nrzDelete(&a0, R); 1371 nrzDelete(&a1, R); 1372 nrzDelete(&b0, R); 1373 nrzDelete(&b1, R); 1374 nrzDelete(&as, R); 1375 return NULL; 1376 } 1377 nrzDelete(&as, R); 1378 nrzDelete(&a0, R); 1379 nrzDelete(&b0, R); 1380 1381 number a, b, ab; 1382 coeffs Q = nInitChar(n_Q, 0); 1383 nMapFunc f = n_SetMap(R, Q); 1384 a = f(a1, R, Q); 1385 b = f(b1, R, Q); 1386 ab = n_Div(a, b, Q); 1387 n_Delete(&a, Q); 1388 n_Delete(&b, Q); 1389 nKillChar(Q); 1390 1391 nrzDelete(&a1, R); 1392 nrzDelete(&b1, R); 1393 return ab; 1394 } 1395 1396 number nrzMapMachineInt(number from, const coeffs /*src*/, const coeffs /*dst*/) 1397 { 1398 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 1399 mpz_init_set_ui(erg, (NATNUMBER) from); 1400 return nrz_short((number) erg); 1401 } 1402 1403 number nrzMapZp(number from, const coeffs /*src*/, const coeffs /*dst*/) 1404 { 1405 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 1406 mpz_init_set_si(erg, (long) from); 1407 return nrz_short((number) erg); 1408 } 1409 1410 number nrzModNMap(number from, const coeffs src, const coeffs /*dst*/) 1411 { 1412 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 1413 mpz_init_set(erg, (int_number) from); 1414 return nrz_short((number) erg); 1415 } 1416 1417 number nrzMapQ(number from, const coeffs src, const coeffs dst) 1418 { 1419 if (SR_HDL(from) & SR_INT) 1420 return nrzInit(SR_TO_INT(from),dst); 1421 if (from->s!=3) 1422 { 1423 WerrorS("rational in map to integer"); 1424 return NULL; 1425 } 1426 int_number erg = (int_number) omAllocBin(gmp_nrz_bin); 1427 mpz_init_set(erg, from->z); 1428 return nrz_short((number) erg); 1429 } 1430 1431 nMapFunc nrzSetMap(const coeffs src, const coeffs /*dst*/) 1432 { 1433 /* dst = rintegers */ 1434 if (src->rep==n_rep_gmp) //nCoeff_is_Ring_ModN(src) || nCoeff_is_Ring_PtoM(src)) 1435 return nrzModNMap; 1436 1437 if ((src->rep==n_rep_gap_gmp) && nCoeff_is_Ring_Z(src)) 1438 { 1439 return ndCopyMap; //nrzCopyMap; 1440 } 1441 if (src->rep==n_rep_gap_rat) /*&& nCoeff_is_Ring_Z(src)) Q, bigint*/ 1442 { 1443 return nrzMapQ; 1444 } 1445 if ((src->rep=n_rep_int) && nCoeff_is_Ring_2toM(src)) 1446 { 1447 return nrzMapMachineInt; 1448 } 1449 if ((src->rep=n_rep_int) && nCoeff_is_Zp(src)) 1450 { 1451 return nrzMapZp; 1452 } 1453 return NULL; // default 1454 } 1455 1456 1457 /* 1458 * set the exponent (allocate and init tables) (TODO) 1459 */ 1460 1461 void nrzSetExp(int, coeffs) 1462 { 1463 } 1464 1465 void nrzInitExp(int, coeffs) 1466 { 1467 } 1468 1469 #ifdef LDEBUG 1470 BOOLEAN nrzDBTest (number x, const char *f, const int l, const coeffs) 1471 { 1472 if (SR_HDL(x) & SR_INT) return TRUE; 1473 if (mpz_cmp_ui((int_number) x,(long)0)==0) 1474 { 1475 Print("gmp-0 %s:%d\n",f,l); 1476 return FALSE; 1477 } 1478 if (mpz_size1((int_number)x)<=MP_SMALL) 1479 { 1480 int ui=mpz_get_si((int_number)x); 1481 if ((((ui<<3)>>3)==ui) 1482 && (mpz_cmp_si((int_number)x,(long)ui)==0)) 1483 { 1484 Print("gmp-small %s:%d\n",f,l); 1485 return FALSE; 1486 } 1487 } 1488 return TRUE; 1489 } 1490 #endif 1491 1492 void nrzWrite (number &a, const coeffs) 1493 { 1494 char *s,*z; 1495 if (a==NULL) 1496 { 1497 StringAppendS("o"); 1498 } 1499 else 1500 { 1501 if (n_Z_IS_SMALL(a)) 1502 { 1503 StringAppend("%d", SR_TO_INT(a)); 1504 } 1505 else 1506 { 1507 int l=mpz_sizeinbase((int_number) a, 10) + 2; 1508 s=(char*)omAlloc(l); 1509 z=mpz_get_str(s,10,(int_number) a); 1510 StringAppendS(z); 1511 omFreeSize((ADDRESS)s,l); 1512 } 1513 } 1514 } 1515 1516 /*2 1517 * extracts a long integer from s, returns the rest (COPY FROM longrat0.cc) 1518 */ 1519 static const char * nlEatLongC(char *s, mpz_ptr i) 1520 { 1521 const char * start=s; 1522 1523 if (*s<'0' || *s>'9') 1524 { 1525 mpz_set_si(i,1); 1526 return s; 1527 } 1528 while (*s >= '0' && *s <= '9') s++; 1529 if (*s=='\0') 1530 { 1531 mpz_set_str(i,start,10); 1532 } 1533 else 1534 { 1535 char c=*s; 1536 *s='\0'; 1537 mpz_set_str(i,start,10); 1538 *s=c; 1539 } 1540 return s; 1541 } 1542 1543 const char * nrzRead (const char *s, number *a, const coeffs) 1544 { 1545 int_number z = (int_number) omAllocBin(gmp_nrz_bin); 1546 { 1547 mpz_init(z); 1548 s = nlEatLongC((char *) s, z); 1549 } 1550 *a = nrz_short((number) z); 1551 return s; 1552 } 1553 1554 void nrzCoeffWrite (const coeffs, BOOLEAN /*details*/) 1555 { 1556 //PrintS("// ZZ\n"); 1557 PrintS("// coeff. ring is : Integers\n"); 1558 } 1559 1560 static char* nrzCoeffString(const coeffs) 1561 { 1562 return omStrDup("integer"); 1563 } 1564 1565 static CanonicalForm nrzConvSingNFactoryN( number n, BOOLEAN setChar, const coeffs /*r*/ ) 1566 { 1567 if (setChar) setCharacteristic( 0 ); 1568 1569 CanonicalForm term; 1570 if ( n_Z_IS_SMALL(n)) 1571 { 1572 term = SR_TO_INT(n); 1573 } 1574 else 1575 { 1576 mpz_t dummy; 1577 mpz_init_set( dummy,n->z ); 1578 term = make_cf( dummy ); 1579 } 1580 return term; 1581 } 1582 1583 static number nrzConvFactoryNSingN( const CanonicalForm n, const coeffs r) 1584 { 1585 if (n.isImm()) 1586 { 1587 return nrzInit(n.intval(),r); 1588 } 1589 else 1590 { 1591 if ( !n.den().isOne() ) 1592 { 1593 WerrorS("rational in conversion to integer"); 1594 return NULL; 1595 } 1596 int_number z = (int_number) omAlloc0Bin(gmp_nrz_bin); 1597 gmp_numerator( n,z); 1598 return nrz_short((number)z); 1599 } 1600 } 1601 1602 static void nrzMPZ(mpz_t res, number &a, const coeffs) 1603 { 1604 if (n_Z_IS_SMALL(a)) 1605 mpz_init_set_si(res, SR_TO_INT(a)); 1606 else 1607 mpz_init_set(res, (int_number) a); 1608 } 1609 1610 coeffs nrzQuot1(number c, const coeffs r) 1611 { 1612 int_number dummy; 1613 dummy = (int_number) omAlloc(sizeof(mpz_t)); 1614 if(n_Z_IS_SMALL(c)) 1615 { 1616 int ch = r->cfInt(c, r); 1617 mpz_init_set_ui(dummy, ch); 1618 } 1619 else 1620 { 1621 mpz_init_set(dummy, (int_number)c); 1622 } 1623 ZnmInfo info; 1624 info.base = dummy; 1625 info.exp = (unsigned long) 1; 1626 coeffs rr = nInitChar(n_Zn, (void*)&info); 1627 return(rr); 1628 } 1629 1630 BOOLEAN nrzInitChar(coeffs r, void *) 1631 { 1632 assume( getCoeffType(r) == ID ); 1633 1634 r->is_field=FALSE; 1635 r->is_domain=TRUE; 1636 r->rep=n_rep_gap_gmp; 1637 1638 r->nCoeffIsEqual = ndCoeffIsEqual; 1639 r->cfCoeffString = nrzCoeffString; 1640 r->cfKillChar = ndKillChar; 1641 r->cfMult = nrzMult; 1642 r->cfSub = nrzSub; 1643 r->cfAdd = nrzAdd; 1644 r->cfDiv = nrzDiv; 1645 r->cfIntMod= nrzIntMod; 1646 r->cfExactDiv= nrzExactDiv; 1647 r->cfInit = nrzInit; 1648 r->cfSize = nrzSize; 1649 r->cfInt = nrzInt; 1650 //#ifdef HAVE_RINGS 1651 r->cfDivComp = nrzDivComp; // only for ring stuff 1652 r->cfIsUnit = nrzIsUnit; // only for ring stuff 1653 r->cfGetUnit = nrzGetUnit; // only for ring stuff 1654 r->cfAnn = nrzAnn; 1655 r->cfExtGcd = nrzExtGcd; // only for ring stuff 1656 r->cfXExtGcd = nrzXExtGcd; // only for ring stuff 1657 r->cfQuotRem = nrzQuotRem; 1658 r->cfDivBy = nrzDivBy; // only for ring stuff 1659 //#endif 1660 r->cfInpNeg = nrzNeg; 1661 r->cfInvers= nrzInvers; 1662 r->cfCopy = nrzCopy; 1663 r->cfWriteLong = nrzWrite; 1664 r->cfRead = nrzRead; 1665 r->cfGreater = nrzGreater; 1666 r->cfEqual = nrzEqual; 1667 r->cfIsZero = nrzIsZero; 1668 r->cfIsOne = nrzIsOne; 1669 r->cfIsMOne = nrzIsMOne; 1670 r->cfGreaterZero = nrzGreaterZero; 1671 r->cfPower = nrzPower; 1672 r->cfGcd = nrzGcd; 1673 //r->cfLcm = nrzLcm; 1674 r->cfDelete= nrzDelete; 1675 r->cfSetMap = nrzSetMap; 1676 r->cfCoeffWrite = nrzCoeffWrite; 1677 r->convSingNFactoryN = nrzConvSingNFactoryN; 1678 r->convFactoryNSingN = nrzConvFactoryNSingN; 1679 r->cfMPZ = nrzMPZ; 1680 r->cfFarey = nrzFarey; 1681 1682 r->cfQuot1 = nrzQuot1; 1683 // debug stuff 1684 1685 #ifdef LDEBUG 1686 r->cfDBTest=nrzDBTest; 1687 #endif 1688 1689 r->nNULL = 0; 1690 r->ch = 0; 1691 r->has_simple_Alloc=FALSE; 1692 r->has_simple_Inverse=FALSE; 1693 return FALSE; 1694 } 1695 1696 #else 1697 #error set SI_INTEGER_VARIANT 1698 #endif 1699 #endif -
libpolys/coeffs/rmodulo2m.cc
r653440 r6a1aa7 105 105 r->is_field=FALSE; 106 106 r->is_domain=FALSE; 107 r->rep=n_rep_int; 107 108 108 109 r->cfKillChar = ndKillChar; /* dummy*/ … … 151 152 r->cfName = ndName; 152 153 r->cfCoeffWrite = nr2mCoeffWrite; 153 r->cfInit_bigint = nr2mMapQ;154 154 r->cfQuot1 = nr2mQuot1; 155 155 #ifdef LDEBUG … … 682 682 } 683 683 684 number nr2mMapZ(number from, const coeffs src, const coeffs dst) 685 { 686 if (SR_HDL(from) & SR_INT) 687 { 688 long f_i=SR_TO_INT(from); 689 return nr2mInit(f_i,dst); 690 } 691 return nr2mMapGMP(from,src,dst); 692 } 693 684 694 nMapFunc nr2mSetMap(const coeffs src, const coeffs dst) 685 695 { 686 if ( nCoeff_is_Ring_2toM(src)696 if ((src->rep==n_rep_int) && nCoeff_is_Ring_2toM(src) 687 697 && (src->mod2mMask == dst->mod2mMask)) 688 698 { 689 699 return ndCopyMap; 690 700 } 691 if ( nCoeff_is_Ring_2toM(src)701 if ((src->rep==n_rep_int) && nCoeff_is_Ring_2toM(src) 692 702 && (src->mod2mMask < dst->mod2mMask)) 693 703 { /* i.e. map an integer mod 2^s into Z mod 2^t, where t < s */ 694 704 return nr2mMapMachineInt; 695 705 } 696 if ( nCoeff_is_Ring_2toM(src)706 if ((src->rep==n_rep_int) && nCoeff_is_Ring_2toM(src) 697 707 && (src->mod2mMask > dst->mod2mMask)) 698 708 { /* i.e. map an integer mod 2^s into Z mod 2^t, where t > s */ … … 700 710 return nr2mMapProject; 701 711 } 702 if ( nCoeff_is_Ring_Z(src))712 if ((src->rep==n_rep_gmp) && nCoeff_is_Ring_Z(src)) 703 713 { 704 714 return nr2mMapGMP; 705 715 } 706 if (nCoeff_is_Q(src)) 716 if ((src->rep==n_rep_gap_gmp) /*&& nCoeff_is_Ring_Z(src)*/) 717 { 718 return nr2mMapZ; 719 } 720 if ((src->rep==n_rep_gap_rat) && nCoeff_is_Q(src)) 707 721 { 708 722 return nr2mMapQ; 709 723 } 710 if ( nCoeff_is_Zp(src) && (src->ch == 2))724 if ((src->rep=n_rep_int) && nCoeff_is_Zp(src) && (src->ch == 2)) 711 725 { 712 726 return nr2mMapZp; 713 727 } 714 if (nCoeff_is_Ring_PtoM(src) || nCoeff_is_Ring_ModN(src)) 728 if ((src->rep=n_rep_gmp) && 729 (nCoeff_is_Ring_PtoM(src) || nCoeff_is_Ring_ModN(src))) 715 730 { 716 731 if (mpz_divisible_2exp_p(src->modNumber,dst->modExponent)) -
libpolys/coeffs/rmodulon.cc
r653440 r6a1aa7 120 120 r->is_field=FALSE; 121 121 r->is_domain=FALSE; 122 r->rep=n_rep_gmp; 122 123 123 124 … … 159 160 r->cfCoeffWrite = nrnCoeffWrite; 160 161 r->nCoeffIsEqual = nrnCoeffsEqual; 161 r->cfInit_bigint = nrnMapQ;162 162 r->cfKillChar = ndKillChar; 163 163 r->cfQuot1 = nrnQuot1; … … 554 554 } 555 555 556 number nrnMapZ(number from, const coeffs src, const coeffs dst) 557 { 558 if (SR_HDL(from) & SR_INT) 559 { 560 long f_i=SR_TO_INT(from); 561 return nrnInit(f_i,dst); 562 } 563 return nrnMapGMP(from,src,dst); 564 } 565 556 566 number nrnMapQ(number from, const coeffs src, const coeffs dst) 557 567 { … … 565 575 nMapFunc nrnSetMap(const coeffs src, const coeffs dst) 566 576 { 567 /* dst = currRing->cf*/568 if ( nCoeff_is_Ring_Z(src))577 /* dst = nrn */ 578 if ((src->rep==n_rep_gmp) && nCoeff_is_Ring_Z(src)) 569 579 { 570 580 return nrnMapGMP; 571 581 } 572 if (nCoeff_is_Q(src)) 582 if ((src->rep==n_rep_gap_gmp) /*&& nCoeff_is_Ring_Z(src)*/) 583 { 584 return nrnMapZ; 585 } 586 if ((src->rep==n_rep_gap_rat) && nCoeff_is_Q(src)) 573 587 { 574 588 return nrnMapQ; -
libpolys/coeffs/shortfl.cc
r653440 r6a1aa7 430 430 431 431 assume( getCoeffType(r) == ID ); 432 assume( getCoeffType(aRing) == n_Q);432 assume( aRing->rep == n_rep_gap_rat ); 433 433 434 434 mpz_ptr z; 435 435 mpz_ptr zz=NULL; 436 #if SIZEOF_LONG == 8437 436 if (IS_IMM(from)) 438 437 { 439 int ui=SR_TO_INT(from);440 if ((long)ui==SR_TO_INT(from))441 return nf((float)ui).N();442 438 zz=(mpz_ptr)omAlloc(sizeof(mpz_t)); 443 439 mpz_init_set_si(zz,SR_TO_INT(from)); 444 440 z=zz; 445 441 } 446 #else447 if (IS_IMM(from))448 return nf((float)nlInt(from,aRing)).N();449 #endif450 442 else 451 443 { … … 461 453 mpf_abs (e, e); 462 454 463 #if SIZEOF_LONG == 8464 455 if (zz!=NULL) 465 456 { … … 467 458 omFreeSize(zz,sizeof(mpz_t)); 468 459 } 469 #endif470 460 /* if number was an integer, we are done*/ 471 461 if(IS_IMM(from)|| IS_INT(from)) … … 509 499 mpf_clear(d); 510 500 mpf_clear(q); 501 return nf(f).N(); 502 } 503 504 number nrMapZ(number from, const coeffs aRing, const coeffs r) 505 { 506 assume( getCoeffType(r) == ID ); 507 assume( aRing->rep == n_rep_gap_gmp ); 508 509 mpz_ptr z; 510 mpz_ptr zz=NULL; 511 if (IS_IMM(from)) 512 { 513 zz=(mpz_ptr)omAlloc(sizeof(mpz_t)); 514 mpz_init_set_si(zz,SR_TO_INT(from)); 515 z=zz; 516 } 517 else 518 { 519 /* read out the enumerator */ 520 z=(mpz_ptr)from; 521 } 522 523 int i = mpz_size1(z); 524 mpf_t e; 525 mpf_init(e); 526 mpf_set_z(e,z); 527 int sign= mpf_sgn(e); 528 mpf_abs (e, e); 529 530 if (zz!=NULL) 531 { 532 mpz_clear(zz); 533 omFreeSize(zz,sizeof(mpz_t)); 534 } 535 if(i>4) 536 { 537 WerrorS("float overflow"); 538 return nf(0.0).N(); 539 } 540 double basis; 541 signed long int exp; 542 basis = mpf_get_d_2exp(&exp, e); 543 float f= sign*ldexp(basis,exp); 544 mpf_clear(e); 511 545 return nf(f).N(); 512 546 } … … 631 665 assume( getCoeffType(dst) == ID ); 632 666 633 if ( nCoeff_is_Q(src))667 if (src->rep=n_rep_gap_rat) /*Q, Z */ 634 668 { 635 669 return nrMapQ; 636 670 } 637 if (nCoeff_is_long_R(src)) 671 if (src->rep=n_rep_gap_gmp) /*Q, Z */ 672 { 673 return nrMapZ; 674 } 675 if ((src->rep==n_rep_gmp_float) && nCoeff_is_long_R(src)) 638 676 { 639 677 return nrMapLongR; 640 678 } 641 if ( nCoeff_is_R(src))679 if ((src->rep==n_rep_float) && nCoeff_is_R(src)) 642 680 { 643 681 return ndCopyMap; 644 682 } 645 if (nCoeff_is_Zp(src))683 if ((src->rep==n_rep_int) && nCoeff_is_Zp(src)) 646 684 { 647 685 return nrMapP; 648 686 } 649 if ( nCoeff_is_long_C(src))687 if ((src->rep==n_rep_gmp_complex) && nCoeff_is_long_C(src)) 650 688 { 651 689 return nrMapC; … … 667 705 n->is_field=TRUE; 668 706 n->is_domain=TRUE; 707 n->rep=n_rep_float; 669 708 670 709 n->cfKillChar = ndKillChar; /* dummy */ … … 693 732 n->cfSetMap = nrSetMap; 694 733 n->cfCoeffWrite = nrCoeffWrite; 695 n->cfInit_bigint = nrMapQ;696 734 697 735 /* nName= ndName; */ -
libpolys/misc/auxiliary.h.in
r653440 r6a1aa7 54 54 #endif 55 55 56 #ifdef HAVE_FACTORY57 58 56 #ifndef SINGULAR 59 57 #undef SINGULAR … … 64 62 #endif 65 63 66 #endif67 // #ifdef HAVE_FACTORY68 69 64 // ---------------- end of parts/extensions 70 65 71 66 // ---------------- Singular standard types etc. 72 // BOOLEAN 67 /* SI_INTEGER_VARIANT: 1: from longrat.cc 68 * 2: GMP 69 * 3: rintegers.cc */ 70 #define SI_INTEGER_VARIANT 2 71 72 /* SI_BIGINT_VARIANT: 1: from longrat.cc 73 * 2: given by SI_INTEGER_VARIANT */ 74 #define SI_BIGINT_VARIANT 1 75 73 76 #ifndef SIZEOF_LONG 74 77 -
libpolys/polys/ext_fields/algext.cc
r653440 r6a1aa7 350 350 } 351 351 352 number naInit_bigint(number longratBigIntNumber, const coeffs src, const coeffs cf)353 {354 assume( cf != NULL );355 356 const ring A = cf->extRing;357 358 assume( A != NULL );359 360 const coeffs C = A->cf;361 362 assume( C != NULL );363 364 number n = n_Init_bigint(longratBigIntNumber, src, C);365 366 if ( n_IsZero(n, C) )367 {368 n_Delete(&n, C);369 return NULL;370 }371 372 return (number)p_NSet(n, A);373 }374 375 376 377 352 number naInit(long i, const coeffs cf) 378 353 { … … 889 864 } 890 865 891 /* assumes that src = Q , dst = Q(a) */866 /* assumes that src = Q or Z, dst = Q(a) */ 892 867 number naMap00(number a, const coeffs src, const coeffs dst) 893 868 { 894 869 if (n_IsZero(a, src)) return NULL; 895 assume(src == dst->extRing->cf);870 assume(src->rep == dst->extRing->cf->rep); 896 871 poly result = p_One(dst->extRing); 897 872 p_SetCoeff(result, n_Copy(a, src), dst->extRing); 873 return (number)result; 874 } 875 876 /* assumes that src = Z, dst = K(a) */ 877 number naMapZ0(number a, const coeffs src, const coeffs dst) 878 { 879 if (n_IsZero(a, src)) return NULL; 880 poly result = p_One(dst->extRing); 881 nMapFunc nMap=n_SetMap(src,dst->extRing->cf); 882 p_SetCoeff(result, nMap(a, src, dst->extRing->cf), dst->extRing); 883 if (n_IsZero(pGetCoeff(result),dst->extRing->cf)) 884 p_Delete(&result,dst->extRing); 898 885 return (number)result; 899 886 } … … 1061 1048 if (h==0) 1062 1049 { 1063 if (nCoeff_is_Q(src) && nCoeff_is_Q(bDst)) 1064 return naMap00; /// Q --> Q(a) 1050 if ((src->rep==n_rep_gap_rat) && nCoeff_is_Q(bDst)) 1051 return naMap00; /// Q or Z --> Q(a) 1052 if ((src->rep==n_rep_gap_gmp) && nCoeff_is_Q(bDst)) 1053 return naMapZ0; /// Z --> Q(a) 1065 1054 if (nCoeff_is_Zp(src) && nCoeff_is_Q(bDst)) 1066 1055 return naMapP0; /// Z/p --> Q(a) 1067 1056 if (nCoeff_is_Q(src) && nCoeff_is_Zp(bDst)) 1068 1057 return naMap0P; /// Q --> Z/p(a) 1058 if ((src->rep==n_rep_gap_gmp) && nCoeff_is_Zp(bDst)) 1059 return naMapZ0; /// Z --> Z/p(a) 1069 1060 if (nCoeff_is_Zp(src) && nCoeff_is_Zp(bDst)) 1070 1061 { … … 1423 1414 cf->is_field=TRUE; 1424 1415 cf->is_domain=TRUE; 1416 cf->rep=n_rep_poly; 1425 1417 1426 1418 #ifdef LDEBUG … … 1437 1429 cf->cfIsMOne = naIsMOne; 1438 1430 cf->cfInit = naInit; 1439 cf->cfInit_bigint = naInit_bigint;1440 1431 cf->cfFarey = naFarey; 1441 1432 cf->cfChineseRemainder= naChineseRemainder; … … 1617 1608 cf->cfIsMOne = naIsMOne; 1618 1609 cf->cfInit = naInit; 1619 cf->cfInit_bigint = naInit_bigint;1620 1610 cf->cfFarey = naFarey; 1621 1611 cf->cfChineseRemainder= naChineseRemainder; -
libpolys/polys/ext_fields/transext.cc
r653440 r6a1aa7 565 565 } 566 566 567 number ntInit_bigint(number longratBigIntNumber, const coeffs src, const coeffs cf)568 {569 assume( cf != NULL );570 571 const ring A = cf->extRing;572 573 assume( A != NULL );574 575 const coeffs C = A->cf;576 577 assume( C != NULL );578 579 number n = n_Init_bigint(longratBigIntNumber, src, C);580 581 if ( n_IsZero(n, C) )582 {583 n_Delete(&n, C);584 return NULL;585 }586 587 fraction result = (fraction)omAlloc0Bin(fractionObjectBin);588 589 number den = n_GetDenom(n, C);590 591 assume( n_GreaterZero(den, C) );592 593 if( n_IsOne(den, C) )594 {595 NUM(result) = p_NSet(n, A);596 //DEN(result) = NULL; // done by ..Alloc0..597 n_Delete(&den, C);598 }599 else600 {601 DEN(result) = p_NSet(den, A);602 NUM(result) = p_NSet(n_GetNumerator(n, C), A);603 n_Delete(&n, C);604 }605 606 //COM(result) = 0; // done by ..Alloc0..607 608 ntTest((number)result);609 //check_N((number)result,cf);610 611 return (number)result;612 }613 614 615 567 number ntInit(long i, const coeffs cf) 616 568 { … … 1804 1756 } 1805 1757 1806 /* assumes that src = Q , dst = Q(t_1, ..., t_s) */1758 /* assumes that src = Q or Z, dst = Q(t_1, ..., t_s) */ 1807 1759 number ntMap00(number a, const coeffs src, const coeffs dst) 1808 1760 { 1809 1761 if (n_IsZero(a, src)) return NULL; 1810 1762 assume(n_Test(a, src)); 1811 assume(src == dst->extRing->cf);1763 assume(src->rep == dst->extRing->cf->rep); 1812 1764 if ((SR_HDL(a) & SR_INT) || (a->s==3)) 1813 1765 { … … 1825 1777 //check_N((number)ff,dst); 1826 1778 return (number)ff; 1779 } 1780 1781 number ntMapZ0(number a, const coeffs src, const coeffs dst) 1782 { 1783 if (n_IsZero(a, src)) return NULL; 1784 assume(n_Test(a, src)); 1785 nMapFunc nMap=n_SetMap(src,dst->extRing->cf); 1786 poly p=p_NSet(nMap(a, src,dst->extRing->cf), dst->extRing); 1787 if (n_IsZero(pGetCoeff(p),dst->extRing->cf)) 1788 p_Delete(&p,dst->extRing); 1789 number res=ntInit(p, dst); 1790 n_Test(res,dst); 1791 return res; 1827 1792 } 1828 1793 … … 1992 1957 if (h==0) 1993 1958 { 1994 if (nCoeff_is_Q(src) && nCoeff_is_Q(bDst)) 1995 return ntMap00; /// Q --> Q(T) 1959 if ((src->rep==n_rep_gap_rat) && nCoeff_is_Q(bDst)) 1960 return ntMap00; /// Q or Z --> Q(T) 1961 if (src->rep==n_rep_gap_gmp) 1962 return ntMapZ0; /// Z --> K(T) 1996 1963 if (nCoeff_is_Zp(src) && nCoeff_is_Q(bDst)) 1997 1964 return ntMapP0; /// Z/p --> Q(T) … … 2431 2398 cf->is_field=TRUE; 2432 2399 cf->is_domain=TRUE; 2400 cf->rep=n_rep_rat_fct; 2433 2401 2434 2402 cf->factoryVarOffset = R->cf->factoryVarOffset + rVar(R); … … 2443 2411 cf->cfIsMOne = ntIsMOne; 2444 2412 cf->cfInit = ntInit; 2445 cf->cfInit_bigint = ntInit_bigint;2446 2413 cf->cfFarey = ntFarey; 2447 2414 cf->cfChineseRemainder = ntChineseRemainder;
Note: See TracChangeset
for help on using the changeset viewer.