gcd: allow user to override (some of) heuristics.
authorAlexei Sheplyakov <varg@theor.jinr.ru>
Mon, 25 Aug 2008 12:52:45 +0000 (16:52 +0400)
committerJens Vollinga <jensv@nikhef.nl>
Wed, 27 Aug 2008 14:22:58 +0000 (16:22 +0200)
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 1:

* add new (optional) argument to gcd() to control its behaviour.
* introduce gcd_options structure.

N.B. No actual code changes so far, the actual handling of newly introduced
options is the subject of further patches.

ginac/normal.cpp
ginac/normal.h

index e756a67..9ec7574 100644 (file)
@@ -1426,7 +1426,7 @@ static bool heur_gcd(ex& res, const ex& a, const ex& b, ex *ca, ex *cb,
  *  @param check_args  check whether a and b are polynomials with rational
  *         coefficients (defaults to "true")
  *  @return the GCD as a new expression */
-ex gcd(const ex &a, const ex &b, ex *ca, ex *cb, bool check_args)
+ex gcd(const ex &a, const ex &b, ex *ca, ex *cb, bool check_args, unsigned options)
 {
 #if STATISTICS
        gcd_called++;
index 5f44427..5a735e3 100644 (file)
 
 namespace GiNaC {
 
+/**
+ * Flags to control the behaviour of gcd() and friends
+ */
+struct gcd_options
+{
+       enum {
+               /**
+                * Usually GiNaC tries heuristic GCD algorithm before PRS.
+                * Some people don't like this, so here's a flag to disable it.
+                */
+               no_heur_gcd = 2,
+               /**
+                * GiNaC tries to avoid expanding expressions when computing
+                * GCDs. This is a good idea, but some people dislike it.
+                * Hence the flag to disable special handling of partially
+                * factored polynomials. DON'T SET THIS unless you *really*
+                * know what are you doing!
+                */
+               no_part_factored = 4
+       };
+};
+
 class ex;
 class symbol;
 
@@ -52,7 +74,8 @@ extern ex sprem(const ex &a, const ex &b, const ex &x, bool check_args = true);
 extern bool divide(const ex &a, const ex &b, ex &q, bool check_args = true);
 
 // Polynomial GCD in Z[X], cofactors are returned in ca and cb, if desired
-extern ex gcd(const ex &a, const ex &b, ex *ca = NULL, ex *cb = NULL, bool check_args = true);
+extern ex gcd(const ex &a, const ex &b, ex *ca = NULL, ex *cb = NULL,
+             bool check_args = true, unsigned options = 0);
 
 // Polynomial LCM in Z[X]
 extern ex lcm(const ex &a, const ex &b, bool check_args = true);