Macaulay2 Engine
Loading...
Searching...
No Matches

◆ find_good_divisor()

int gbA::find_good_divisor ( exponents_t e,
int x,
int degf,
int & result_gap )
private

Definition at line 1710 of file gb-default.cpp.

1714{
1715 int n = 0;
1716 int gap;
1717 int egap = degf - weightInfo_->exponents_weight(e, x);
1718
1719 VECTOR(MonomialTable::mon_term *) divisors;
1720
1722 {
1723 gbelem *tg = gb[divisor_previous];
1724 gap = tg->gap - egap;
1725 if (gap <= 0 && exponents_divide(_nvars, tg->lead, e))
1726 {
1727 result_gap = 0;
1728 return divisor_previous;
1729 }
1730 }
1731
1732 /* First search for ring divisors */
1733 if (ringtable) n += ringtable->find_divisors(-1, e, 1, &divisors);
1734
1735 /* Next search for GB divisors */
1736 n += lookup->find_divisors(-1, e, x, &divisors);
1737
1738 if (M2_gbTrace == 15 && n >= 2)
1739 {
1740 gbelem *tg = gb[divisors[n - 1]->_val];
1741 int sz = tg->size;
1742 if (sz >= 0) // was 3, why??
1743 {
1744 buffer o;
1745 o << " reducers: ";
1746 for (int j = 0; j < n; j++) o << "g" << divisors[j]->_val << " ";
1747 emit_line(o.str());
1748 }
1749 }
1750 /* Now find the minimal gap value */
1751 if (n == 0)
1752 {
1753 result_gap = 0;
1754 return -1;
1755 }
1756
1757 if (is_local_gb)
1758 {
1759 // new version, under development
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 {
1773 divisor_previous = best;
1775 result_gap = mingap; // a difference between two gaps is no
1776 // longer a "gap"...
1777 if (result_gap < 0)
1778 result_gap = 0; // I'm not sure this is needed.
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); // used to be: (! gap < mingap || gap ==
1786 // mingap && false)
1787 }
1788 }
1789 else
1790 {
1791 int newgap;
1792 int result = divisors[n - 1]->_val;
1793 gbelem *tg = gb[result];
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;
1802 tg = gb[new_val];
1803 int sz = tg->size;
1804 if (sz < minsz)
1805 {
1806 if (tg->gap <= egap)
1807 {
1808 minsz = sz;
1809 result = new_val;
1810 }
1811 }
1812 }
1813 }
1814 else
1815 // for (i=1; i<n; i++)
1816 for (int i = n - 2; i >= 0; i--)
1817 {
1818 int new_val = divisors[i]->_val;
1819 tg = gb[new_val];
1820
1821 newgap = tg->gap - egap;
1822 if (newgap <= 0)
1823 {
1824 gap = 0;
1825 result = new_val;
1826 break;
1827 }
1828 else if (newgap < gap)
1829 {
1830 result = new_val;
1831 gap = newgap;
1832 }
1833 }
1836 result_gap = gap;
1837 return result;
1838 }
1839}
char * str()
Definition buffer.hpp:72
MonomialTable * ringtable
MonomialTable * lookup
int _nvars
int divisor_previous_comp
const GBWeight * weightInfo_
bool is_local_gb
int divisor_previous
void gb(IntermediateBasis &F, int n)
static bool exponents_divide(int nvars, exponents_t a, exponents_t b)
VALGRIND_MAKE_MEM_DEFINED & result(result)
int M2_gbTrace
Definition m2-types.cpp:52
#define VECTOR(T)
Definition newdelete.hpp:78
volatile int x
void emit_line(const char *s)
Definition text-io.cpp:47

References _nvars, divisor_previous, divisor_previous_comp, emit_line(), exponents_divide(), gbA::gbelem::gap, gb(), is_local_gb, gbA::gbelem::lead, lookup, M2_gbTrace, result(), ringtable, gbA::gbelem::size, buffer::str(), VECTOR, weightInfo_, and x.

Referenced by reduce_kk(), and remainder_non_ZZ().