default(parisize,"16M");
do(T, P) = lift(nffactor(nfinit(T),P)[,1]);

do(polcyclo(13,y),x^72-291*x^70+168*x^69+40380*x^68-48588*x^67-3528919*x^66+6672120*x^65+215657160*x^64-575538144*x^63-9642387423*x^62+34735086786*x^61+318475831783*x^60-1543992152304*x^59-7526047084203*x^58+51709921323996*x^57+110268119466273*x^56-1306863903654948*x^55-197687339387338*x^54+24340617020480994*x^53-37674206381844006*x^52-309388136734870296*x^51+1097175021601270233*x^50+1965430743178095924*x^49-17057741307681944498*x^48+12695705864721864408*x^47+149941210123858078557*x^46-449449010694960248724*x^45-360137445013361079753*x^44+4743771886303072354536*x^43-7957480107528139931362*x^42-20006312987061736459890*x^41+103127662005251951018025*x^40-57922725775374790826892*x^39-575374977336477060878406*x^38+1141042155363070337681952*x^37+2107623272811930164219492*x^36-8555883275792119671168984*x^35-6622038332271478648217502*x^34+67788499073804904961005264*x^33-62194621346216574281355513*x^32-298503076979390816950994616*x^31+935868776923024509133161567*x^30-602191893688026944562387144*x^29-2378403718028116295265005703*x^28+7144715267789671188060423636*x^27-8264313767410946129053876314*x^26-2988303993119955116599622124*x^25+36320303706133493815706370331*x^24-93405543373036036850518472592*x^23+137892731303549623166716872621*x^22-73374564495372153466268524626*x^21-180690507689854149951443988039*x^20+506199649638427572646328975856*x^19-511453665473658325356669209047*x^18-183193264910244539106552118338*x^17+1423840911419731272911578335897*x^16-2367314022969857609246689985844*x^15+2236677523353346112926136338695*x^14-1548489683091587051973217338168*x^13+2105049137205776145162583648404*x^12-4754348311294629767834593856064*x^11+7567806891220394207855512254933*x^10-7605431066578089163623568649610*x^9+3882625664788999249342771140339*x^8+1356469287400668040516453202076*x^7-3841355512345259545848813224621*x^6+2330504083587501732658867007532*x^5-169172628407290891217225606775*x^4-398965703199322569698936377044*x^3+198978398979453484569202793808*x^2-60597282938946837445378411698*x+12280639561039083425818958713)

do(polcyclo(5,y),x^48+12*x^46+948*x^44+7200*x^42+152361*x^40+815832*x^38+9475380*x^36+44654004*x^34+299137536*x^32+1335241260*x^30+5029216452*x^28+15282825984*x^26+37737671337*x^24+79579803672*x^22+143658877428*x^20+222699104460*x^18+303698198961*x^16+348787956312*x^14+312863646960*x^12+212893847424*x^10+111407984496*x^8+43762394880*x^6+11836253952*x^4+1904684544*x^2+136048896)

do(polsubcyclo(17,8,y),x^48-104*x^46+4664*x^44-122476*x^42+2137838*x^40-26567700*x^38+245144964*x^36-1725955872*x^34+9441692003*x^32-40611588644*x^30+138356971048*x^28-374714866240*x^26+807289826646*x^24-1380693858220*x^22+1866021172640*x^20-1978766780068*x^18+1630151673857*x^16-1029505301024*x^14+489498952012*x^12-170832297056*x^10+42133382284*x^8-6904507136*x^6+669868016*x^4-28899680*x^2+16)

