X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=ginac%2Fpolynomial%2Fremainder.h;h=5e82149825a027bf6f3ea185e9ce51be11deb5e5;hp=c099dfe9f9d4b7caabf33f455390d860b121145d;hb=8cffcdf13d817a47f217f1a1043317d95969e070;hpb=1602530f716ba1d425a0667b897182b99c374823 diff --git a/ginac/polynomial/remainder.h b/ginac/polynomial/remainder.h index c099dfe9..5e821498 100644 --- a/ginac/polynomial/remainder.h +++ b/ginac/polynomial/remainder.h @@ -3,7 +3,7 @@ * Functions calculating remainders. */ /* - * GiNaC Copyright (C) 1999-2009 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2019 Johannes Gutenberg University Mainz, Germany * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,62 +30,7 @@ namespace GiNaC { -/** - * @brief Polynomial remainder for univariate polynomials over fields - * - * Given two univariate polynomials \f$a, b \in F[x]\f$, where F is - * a finite field (presumably Z/p) computes the remainder @a r, which is - * defined as \f$a = b q + r\f$. Returns true if the remainder is zero - * and false otherwise. - */ -static bool -remainder_in_field(umodpoly& r, const umodpoly& a, const umodpoly& b) -{ - typedef cln::cl_MI field_t; - - if (degree(a) < degree(b)) { - r = a; - return false; - } - // The coefficient ring is a field, so any 0 degree polynomial - // divides any other polynomial. - if (degree(b) == 0) { - r.clear(); - return true; - } - - r = a; - const field_t b_lcoeff = lcoeff(b); - for (std::size_t k = a.size(); k-- >= b.size(); ) { - - // r -= r_k/b_n x^{k - n} b(x) - if (zerop(r[k])) - continue; - - field_t qk = div(r[k], b_lcoeff); - bug_on(zerop(qk), "division in a field yield zero: " - << r[k] << '/' << b_lcoeff); - - // Why C++ is so off-by-one prone? - for (std::size_t j = k, i = b.size(); i-- != 0; --j) { - if (zerop(b[i])) - continue; - r[j] = r[j] - qk*b[i]; - } - bug_on(!zerop(r[k]), "polynomial division in field failed: " << - "r[" << k << "] = " << r[k] << ", " << - "r = " << r << ", b = " << b); - - } - - // Canonicalize the remainder: remove leading zeros. Give a hint - // to canonicalize(): we know degree(remainder) < degree(b) - // (because the coefficient ring is a field), so - // c_{degree(b)} \ldots c_{degree(a)} are definitely zero. - std::size_t from = degree(b) - 1; - canonicalize(r, from); - return r.empty(); -} +bool remainder_in_field(umodpoly& r, const umodpoly& a, const umodpoly& b); /** * @brief Polynomial remainder for univariate polynomials over a ring.