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,Mod(1,13)*(x^4+2*x^2+2*x+1),Mod(1,13)*(x^4+2*x^3+2*x^2+1));
fptest(131,Mod(1,131)*x^10+Mod(126,131)*x^5+Mod(78,131),Mod(1,131)*x^10+Mod(128,131)*x^5+Mod(70,131));
fptest(11,Mod(1,11)*x^3+Mod(2,11)*x^2+Mod(6,11)*x+Mod(7,11),Mod(1,11)*x^3+Mod(5,11)*x^2+Mod(3,11)*x+Mod(6,11));
fptest(1009,Mod(1,1009)*(x^17+x+25),Mod(1,1009)*(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,Mod(1,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),Mod(1,1009)*(x^16+11));
fptest(1009,Mod(1,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),Mod(1,1009)*(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)*Mod(1,23),Mod(1,23)*(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,Mod(1,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),Mod(1,10007)*(x^30+x+2));
fptest(67108879,Mod(1,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),Mod(1,67108879)*(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,Mod(1,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),Mod(1,11)*(x^11+10*x+1));
fptest(7,Mod(1,7)*(x^14+x+4),Mod(1,7)*(x^14+5*x^8+5*x^7+x^2+2*x+5));
fptest(5,Mod(1,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),Mod(1,5)*(x^30+x^3+x+3));
fptest(7,Mod(1,7)*(x^35+2*x^2+x+6),Mod(1,7)*(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,Mod(1,2)*(x^4+x+1),Mod(1,2)*(x^4+x^3+1));
fptest(5,Mod(1,5)*(x^25+2*x^3+3*x+2),Mod(1,5)*(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,Mod(1,3)*(x^18+x^3+2*x+1),Mod(1,3)*(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,Mod(1,2)*(x^20+x^3+1),Mod(1,2)*(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,Mod(1,2)*(x^8+x^4+x^3+x+1),Mod(1,2)*(x^8+x^6+x^5+x^3+1));
fptest(3,Mod(1,3)*(x^27+x^5+x^3+x^2+2*x+2),Mod(1,3)*(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,Mod(1,2)*(x^40+x^5+x^4+x^3+1),Mod(1,2)*(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,Mod(1,2)*(x^16+x^15+x^14+x^12+x^7+x^6+x^5+x^2+1),Mod(1,2)*(x^16+x^5+x^3+x+1));
fptest(2,Mod(1,2)*(x^32+x^7+x^3+x^2+1),Mod(1,2)*(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,Mod(1,2)*(x^64+x^4+x^3+x+1),Mod(1,2)*(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,Mod(1,2)*(x^48+x^5+x^3+x^2+1),Mod(1,2)*(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,Mod(1,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 ),Mod(1,300007)*(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));