do(polsubcyclo(19,6,y),x^64-6384*x^62+18261761*x^60-31231019568*x^58+35925400902280*x^56-29635423138225800*x^54+18244443900381139917*x^52-8609789775431197305288*x^50+3173715440318358526295493*x^48-926253189958924421506713024*x^46+216130107574547887816493973792*x^44-40600173780591579547211667354912*x^42+6168621134132051706341715912515370*x^40-760139434277348135867991392951415744*x^38+76052955647065900426700689494084391434*x^36-6175311843554416772593815034596603661344*x^34+406137362468726923132369140307868626461744*x^32-21559959594011538596615817038079394912524336*x^30+919122010228667702998458013093798368177514170*x^28-31251399013676293208252728256910183010646331888*x^26+840017792466500823059432352741453680599704357258*x^24-17651171087877975905738341268934550365403253370816*x^22+285940694256111366646633973109729677687028435758880*x^20-3510138236669349338216717168753743720690200440965920*x^18+31970659328447652254136627725804141367170891626180389*x^16-210577501276259853380917767547980363666145460503950096*x^14+972633665701140285445722173171004563157651576027463941*x^12-3038789368329382179884462851269146550248145196800679728*x^10+6158927928896588396670590928896385649075890120481042824*x^8-7695135079270077790657693634058524039308535641860032904*x^6+5510293734552561962521574495431679567021222445632508873*x^4-1998778331104544904932086470347413669495129560426038280*x^2+273892744995340833777347939263771534786080723599733441)

do(y^16-748*y^14+183362*y^12-18209312*y^10+854163776*y^8-19811731456*y^6+217053667328*y^4-963359277056*y^2+1401249857536,x^64-50520*x^62+1184742668*x^60-17134912892184*x^58+171302841202784230*x^56-1257730595773642457272*x^54+7035168717087126283039868*x^52-30701149599207543908253060456*x^50+106209876041363261331175274376961*x^48-294437498300554938723628131780900528*x^46+658747632370852789155278036118795891376*x^44-1194508299658559259423544698671941624911936*x^42+1758886106345358997541429698467814358261692768*x^40-2102877763749659939135348751421310839041552295168*x^38+2037272869739882513058383232251947632400144748327680*x^36-1593244672706602785431833797822694649876503949099971584*x^34+1000137401948528280332750479657406431558467421878362177792*x^32-500163144667908835632768747437877749311388525989506418016256*x^30+197386643425666396587295586758946216300889646426384501395505152*x^28-60764991565332609893728829321665731738637757708625749066895851520*x^26+14391680825163014577680716072706067747656540117078764576362349133824*x^24-2579614931575491289251668514169821364409673054271152939186037020688384*x^22+343089307498773969742537952871359998792597096472804803564329469006053376*x^20-33039893809399713739300133477660888984993965585329459081212907387885715456*x^18+2232207983615195492545494908634867604311043135572503317867045868579149840384*x^16-101424324951708207798235121163034156328923938680623314497489525231592962785280*x^14+2924360883858624736764622501847786486366632522081726107231999581887779150233600*x^12-49361130671745243582144295846906126266126621338339076133495563142930969537806336*x^10+439086453618923969602036267436177792533605154882821831371393950663185250364948480*x^8-1791241595903032942764035441499088453133177154876529243608326027299172423825358848*x^6+3156683219740128500900617761806000080676491013147893106666462267204557337199116288*x^4-2047559682560580731342531379502232338263001052780076721919148124626016913223319552*x^2+364046770867177439711105777657339121207381033680019800170419997640962734592884736)

do(y^20+1161*y^16+357096*y^12+15694096*y^8+129931776*y^4+26873856,x^20+1219*x^16+25560*x^14+1352565*x^12+15766260*x^10+468310924*x^8-1266123120*x^6+27117441616*x^4+101145350400*x^2+914700960000)

do(y^3+y^2+2,x^24+69)

do(y^4+7^2,x^28-14*x^24+20321*x^20+166992*x^16+1171296*x^12+1342208*x^8-5005056*x^4+3211264)

setrand(1);do(y^16-24*y^14+196*y^12-696*y^10+1118*y^8-840*y^6+292*y^4-40*y^2+1,x^32-208*x^30+12736*x^28-330032*x^26+4326444*x^24-32221712*x^22+147532904*x^20-437660272*x^18+869634612*x^16-1179150112*x^14+1097619208*x^12-696893680*x^10+295476664*x^8-80251024*x^6+12946192*x^4-1075648*x^2+33614)

