gcd(w, c, y);
div(w, y, z);
if ( !is_one(z) ) {
- UniFactor uf(z, i++);
+ UniFactor uf(z, i);
fvec.factors.push_back(uf);
}
+ ++i;
w = y;
UniPoly cbuf(a.R);
div(c, y, cbuf);
{
unsigned int n = a.degree();
unsigned int q = cl_I_to_uint(a.R->modulus);
- vector<cl_MI> r(n, a.R->zero());
- r[0] = a.R->one();
- Q.set_row(0, r);
- unsigned int max = (n-1) * q;
- for ( size_t m=1; m<=max; ++m ) {
- cl_MI rn_1 = r.back();
- for ( size_t i=n-1; i>0; --i ) {
- r[i] = r[i-1] - rn_1 * a[i];
- }
- r[0] = -rn_1 * a[0];
- if ( (m % q) == 0 ) {
- Q.set_row(m/q, r);
+// fast and buggy
+// vector<cl_MI> r(n, a.R->zero());
+// r[0] = a.R->one();
+// Q.set_row(0, r);
+// unsigned int max = (n-1) * q;
+// for ( size_t m=1; m<=max; ++m ) {
+// cl_MI rn_1 = r.back();
+// for ( size_t i=n-1; i>0; --i ) {
+// r[i] = r[i-1] - rn_1 * a[i];
+// }
+// r[0] = -rn_1 * a[0];
+// if ( (m % q) == 0 ) {
+// Q.set_row(m/q, r);
+// }
+// }
+// slow and (hopefully) correct
+ for ( size_t i=0; i<n; ++i ) {
+ UniPoly qk(a.R);
+ qk.set(i*q, a.R->one());
+ UniPoly r(a.R);
+ rem(qk, a, r);
+ Vec rvec;
+ for ( size_t j=0; j<n; ++j ) {
+ rvec.push_back(r[j]);
}
+ Q.set_row(i, rvec);
}
}
*u = uo;
}
factors.push_back(g);
- ++size;
+ size = 0;
+ list<UniPoly>::const_iterator i = factors.begin(), end = factors.end();
+ while ( i != end ) {
+ if ( i->degree() ) ++size;
+ ++i;
+ }
if ( size == k ) {
list<UniPoly>::const_iterator i = factors.begin(), end = factors.end();
while ( i != end ) {
}
return;
}
- if ( u->degree() < nur.degree() ) {
- break;
- }
+// if ( u->degree() < nur.degree() ) {
+// break;
+// }
}
}
if ( ++r == k ) {
UniPoly modpoly(R, prim, x);
UniFactorVec sqrfree_ufv;
squarefree(modpoly, sqrfree_ufv);
- if ( sqrfree_ufv.factors.size() == 1 ) break;
+ if ( sqrfree_ufv.factors.size() == 1 && sqrfree_ufv.factors.front().exp == 1 ) break;
}
p = next_prime(p);
R = find_modint_ring(p);
mf.factors = newfactors2;
mf.poly = answer.op(1);
tocheck.push(mf);
+ break;
}
}
else {