X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=blobdiff_plain;f=check%2Fexam_factor.cpp;h=d346efed3e07c82dce355eb63d7d0b6db440487a;hp=ce4d7027644ad1b3851b57f4456bc350734b8970;hb=3563317bdfee90677c041bf1cb585ad220e9b7d3;hpb=8cffcdf13d817a47f217f1a1043317d95969e070;ds=sidebyside diff --git a/check/exam_factor.cpp b/check/exam_factor.cpp index ce4d7027..d346efed 100644 --- a/check/exam_factor.cpp +++ b/check/exam_factor.cpp @@ -3,7 +3,7 @@ * Factorization test suite. */ /* - * GiNaC Copyright (C) 1999-2019 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2020 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 @@ -26,8 +26,6 @@ using namespace GiNaC; #include using namespace std; -static symbol w("w"), x("x"), y("y"), z("z"); - static unsigned check_factor(const ex& e) { ex ee = e.expand(); @@ -44,9 +42,11 @@ static unsigned exam_factor1() unsigned result = 0; ex e; symbol x("x"); - lst syms; - syms.append(x); - + lst syms = {x}; + + e = 1; + result += check_factor(e); + e = ex("1+x-x^3", syms); result += check_factor(e); @@ -193,13 +193,30 @@ static unsigned check_factor_expanded(const ex& e) return 0; } +static unsigned exam_factor_content() +{ + unsigned result = 0; + ex e; + symbol x("x"), y("y"); + + // Fixed 2013-07-28 by Alexei Sheplyakov in factor_univariate(). + e = ex("174247781*x^2-1989199947807987/200000000000000", lst{x}); + result += check_factor(e); + + // Fixed 2014-05-18 by Alexei Sheplyakov in factor_multivariate(). + e = ex("(x+y+x*y)*(3*x+2*y)", lst{x, y}); + result += check_factor(e); + + return result; +} + static unsigned exam_factor_wang() { // these 15 polynomials are from the appendix of P.S.Wang, // "An Improved Multivariate Polynomial Factoring Algorithm" unsigned result = 0; ex e; - symbol x("x"), y("y"), z("z"), u("u"); + symbol u("u"), w("w"), x("x"), y("y"), z("z"); e = ex("(z+x*y+10)*(x*z+y+30)*(y*z+x+20)", lst{x, y, z}); result += check_factor_expanded(e); @@ -263,33 +280,6 @@ static unsigned exam_factor_wang() return result; } -static unsigned check_factorization(const exvector& factors) -{ - ex e = dynallocate(factors); - ex ef = factor(e.expand()); - if (ef.nops() != factors.size()) { - clog << "wrong number of factors, expected " << factors.size() << - ", got " << ef.nops(); - return 1; - } - for (size_t i = 0; i < ef.nops(); ++i) { - if (find(factors.begin(), factors.end(), ef.op(i)) == factors.end()) { - clog << "wrong factorization: term not found: " << ef.op(i); - return 1; - } - } - return 0; -} - -static unsigned factor_integer_content_bug() -{ - parser reader; - exvector factors; - factors.push_back(reader("x+y+x*y")); - factors.push_back(reader("3*x+2*y")); - return check_factorization(factors); -} - unsigned exam_factor() { unsigned result = 0; @@ -299,9 +289,8 @@ unsigned exam_factor() result += exam_factor1(); cout << '.' << flush; result += exam_factor2(); cout << '.' << flush; result += exam_factor3(); cout << '.' << flush; + result += exam_factor_content(); cout << '.' << flush; result += exam_factor_wang(); cout << '.' << flush; - result += factor_integer_content_bug(); - cout << '.' << flush; return result; }