setrand(29);do(y^16+6*y^8+1,x^64+112*x^60+4672*x^56-61472*x^52+1722640*x^48-19382720*x^44+137146112*x^40+89961600*x^36+762162272*x^32-7723483904*x^28+17460562944*x^24+100233636352*x^20+74611011840*x^16-74722169856*x^12+20300812288*x^8+1358714880*x^4+21381376)

setrand(6);do(y^16+2,x^64+192*x^62+17568*x^60+1019520*x^58+42131676*x^56+1319651424*x^54+32559096528*x^52+649228312512*x^50+10651553826426*x^48+145639438552224*x^46+1674922821206832*x^44+16307859539653056*x^42+135023677732167696*x^40+953248899971965824*x^38+5745239175305568960*x^36+29556064271185194240*x^34+129595725382952883843*x^32+483002100692576612640*x^30+1523870714370199019760*x^28+4047489983524093705152*x^26+8985812828648862019536*x^24+16525310345394167002752*x^22+24893927149975603242048*x^20+30294355815129821928192*x^18+29274561574319887883226*x^16+21987801771104340121824*x^14+12494344840480632094992*x^12+5187763623118143696192*x^10+1502211081063677383836*x^8+283567347515314680480*x^6+31146155438884525872*x^4+1543354925530003776*x^2+8057044481403681)

do(y^32+28*y^24+70*y^16+28*y^8+1, x^16-72*x^12-280*x^8+288*x^4+16)

S=x^5-5*x^3+4*x-1;
T=y^15-25*y^13+202*y^11-16*y^10-665*y^9+115*y^8+916*y^7-160*y^6-537*y^5+80*y^4+119*y^3-16*y^2-8*y+1;
lift(nfroots(T,S))

S=polsubcyclo(97,12);
lift(nfroots(subst(S,x,y),S))

S=x^9+9*x^8+36*x^7+69*x^6+36*x^5-99*x^4-303*x^3-450*x^2-342*x-226;
T=y^9-15*y^6-87*y^3-125;
lift(nffactor(T,S))

lift(nffactor(nfinit(y^2+1),(x-y)^3*(x^2+y)^4*(x^3-y*x+y)^5))

lift(factor(Mod(y,y^2+1)*x^2 + y))
lift(nffactor(nfinit(y^2+1),Mod(y,y^2+1)*x^2 + y))

factor((2*x+1)^2*(x+1)^3)

