/* Copyright (C) 2017 William Hart This file is part of FLINT. FLINT is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. See . */ #include #include #include "flint.h" #include "mpoly.h" int mpoly_monomial_exists1(slong * index, const ulong * poly_exps, const ulong exp, slong len, ulong maskhi) { slong n = len; slong i = 0; if ((exp^maskhi) > (poly_exps[0]^maskhi)) /* greater than first term */ { (*index) = 0; return 0; } while (n > 1) /* do binary search */ { slong half = n/2; /* if in first half */ if ((exp^maskhi) > (poly_exps[i + half]^maskhi)) n = half; else /* in second half */ { n -= half; i += half; } } /* if equal to term at index i */ if (exp == poly_exps[i]) { (*index) = i; return 1; } else /* less than term at index i, but doesn't exist */ { (*index) = i + 1; return 0; } } int mpoly_monomial_exists(slong * index, const ulong * poly_exps, const ulong * exp, slong len, slong N, const ulong * cmpmask) { slong n = len; slong i = 0; if (len == 0) /* no terms to search */ { (*index) = 0; return 0; } /* specialised version if exponent vectors are one word */ if (N == 1) return mpoly_monomial_exists1(index, poly_exps, *exp, len, cmpmask[0]); if (mpoly_monomial_gt(exp, poly_exps, N, cmpmask)) /* greater than first term */ { (*index) = 0; return 0; } while (n > 1) /* do binary search */ { slong half = n/2; /* if in first half */ if (mpoly_monomial_gt(exp, poly_exps + (i + half)*N, N, cmpmask)) n = half; else /* in second half */ { n -= half; i += half; } } /* if equal to term at index i */ if (mpoly_monomial_equal(exp, poly_exps + i*N, N)) { (*index) = i; return 1; } else /* less than term at index i, but doesn't exist */ { (*index) = i + 1; return 0; } }