Changeset de27d8 in git for libpolys/coeffs
- Timestamp:
- Feb 18, 2013, 7:27:17 PM (11 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- 7d1ce3ef53e17b72b36010a52fcfbdbde745a3e7afc974f80049f26666102bf7d90f3aa6c1dfd957
- Parents:
- 77ed18101c07cdbb767d8703e5ea1d0f7c8b05f6
- git-author:
- Hans Schoenemann <hannes@mathematik.uni-kl.de>2013-02-18 19:27:17+01:00
- git-committer:
- Hans Schoenemann <hannes@mathematik.uni-kl.de>2013-02-18 19:27:55+01:00
- Location:
- libpolys/coeffs
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
libpolys/coeffs/coeffs.h
r77ed181 rde27d8 201 201 /// chinese remainder 202 202 /// returns X with X mod q[i]=x[i], i=0..rl-1 203 number (*cfChineseRemainder)(number *x, number *q,int rl, const coeffs);203 number (*cfChineseRemainder)(number *x, number *q,int rl, BOOLEAN sym,const coeffs); 204 204 205 205 /// degree for coeffcients: -1 for 0, 0 for "constants", ... … … 654 654 } 655 655 656 static inline number n_ChineseRemainder (number *a, number *b, int rl,const coeffs r)657 { 658 assume(r != NULL); assume(r->cfChineseRemainder != NULL); return r->cfChineseRemainder(a,b,rl, r);656 static inline number n_ChineseRemainderSym(number *a, number *b, int rl, BOOLEAN sym,const coeffs r) 657 { 658 assume(r != NULL); assume(r->cfChineseRemainder != NULL); return r->cfChineseRemainder(a,b,rl,sym,r); 659 659 } 660 660 -
libpolys/coeffs/longrat.cc
r77ed181 rde27d8 722 722 long aa=SR_TO_INT(a); 723 723 long bb=SR_TO_INT(b); 724 //return INT_TO_SR((aa-(aa%bb))/bb);725 724 return INT_TO_SR(aa/bb); 726 725 } … … 760 759 bb->debug=654324; 761 760 #endif 762 FREE_RNUMBER(bb); // omFreeBin((void *)bb, rnumber_bin);761 FREE_RNUMBER(bb); 763 762 } 764 763 u=nlShort3(u); 765 nlTest(u, 764 nlTest(u,r); 766 765 return u; 767 766 } … … 782 781 if (SR_HDL(a) & SR_HDL(b) & SR_INT) 783 782 { 784 //return INT_TO_SR(SR_TO_INT(a)%SR_TO_INT(b)); 785 if ((long)a>0L) 786 { 787 if ((long)b>0L) 788 return INT_TO_SR(SR_TO_INT(a)%SR_TO_INT(b)); 789 else 790 return INT_TO_SR(SR_TO_INT(a)%(-SR_TO_INT(b))); 791 } 792 else 793 { 794 if ((long)b>0L) 795 { 796 long i=(-SR_TO_INT(a))%SR_TO_INT(b); 797 if ( i != 0L ) i = (SR_TO_INT(b))-i; 798 return INT_TO_SR(i); 799 } 800 else 801 { 802 long i=(-SR_TO_INT(a))%(-SR_TO_INT(b)); 803 if ( i != 0L ) i = (-SR_TO_INT(b))-i; 804 return INT_TO_SR(i); 805 } 806 } 783 LONG bb=SR_TO_INT(b); 784 LONG c=SR_TO_INT(a)%bb; 785 return INT_TO_SR(c); 807 786 } 808 787 if (SR_HDL(a) & SR_INT) 809 788 { 810 /* a is a small and b is a large int: -> a or (a+b) or (a-b) */811 if ((long)a<0L)812 {813 if (mpz_isNeg(b->z))814 return nlSub(a,b,r);815 /*else*/816 return nlAdd(a,b,r);817 }818 /*else*/819 return a;820 821 789 /* a is a small and b is a large int: -> a */ 822 //return a;790 return a; 823 791 } 824 792 number bb=NULL; … … 841 809 bb->debug=654324; 842 810 #endif 843 FREE_RNUMBER(bb); // omFreeBin((void *)bb, rnumber_bin);811 FREE_RNUMBER(bb); 844 812 } 845 813 if (mpz_isNeg(u->z)) … … 851 819 } 852 820 u=nlShort3(u); 853 nlTest(u, 821 nlTest(u,r); 854 822 return u; 855 823 } … … 2632 2600 } 2633 2601 2634 number nlChineseRemainder (number *x, number *q,int rl, const coeffs C)2602 number nlChineseRemainderSym(number *x, number *q,int rl, BOOLEAN sym, const coeffs CF) 2635 2603 // elemenst in the array are x[0..(rl-1)], q[0..(rl-1)] 2636 2604 { 2637 2605 #ifdef HAVE_FACTORY 2638 2606 setCharacteristic( 0 ); // only in char 0 2607 Off(SW_RATIONAL); 2639 2608 CFArray X(rl), Q(rl); 2640 2609 int i; 2641 2610 for(i=rl-1;i>=0;i--) 2642 2611 { 2643 X[i]=C ->convSingNFactoryN(x[i],FALSE,C); // may be larger MAX_INT2644 Q[i]=C ->convSingNFactoryN(q[i],FALSE,C); // may be larger MAX_INT2612 X[i]=CF->convSingNFactoryN(x[i],FALSE,CF); // may be larger MAX_INT 2613 Q[i]=CF->convSingNFactoryN(q[i],FALSE,CF); // may be larger MAX_INT 2645 2614 } 2646 2615 CanonicalForm xnew,qnew; 2647 2616 chineseRemainder(X,Q,xnew,qnew); 2648 number n=C->convFactoryNSingN(xnew,C); 2649 number p=C->convFactoryNSingN(qnew,C); 2650 number p2=nlIntDiv(p,nlInit(2, C),C); 2651 if (nlGreater(n,p2,C)) 2652 { 2653 number n2=nlSub(n,p,C); 2654 nlDelete(&n,C); 2655 n=n2; 2656 } 2657 nlDelete(&p,C); 2658 nlDelete(&p2,C); 2617 number n=CF->convFactoryNSingN(xnew,CF); 2618 if (sym) 2619 { 2620 number p=CF->convFactoryNSingN(qnew,CF); 2621 number p2=nlIntDiv(p,nlInit(2, CF),CF); 2622 if (nlGreater(n,p2,CF)) 2623 { 2624 number n2=nlSub(n,p,CF); 2625 nlDelete(&n,CF); 2626 n=n2; 2627 } 2628 nlDelete(&p2,CF); 2629 nlDelete(&p,CF); 2630 } 2659 2631 return n; 2660 2632 #else 2661 2633 WerrorS("not implemented"); 2662 return nlInit(0, C); 2663 #endif 2634 return nlInit(0,CF); 2635 #endif 2636 } 2637 number nlChineseRemainder(number *x, number *q,int rl, const coeffs C) 2638 { 2639 return nlChineseRemainderSym(x,q,rl,TRUE,C); 2664 2640 } 2665 2641 … … 2875 2851 r->cfInt = nlInt; 2876 2852 2877 r->cfChineseRemainder=nlChineseRemainder ;2853 r->cfChineseRemainder=nlChineseRemainderSym; 2878 2854 r->cfFarey=nlFarey; 2879 2855 #ifdef HAVE_RINGS -
libpolys/coeffs/numbers.cc
r77ed181 rde27d8 77 77 return NULL; 78 78 } 79 number ndChineseRemainder(number *,number *,int, const coeffs r)79 number ndChineseRemainder(number *,number *,int,BOOLEAN,const coeffs r) 80 80 { 81 81 Werror("ChineseRemainder not implemented for (c=%d)",getCoeffType(r));
Note: See TracChangeset
for help on using the changeset viewer.