{P=x^9 - 9*x^7 + 27*x^5 - 30*x^3 + 9*x - 2/7;
K=
a^27-63*a^25+1701*a^23-25914*a^21+246960*a^19-700*a^18-1543941*a^17+21168*a^16+6465060*a^15-254016*a^14-18197865*a^13+1560552*a^12+34034175*a^11-5321988*a^10-40965225*a^9+10224144*a^8+29604330*a^7-10606932*a^6-10927980*a^5+5186160*a^4+1256409*a^3-777924*a^2+21952; #nfroots(K,P)}

\\ no factor #930
nf = nfinit(y^16-24*y^12+80*y^10-172*y^8+192*y^6-112*y^4+32*y^2+4);
P = x^16-24*x^12+80*x^10-172*x^8+192*x^6-112*x^4+32*x^2+4;
do(nf, P)
nfroots(nf, P*(x^2+y)*(x^2+2*y))

\\ Bug #959
P=x^36+12*x^35-900*x^34-585*x^33+232905*x^32-1232184*x^31-15039873*x^30+110066100*x^29+430062960*x^28-3889034165*x^27-6885371553*x^26+72277665264*x^25+75990228525*x^24-788853282390*x^23-669954405945*x^22+5321235823803*x^21+4528671343041*x^20-22706777648475*x^19-20887787332600*x^18+62214414690960*x^17+62136364754205*x^16-111213087488775*x^15-118854042392850*x^14+131983619890275*x^13+148593402314775*x^12-105099439356375*x^11-122927027339625*x^10+56029221057500*x^9+67224101142000*x^8-19578944328750*x^7-23826919393125*x^6+4261743915000*x^5+5216451275625*x^4-517952334375*x^3-635253609375*x^2+26484140625*x+32625390625;
#nfgaloisconj(nfinit([P,nfbasis([P, factor(poldisc(P), 175069)])]),1)

\\ Bug #1006
#do(y^24-12*y^23+72*y^22-286*y^21+849*y^20-2022*y^19+4034*y^18-6894*y^17+10182*y^16-13048*y^15+14532*y^14-13974*y^13+11365*y^12-7578*y^11+4038*y^10-1766*y^9+762*y^8-408*y^7+236*y^6-126*y^5+69*y^4-38*y^3+18*y^2-6*y+1,8*x^9+42*x^6+6*x^3-1)

\\ Bug #980
P=x^6 - x^5 - 76*x^4 + 60*x^3 + 1140*x^2 + 1155*x - 695
Q=a^36 - 140*a^34 + 8402*a^32 - 288950*a^30 + 6406703*a^28 - 97539585*a^26 + 1059042259*a^24 - 8396309325*a^22 + 49297808195*a^20 - 215811263825*a^18 + 704643601819*a^16 - 1705347924285*a^14 + 3017070472643*a^12 - 3809285900925*a^10 + 3299709349267*a^8 - 1836758642090*a^6 + 585303753211*a^4 - 85409835875*a^2 + 3969153125
lift(nfroots(Q,P))

\\ Bug #1023
do(a^2+13,polcyclo(13,13*x^2))

\\ Bug #1070
do(y^2-5,x^5-x^4-7*x^3+x^2+7*x-3)

\\ Bug #1075
lift(nffactor(polcyclo(21,y), x^2-y^7))

\\ Bug #1132
do(y^4-y^2+1, 3*x^3+(-12*y^3+6*y)*x^2-11*y^2*x+(2*y^3-4*y))

\\ Bug #1141
do(y^2-y+1, (x-(1+y)/3)^2*(x+2*(1+y)/3))

\\ Bug #1142
lift(nffactor(3*y^2+1, 3*x^2+1))
lift(nfroots(3*y^2+1, 3*x^2+1))

\\#1207
lift(nffactor(t^6-6*t^5-3298534883316*t^4+13194139533310*t^3+3626777458830693384585198*t^2-7253554917667983838937052*t-1329227995784915872903826851489644559,x^3-3))

\\#1276
pol=1225*x^6+1750*x^5-21675*x^4-380*x^3+110180*x^2-129720*x+48771;lift(factorback(factornf(pol,subst(pol,x,y))))

\\#1438
factor((x^2-1)*(x^2-2)*(x^2-5))

\\#1446
factor((x^80-1)/(x-1))

\\also exercises Flx_extgcd above half-gcd threshold
test(T,p)=
{
  v=polhensellift(T,lift(factormod(T,p)[,1]),p,10);
  valuation(T-factorback(v),p);
}
\\also exercises FqX_extgcd above half-gcd threshold
test(polcyclo(503),3)
test(polcyclo(211),18446744073709551667)

do(y^2-22,x^2+926246528884912528275985458927067632*y-4344481316563541186659879867597013188)

nf = nfinit(y^2+1);
do(nf,(x^2+4)/(x^2+1)^2)
do(nf,y/(x^2+1)^2)

nfroots(a^2+1,x^2)
nfroots(,x+1/2)
nfroots(,x^2-1/4)
nfroots(,(x+1)*(x^2+1))

\\#1841
K = nfinit (y^4 + 57*y^2 + 661);
P = Mod((1/11*y^2 + 56/11)*x^2 + x + 3, K.pol);
nfroots (K, P)
nfroots (K, P / pollead(P))
nfroots (K, P / (pollead(P)*y))

\\ #1956, #1957
nfroots(a^2-a+3,x^2+Mod(84*a-248/3,a^2-a+3)*x+Mod(-1440*a-73760/9,a^2-a+3))
nfroots(a^2-a+3,a*(x^2-4))

nffactor(y^2+7, (11*x)^4 - 10*(11*x)^2 + 1)

\\ #2009
nffactor(y^8-y^6+y^4-y^2+1,x^4-1)

\\ #2013
#nffactor(y^16+8, x^128+38963*x^120+443415855*x^112-3190514348*x^104+1973183073491*x^96+12244232235795*x^88+1921165187202898*x^80+36262111346728415*x^72+203445143688320136*x^64+36262111346728415*x^56+1921165187202898*x^48+12244232235795*x^40+1973183073491*x^32-3190514348*x^24+443415855*x^16+38963*x^8+1)[,2]

\\ #2083

f=x^20-15*x^19+70989*x^18-1646113*x^17+3890074283*x^16-199035549796*x^15+203804256639644*x^14-10657741285726487*x^13+9779630086245476401*x^12-457685358591718595073*x^11+211985887298317287648516*x^10-13621268697129972225420327*x^9+3065457104886066023133986949*x^8-28110542105571309419720191704*x^7+34539665971867983088754678645580*x^6-1061445386217881235978009629856081*x^5+498395492968339432558541006017143039*x^4-15789239186368833250097534490638459475*x^3+1774782276941552319212370439848636475557*x^2+4469330093535998306027448264353195140536*x+4277406750726325717327241436124994515881;
g=y^20-5*y^19-497395*y^18+43617925*y^17+92084825461*y^16-13577322967760*y^15-7694013534722665*y^14+1430561593275815035*y^13+321534254513790999596*y^12-70299145498412320125190*y^11-6894702144208513885815805*y^10+1786517983436254067840917780*y^9+72426826805051978098685836211*y^8-24338190557208310471662504670520*y^7-255231848841911020332784180965840*y^6+172908549561723112381441893500998965*y^5-1042438501414486010172621550211101919*y^4-555813027721813935650430329326884907050*y^3+6754721428610694790490649672796107843280*y^2+470810707124413968773034018937652067163520*y+3896560262532181966922924457358135376686480;
apply(poldegree, nffactor(g, f)[,1])

\\ very slow if too few maximal ideals tested
#nfroots(y^42 + 448*y^41 + 938*y^40 + 30*y^39 - 243*y^38 + 165*y^37 - 886*y^36 + 904*y^35 - 265*y^34 + 710*y^33 + 182*y^32 + 903*y^31 + 330*y^30 - 17*y^29 - 865*y^28 + 24*y^27 + 521*y^26 - 426*y^25 - 266*y^24 - 863*y^23 - 312*y^22 + 851*y^21 + 745*y^20 + 211*y^19 + 569*y^18 - 974*y^17 + 925*y^16 - 165*y^15 + 134*y^14 - 47*y^13 - 880*y^12 + 273*y^11 + 241*y^10 - 268*y^9 - 674*y^8 + 657*y^7 + 273*y^6 + 626*y^5 - 682*y^4 - 595*y^3 + 472*y^2 - 906*y - 633, x^21 + (-y + 1102609961)*x^20 - 1102609961*y*x^19 + 1897*x^18 - 1897*y*x^17 + 443738939*x^15 + (-443738939*y - 674)*x^14 + 674*y*x^13 - 1601470*x^11 + 1601470*y*x^10 - 11136*x^9 + (11136*y + 323053911)*x^8 - 323053911*y*x^7 - 3966537*x^4 + 3966537*y*x^3 + 66050170*x^2 + (-66050170*y - 850727634)*x + 850727634*y)

\\ #2224
liftall(nffactor(polcyclo(22,t),y^3-t^5*y^2+(-t^9+t^8-t^7+t^6-t^5+t^4-t^3+t^2-t+1)*y-t^4))

\\ #2345
z=165559824909720476613877584753341483144637646579557529026273280000/9*a^2+56078742454776309859578474600162204885727171768074523043664131900438884288102400000/9*a+4748774887119566581834096656075080887220928529284512367607230603029718257830039234103453402398720000/9; P = a^3-86049406274089479559709541243402288*a-9715606813562913292353222097273654531394752027484288;
liftall(nfroots(P,x^2-z))

\\ Errors, keep at end of file
polhensellift(x^2+x+1,[x+a,x+a+1],2,10)
