+ return result;
+}
+
+// This one returned 0 because add::normal() incorrectly assumed that if the
+// common denominator is 1, all the denominators would be 1 (they can in fact
+// be +/-1). Fixed on Aug 2nd 2000.
+static unsigned exam_paranoia12(void)
+{
+ unsigned result = 0;
+ symbol x("x");
+
+ ex e = 2-2*(1+x)/(-1-x);
+ ex f = e.normal();
+ ex d = 4;
+
+ if (!(f - d).expand().is_zero()) {
+ clog << "normal(" << e << ") returns " << f
+ << " instead of " << d << endl;
+ ++result;
+ }
+ return result;
+}
+
+// This one caused a division by 0 because heur_gcd() didn't check its
+// input polynomials against 0. Fixed on Aug 4th 2000.
+static unsigned exam_paranoia13(void)
+{
+ unsigned result = 0;
+ symbol a("a"), b("b"), c("c");
+
+ ex e = (b*a-c*a)/(4-a);
+ ex d = (c*a-b*a)/(a-4);
+
+ try {
+ ex f = e.normal();
+ if (!(f - d).expand().is_zero()) {
+ clog << "normal(" << e << ") returns " << f
+ << " instead of " << d << endl;
+ ++result;
+ }
+ } catch (const exception &err) {
+ clog << "normal(" << e << ") throws " << err.what() << endl;
+ ++result;
+ }
+ return result;