- DCOUTVAR(trialcount);
- DCOUTVAR(minimalr);
- if ( minimalr <= 1 ) {
- DCOUTVAR(poly);
- DCOUT(END factor_multivariate);
- return poly;
- }
- }
-
- vector<numeric> ftilde((vnlst.nops()-1)/2+1);
- ftilde[0] = ex_to<numeric>(vnlst.op(0));
- for ( size_t i=1; i<ftilde.size(); ++i ) {
- ex ft = vnlst.op((i-1)*2+1);
- s = syms.begin();
- ++s;
- for ( size_t j=0; j<a.size(); ++j ) {
- ft = ft.subs(*s == a[j]);
- ++s;
- }
- ftilde[i] = ex_to<numeric>(ft);
- }
- DCOUTVAR(ftilde);
-
- vector<bool> used_flag((vnlst.nops()-1)/2+1, false);
- vector<ex> D(factor_count, 1);
- for ( size_t i=0; i<=factor_count; ++i ) {
- DCOUTVAR(i);
- numeric prefac;
- if ( i == 0 ) {
- prefac = ex_to<numeric>(ufaclst.op(0));
- ftilde[0] = ftilde[0] / prefac;
- vnlst.let_op(0) = vnlst.op(0) / prefac;
- continue;
- }
- else {
- prefac = ex_to<numeric>(ufaclst.op(2*(i-1)+1).lcoeff(x));
- }
- DCOUTVAR(prefac);
- for ( size_t j=(vnlst.nops()-1)/2+1; j>0; --j ) {
- DCOUTVAR(j);
- DCOUTVAR(prefac);
- DCOUTVAR(ftilde[j-1]);
- if ( abs(ftilde[j-1]) == 1 ) {
- used_flag[j-1] = true;
- continue;
- }
- numeric g = gcd(prefac, ftilde[j-1]);
- DCOUTVAR(g);
- if ( g != 1 ) {
- DCOUT(has_common_prime);
- prefac = prefac / g;
- numeric count = abs(iquo(g, ftilde[j-1]));
- DCOUTVAR(count);
- used_flag[j-1] = true;
- if ( i > 0 ) {
- if ( j == 1 ) {
- D[i-1] = D[i-1] * pow(vnlst.op(0), count);
- }
- else {
- D[i-1] = D[i-1] * pow(vnlst.op(2*(j-2)+1), count);
- }
- }
- else {
- ftilde[j-1] = ftilde[j-1] / prefac;
- DCOUT(BREAK);
- DCOUTVAR(ftilde[j-1]);
- break;
- }
- ++j;
- }
- }
- }
- DCOUTVAR(D);
-
- bool some_factor_unused = false;
- for ( size_t i=0; i<used_flag.size(); ++i ) {
- if ( !used_flag[i] ) {
- some_factor_unused = true;
- break;
- }
- }
- if ( some_factor_unused ) {
- DCOUT(some factor unused!);
- continue;