- Timestamp:
- Oct 16, 2020, 2:09:11 PM (4 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- a647f6c6913c43c8b1e4d17f57b29e6c688b05c9
- Parents:
- 5de96dc9e2d1e82cec4f3996f521041242192cf8
- Location:
- factory
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
factory/cf_factory.cc
r5de96d ref4ae2 58 58 } 59 59 60 #if SIZEOF_LONG == 8 61 InternalCF * 62 CFFactory::basic ( int value ) 63 { 64 switch(currenttype) 65 { 66 case IntegerDomain: 67 return int2imm( value ); 68 // else if ( currenttype == RationalDomain ) 69 // if ( value >= MINIMMEDIATE && value <= MAXIMMEDIATE ) 70 // return int2imm( value ); 71 // else 72 // return new InternalRational( value ); 73 case FiniteFieldDomain: 74 return int2imm_p( ff_norm( value ) ); 75 case GaloisFieldDomain: 76 return int2imm_gf( gf_int2gf( value ) ); 77 #ifndef HAVE_NTL 78 case PrimePowerDomain: 79 return new InternalPrimePower( value ); 80 #endif 81 default: { 82 ASSERT( 0, "illegal basic domain!" ); 83 return 0; 84 } 85 } 86 } 87 #endif 88 60 89 InternalCF * 61 90 CFFactory::basic ( int type, long value ) -
factory/cf_factory.h
r5de96d ref4ae2 32 32 currenttype = type; 33 33 }; 34 #if SIZEOF_LONG == 8 35 static InternalCF * basic ( int value ); 36 #endif 34 37 static InternalCF * basic ( long value ); 35 38 static InternalCF * basic ( int type, long value ); -
factory/cf_inline.cc
r5de96d ref4ae2 141 141 * 142 142 **/ 143 #if SIZEOF_LONG == 8 144 CF_INLINE 145 CanonicalForm::CanonicalForm ( const int i ) 146 : value( CFFactory::basic( i ) ) 147 #else 143 148 CF_INLINE 144 149 CanonicalForm::CanonicalForm ( const int i ) 145 150 : value( CFFactory::basic( (long)i ) ) 151 #endif 146 152 { 147 153 } -
factory/fac_multivar.cc
r5de96d ref4ae2 279 279 { 280 280 return conv_to_factor_array(CFFactor(arg,1)); 281 //printf("out of primes - switch otnon-NTL\n");281 //printf("out of primes - switch to non-NTL\n"); 282 282 } 283 283 else if (((i==0)||(i!=prime_number))) -
factory/gmpext.h
r5de96d ref4ae2 19 19 mpz_is_imm( const mpz_t mpi ) 20 20 { 21 return ( mpz_cmp_si( mpi, MINIMMEDIATE ) >= 0 ) && 21 if (mpi->_mp_size==0) 22 return true; 23 if ((mpi->_mp_size>1)||(mpi->_mp_size< -1)) 24 return false; 25 return ( mpz_cmp_si( mpi, MINIMMEDIATE ) >= 0 ) && 22 26 ( mpz_cmp_si( mpi, MAXIMMEDIATE ) <= 0 ); 23 27 } -
factory/int_cf.cc
r5de96d ref4ae2 91 91 InternalCF::den () 92 92 { 93 return CFFactory::basic( 1 L);93 return CFFactory::basic( 1 ); 94 94 } 95 95 … … 133 133 { 134 134 ASSERT1( 0, "bgcd() not implemented for class %s", this->classname() ); 135 return CFFactory::basic( 0 L);135 return CFFactory::basic( 0 ); 136 136 } 137 137 … … 140 140 { 141 141 ASSERT1( 0, "bgcd() not implemented for class %s", this->classname() ); 142 return CFFactory::basic( 0 L);142 return CFFactory::basic( 0 ); 143 143 } 144 144 … … 151 151 ASSERT1( 0, "bextgcd() not implemented for class %s", this->classname() ); 152 152 a = 0; b = 0; 153 return CFFactory::basic( 0 L);153 return CFFactory::basic( 0 ); 154 154 } 155 155 … … 159 159 ASSERT1( 0, "bextgcd() not implemented for class %s", this->classname() ); 160 160 a = 0; b = 0; 161 return CFFactory::basic( 0 L);161 return CFFactory::basic( 0 ); 162 162 } 163 163 -
factory/int_poly.cc
r5de96d ref4ae2 258 258 } 259 259 else 260 return CFFactory::basic( 0 L);260 return CFFactory::basic( 0 ); 261 261 } 262 262 … … 280 280 } 281 281 else 282 return CFFactory::basic( 0 L);282 return CFFactory::basic( 0 ); 283 283 } 284 284 … … 301 301 { 302 302 delete this; 303 return CFFactory::basic( 0 L);303 return CFFactory::basic( 0 ); 304 304 } 305 305 } … … 318 318 } 319 319 else 320 return CFFactory::basic( 0 L);320 return CFFactory::basic( 0 ); 321 321 322 322 } … … 341 341 { 342 342 delete this; 343 return CFFactory::basic( 0 L);343 return CFFactory::basic( 0 ); 344 344 } 345 345 } … … 358 358 } 359 359 else 360 return CFFactory::basic( 0 L);360 return CFFactory::basic( 0 ); 361 361 362 362 } … … 385 385 { 386 386 delete this; 387 return CFFactory::basic(0 L);387 return CFFactory::basic(0); 388 388 } 389 389 else 390 390 { 391 391 decRefCount(); 392 return CFFactory::basic(0 L);392 return CFFactory::basic(0); 393 393 } 394 394 } … … 448 448 { 449 449 delete this; 450 return CFFactory::basic(0 L);450 return CFFactory::basic(0); 451 451 } 452 452 else 453 453 { 454 454 decRefCount(); 455 return CFFactory::basic(0 L);455 return CFFactory::basic(0); 456 456 } 457 457 } … … 563 563 firstTerm = 0; 564 564 delete this; 565 return CFFactory::basic( 0 L);565 return CFFactory::basic( 0 ); 566 566 } 567 567 } … … 577 577 } 578 578 else 579 return CFFactory::basic( 0 L);579 return CFFactory::basic( 0 ); 580 580 } 581 581 } … … 588 588 InternalCF * dummy = aCoeff->tryInvert(M, fail); 589 589 if (fail) 590 return CFFactory::basic( 0 L);590 return CFFactory::basic( 0 ); 591 591 if (is_imm(dummy)) dummy=this->tryMulsame(dummy, M); 592 592 else dummy = dummy->tryMulsame( this, M); … … 633 633 { 634 634 freeTermList (first); 635 return CFFactory::basic (0 L);635 return CFFactory::basic (0); 636 636 } 637 637 newcoeff= reduce (newcoeff, M); … … 666 666 firstTerm = 0; 667 667 delete this; 668 return CFFactory::basic( 0 L);668 return CFFactory::basic( 0 ); 669 669 } 670 670 } … … 680 680 } 681 681 else 682 return CFFactory::basic( 0 L);682 return CFFactory::basic( 0 ); 683 683 } 684 684 } … … 696 696 { 697 697 if ( deleteObject() ) delete this; 698 return CFFactory::basic( 0 L);698 return CFFactory::basic( 0 ); 699 699 } 700 700 InternalPoly *aPoly = (InternalPoly*)aCoeff; … … 743 743 firstTerm = 0; 744 744 delete this; 745 return CFFactory::basic( 0 L);745 return CFFactory::basic( 0 ); 746 746 } 747 747 } … … 757 757 } 758 758 else 759 return CFFactory::basic( 0 L);759 return CFFactory::basic( 0 ); 760 760 } 761 761 } … … 769 769 InternalCF * dummy = acoeff->invert(); 770 770 quot = dummy->mulsame( this ); 771 rem = CFFactory::basic( 0 L);771 rem = CFFactory::basic( 0 ); 772 772 } 773 773 else … … 800 800 quot = new InternalPoly( resultfirst, resultlast, var ); 801 801 else 802 quot = CFFactory::basic( 0 L);802 quot = CFFactory::basic( 0 ); 803 803 if ( first ) 804 804 if ( first->exp == 0 ) … … 810 810 rem = new InternalPoly( first, last, var ); 811 811 else 812 rem = CFFactory::basic( 0 L);812 rem = CFFactory::basic( 0 ); 813 813 } 814 814 } … … 860 860 quot = new InternalPoly( resultfirst, resultlast, var ); 861 861 else 862 quot = CFFactory::basic( 0 L);862 quot = CFFactory::basic( 0 ); 863 863 if ( first ) 864 864 if ( first->exp == 0 ) … … 870 870 rem = new InternalPoly( first, last, var ); 871 871 else 872 rem = CFFactory::basic( 0 L);872 rem = CFFactory::basic( 0 ); 873 873 } 874 874 else … … 889 889 return false; 890 890 quot = dummy->tryMulsame( this, M); 891 rem = CFFactory::basic( 0 L);891 rem = CFFactory::basic( 0 ); 892 892 if (fail) 893 893 return false; … … 935 935 quot = new InternalPoly( resultfirst, resultlast, var ); 936 936 else 937 quot = CFFactory::basic( 0 L);937 quot = CFFactory::basic( 0 ); 938 938 if ( first ) 939 939 if ( first->exp == 0 ) … … 946 946 if (first->coeff.isZero()) 947 947 { 948 rem= CFFactory::basic (0 L);948 rem= CFFactory::basic (0); 949 949 delete first; 950 950 } … … 953 953 } 954 954 else 955 rem = CFFactory::basic( 0 L);955 rem = CFFactory::basic( 0 ); 956 956 } 957 957 else … … 1187 1187 { 1188 1188 delete this; 1189 return CFFactory::basic( 0 L);1190 } 1191 else 1192 { 1193 decRefCount(); 1194 return CFFactory::basic( 0 L);1189 return CFFactory::basic( 0 ); 1190 } 1191 else 1192 { 1193 decRefCount(); 1194 return CFFactory::basic( 0 ); 1195 1195 } 1196 1196 } … … 1201 1201 if ( getRefCount() <= 1 ) 1202 1202 { 1203 mulTermList( firstTerm, c, 0 L);1203 mulTermList( firstTerm, c, 0 ); 1204 1204 return this; 1205 1205 } … … 1249 1249 { 1250 1250 delete this; 1251 return CFFactory::basic( 0 L);1252 } 1253 else 1254 { 1255 decRefCount(); 1256 return CFFactory::basic( 0 L);1251 return CFFactory::basic( 0 ); 1252 } 1253 else 1254 { 1255 decRefCount(); 1256 return CFFactory::basic( 0 ); 1257 1257 } 1258 1258 } … … 1275 1275 { 1276 1276 delete this; 1277 return CFFactory::basic( 0 L);1277 return CFFactory::basic( 0 ); 1278 1278 } 1279 1279 } … … 1294 1294 { 1295 1295 delete first; 1296 return CFFactory::basic( 0 L);1296 return CFFactory::basic( 0 ); 1297 1297 } 1298 1298 } … … 1314 1314 else 1315 1315 decRefCount(); 1316 return dummy; //is equal to CFFactory::basic ( 0 L) in this case1316 return dummy; //is equal to CFFactory::basic ( 0 ) in this case 1317 1317 } 1318 1318 if (is_imm(dummy)) … … 1343 1343 { 1344 1344 delete this; 1345 return CFFactory::basic( 0 L);1346 } 1347 else 1348 { 1349 decRefCount(); 1350 return CFFactory::basic( 0 L);1345 return CFFactory::basic( 0 ); 1346 } 1347 else 1348 { 1349 decRefCount(); 1350 return CFFactory::basic( 0 ); 1351 1351 } 1352 1352 } … … 1370 1370 { 1371 1371 delete this; 1372 return CFFactory::basic( 0 L);1372 return CFFactory::basic( 0 ); 1373 1373 } 1374 1374 } … … 1389 1389 { 1390 1390 delete first; 1391 return CFFactory::basic( 0 L);1391 return CFFactory::basic( 0 ); 1392 1392 } 1393 1393 } … … 1421 1421 { 1422 1422 delete this; 1423 return CFFactory::basic( 0 L);1424 } 1425 else 1426 { 1427 decRefCount(); 1428 return CFFactory::basic( 0 L);1423 return CFFactory::basic( 0 ); 1424 } 1425 else 1426 { 1427 decRefCount(); 1428 return CFFactory::basic( 0 ); 1429 1429 } 1430 1430 } … … 1447 1447 { 1448 1448 delete this; 1449 return CFFactory::basic( 0 L);1449 return CFFactory::basic( 0 ); 1450 1450 } 1451 1451 } … … 1466 1466 { 1467 1467 delete first; 1468 return CFFactory::basic( 0 L);1468 return CFFactory::basic( 0 ); 1469 1469 } 1470 1470 } … … 1505 1505 { 1506 1506 delete this; 1507 return CFFactory::basic( 0 L);1508 } 1509 else 1510 { 1511 decRefCount(); 1512 return CFFactory::basic( 0 L);1507 return CFFactory::basic( 0 ); 1508 } 1509 else 1510 { 1511 decRefCount(); 1512 return CFFactory::basic( 0 ); 1513 1513 } 1514 1514 } … … 1523 1523 { 1524 1524 delete this; 1525 return CFFactory::basic (0 L);1525 return CFFactory::basic (0); 1526 1526 } 1527 1527 if ( firstTerm && firstTerm->exp != 0 ) … … 1536 1536 { 1537 1537 delete this; 1538 return CFFactory::basic( 0 L);1538 return CFFactory::basic( 0 ); 1539 1539 } 1540 1540 } … … 1547 1547 { 1548 1548 delete this; 1549 return CFFactory::basic (0 L);1549 return CFFactory::basic (0); 1550 1550 } 1551 1551 if (fail) 1552 1552 { 1553 1553 delete first; 1554 return CFFactory::basic (0 L);1554 return CFFactory::basic (0); 1555 1555 } 1556 1556 if ( first && first->exp != 0 ) … … 1565 1565 { 1566 1566 delete first; 1567 return CFFactory::basic( 0 L);1567 return CFFactory::basic( 0 ); 1568 1568 } 1569 1569 } … … 1582 1582 ASSERT( ! c.isZero(), "divide by zero!" ); 1583 1583 if ( deleteObject() ) delete this; 1584 return CFFactory::basic( 0 L);1584 return CFFactory::basic( 0 ); 1585 1585 } 1586 1586 … … 1600 1600 { 1601 1601 delete this; 1602 return CFFactory::basic( 0 L);1603 } 1604 else 1605 { 1606 decRefCount(); 1607 return CFFactory::basic( 0 L);1602 return CFFactory::basic( 0 ); 1603 } 1604 else 1605 { 1606 decRefCount(); 1607 return CFFactory::basic( 0 ); 1608 1608 } 1609 1609 } … … 1624 1624 { 1625 1625 delete this; 1626 return CFFactory::basic( 0 L);1626 return CFFactory::basic( 0 ); 1627 1627 } 1628 1628 } … … 1643 1643 { 1644 1644 delete first; 1645 return CFFactory::basic( 0 L);1645 return CFFactory::basic( 0 ); 1646 1646 } 1647 1647 } … … 1656 1656 quot = copyObject(); 1657 1657 quot = quot->dividecoeff( cc, invert ); 1658 rem = CFFactory::basic( 0 L);1658 rem = CFFactory::basic( 0 ); 1659 1659 } 1660 1660 else if ( invert ) … … 1664 1664 else 1665 1665 rem = cc->copyObject(); 1666 quot = CFFactory::basic( 0 L);1666 quot = CFFactory::basic( 0 ); 1667 1667 } 1668 1668 else … … 1681 1681 quot = new InternalPoly( quotfirst, quotlast, var ); 1682 1682 else 1683 quot = CFFactory::basic( 0 L);1684 rem = CFFactory::basic( 0 L);1683 quot = CFFactory::basic( 0 ); 1684 rem = CFFactory::basic( 0 ); 1685 1685 } 1686 1686 } … … 1693 1693 quot = copyObject(); 1694 1694 quot = quot->dividecoeff( cc, invert ); 1695 rem = CFFactory::basic( 0 L);1695 rem = CFFactory::basic( 0 ); 1696 1696 return true; 1697 1697 } … … 1702 1702 else 1703 1703 rem = cc->copyObject(); 1704 quot = CFFactory::basic( 0 L);1704 quot = CFFactory::basic( 0 ); 1705 1705 return true; 1706 1706 } … … 1742 1742 quot = new InternalPoly( quotfirst, quotcursor, var ); 1743 1743 else 1744 quot = CFFactory::basic( 0 L);1745 rem = CFFactory::basic( 0 L);1744 quot = CFFactory::basic( 0 ); 1745 rem = CFFactory::basic( 0 ); 1746 1746 } 1747 1747 else … … 1761 1761 if (fail) 1762 1762 return false; 1763 rem = CFFactory::basic( 0 L);1763 rem = CFFactory::basic( 0 ); 1764 1764 return true; 1765 1765 } … … 1770 1770 else 1771 1771 rem = cc->copyObject(); 1772 quot = CFFactory::basic( 0 L);1772 quot = CFFactory::basic( 0 ); 1773 1773 return true; 1774 1774 } … … 1815 1815 quot = new InternalPoly( quotfirst, quotcursor, var ); 1816 1816 else 1817 quot = CFFactory::basic( 0 L);1818 rem = CFFactory::basic( 0 L);1817 quot = CFFactory::basic( 0 ); 1818 rem = CFFactory::basic( 0 ); 1819 1819 } 1820 1820 else … … 1830 1830 InternalPoly::copyTermList ( termList aTermList, termList& theLastTerm, bool negate ) 1831 1831 { 1832 if ( aTermList == 0)1832 if ( UNLIKELY(aTermList == 0) ) 1833 1833 return 0; 1834 1834 else if ( negate ) … … 1838 1838 termList targetCursor = dummy; 1839 1839 1840 while ( sourceCursor)1840 while ( LIKELY(sourceCursor) ) 1841 1841 { 1842 1842 targetCursor->next = new term( 0, -sourceCursor->coeff, sourceCursor->exp ); … … 1856 1856 termList targetCursor = dummy; 1857 1857 1858 while ( sourceCursor)1858 while ( LIKELY(sourceCursor) ) 1859 1859 { 1860 1860 targetCursor->next = new term( 0, sourceCursor->coeff, sourceCursor->exp ); … … 1900 1900 termList cursor = aTermList; 1901 1901 1902 while ( cursor)1902 while ( LIKELY(cursor) ) 1903 1903 { 1904 1904 cursor = cursor->next; … … 1912 1912 { 1913 1913 termList cursor = terms; 1914 while ( cursor)1914 while ( LIKELY(cursor) ) 1915 1915 { 1916 1916 cursor->coeff = -cursor->coeff; … … 1926 1926 termList predCursor = 0; 1927 1927 1928 while ( theCursor && aCursor ) 1929 { 1928 if (negate) 1929 while ( theCursor && aCursor ) 1930 { 1930 1931 if ( theCursor->exp == aCursor->exp ) 1931 1932 { 1932 if ( negate ) 1933 theCursor->coeff -= aCursor->coeff; 1934 else 1935 theCursor->coeff += aCursor->coeff; 1933 theCursor->coeff -= aCursor->coeff; 1936 1934 if ( theCursor->coeff.isZero() ) 1937 1935 { … … 1958 1956 else if ( theCursor->exp < aCursor->exp ) 1959 1957 { 1960 if ( negate ) 1961 if ( predCursor ) 1962 { 1963 predCursor->next = new term( theCursor, -aCursor->coeff, aCursor->exp ); 1964 predCursor = predCursor->next; 1965 } 1966 else 1967 { 1968 theList = new term( theCursor, -aCursor->coeff, aCursor->exp ); 1969 predCursor = theList; 1970 } 1971 else 1972 if ( predCursor ) 1973 { 1974 predCursor->next = new term( theCursor, aCursor->coeff, aCursor->exp ); 1975 predCursor = predCursor->next; 1976 } 1977 else 1978 { 1979 theList = new term( theCursor, aCursor->coeff, aCursor->exp ); 1980 predCursor = theList; 1981 } 1958 if ( predCursor ) 1959 { 1960 predCursor->next = new term( theCursor, -aCursor->coeff, aCursor->exp ); 1961 predCursor = predCursor->next; 1962 } 1963 else 1964 { 1965 theList = new term( theCursor, -aCursor->coeff, aCursor->exp ); 1966 predCursor = theList; 1967 } 1982 1968 aCursor = aCursor->next; 1983 1969 } … … 1987 1973 theCursor = theCursor->next; 1988 1974 } 1989 } 1990 if ( aCursor ) 1991 { 1992 if ( predCursor ) 1993 predCursor->next = copyTermList( aCursor, lastTerm, negate ); 1994 else 1995 theList = copyTermList( aCursor, lastTerm, negate ); 1996 } 1997 else if ( ! theCursor ) 1998 lastTerm = predCursor; 1999 2000 return theList; 2001 } 2002 2003 void 2004 InternalPoly::mulTermList ( termList theCursor, const CanonicalForm& coeff, const int exp ) 2005 { 2006 while ( theCursor ) 2007 { 2008 theCursor->coeff *= coeff; 2009 theCursor->exp += exp; 2010 theCursor = theCursor->next; 2011 } 2012 } 2013 2014 termList 2015 InternalPoly::divideTermList ( termList firstTerm, const CanonicalForm& coeff, termList& lastTerm ) 2016 { 2017 termList theCursor = firstTerm; 2018 lastTerm = 0; 2019 termList dummy; 2020 2021 while ( theCursor ) 2022 { 2023 theCursor->coeff /= coeff; 2024 if ( theCursor->coeff.isZero() ) 2025 { 2026 if ( theCursor == firstTerm ) 2027 firstTerm = theCursor->next; 2028 else 2029 lastTerm->next = theCursor->next; 2030 dummy = theCursor; 2031 theCursor = theCursor->next; 2032 delete dummy; 2033 } 2034 else 2035 { 2036 lastTerm = theCursor; 2037 theCursor = theCursor->next; 2038 } 2039 } 2040 return firstTerm; 2041 } 2042 2043 termList 2044 InternalPoly::divTermList ( termList firstTerm, const CanonicalForm& coeff, termList& lastTerm ) 2045 { 2046 termList theCursor = firstTerm; 2047 lastTerm = 0; 2048 termList dummy; 2049 2050 while ( theCursor ) 2051 { 2052 theCursor->coeff.div( coeff ); 2053 if ( theCursor->coeff.isZero() ) 2054 { 2055 if ( theCursor == firstTerm ) 2056 firstTerm = theCursor->next; 2057 else 2058 lastTerm->next = theCursor->next; 2059 dummy = theCursor; 2060 theCursor = theCursor->next; 2061 delete dummy; 2062 } 2063 else 2064 { 2065 lastTerm = theCursor; 2066 theCursor = theCursor->next; 2067 } 2068 } 2069 return firstTerm; 2070 } 2071 2072 termList 2073 InternalPoly::tryDivTermList ( termList firstTerm, const CanonicalForm& coeff, termList& lastTerm, const CanonicalForm& M, bool& fail ) 2074 { 2075 termList theCursor = firstTerm; 2076 lastTerm = 0; 2077 termList dummy; 2078 2079 while ( theCursor ) 2080 { 2081 theCursor->coeff.tryDiv( coeff, M, fail ); 2082 if (fail) 2083 return 0; 2084 if ( theCursor->coeff.isZero() ) 2085 { 2086 if ( theCursor == firstTerm ) 2087 firstTerm = theCursor->next; 2088 else 2089 lastTerm->next = theCursor->next; 2090 dummy = theCursor; 2091 theCursor = theCursor->next; 2092 delete dummy; 2093 } 2094 else 2095 { 2096 lastTerm = theCursor; 2097 theCursor = theCursor->next; 2098 } 2099 } 2100 return firstTerm; 2101 } 2102 2103 termList 2104 InternalPoly::modTermList ( termList firstTerm, const CanonicalForm& coeff, termList& lastTerm ) 2105 { 2106 termList theCursor = firstTerm; 2107 lastTerm = 0; 2108 termList dummy; 2109 2110 while ( theCursor ) 2111 { 2112 theCursor->coeff.mod( coeff ); 2113 if ( theCursor->coeff.isZero() ) 2114 { 2115 if ( theCursor == firstTerm ) 2116 firstTerm = theCursor->next; 2117 else 2118 lastTerm->next = theCursor->next; 2119 dummy = theCursor; 2120 theCursor = theCursor-> next; 2121 delete dummy; 2122 } 2123 else 2124 { 2125 lastTerm = theCursor; 2126 theCursor = theCursor->next; 2127 } 2128 } 2129 return firstTerm; 2130 } 2131 2132 void 2133 InternalPoly::appendTermList ( termList& first, termList& last, const CanonicalForm& coeff, const int exp ) 2134 { 2135 if ( last ) 2136 { 2137 last->next = new term( 0, coeff, exp ); 2138 last = last->next; 2139 } 2140 else 2141 { 2142 first = new term( 0, coeff, exp ); 2143 last = first; 2144 } 2145 } 2146 2147 termList 2148 InternalPoly::mulAddTermList ( termList theList, termList aList, const CanonicalForm & c, const int exp, termList & lastTerm, bool negate ) 2149 { 2150 termList theCursor = theList; 2151 termList aCursor = aList; 2152 termList predCursor = 0; 2153 CanonicalForm coeff; 2154 2155 if ( negate ) 2156 coeff = -c; 2157 else 2158 coeff = c; 2159 1975 } 1976 else 2160 1977 while ( theCursor && aCursor ) 2161 1978 { 2162 if ( theCursor->exp == aCursor->exp + exp)2163 { 2164 theCursor->coeff += aCursor->coeff * coeff;2165 if (UNLIKELY(( theCursor->coeff.isZero() )))1979 if ( theCursor->exp == aCursor->exp ) 1980 { 1981 theCursor->coeff += aCursor->coeff; 1982 if ( theCursor->coeff.isZero() ) 2166 1983 { 2167 1984 if ( predCursor ) … … 2185 2002 aCursor = aCursor->next; 2186 2003 } 2004 else if ( theCursor->exp < aCursor->exp ) 2005 { 2006 if ( predCursor ) 2007 { 2008 predCursor->next = new term( theCursor, aCursor->coeff, aCursor->exp ); 2009 predCursor = predCursor->next; 2010 } 2011 else 2012 { 2013 theList = new term( theCursor, aCursor->coeff, aCursor->exp ); 2014 predCursor = theList; 2015 } 2016 aCursor = aCursor->next; 2017 } 2018 else 2019 { 2020 predCursor = theCursor; 2021 theCursor = theCursor->next; 2022 } 2023 } 2024 if ( aCursor ) 2025 { 2026 if ( predCursor ) 2027 predCursor->next = copyTermList( aCursor, lastTerm, negate ); 2028 else 2029 theList = copyTermList( aCursor, lastTerm, negate ); 2030 } 2031 else if ( ! theCursor ) 2032 lastTerm = predCursor; 2033 2034 return theList; 2035 } 2036 2037 void 2038 InternalPoly::mulTermList ( termList theCursor, const CanonicalForm& coeff, const int exp ) 2039 { 2040 while ( LIKELY(theCursor) ) 2041 { 2042 theCursor->coeff *= coeff; 2043 theCursor->exp += exp; 2044 theCursor = theCursor->next; 2045 } 2046 } 2047 2048 termList 2049 InternalPoly::divideTermList ( termList firstTerm, const CanonicalForm& coeff, termList& lastTerm ) 2050 { 2051 termList theCursor = firstTerm; 2052 lastTerm = 0; 2053 termList dummy; 2054 2055 while ( LIKELY(theCursor) ) 2056 { 2057 theCursor->coeff /= coeff; 2058 if ( theCursor->coeff.isZero() ) 2059 { 2060 if ( theCursor == firstTerm ) 2061 firstTerm = theCursor->next; 2062 else 2063 lastTerm->next = theCursor->next; 2064 dummy = theCursor; 2065 theCursor = theCursor->next; 2066 delete dummy; 2067 } 2068 else 2069 { 2070 lastTerm = theCursor; 2071 theCursor = theCursor->next; 2072 } 2073 } 2074 return firstTerm; 2075 } 2076 2077 termList 2078 InternalPoly::divTermList ( termList firstTerm, const CanonicalForm& coeff, termList& lastTerm ) 2079 { 2080 termList theCursor = firstTerm; 2081 lastTerm = 0; 2082 termList dummy; 2083 2084 while ( LIKELY(theCursor) ) 2085 { 2086 theCursor->coeff.div( coeff ); 2087 if ( theCursor->coeff.isZero() ) 2088 { 2089 if ( theCursor == firstTerm ) 2090 firstTerm = theCursor->next; 2091 else 2092 lastTerm->next = theCursor->next; 2093 dummy = theCursor; 2094 theCursor = theCursor->next; 2095 delete dummy; 2096 } 2097 else 2098 { 2099 lastTerm = theCursor; 2100 theCursor = theCursor->next; 2101 } 2102 } 2103 return firstTerm; 2104 } 2105 2106 termList 2107 InternalPoly::tryDivTermList ( termList firstTerm, const CanonicalForm& coeff, termList& lastTerm, const CanonicalForm& M, bool& fail ) 2108 { 2109 termList theCursor = firstTerm; 2110 lastTerm = 0; 2111 termList dummy; 2112 2113 while ( theCursor ) 2114 { 2115 theCursor->coeff.tryDiv( coeff, M, fail ); 2116 if (fail) 2117 return 0; 2118 if ( theCursor->coeff.isZero() ) 2119 { 2120 if ( theCursor == firstTerm ) 2121 firstTerm = theCursor->next; 2122 else 2123 lastTerm->next = theCursor->next; 2124 dummy = theCursor; 2125 theCursor = theCursor->next; 2126 delete dummy; 2127 } 2128 else 2129 { 2130 lastTerm = theCursor; 2131 theCursor = theCursor->next; 2132 } 2133 } 2134 return firstTerm; 2135 } 2136 2137 termList 2138 InternalPoly::modTermList ( termList firstTerm, const CanonicalForm& coeff, termList& lastTerm ) 2139 { 2140 termList theCursor = firstTerm; 2141 lastTerm = 0; 2142 termList dummy; 2143 2144 while ( theCursor ) 2145 { 2146 theCursor->coeff.mod( coeff ); 2147 if ( theCursor->coeff.isZero() ) 2148 { 2149 if ( theCursor == firstTerm ) 2150 firstTerm = theCursor->next; 2151 else 2152 lastTerm->next = theCursor->next; 2153 dummy = theCursor; 2154 theCursor = theCursor-> next; 2155 delete dummy; 2156 } 2157 else 2158 { 2159 lastTerm = theCursor; 2160 theCursor = theCursor->next; 2161 } 2162 } 2163 return firstTerm; 2164 } 2165 2166 void 2167 InternalPoly::appendTermList ( termList& first, termList& last, const CanonicalForm& coeff, const int exp ) 2168 { 2169 if ( last ) 2170 { 2171 last->next = new term( 0, coeff, exp ); 2172 last = last->next; 2173 } 2174 else 2175 { 2176 first = new term( 0, coeff, exp ); 2177 last = first; 2178 } 2179 } 2180 2181 termList 2182 InternalPoly::mulAddTermList ( termList theList, termList aList, const CanonicalForm & c, const int exp, termList & lastTerm, bool negate ) 2183 { 2184 termList theCursor = theList; 2185 termList aCursor = aList; 2186 termList predCursor = 0; 2187 CanonicalForm coeff; 2188 2189 if ( negate ) 2190 coeff = -c; 2191 else 2192 coeff = c; 2193 2194 while ( theCursor && aCursor ) 2195 { 2196 if ( theCursor->exp == aCursor->exp + exp ) 2197 { 2198 theCursor->coeff += aCursor->coeff * coeff; 2199 if(UNLIKELY(( theCursor->coeff.isZero() ))) 2200 { 2201 if ( predCursor ) 2202 { 2203 predCursor->next = theCursor->next; 2204 delete theCursor; 2205 theCursor = predCursor->next; 2206 } 2207 else 2208 { 2209 theList = theList->next; 2210 delete theCursor; 2211 theCursor = theList; 2212 } 2213 } 2214 else 2215 { 2216 predCursor = theCursor; 2217 theCursor = theCursor->next; 2218 } 2219 aCursor = aCursor->next; 2220 } 2187 2221 else if ( theCursor->exp < aCursor->exp + exp ) 2188 2222 { -
factory/int_pp.cc
r5de96d ref4ae2 242 242 if ( c == this ) { 243 243 if ( deleteObject() ) delete this; 244 return CFFactory::basic( 1 L);244 return CFFactory::basic( 1 ); 245 245 } 246 246 if ( getRefCount() > 1 ) { … … 275 275 { 276 276 if ( deleteObject() ) delete this; 277 return CFFactory::basic( 0 L);277 return CFFactory::basic( 0 ); 278 278 } 279 279 … … 282 282 { 283 283 if ( deleteObject() ) delete this; 284 return CFFactory::basic( 0 L);284 return CFFactory::basic( 0 ); 285 285 } 286 286 … … 289 289 { 290 290 if ( c == this ) { 291 quot = CFFactory::basic( 1 L);292 rem = CFFactory::basic( 0 L);291 quot = CFFactory::basic( 1 ); 292 rem = CFFactory::basic( 0 ); 293 293 } 294 294 else { … … 303 303 mpz_mod( b, b, primepow ); 304 304 quot = new InternalPrimePower( b ); 305 rem = CFFactory::basic( 0 L);305 rem = CFFactory::basic( 0 ); 306 306 } 307 307 } -
factory/int_rat.cc
r5de96d ref4ae2 413 413 { 414 414 if ( deleteObject() ) delete this; 415 return CFFactory::basic( 1 L);415 return CFFactory::basic( 1 ); 416 416 } 417 417 else … … 484 484 { 485 485 if ( deleteObject() ) delete this; 486 return CFFactory::basic( 0 L);486 return CFFactory::basic( 0 ); 487 487 } 488 488 … … 491 491 quot = copyObject(); 492 492 quot = quot->dividesame( c ); 493 rem = CFFactory::basic( 0 L);493 rem = CFFactory::basic( 0 ); 494 494 } 495 495 … … 662 662 { 663 663 if ( deleteObject() ) delete this; 664 return CFFactory::basic( 0 L);664 return CFFactory::basic( 0 ); 665 665 } 666 666 mpz_init_set_si( n, cc ); … … 717 717 // => invert 718 718 if ( deleteObject() ) delete this; 719 return CFFactory::basic( 0 L);719 return CFFactory::basic( 0 ); 720 720 } 721 721 if ( invert ) … … 800 800 ASSERT( invert || ! ::is_imm( c ) || imm2int( c ) != 0, "divide by zero" ); 801 801 if ( deleteObject() ) delete this; 802 return CFFactory::basic( 0 L);802 return CFFactory::basic( 0 ); 803 803 } 804 804 … … 807 807 quot = copyObject(); 808 808 quot = quot->dividecoeff( c, invert ); 809 rem = CFFactory::basic( 0 L);809 rem = CFFactory::basic( 0 ); 810 810 } 811 811
Note: See TracChangeset
for help on using the changeset viewer.