Index: normal.cpp =================================================================== RCS file: /home/cvs/GiNaC/ginac/normal.cpp,v retrieving revision 1.94.2.5 diff -r1.94.2.5 normal.cpp 1346a1347 > const ex& exp_a = a.op(1); 1348c1349,1351 < if (p.is_equal(b.op(0))) { --- > ex pb = b.op(0); > const ex& exp_b = b.op(1); > if (p.is_equal(pb)) { 1350d1352 < ex exp_a = a.op(1), exp_b = b.op(1); 1364c1366,1391 < } --- > } else { > ex p_co, pb_co; > ex p_gcd = gcd(p, pb, &p_co, &pb_co, check_args); > if (p_gcd.is_equal(_ex1)) { > // a(x) = p(x)^n, b(x) = p_b(x)^m, gcd (p, p_b) = 1 ==> > // gcd(a,b) = 1 > if (ca) > *ca = a; > if (cb) > *cb = b; > return _ex1; > // XXX: do I need to check for p_gcd = -1? > } else { > // there are common factors: > // a(x) = g(x)^n A(x)^n, b(x) = g(x)^m B(x)^m ==> > // gcd(a, b) = g(x)^n gcd(A(x)^n, g(x)^(n-m) B(x)^m > if (exp_a < exp_b) { > return power(p_gcd, exp_a)* > gcd(power(p_co, exp_a), power(p_gcd, exp_b-exp_a)*power(pb_co, exp_b), ca, cb, false); > } else { > return power(p_gcd, exp_b)* > gcd(power(p_gcd, exp_a - exp_b)*power(p_co, exp_a), power(pb_co, exp_b), ca, cb, false); > } > } // p_gcd.is_equal(_ex1) > } // p.is_equal(pb) > 1372a1400,1414 > } > > ex p_co, bpart_co; > ex p_gcd = gcd(p, b, &p_co, &bpart_co, false); > > if (p_gcd.is_equal(_ex1)) { > // a(x) = p(x)^n, gcd(p, b) = 1 ==> gcd(a, b) = 1 > if (ca) > *ca = a; > if (cb) > *cb = b; > return _ex1; > } else { > // a(x) = g(x)^n A(x)^n, b(x) = g(x) B(x) ==> gcd(a, b) = g(x) gcd(g(x)^(n-1) A(x)^n, B(x)) > return p_gcd*gcd(power(p_gcd, exp_a-1)*power(p_co, exp_a), bpart_co, ca, cb, false); 1374c1416,1417 < } --- > } // is_exactly_a(b) > 1384a1428,1444 > > ex p_co, apart_co; > const ex& exp_b(b.op(1)); > ex p_gcd = gcd(a, p, &apart_co, &p_co, false); > if (p_gcd.is_equal(_ex1)) { > // b=p(x)^n, gcd(a, p) = 1 ==> gcd(a, b) == 1 > if (ca) > *ca = a; > if (cb) > *cb = b; > return _ex1; > } else { > // there are common factors: > // a(x) = g(x) A(x), b(x) = g(x)^n B(x)^n ==> gcd = g(x) gcd(g(x)^(n-1) A(x)^n, B(x)) > > return p_gcd*gcd(apart_co, power(p_gcd, exp_b-1)*power(p_co, exp_b), ca, cb, false); > } // p_gcd.is_equal(_ex1)