Changeset de27d8 in git
- Timestamp:
- Feb 18, 2013, 7:27:17 PM (10 years ago)
- Branches:
- (u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', 'a800fe4b3e9d37a38c5a10cc0ae9dfa0c15a4ee6')
- 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
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/iparith.cc
r77ed181 rde27d8 1643 1643 x[i]=n_Init((*c)[i], coeffs_BIGINT); 1644 1644 } 1645 number n=n_ChineseRemainder (x,q,rl,coeffs_BIGINT);1645 number n=n_ChineseRemainderSym(x,q,rl,FALSE,coeffs_BIGINT); 1646 1646 for(i=rl-1;i>=0;i--) 1647 1647 { … … 1720 1720 static BOOLEAN jjCHINREM_ID(leftv res, leftv u, leftv v) 1721 1721 { 1722 lists c=(lists)u->CopyD(); // list of ideal 1722 lists c=(lists)u->CopyD(); // list of ideal or bigint/int 1723 1723 lists pl=NULL; 1724 1724 intvec *p=NULL; … … 1816 1816 for(i++;i<rl;i++) 1817 1817 { 1818 n_Delete(&(q[i]),currRing ->cf);1818 n_Delete(&(q[i]),currRing); 1819 1819 } 1820 1820 1821 omFree(x); // delete c 1821 1822 omFree(q); // delete pl 1823 if (xx!=NULL) omFree(xx); // delete c 1822 1824 return TRUE; 1823 1825 } … … 1826 1828 if (return_type==BIGINT_CMD) 1827 1829 { 1828 number n=n_ChineseRemainder (xx,q,rl,coeffs_BIGINT);1830 number n=n_ChineseRemainderSym(xx,q,rl,TRUE,coeffs_BIGINT); 1829 1831 res->data=(char *)n; 1830 1832 } … … 1843 1845 for(i=rl-1;i>=0;i--) 1844 1846 { 1845 n_Delete(&(q[i]),currRing ->cf);1847 n_Delete(&(q[i]),currRing); 1846 1848 } 1847 1849 omFree(q); -
kernel/ideals.cc
r77ed181 rde27d8 2400 2400 #endif 2401 2401 2402 #ifdef HAVE_FACTORY2403 /*22404 * xx,q: arrays of length 0..rl-12405 * xx[i]: SB mod q[i]2406 * assume: char=02407 * assume: q[i]!=02408 * destroys xx2409 */2410 ideal id_ChineseRemainder(ideal *xx, number *q, int rl, const ring R)2411 {2412 int cnt=IDELEMS(xx[0])*xx[0]->nrows;2413 ideal result=idInit(cnt,xx[0]->rank);2414 result->nrows=xx[0]->nrows; // for lifting matrices2415 result->ncols=xx[0]->ncols; // for lifting matrices2416 int i,j;2417 number *x=(number *)omAlloc(rl*sizeof(number));2418 poly *p=(poly *)omAlloc(rl*sizeof(poly));2419 for(i=cnt-1;i>=0;i--)2420 {2421 for(j=rl-1;j>=0;j--)2422 {2423 p[j]=xx[j]->m[i];2424 }2425 result->m[i]=p_ChineseRemainder(p,x,q,rl,R);2426 for(j=rl-1;j>=0;j--)2427 {2428 xx[j]->m[i]=p[j];2429 }2430 }2431 omFreeSize(p,rl*sizeof(poly));2432 omFreeSize(x,rl*sizeof(number));2433 for(i=rl-1;i>=0;i--) id_Delete(&(xx[i]),R);2434 omFreeSize(xx,rl*sizeof(ideal));2435 return result;2436 }2437 #endif2438 2439 2402 #if 0 2440 2403 /*2 -
kernel/ideals.h
r77ed181 rde27d8 204 204 poly id_GCD(poly f, poly g, const ring r); 205 205 206 ideal id_ChineseRemainder(ideal *x, number *q, int rl, const ring R);207 //ideal idChineseRemainder(ideal *x, intvec *iv); /* currently unused */208 206 ideal id_Farey(ideal x, number N, const ring r); 209 207 -
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)); -
libpolys/polys/monomials/p_polys.cc
r77ed181 rde27d8 128 128 x[j]=n_Init(0, R); 129 129 } 130 number n=n_ChineseRemainder (x,q,rl,R->cf);130 number n=n_ChineseRemainderSym(x,q,rl,TRUE,R->cf); 131 131 for(j=rl-1;j>=0;j--) 132 132 { -
libpolys/polys/simpleideals.cc
r77ed181 rde27d8 1768 1768 return(idResult); 1769 1769 } 1770 1771 ideal id_ChineseRemainder(ideal *xx, number *q, int rl, const ring r) 1772 { 1773 int cnt=IDELEMS(xx[0])*xx[0]->nrows; 1774 ideal result=idInit(cnt,xx[0]->rank); 1775 result->nrows=xx[0]->nrows; // for lifting matrices 1776 result->ncols=xx[0]->ncols; // for lifting matrices 1777 int i,j; 1778 number *x=(number *)omAlloc(rl*sizeof(number)); 1779 poly *p=(poly *)omAlloc(rl*sizeof(poly)); 1780 for(i=cnt-1;i>=0;i--) 1781 { 1782 for(j=rl-1;j>=0;j--) 1783 { 1784 p[j]=xx[j]->m[i]; 1785 } 1786 result->m[i]=p_ChineseRemainder(p,x,q,rl,r); 1787 for(j=rl-1;j>=0;j--) 1788 { 1789 xx[j]->m[i]=p[j]; 1790 } 1791 } 1792 omFreeSize(p,rl*sizeof(poly)); 1793 omFreeSize(x,rl*sizeof(number)); 1794 for(i=rl-1;i>=0;i--) id_Delete(&(xx[i]),r); 1795 omFreeSize(xx,rl*sizeof(ideal)); 1796 return result; 1797 } -
libpolys/polys/simpleideals.h
r77ed181 rde27d8 147 147 148 148 149 ideal id_ChineseRemainder(ideal *xx, number *q, int rl, const ring r); 149 150 #endif
Note: See TracChangeset
for help on using the changeset viewer.