QString restpolynomial::factors(unboundInt k){ unboundInt i(1), j, nb, chara = this->charac(); const unboundInt one(1); QString res, help; restpolynomial f(*this); f = f.normalize(); if (f.degree()>0){ restpolynomial g(chara), c(chara), w(chara), y(chara), z(chara), m(chara), n(chara), hilf(chara); g = f.der(); if (g.degree()>-1){ c = rgcd(f,g); w = f/c; while(w.degree()>0){ y = rgcd(w,c); z = w/y; if(z.degree()>0){ j= one; nb = i*k; help = z.EqDegFactor(nb); res.append(help); } i++; w = y; c = c/y; } c.normalize(); if(c.degree()>0){ c = c.killZero(); help = c.factors(chara*k); res.append(help); } else{ res = res.left(res.size()-2); } } else{ f = f.killZero(); help = f.factors(chara*k); res.append(help); } } else{ res = f.print(); } return res; }
//最大公约数 int rgcd(int v1,int v2) { if(v2!=0){ return rgcd(v2,v1%v2); } return v1; }
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; }
void getE(int * e, int In){ int i; for(i = 2; i < In; i++){ //判断是否互素,最大公约数为1 if(rgcd(i, In) == 1){ *e = i; return ; } } }