fpisom2(l,P,Q)=
{
        my(L);
        x=variable(P);
        L=factorff(lift(P),l,lift(subst(Q,x,MAXVARN)))[,1];
        L=-subst(L,x,0);
        subst(lift(L),MAXVARN,x)*Mod(1,Q);
}
fptest(l,P,Q)=
{
        my(C);
        C=fpisom2(l,P,Q);
        print(vector(length(C),i,if(subst(P,x,C[i])==0,0,error("fptest("a","l","P","Q")"))));
        C;
}
print("-------------e=0--------------");
fptest(13,x^4+2*x^2+2*x+1,x^4+2*x^3+2*x^2+1);
fptest(131,x^10+126*x^5+78,x^10+128*x^5+70);
fptest(11,x^3+2*x^2+6*x+7,x^3+5*x^2+3*x+6);
fptest(1009,x^17+x+25,x^17+42*x^16+61*x^15+952*x^14+113*x^13+398*x^12+694*x^11+238*x^10+465*x^9+308*x^8+545*x^7+145*x^6+79*x^5+896*x^4+515*x^3+63*x^2+808*x+1008);
fptest(1009,x^16+x^15+964*x^14+911*x^13+650*x^12+165*x^11+451*x^10+957*x^9+342*x^8+616*x^7+212*x^6+595*x^5+130*x^4+63*x^3+340*x^2+537*x+694,x^16+11);
fptest(1009,x^20+595*x^19+863*x^18+194*x^17+127*x^16+364*x^15+31*x^14+869*x^13+422*x^12+663*x^11+669*x^10+28*x^9+9*x^8+937*x^7+35*x^6+292*x^5+302*x^4+441*x^3+863*x^2+118*x+1,x^20+919*x^19+582*x^18+634*x^17+881*x^16+563*x^15+966*x^14+892*x^13+894*x^12+40*x^11+322*x^10+961*x^9+431*x^8+172*x^7+641*x^6+599*x^5+1001*x^4+718*x^3+582*x^2+851*x+1);
fptest(23,x^20+x+5,x^20+4*x^19+15*x^18+17*x^17+6*x^16+3*x^15+8*x^14+16*x^13+11*x^12+20*x^11+x^10+20*x^9+11*x^8+16*x^7+8*x^6+3*x^5+6*x^4+17*x^3+15*x^2+4*x+1);
fptest(10007,x^30+9557*x^29+7812*x^28+7090*x^27+7645*x^26+4110*x^25+3307*x^24+5763*x^23+7900*x^22+3872*x^21+8123*x^20+4076*x^19+3265*x^18+3777*x^17+3398*x^16+5674*x^15+4018*x^14+6820*x^13+6479*x^12+984*x^11+5652*x^10+1129*x^9+7573*x^8+1822*x^7+837*x^6+4169*x^5+4787*x^4+1616*x^3+5185*x^2+2649*x+1933,x^30+x+2);
fptest(67108879,x^30+67107859*x^29+502860*x^28+41752426*x^27+47923483*x^26+56252217*x^25+29702433*x^24+34566275*x^23+43724662*x^22+43031233*x^21+6098024*x^20+7989587*x^19+27885185*x^18+50348895*x^17+46982824*x^16+27081672*x^15+64032686*x^14+24948096*x^13+22483934*x^12+62577008*x^11+33925741*x^10+21192636*x^9+60947997*x^8+24913164*x^7+28577178*x^6+19817925*x^5+12532882*x^4+28467302*x^3+18972253*x^2+4366256*x+32457808,x^30+50150808*x^29+63186895*x^28+49093281*x^27+9998922*x^26+33903391*x^25+64572368*x^24+18465285*x^23+9365844*x^22+146044*x^21+52005244*x^20+51914117*x^19+50853399*x^18+47731827*x^17+63045151*x^16+30915147*x^15+52060592*x^14+54056376*x^13+50213837*x^12+47827172*x^11+33322080*x^10+37183875*x^9+59905379*x^8+12524247*x^7+53983516*x^6+18456131*x^5+47473382*x^4+30607833*x^3+17662487*x^2+66659374*x+2497577);
print("-------------e=1--------------");
fptest(11,x^11+x^9+9*x^7+3*x^6+8*x^5+7*x^4+5*x^3+x^2+10*x+3,x^11+10*x+1);
fptest(7,x^14+x+4,x^14+5*x^8+5*x^7+x^2+2*x+5);
fptest(5,x^30+4*x^26+4*x^25+3*x^20+3*x^16+3*x^12+3*x^8+4*x^6+3*x^4+x^2+x+4,x^30+x^3+x+3);
fptest(7,x^35+2*x^2+x+6,x^35+2*x^28+6*x^24+3*x^23+4*x^22+4*x^21+3*x^17+5*x^16+2*x^15+x^14+5*x^13+x^12+4*x^11+4*x^10+5*x^9+4*x^8+3*x^7+2*x^6+6*x^5+3*x^4+x^3+2*x^2+2*x+3);
print("-------------e=2--------------");
fptest(2,x^4+x+1,x^4+x^3+1);
fptest(5,x^25+2*x^3+3*x+2,x^25+2*x^19+3*x^17+4*x^16+2*x^15+x^14+x^13+3*x^12+2*x^11+4*x^10+2*x^8+4*x^7+4*x^5+2*x^4+3*x^3+2*x+2);
fptest(3,x^18+x^3+2*x+1,x^18+x^17+2*x^16+2*x^15+x^14+x^13+x^12+x^11+x^10+2*x^9+x^7+2*x^5+x^4+2*x^3+1);
fptest(2,x^20+x^3+1,x^20+x^14+x^13+x^10+x^7+x^5+x^4+x^3+x^2+x+1);
print("-------------e=3--------------");
fptest(2,x^8+x^4+x^3+x+1,x^8+x^6+x^5+x^3+1);
fptest(3,x^27+x^5+x^3+x^2+2*x+2,x^27+x^25+2*x^24+x^23+x^22+x^20+x^17+2*x^15+2*x^13+x^12+2*x^11+2*x^10+x^9+2*x^8+x^7+2*x^6+2*x^5+2*x^4+2);
fptest(2,x^40+x^5+x^4+x^3+1,x^40+x^38+x^37+x^36+x^35+x^34+x^32+x^31+x^30+x^29+x^28+x^25+x^23+x^19+x^16+x^15+x^13+x^11+x^10+x^9+x^7+x^5+x^3+x^2+1);
print("-------------e>=4--------------");
fptest(2,x^16+x^15+x^14+x^12+x^7+x^6+x^5+x^2+1,x^16+x^5+x^3+x+1);
fptest(2,x^32+x^7+x^3+x^2+1,x^32+x^29+x^28+x^27+x^25+x^24+x^22+x^18+x^17+x^15+x^14+x^13+x^11+x^5+x^4+x^3+1);
fptest(2,x^64+x^4+x^3+x+1,x^64+x^59+x^57+x^56+x^53+x^52+x^51+x^48+x^47+x^46+x^45+x^42+x^40+x^39+x^35+x^33+x^32+x^30+x^29+x^26+x^25+x^24+x^22+x^21+x^20+x^18+x^17+x^14+x^13+x^11+x^10+x^7+x^5+x^2+1);
fptest(2,x^48+x^5+x^3+x^2+1,x^48+x^46+x^45+x^43+x^42+x^40+x^39+x^38+x^37+x^35+x^34+x^33+x^31+x^29+x^25+x^19+x^18+x^16+x^12+x^9+x^4+x^3+1);
print("----------large p---------------");
fptest(300007,x^29+111826*x^28+192245*x^27+118259*x^26+116591*x^25+90193*x^24+179240*x^23+218526*x^22+105853*x^21+39775*x^20+120877*x^19+141649*x^18+95990*x^17+253141*x^16+113157*x^15+174998*x^14+231363*x^13+45405*x^12+279688*x^11+260746*x^10+295341*x^9+186647*x^8+1286*x^7+5846*x^6+226308*x^5+155249*x^4+161003*x^3+892*x^2+124319*x+45791 ,x^29+144375*x^28+258947*x^27+2448*x^26+213576*x^25+275912*x^24+295000*x^23+16021*x^22+62890*x^21+223177*x^20+133874*x^19+291070*x^18+268346*x^17+231097*x^16+27675*x^15+181579*x^14+144969*x^13+37193*x^12+236074*x^11+44381*x^10+87819*x^9+180121*x^8+195512*x^7+82624*x^6+113318*x^5+67595*x^4+26623*x^3+13359*x^2+191742*x+143596);
print("----------huge p---------------");
p=nextprime(3^64);P=ffinit(p,19);Q=poltschirnhaus(P);fptest(p,P,Q);
p=nextprime(3^66);P=ffinit(p,19);Q=poltschirnhaus(P);fptest(p,P,Q);
p=1208925819614629174706189;
P=x^3+154950186819311566804335*x^2+793256884583803289109038*x+629557146926040851399629;
Q=factormod(polcyclo(13),p)[3,1];
fptest(p,P,Q);
