QString restpolynomial::CanZas(int d, unboundInt k){//d degree, k times restpolynomial f(*this); unboundInt chara= f.charac(); const restpolynomial zero(chara); QString res = " ", hehe; unboundInt r, charac, facNum; int count, kar; kar = k.toInt(); bool more = true; r = f.degree()/d; charac = f.leader().mod; rest one(1,chara), mem, nihil(chara), minusOne(chara); minusOne = minusOne-one; restpolynomial h(one); h.shift(d); QList<rest>::iterator iter = h.mons.begin(); QList<rest>::iterator eraser = h.mons.begin(); count = 0; while (facNum< r && more){ if (f%h == zero){ hehe = h.print(); for (int i=0; i < kar; i++){ res = res.append(hehe); res = res.append(", "); } facNum++; f = f/h; } while ((count < d) && ((*iter) == minusOne)){ iter++; count++; } if (count >= d){more = false;} else{ while (eraser != iter){ *eraser = nihil; eraser++; } *iter = (*iter) + one; eraser = h.mons.begin(); iter = h.mons.begin(); count = 0; } } return res; }
QString restpolynomial::EqDegFactor(unboundInt d){ restpolynomial f, tmp(*this); f = tmp; unboundInt chara= f.charac(); unboundInt one(1), count; unboundInt clara = chara; rest eins(one,chara); const rest zero(chara); rest minusOne(chara-one,chara); restpolynomial n(chara), m(chara), hilf(eins), master(zero), g(eins); QString res, hehe; int i=1, j=1; master = hilf; master = master.mult(minusOne); master.shift(j); while(clara.larger(j)){ j++; if (clara.larger(j)){master.expand(zero);} else{master.expand(eins);} } while (f.degree() >= (2*i)){ g = rgcd(f,master); if (g.degree()> 0){ hehe = g.CanZas(i,d); res.append(hehe); } f = f/g; i++; clara = chara*clara; j= 1; master = hilf; master = master.mult(minusOne); master.shift(j); while(clara.larger(j)){ j++; if (clara.larger(j)){master.expand(zero);} else{master.expand(eins);} } f.normalize(); } if (f.degree()>0){ hehe = f.CanZas(f.degree(),d); res.append(hehe); } return res; }
int main() { overflow(); minusOne(); shiftOne(); one(); shiftSize(); // 64bit only if (sizeof(long) == 8) { printf("64bit\n"); ul = -2; ull = -1; assert(0 < ul); assert(ul < ull); } return (0); }