1714{
1715 int n = 0;
1716 int gap;
1718
1719 VECTOR(MonomialTable::mon_term *) divisors;
1720
1722 {
1724 gap = tg->gap - egap;
1726 {
1727 result_gap = 0;
1729 }
1730 }
1731
1732
1734
1735
1736 n +=
lookup->find_divisors(-1, e,
x, &divisors);
1737
1739 {
1740 gbelem *tg =
gb[divisors[n - 1]->_val];
1741 int sz = tg->size;
1742 if (sz >= 0)
1743 {
1744 buffer o;
1745 o << " reducers: ";
1746 for (int j = 0; j < n; j++) o << "g" << divisors[j]->_val << " ";
1748 }
1749 }
1750
1751 if (n == 0)
1752 {
1753 result_gap = 0;
1754 return -1;
1755 }
1756
1758 {
1759
1760 int i = 0;
1761 int j = divisors[i]->_val;
1763 gap =
gb[j]->gap - egap;
1764 if (gap < 0) gap = 0;
1765 while (true)
1766 {
1767 int mingap = gap;
1768 int best = j;
1769 do
1770 {
1771 if (++i == n)
1772 {
1775 result_gap = mingap;
1776
1777 if (result_gap < 0)
1778 result_gap = 0;
1779 return best;
1780 }
1781 j = divisors[i]->_val;
1782 gap =
gb[j]->gap - egap;
1783 if (gap < 0) gap = 0;
1784 }
1785 while (gap >= mingap);
1786
1787 }
1788 }
1789 else
1790 {
1791 int newgap;
1792 int result = divisors[n - 1]->_val;
1794 gap = tg->gap - egap;
1795 if (gap <= 0)
1796 {
1797 gap = 0;
1798 int minsz = tg->size;
1799 for (int i = n - 2; i >= 0; i--)
1800 {
1801 int new_val = divisors[i]->_val;
1803 int sz = tg->size;
1804 if (sz < minsz)
1805 {
1806 if (tg->gap <= egap)
1807 {
1808 minsz = sz;
1810 }
1811 }
1812 }
1813 }
1814 else
1815
1816 for (int i = n - 2; i >= 0; i--)
1817 {
1818 int new_val = divisors[i]->_val;
1820
1821 newgap = tg->gap - egap;
1822 if (newgap <= 0)
1823 {
1824 gap = 0;
1826 break;
1827 }
1828 else if (newgap < gap)
1829 {
1831 gap = newgap;
1832 }
1833 }
1836 result_gap = gap;
1838 }
1839}
MonomialTable * ringtable
int divisor_previous_comp
const GBWeight * weightInfo_
void gb(IntermediateBasis &F, int n)
static bool exponents_divide(int nvars, exponents_t a, exponents_t b)
VALGRIND_MAKE_MEM_DEFINED & result(result)
void emit_line(const char *s)