From 77b6a0304a48d6a306deeda18177680f16025b33 Mon Sep 17 00:00:00 2001 From: Alexei Sheplyakov Date: Mon, 25 Aug 2008 16:54:10 +0400 Subject: [PATCH] refactor gcd() a little bit (no functional changes). GiNaC tries to avoid expanding expressions while computing GCDs and applies a number of heuristics. Usually this improves performance, but in some cases it doesn't. Allow user to switch off heuristics. Part 4: refactor gcd() a little bit, so subsequent patch(es) won't be so big and ugly. --- ginac/normal.cpp | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/ginac/normal.cpp b/ginac/normal.cpp index 0cb91001..0227f4e3 100644 --- a/ginac/normal.cpp +++ b/ginac/normal.cpp @@ -1602,33 +1602,36 @@ ex gcd(const ex &a, const ex &b, ex *ca, ex *cb, bool check_args, unsigned optio // Try heuristic algorithm first, fall back to PRS if that failed ex g; bool found = heur_gcd(g, aex, bex, ca, cb, var); - if (!found) { -#if STATISTICS - heur_gcd_failed++; -#endif - g = sr_gcd(aex, bex, var); - if (g.is_equal(_ex1)) { - // Keep cofactors factored if possible - if (ca) - *ca = a; - if (cb) - *cb = b; - } else { - if (ca) - divide(aex, g, *ca, false); - if (cb) - divide(bex, g, *cb, false); - } - } else { + if (found) { + // heur_gcd have already computed cofactors... if (g.is_equal(_ex1)) { - // Keep cofactors factored if possible + // ... but we want to keep them factored if possible. if (ca) *ca = a; if (cb) *cb = b; } + return g; } +#if STATISTICS + else { + heur_gcd_failed++; + } +#endif + g = sr_gcd(aex, bex, var); + if (g.is_equal(_ex1)) { + // Keep cofactors factored if possible + if (ca) + *ca = a; + if (cb) + *cb = b; + } else { + if (ca) + divide(aex, g, *ca, false); + if (cb) + divide(bex, g, *cb, false); + } return g; } -- 2.44.0