Changeset 003f71 in git
- Timestamp:
- Nov 26, 2022, 7:17:34 PM (17 months ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- 4bd8b041a99fff0e3b0ea2ae4a7114855c08b720
- Parents:
- f7e6710d93be192399d06dba64ca56a8b283c6e7
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libpolys/coeffs/rintegers3.cc
rf7e671 r003f71 7 7 #ifdef HAVE_RINGS 8 8 #if SI_INTEGER_VARIANT == 3 9 #define POW_2_28 (1L<<60) 9 10 10 11 //make sure that a small number is an immediate integer … … 94 95 { 95 96 //from longrat.cc 96 if (SR_TO_INT(a)==0) 97 return a; 98 if (SR_TO_INT(b)==0) 99 return b; 97 if (a==INT_TO_SR(0)) return INT_TO_SR(0); 98 if (b==INT_TO_SR(0)) return INT_TO_SR(0); 100 99 long r=(long)((unsigned long)(SR_HDL(a)-1L))*((unsigned long)(SR_HDL(b)>>1)); 101 100 if ((r/(SR_HDL(b)>>1))==(SR_HDL(a)-1L)) 102 101 { 103 102 number u=((number) ((r>>1)+SR_INT)); 104 //if (((((long)SR_HDL(u))<<1)>>1)==SR_HDL(u)) return (u);103 if (((((long)SR_HDL(u))<<1)>>1)==SR_HDL(u)) return (u); 105 104 return nrzInit(SR_HDL(u)>>2, R); 106 105 } 107 106 mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin); 108 mpz_init(erg); 109 mpz_set_si(erg, SR_TO_INT(a)); 107 mpz_init_set_si(erg, SR_TO_INT(a)); 110 108 mpz_mul_si(erg, erg, SR_TO_INT(b)); 111 109 nrzTest((number)erg); 112 return (number) erg;110 return nrz_short((number) erg); 113 111 } 114 112 else if (n_Z_IS_SMALL(a)) 115 113 { 116 if (SR_TO_INT(a)==0) 117 return a; 114 if (a==INT_TO_SR(0)) return INT_TO_SR(0); 118 115 mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin); 119 116 mpz_init_set(erg, (mpz_ptr) b); 120 117 mpz_mul_si(erg, erg, SR_TO_INT(a)); 121 nrzTest((number)erg); 122 return (number) erg; 118 return nrz_short((number) erg); 123 119 } 124 120 else if (n_Z_IS_SMALL(b)) 125 121 { 126 if (SR_TO_INT(b)==0) 127 return b; 122 if (b==INT_TO_SR(0)) return INT_TO_SR(0); 128 123 mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin); 129 124 mpz_init_set(erg, (mpz_ptr) a); 130 125 mpz_mul_si(erg, erg, SR_TO_INT(b)); 131 nrzTest((number)erg); 132 return (number) erg; 126 return nrz_short((number) erg); 133 127 } 134 128 else … … 138 132 mpz_mul(erg, (mpz_ptr) a, (mpz_ptr) b); 139 133 nrzTest((number)erg); 140 return (number) erg;134 return nrz_short((number) erg); 141 135 } 142 136 } … … 449 443 #endif 450 444 { 451 assume(SR_TO_INT(b)); 452 if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b)) 453 { 454 if (r) 455 *r = INT_TO_SR(SR_TO_INT(a) % SR_TO_INT(b)); 456 return INT_TO_SR(SR_TO_INT(a)/SR_TO_INT(b)); 457 } 458 else if (n_Z_IS_SMALL(a)) 459 { 460 //a is small, b is not, so q=0, r=a 461 if (r) 462 *r = a; 463 return INT_TO_SR(0); 464 } 465 else if (n_Z_IS_SMALL(b)) 466 { 467 unsigned long rr; 468 mpz_ptr qq = (mpz_ptr) omAllocBin(gmp_nrz_bin); 469 mpz_init(qq); 470 mpz_t rrr; 471 mpz_init(rrr); 472 rr = mpz_divmod_ui(qq, rrr, (mpz_ptr) a, (unsigned long)ABS(SR_TO_INT(b))); 473 mpz_clear(rrr); 474 475 if (r) 476 *r = INT_TO_SR(rr); 477 if (SR_TO_INT(b)<0) 478 { 479 mpz_mul_si(qq, qq, -1); 480 } 481 return nrz_short((number)qq); 482 } 483 mpz_ptr qq = (mpz_ptr) omAllocBin(gmp_nrz_bin), 484 rr = (mpz_ptr) omAllocBin(gmp_nrz_bin); 445 mpz_ptr qq = (mpz_ptr) omAllocBin(gmp_nrz_bin); 485 446 mpz_init(qq); 447 mpz_ptr rr = (mpz_ptr) omAllocBin(gmp_nrz_bin); 486 448 mpz_init(rr); 487 mpz_divmod(qq, rr, (mpz_ptr)a, (mpz_ptr)b); 488 if (r) 489 *r = (number) rr; 490 else 449 mpz_t bb; 450 mpz_t aa; 451 int gsign; 452 if (SR_HDL(b) & SR_INT) 453 { 454 if (SR_HDL(b)<0) gsign=-1; 455 else gsign=1; 456 mpz_init_set_si(bb,SR_TO_INT(b)); 457 } 458 else 459 { 460 gsign = mpz_sgn((mpz_ptr) b); 461 mpz_init_set(bb,(mpz_ptr) b); 462 } 463 if (SR_HDL(a) & SR_INT) 464 { 465 mpz_init_set_si(aa,SR_TO_INT(a)); 466 } 467 else 468 { 469 mpz_init_set(aa,(mpz_ptr) a); 470 } 471 mpz_t gg, ghalf; 472 mpz_init(gg); 473 mpz_init(ghalf); 474 mpz_abs(gg, bb); 475 mpz_fdiv_qr(qq, rr, aa, gg); 476 mpz_tdiv_q_2exp(ghalf, gg, 1); 477 if (mpz_cmp(rr, ghalf) > 0) // r > ghalf 478 { 479 mpz_sub(rr, rr, gg); 480 mpz_add_ui(qq, qq, 1); 481 } 482 if (gsign < 0) mpz_neg(qq, qq); 483 484 mpz_clear(ghalf); 485 mpz_clear(gg); 486 mpz_clear(aa); 487 mpz_clear(bb); 488 if (r==NULL) 491 489 { 492 490 mpz_clear(rr); 493 } 494 number res=nrz_short((number)qq); 495 nrzTest(res); 496 return res; 491 omFreeBin(rr,gmp_nrz_bin); 492 } 493 else 494 { 495 *r=nrz_short((number)rr); 496 } 497 return nrz_short((number)qq); 497 498 } 498 499 … … 571 572 if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b)) 572 573 { 573 long c = SR_ TO_INT(a) + SR_TO_INT(b);574 long c = SR_HDL(a)+SR_HDL(b)-1L; 574 575 if (INT_IS_SMALL(c)) 575 return INT_TO_SR(c); 576 mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin); 577 mpz_init_set_si(erg, c); 578 579 nrzTest((number)erg); 580 return (number) erg; 576 return (number)c; 577 mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin); 578 mpz_init_set_si(erg,SR_TO_INT(a)); 579 if (SR_HDL(b)>0) 580 mpz_add_ui(erg, erg, (unsigned long)SR_TO_INT(b)); 581 else 582 mpz_sub_ui(erg, erg, (unsigned long)-(SR_TO_INT(b))); 583 return nrz_short((number)erg); 581 584 } 582 585 else if (n_Z_IS_SMALL(a)) … … 584 587 mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin); 585 588 mpz_init(erg); 586 if (SR_ TO_INT(a)>0)589 if (SR_HDL(a)>0) 587 590 mpz_add_ui(erg, (mpz_ptr) b, (unsigned long)SR_TO_INT(a)); 588 591 else … … 594 597 mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin); 595 598 mpz_init(erg); 596 if (SR_ TO_INT(b)>0)599 if (SR_HDL(b)>0) 597 600 mpz_add_ui(erg, (mpz_ptr) a, (unsigned long)SR_TO_INT(b)); 598 601 else … … 613 616 if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b)) 614 617 { 615 long c = SR_ TO_INT(a) - SR_TO_INT(b);618 long c = SR_HDL(a)-SR_HDL(b)+1; 616 619 if (INT_IS_SMALL(c)) 617 return INT_TO_SR(c); 618 mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin); 619 mpz_init_set_si(erg, c); 620 nrzTest((number)erg); 621 return (number) erg; 620 return number(c); 621 mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin); 622 mpz_init_set_si(erg,SR_TO_INT(a)); 623 if (SR_HDL(b)>0) 624 mpz_sub_ui(erg, erg, (unsigned long)SR_TO_INT(b)); 625 else 626 mpz_add_ui(erg, erg, (unsigned long)-(SR_TO_INT(b))); 627 return nrz_short((number)erg); 622 628 } 623 629 else if (n_Z_IS_SMALL(a)) 624 630 { 625 631 mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin); 632 mpz_init_set_si(erg,SR_TO_INT(a)); 633 mpz_sub(erg, erg, (mpz_ptr) b); 634 return nrz_short((number) erg); 635 } 636 else if (n_Z_IS_SMALL(b)) 637 { 638 mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin); 626 639 mpz_init(erg); 627 628 if (SR_TO_INT(a)>0) 629 mpz_ui_sub(erg, (unsigned long)SR_TO_INT(a), (mpz_ptr) b); 630 else 631 { 632 mpz_add_ui(erg, (mpz_ptr) b, (unsigned long)-SR_TO_INT(a)); 633 mpz_neg(erg, erg); 634 } 635 return nrz_short((number) erg); 636 } 637 else if (n_Z_IS_SMALL(b)) 638 { 639 mpz_ptr erg = (mpz_ptr) omAllocBin(gmp_nrz_bin); 640 mpz_init(erg); 641 if (SR_TO_INT(b)>0) 640 if (SR_HDL(b)>0) 642 641 mpz_sub_ui(erg, (mpz_ptr) a, (unsigned long)SR_TO_INT(b)); 643 642 else … … 747 746 static number nrzDiv (number a,number b, const coeffs cf) 748 747 { 749 assume(SR_TO_INT(b));750 748 if (nrzIsZero(b,cf)) 751 749 { … … 755 753 else if (n_Z_IS_SMALL(a) && n_Z_IS_SMALL(b)) 756 754 { 755 long i=SR_TO_INT(a); 756 long j=SR_TO_INT(b); 757 if (j==1L) return a; 758 if ((i==-POW_2_28) && (j== -1L)) 759 { 760 return nrzInit(POW_2_28,cf); 761 } 757 762 //if (SR_TO_INT(a) % SR_TO_INT(b)) 758 763 //{ … … 760 765 // WerrorS("Result is without remainder."); 761 766 //} 762 return INT_TO_SR( SR_TO_INT(a)/SR_TO_INT(b));767 return INT_TO_SR(i/j); 763 768 } 764 769 else if (n_Z_IS_SMALL(a)) … … 782 787 } 783 788 mpz_clear(r); 784 if (SR_ TO_INT(b)<0)789 if (SR_HDL(b)<0) 785 790 mpz_neg(erg, erg); 786 791 return nrz_short((number) erg);
Note: See TracChangeset
for help on using the changeset viewer.