74 if (
size() != monom.
size())
return false;
82 return ((
size() != 0) && ((std::memcmp(
mData + 1,
90 if (divisor.
size() > divisee.
size())
return false;
91 auto divisorIt = divisor.
begin();
92 auto diviseeIt = divisee.
begin();
93 auto divisorEnd = divisor.
end();
94 auto diviseeEnd = divisee.
end();
95 while (divisorIt != divisorEnd)
97 auto divisorVar = divisorIt.var();
100 if (diviseeIt == diviseeEnd)
return false;
101 if (diviseeIt.var() > divisorVar)
return false;
102 if (diviseeIt.var() == divisorVar)
break;
106 if (divisorIt.power() > diviseeIt.power())
return false;
117 for (
auto i =
begin(); i !=
end(); ++i)
126 std::function<
int(
int,
int)>,
143 template<
bool Const = false >
148 using reference =
typename std::conditional_t< Const, MonomialInt const &, MonomialInt & >;
149 using pointer =
typename std::conditional_t< Const, MonomialInt const *, MonomialInt * >;
178 template<
bool _Const = Const >
179 std::enable_if_t< _Const, reference >
185 template<
bool _Const = Const >
186 std::enable_if_t< !_Const, reference >
192 template<
bool _Const = Const >
193 std::enable_if_t< _Const, reference >
199 template<
bool _Const = Const >
200 std::enable_if_t< !_Const, reference >
206 std::pair<MonomialInt, MonomialInt>
operator*()
const {
return std::make_pair(
var(),
power()); }
226 static void display(std::ostream& o,
227 const std::vector<std::string>& varnames,
Bump-pointer arena allocator for transient inner-loop allocations.
Typed integer vocabulary for namespace newf4 (indices, monomial words, hashes, masks).
std::pair< T *, T * > allocateArray(size_t nelems)
Thin RAII wrapper around memtailor::Arena providing bump-pointer array allocation with optional mutex...
MonomialIterator & operator+=(int offset)
std::enable_if_t< !_Const, reference > var()
std::enable_if_t< _Const, reference > power() const
std::pair< MonomialInt, MonomialInt > operator*() const
std::forward_iterator_tag iterator_category
bool operator==(const MonomialIterator &rhs) const
MonomialIterator(MonomialInt *curLoc)
MonomialIterator & operator++()
std::enable_if_t< !_Const, reference > power()
typename std::conditional_t< Const, MonomialInt const &, MonomialInt & > reference
std::enable_if_t< _Const, reference > var() const
bool operator!=(const MonomialIterator &rhs) const
typename std::conditional_t< Const, MonomialInt const *, MonomialInt * > pointer
MonomialView(std::vector< MonomialInt > &data)
MonomialView(MonomialInt *data)
static MonomialView quotient(const MonomialView &left, const MonomialView &right, MemoryBlock &block)
static void display(std::ostream &o, const std::vector< std::string > &varnames, const newf4::MonomialView &m)
MonomialInt simpleDegree() const
MonomialView(std::vector< MonomialInt > data, MemoryBlock &block)
static MonomialView combine(const MonomialView &left, const MonomialView &right, bool copyLeft, bool copyRight, std::function< int(int, int)>, MemoryBlock &block)
MonomialView(const MonomialView &m, MemoryBlock &block)
auto dataBegin() const -> MonomialInt *
auto begin() const -> MonomialIterator< true >
auto end() const -> MonomialIterator< true >
auto end() -> MonomialIterator< false >
auto dataEnd() const -> MonomialInt *
static MonomialView lcm(const MonomialView &left, const MonomialView &right, MemoryBlock &block)
static MonomialView product(const MonomialView &left, const MonomialView &right, MemoryBlock &block)
auto dataEnd() -> MonomialInt *
static bool monomialDivides(const MonomialView &divisor, const MonomialView &divisee)
auto begin() -> MonomialIterator< false >
bool operator==(const MonomialView &monom) const
auto dataBegin() -> MonomialInt *
VALGRIND_MAKE_MEM_DEFINED & result(result)