Changeset d4b25e in git


Ignore:
Timestamp:
Mar 23, 2013, 10:17:45 AM (10 years ago)
Author:
Oleksandr Motsak <motsak@…>
Branches:
(u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', 'cbf866d4f8c3861325311c042cb2033c053453b2')
Children:
0dff6bc7750e8ac23591245c682dede4e272698b15913a696349fcc40d93d2f1edb152b6effea44a
Parents:
a601d5555bc411c2f00957c8f324951e8d88085f0f2fcb41f5f91fd6d98a4561921a7640b70e7147
Message:
Merge pull request #310 from mmklee/factory_opt_sw

Factory opt sw
Files:
3 added
11 edited

Legend:

Unmodified
Added
Removed
  • Tst/Short/factorizep_s.res.gz.uu

    ra601d5 rd4b25e  
    11begin 644 factorizep_s.res.gz
    2 M'XL("*[7N%```V9A8W1O<FEZ97!?<RYR97,`E/U-DRQ/>MV)[?DIKLU&#00<
     2M'XL("*U>3%$``V9A8W1O<FEZ97!?<RYR97,`E/U-DRQ/>MV)[?DIKLU&#00<
    33M<\O?2Q2P&)L-S<9F,[,;(V@4"5!M:@$T=$N\1=E\=X6?YSS',SRB;KJ,1E3T
    44M_Z:'9U5F^-OS.^?\;__[__SO_M<?/WY\_/V/_^7?_4\__H>__/DO?_NG/_[?
     
    13341334M_?CX67K\Z__V#^FO__L_Y"-^I%CLZK/&G^=_S^?_2D=,YS?KK_\;KC]B3I_G
    13351335MO]3S?YU[\=*\>3Q*KG;Q4<OGS_'Z(^;>RWC!<;[OFN;[J2_OIYUO]^]^_--_
    1336 M_$]_^9=__>-__\<??_BGO_JW/_[RCW_^B_VG/__XPY_^YL?YW_Y_[9U+;]Q(
    1337 MEN_W_2DXC;N01='%>$>@VE[-9C:#"\RL9J$+^2&7T"Y7PTI7DCGH[W[/.1&,
    1338 M""HE=TEM7,P%_M-3-AED_B-^<1[Q(#-]9A]N2K71T8Q6G_2D9N_-Z3BE^NCL
    1339 MI(]F2LKR11U2?/!*RM:,SA[VW!ZNLX?K[7$U7-Q?'7;&<&2,!P9PIONX;0:X
    1340 MOZ;)T<7AU24=6#JXUG)HQHM)71ZN5>13'[;3)*=>;ISEV%55,JN4*RG/8J+F
    1341 M-S5MY51MITY.9[E3E)VO:CZK&6F`W1I@Y#8:'?*IE3;0L%A.I3J[56>-G.JJ
    1342 M&5@S7Y*J:69?3CV?TF*&:K1!CB,?.RG7J=SFI3K=D&,5]$*MA=I+O5K+L2!K
    1343 M)<=2J=XJ]2*N4E5+34W:H*0-,:O)(8O)@6MQ[#O'\.JEKES=^-Y.]^8PWNN#
    1344 M'@^V^O"]E:+I_F!JL6W%A_;4E@7Z(K_7)(%Z*6R7IK-+D2[Y\=[1)<O5&J[7
    1345 MYVN)KTUT;91B^BRUXN#J=37G&^CB='Y1;<HC*X_YKOX&W>1KU2RSOXO[A'JH
    1346 M/"!75D[O#U,MX:[@_FHEW!/CX;%-PMW_C/Q/F6K4+K5Z<Y88?)=:O>L2@YYG
    1347 M3@ZW5Y^N?K]:K[Y=+:^NABY+>'^6)3P-%I(9?B$GHJSZ[=I,]O+V6E]^NOS]
    1348 M<J5S/8S#1;SDB[]3,2VAMLOTYS+2S9>?Z$BN<2[Y5J4I5J;M@^9RF=JM=':Y
    1349 MDNZG[=JU;BU*C2[,#[W[ET>\^Y?O>;>]_:1_UZO^-LF169?QD_G=+'J,MX8N
    1350 M<+G^]/OZ34]<8);1\[G^MHRWYIMY;(`-JFNA/C-/H,3[T"0W5^^NWE_=[LT1
    1351 M[)DY@FOFN*&.>4?_W=+HJ**_O*&N>T?CXWONTE$I9_3E#96XR_=TY99'06OF
    1352 M0"6>2NAS3;4;^\+9V/?L+KVM.>)=30M>OWL_WMSN7)V<NM;:#77A?*B+\\,N
    1353 MNUC(@4^[,2ZJL^Z*^FT=U\B'W$@>:,83Y]&%>FJ]YF\R7$<Z<",Y*W75>LV7
    1354 M^&\GDXN%.FN]]DVQ&S6C_:=SZ\)MXB9QB_A)VKA$>0_&K5%>B3D9?M75/^9F
    1355 MT75-\>=]%L[=3#KMP3PMQO-N2[7;MJ)$D3:Y8.:9^XD?D=C9J4#'B4+>T$PJ
    1356 MILO<E33MHFEHY/L"G=)D+4:K^2IWI:V*-#*-P9ND4NEY-YK@_66VC)^\371.
    1357 MIX9.P^12=(HS`=MH<I;F38G3Q'4:]9Q"$FM6<0J[R7HUTYR1FWB:O)NM*TVD
    1358 MTV1M<J$T4=.\4/D05)A+*XV4>*^<+8VC>6<5IY1+\S:C@YI+:\E9QNAU$$QN
    1359 MK^<J50Q>ER8'*@BS"SY*HR.=TN79<&W<OF#5;+2TCR:LM2IR,0I;Z[TT)'#;
    1360 MKS5UC3%Z:ZN6(N6-\])=+K>?RV*R>FNBE8FPC]K51KI=58Z[S,TZVM)DF5!/
    1361 MA)FX7S(#2U"W^HS`\^WH?8S2-IF,IZB]S2WC@BF0TRA3FJ7SY'V>(SE(:9>1
    1362 MVWQP+F[MDCG^I(V)V<5T#4>K3**)_U):1_6Y6;E0VE;32>*Y(F5`G;+;G21%
    1363 MFC@'EUO")5/4RDJ=MC3-3B%HFS:?RTN09%/<C,@-:P[,DT?G-'FB-"BO4ZC+
    1364 MG;&E?792P02;'?QT[29:SNB87*Z32VB)XJ@S2HW<B#J73#R7)#Y/X53J-_(1
    1365 MH[Q54J65\^C(SU1I@2/0:,4$?-6/Y!3&NUP!%U3YQ%ZL`@T36UAQ]9Y"PZLL
    1366 M;T2`/DU!6FKS$Z6`;!6^&LAO]>;C?%[4U3QS=#MO?0Y2E@YCH'A,J2B'T3M>
    1367 M[<F'3Y1WM5?%N'(:9G*T\M$X43)P@:CH)-5*.(4HG4+,O4F9P'-_T:&:)P;C
    1368 M?J+P.DXZ.LL?E_`_DAWF69DM1=&"<4QS3,'6\#_6.CB3T$J1O#S45'"499O?
    1369 M7)C6DR.M6O5F1D_GEA)*JK%/YR'-;$<)'#HE/:,E]EM51@SNO=S(\44WJJA"
    1370 MF-,6_%0UA5N<?0M^*@HVMB`S4J22H6P36O!W]5!2F2C[)3;SE@BHJJB2VCS-
    1371 MY\HIS7`OY?CB7HHS17@.?JY$S<&Z$ORZJX%SB3)A#B;67*#E`Q1TR77I@/N>
    1372 M#,5YITL(?"^E":_-UJ?V00T<X=I0(,@=6X9@-65=T"5C^5H6R2!QRV%<XBVY
    1373 MA"OI@0P^4NQKU?)#[P,YTBW=T&4+_HPG(^L^7W"AH9ARODL94NAGI?Q<,T4O
    1374 MSX'NM5-&;7F-\3DX9E-2!_L<#R]YM,SN;AF#=QSLU@*=2ZLPKQ\UB1B[N:+9
    1375 M/I?F1$-8S2)67#@:[[=,QM:VDFARFI'*`@T\IN82UZI2'.^*QLMHMN%#YSLH
    1376 M5*+G<6[+*%QF$\U%XY;!J"!2365<.DG\)*]CJ'G%=S4I]BVZW25?4XMG39H0
    1377 M.+6E+?9G[YQ$A20?,8RO^27P)S1ESK1EIZX*CGEM?909QHD#=J*H,8XRY5K.
    1378 M"54'=B;.+L89&EXD9H\\SZ90)\.4F.42FG='&VK,'NNPJU0.>J/K3,/()VA^
    1379 M8FOP<D$(CARH!BP7D:0--6!SS32ET*E$;%\-3R2T)=P\=-,E"3"9,4AL\WQ!
    1380 M1T-1L$5L;KG2VO@6L%)(_6;<W.)U5Q/O^E#/48^TT,W-S0:JT9KKI!:7B9PO
    1381 M]U'.I5'3;$FGD_:<N,C?YUCB5N</:,I^DHW=EFFX.D4YL`_8<K.AN8;I0G9O
    1382 MCL#>-9/#*MM%L-PS4:-";(-]+K1$H$++-3P]FVF2%4ODFIT\KWEY0A7;'"#;
    1383 M6Q'4;+HX+L7:.N],%[VYG(;H-/L:OOM*\LCNV?U;MJ%VQ1#UO`5T]BJ7:(H:
    1384 M:T3;[!B:YLJQ"V/;RVM>"IC91'''EE/X@\2E76HYA?N'"@K8*?OM1!,8/?L:
    1385 MW&ZGSN%-@6KE0RV-L+JBA&1\2R,RQ76NS%].)08LST&W,/<[;8YK<C?K6]K@
    1386 M/J!Y!^/F)$"BE#5<LEN:8(88>&@XE<!)-(V1I0)?-56=(UF3[4U9Z_!%RE0T
    1387 M"_=MQ#O*VISN4;[&C]Q'HXSW;08L93S-=VU\ZROC>.95@?4E=O('/`6P*\%O
    1388 M*&?$H'(\G^0&&KZ#W>)$2BB<^E%M5X>3Z95-.LTM7C(!C46\EU`C1$H=QY;9
    1389 MXD/D:;[+.68+[J;-H>P-S96W$4YG@D@+AC+HK+54>S+IG+KHR!U)"T05?!<<
    1390 M>E<'QS(M/FD\;I&BMYZEM4#H`IG6%C2/GGV)#I/[C].ZJM%A=NH\:I-+>A7Z
    1391 M4"G6I`&.1HP:'ENI\SFQU2HH"7.N*>%ARX,)FL&T\,B^H"GG^E`CHA0&6M5Z
    1392 MW\4@53*3LY9A(4<)K;A4H&7=7&)B[TB<+!PM/JWK@LW0?(0&("=!X;/):=%&
    1393 M<5NCBLQ-D^UD2Y`86CM2=^4)U;&NDFAZ1MUD:!G*U8O?T46:P](*8:YN=Y0'
    1394 M/$')LL64F+"T6$W5P_B<UG,RW2S!T.J0*8&AM*W*])N7<K0>3R4)2P$-*\:;
    1395 MFG>EC)R*UDZV.9;40XLV6F9VBZY=93K/TE5L^3=_RIB@Y^K[)&XI3VP+L0Q)
    1396 MD6]]L-6C]$Y9$HBEM)KFSJ-T[C%:=I6IN*F%%-S!=8Y-%>B8)[&;US5USAB\
    1397 M1:";:^5N3L&DLN+;/-A.SE,RGSOWI?5RLL&EXEAVIYTS!0TX41<G*Q8C!S'=
    1398 MS)1!`ID^B&.)$<DY'.^;K+6`ENDJ%"]K5>0EO;6A)-,C+W4IFK8-#BDPM(SK
    1399 M\@074:HV-8<:*?*4W;>I[[$NN$E,]G4HXI,J+D8K=O*0S8CR89K"!%OGP/D>
    1400 MCI_03":%/"W7<3/8KAZ>!%"[>6^@^@\UE%+2MM[)YN3:HS:Q&2R7DF/Y;EVM
    1401 M=^(R^--$W=G8^0I)!5IQIBTOF"P4:"VI?3%9[AQ:)B5>-S=GJ-IVELF14[:L
    1402 MQ&W^A/8\K=BL[BCT.*J*/1VG8.?RZN[(^WH4Z*H,*%Q0U7DU3Z9IVQU:[E=;
    1403 M6;&?IWF\XB%I+8*TK*+%;)[$G.0&"O.4MD[;U<'!2[-+&^K:021"H-F^JJ8B
    1404 M3<63E-)9T@Y:3M#$8LNA>J<J<_A(H5UG%KGI%)V:TUSI2,])U,2RBL@E-.EC
    1405 MU=QU39&#E19HSN>..EX'GGVF;2;(!4SIW.8&7*`IP]&`7_HIT!*2EBAE`<0%
    1406 M55V6YS,AAF+[7`'%O&O3_$`S*5J59$M+!3193YZ3PE;`*QW*A`6FZ7.LTD+1
    1407 M9L<]7D=>^-.M8D0^IS1'0_H6I)%GG#))DHKIE'?-MCF*[/W0+*54&FLMO"KG
    1408 M;,E;TG0AC=$9.\]20Z)<09T=\[0C332T<T`<K]7\<Q5H#QT4/U]_T5Y^FFW;
    1409 MSB=)LU"H:<\_1#%1<X+\"`7U]3PO>J71V1COEI5&(\L_W^]HUJ'#8D\3)QVZ
    1410 M]T23NJCX6P4GNF4V=EG-:;3\#YCP34'9Q9QDM]?0372D::&XK.4U`_[=Y1,M
    1411 M%6E@7O1)'@(IM:PGKG?F+W32D9VIZ$0-,/S/,YSL>'*T"K!JL;0@CIJ_[\LK
    1412 M96G#46*;VFMXA<X__TXE\ZP]->(XTA2=[SIQ&>4R;@5O&?$WK_AR<-0&?:09
    1413 MIHO4!IUW6+BI^2YJ!<GRS(X:>*2AR:H3Z9,1J=..O%#3B?6/FA)*T"3/A3KQ
    1414 MS[4?>;'JM:8:^)"JI([BP\2_+<Z%(X^-"]5%9?PO1_`132C,?!)MI_G#1]Y`
    1415 MCBHL*Q]9_A="^,T,1^//<CH:V51?Y<"FE.2M#9Y1+T?J/DW3MI4/J&/M20XH
    1416 MY1]=??A%M[BD%]Z0U3.Y`^]^.G$'XRU;CV9Z+B9Q!IIN1/[*-04!.<.8:(DK
    1417 MSF`I:HHS.))G9YALX']=@$KX51;Q!@Y*\8:\82?N0'-7_A%[]@OY))N>^LFQ
    1418 M-\@FHQ5O4+P`S.[`7P`4=^"9$CF0Y:V;6;-7'L6E;7:)2'-G\0CNNKCR;9R:
    1419 MV"4HX[C-)31]1%R"/\N_Q"^%T5GQBM%:;;-7)/GFL'@*C:+B%(:_YRK>0<8A
    1420 MIZ".8<=G4\_&!7$*8G7<$+'PS+\C3V7&4`"*^:DA+KN$EN]C<QGUILXN$=CI
    1421 MV"-HEAM.(IS(.&Q@?M[!_C!%_AD7<1'N#?*"D:JQV1UH-F7%'10_>A)_4/S%
    1422 M4#F@R"[^X,+QX;_\5?)-]_*.XI=W]@_O%+^O\^#]JD>>W2E^AV?_[(ZF(NV1
    1423 MYP69J(Q'_(^J\4M2/)-1/+:J\BQF6WI0WW%VE/OG5Y?\U@E=5],QWZGGD3X3
    1424 M)_K#CF5TYK_52`OB5ZUVUV'Y%Z;4R=2$>M+S4>GQ1`U9M)KXJUVK_,/@JYZ.
    1425 M[:<(5KZ-_986Q/DK7613FL.2V>4;D10&3Y@A=.VE:1EW6GG';*K3JREW&W>-
    1426 MIV.=IRZYCZAXXGZDH:ITBZ$+Q_+LI<RARH?JA%Z>,)^FLOJ9CM=E.MGU8WO)
    1427 M@<:WE_9C]YS939)P*.+74\M0BUO]D4*>.XO#7$^2.^I3^Y,_YLZ6H.$[#/^^
    1428 M`_\#1*>1\\?#5U=JFU77_K-7("BM-O?6XMH[M_9G+SY0;NJ>Y%]>+"/W_\)=
    1429 M.<I;)=OQJ/KR<F;DS+3C??F#LX=7LTYKB>_07ORB8+-,M0;55CM^*3#U':K%
    1430 M]`5>[F`[U->FROEV1Y2/D,67^H94.=_NX'>BMJ(JS.]"Y<(B]MU7DVHW=!,I
    1431 MGUX_VT:U;T.7%<,__^;:'^W;OBM]WY6/?7MS:Y[NFFIRYN@YA9W.K9S;L0ON
    1432 M8+N/NA_P#LD&QZ"V(VU41,G_4.4Y4&U'Y]7\"M`Y3FM^9^WPTFGS$\V7%C^:
    1433 MJ6/G&O%\P(R=.:+I7X8]RR[Q/+O$+KO\42O&KL?B#\@#/\**L3--+(%X;89I
    1434 MH#Q6&YZZGDP_(,BFM6M0W5=,G4'2V3N**G4QD+IW%-TC;W:IU'4UOW7QP'JI
    1435 MH^:W&IHE:5!>1\/3&1F?1YG9T,$EA?]<34E+]"J@YQ_0(^O8QMCEU)OR=&Z]
    1436 M6K'N&O&LA*)GVWWT?T9"T;/OVA2**ZI9?-&VEL?NKI?FDMT\AU)W/[_AT\?R
    1437 MB5:=S=59/J'%2YNAT.JVOJ+Y8?>*IE9G$W"M^@GXS?2.S'7#6[67[RZ']Y.5
    1438 M4S>]&]_32N'R@\P^VF==UZB73I^UK=TQW8SO6F_H=&/'=^]I]5<-.EE_X\8/
    1439 M9K3^'1U3^\Y^LJ"V)W1MB^<=EAZN6.KKAE??KGZ_DF\D]%VGY[.NTZI_7=/7
    1440 M[<L+D]<J_`6.*6^I\@-3?A8G$V@YC75:?BRS;B5/8[?-S;$\3N1UT#+UJQ:M
    1441 MN]#CIW@O]$(?6\<GQ2OB=93E*:V/>1M&TW+6\1N=6G[ZBQ^8S*=CB[15%J+:
    1442 M>R\'(:6X\$^@48&(T-I^:5/S%H=MXO+`=OK*7/D*UB4)?K+'[JGEN>*DZHM,
    1443 M4WV9Q4YF>ZQEI<ORXF;:GLWQ@E'>+J(.-]NK1WY4*E\J+YQ-^=EBU]5=6M`O
    1444 M'34GEYJ/TWK$47W.4W?S^W;!\0IE"KR7H/G7Y.C_9.VC+/^T%>_.66N6]D4&
    1445 M7@2-\AV=A1_BN,`_'RL%]JGDH;NTI?,XN_-1><5-W%+>,#+-*4<KS_#V_F>Z
    1446 M7&1>.O[HYGR\J4,0%.B)_TE#/D_VE,_)\<;.Z60WS/+79(]/L)HN.$P9EWA8
    1447 M728C@^G#HT;5.9SY`:,2Z9\F\\A<0YO.J4SXQTW<CG1WU)K=V=;\@.FM-+O[
    1448 MU<0S#-U`NJ_8:7X<(B"R7R`A.7Z3V<"%[+V\XM0XC`-_)T.W-VU&)2\TT6W?
    1449 MVMLKLC5Q&MMWA'3W[3QM7YKRVCX-Q]YXTN.W#I2*3M_T%DBG<K3D`_Z=P3:M
    1450 ML"?]C;]_3TU\:OCIOB^HK:M=,PGX*#9M'<43OB?).V=Y^1?]6K!QLB`FLP,?
    1451 M3WNZ?\#6N9PMZ22/63)VC7FO3?8O&).RU*OQ5%@[S^WV%+7[YZ>QO%',VP[K
    1452 MJ9]3R0;V<N)?-SH]GC!<YUINF\A26SG4J-TT[<DSVFPQ)J"02-UTW'6F=C\@
    1453 M<9"!%G.2FAL&_VX3[T1+W4^`=)[BGIS"NLYX[O_I%+;[GI_V)5O(LSK^+HN\
    1454 MKKO(^TU<<ASEH9ZXT"-WM,[OOENF_4L30T=SXA]:.U%%-,[TJZ*^F([I\/@$
    1455 M9><-WFWN1(%/@7&BT-_61_P-,IX,JB[6N[TZ_>*]NJD/=MX:FLQ2Y]#B2A,O
    1456 M\D[C4V;J'*3LCET\.[:[G3'](W;&<ER?S/-"N]OTTG73BX>9O*0N<;V*=^6D
    1457 M7/:]\^2;TC#/Y7.)O!PUA@ZQ,_2+M\5\MXJ5'QG8A;S\`H#I=@+S/(]_/H/_
    1458 M]MV6X)IG34O^^VRCN^N3SL?*SEG>[L_OA,K3$R=?-L]/L/G%$KHXQB`O2*RR
    1459 M^1_DAE!NX'EUI!)^VZ9]A$M2C-T]872VG/*T7<VCTULE-A>D4DFNLXGE-Q^-
    1460 MO-*8FY!+\EN1K42^)A^3/.%_4!K"Y5[/U@:ZG:95MB?/9;KGN,QOP'9MK7II
    1461 M?E"JI6[3828I=;%KI+SMK9)S!=#66GRYR[6[?"C0VUUF3+[4ROT:MUJCZ7NS
    1462 ME$9MNGM#:3>_A=GN57,FW/JFMKHY?Y<D7KRI^C]]"=KMX>JX36^WW;C+1[?K
    1463 M:@=U&[PZ_H!QB29M5.MNFXZJWNW44?U/S=ABEZNB:W.<53+WJ9_E;)-03O3[
    1464 M>4ZW@ZQ_Q`[R2^<YW:ZQ+KO&%\O$<X55_J1QE:?7Y?@DY=V,H=M/UB_>3]X-
    1465 MLMWVX[1LLP;>K:H;JYRBIV/UNG4[#N25T_'QIU:UC9TGI3*(\1?-V'1C(KKR
    1466 M:I@\)5KD.X8=;&?X].)!:FZPG.+XB=O(W]&MV(X#C<=H_C(M'<J?CPY%M3&=
    1467 M,Z5POB61OTKWQ_8CN@UUG5Z:C,[W([9]B.FY>Q"FVZ`WLVIS0/[Z&7^A;]LG
    1468 M+R\EE!GA_NK/54!W8C\@D^C='*I4NZQCM\!=2E-SZ>,YQ72[^&9V=14H$UW&
    1469 MD=V*LJVT37@[US3=CKN9?\0#J3JM;8:B5#+)#]Y2S4^8*G:M2/4QQGB2%++R
    1470 MO@4GD:D]OC#=5KQ1/V!N._;/7Z;NU.;3Z?24"53G&LI4$XPY'Z1M8-K>]>@0
    1471 M.MNI'[!DI3ZFGD^=6U'/L34>[W35F5YUP<_SN183,@N;3-X$YUEXU_[.:NK%
    1472 MTP^_"_GD\FHI1WWSHKS5FB_QY/N)=W.,[MQ"J[+\ML/(#S/I3YI)U>9W&_CF
    1473 MQ1OXK?M/;N3'7H_]N(?IMM%-V4:?B,]*RIF<YK=8^8<VK"E9*+]K/O&[NN+Z
    1474 MD3I&#OB]O"Y\NYUQ\_*=<6Y*<Z-<1_,BJ;S+2M*XW+9NZ2,4!>+)=8_I]L"-
    1475 MWIXU1S+,,HQJJ%C=WK9Y\=[V+MLNNS7=2"/B,K7!D[DL=P./-S8D3LC.>!I"
    1476 M@YKC4X'?;7*;LLE-LW8[J<;1V?V'[&9W$*.N$W<KI]:99H^19EC=>S\CK0IC
    1477 MG>TL\DYE2111SJURY?8D+M#.Y96?J?N`O.XS-4$E3M/J4^(TK3G\HT9T7ENK
    1478 M9![V#]X2>N@XW6Z]X=WZ_8-$T^V_&]Y_SP\5!WY:=77SZNQU#L-[YK_>?9'G
    1479 MAORC.+PG?D/_-=/9]ECQ0JZ\XB69?-\I<CYIA7KF0A78BZ_EZ_E*:3E)LMAL
    1480 M&<=NORSSB2I=^-]@H,F:"N/%#>GPOY>0C_A?3I0#_E>2+FYXBX3_04,I6Y5N
    1481 M168[U&LJAZ*92-:V6L\>-QO>%[_][>MP<??E,-R](>SA;O@+Q]VL?^:"N]&8
    1482 M5_5N\MS_KB?^-=GL?KT_?/QUN/CS-'V]^?+AMU__?#7<M;1D(]]TYNW;93?S
    1483 MY;O;X>)>+GTF-W\U_,N;P=4ZG>9;:JW\6W/\?PW!^5SR[NO'F[^V4JGX[]NI
    1484 MG_]`8[T^;^RG[K)4_2!.^^O4D+]_9T,\9KN%S58M@@._1B>68VOFVQ[^0Y/0
    1485 MA2YTH0M=Z$(7NM"%+G2A"UWH0A>ZT(4N=*$+7>A"%[K0A2YTH0M=Z$(7NM"%
    1486 M+G2A"UWH0A>ZT(4N=*$+7>A"%[K0A2YTH0M=Z$(7NM"%+G2A"UWH0A>ZT(4N
     1336M_$]_^9=__>-__\<??_BGO_JW/_[RCW_^B_VG/__XPY_^YL?YW_Y_[9U+;^0X
     1337MEN_W_2DTC;MPAJPL\4VA.G,UF]D,+C"SFH4OG`]G&965U<@(.R0-^KO?<PXI
     1338MDN&P765WXF(N\._JM"5*\2=_/`\^0A$^LP\WI=CH:'JK5SVHT7NS'H>IO'6V
     1339MZJ,9)F7YH@Y3?/!(RM:,QA[VW!ZNL8=K[7'97>PO#R?&<&2,!P9PIGFYK0;8
     1340M7]'DZ.+P9D<'E@ZNM!R:_F)0N\.5BGSJPW8ZR:F7&T<Y=D65S"KE2LJ3F*CY
     1341M34U;.57;J9/34>X49>>+FD]J1AI@MP88N8U&AW1JI0TT+.93J<YNU5DCI[IH
     1342M!M9,EZ1JFMGG4\^GM)BA&FV0X\C'3LKUE&_S4IVNR+$(>J'60NVE7JWE6)"U
     1343MDF.I5&^5>A%74U&;JIJT04D;8E*30Q:3`U?CV#>.X=5K7;FX\=X.>W/H]_J@
     1344M^X,M/KRW4C3L#Z84VUI\J._:LD!;Y$\U2:!<"MNEX>Q2I$N^WSNZ9+E:P_7Z
     1345M=&WB:P-=ZZ687DNM.+AR78WI!KHXG%]4FW+/RGVZJ[U!5_E2-<N<WL5]0CV4
     1346MWR!75D[WAZ&4<%=P?]42[HG^\-@FX<E_1OY3IABU2:W>G"4&WZ16[YK$H,>1
     1347MD\/-Y9?+^\OE\NYR?G/9-5G"^[,LX6FPD,SP"SD19=6[*S/8W<V5WGW9W>\6
     1348M.M==WUW$'5^\IV):0FV7Z>?<T\V[+W0DUSB7W!5IBI5A>Z'9S4.]E<YV"^E^
     1349MV:Y=Z=JBJ=*%\:%W__*(=__RG'?;FR_Z7B_Z;I`CL\S]%W-O9MW'&T,7N%Q_
     1350MN5_N],`%9NX]G^N[N;\Q=^:Q`3:HIH7ZS#R!$N]#DUQ??KC\>'ES:HY@S\P1
     1351M7#7'-77,!_IW0Z.CBGYW35WW@<;'C]REO5+.Z-TUE;C=1[IRPZ.@-6.@$D\E
     1352M]+JJVHQ]X6SL>W&7WI0<\:&D!:\_?.RO;TY<G9RZU-H,=>%\J(OCPRZ[F,F!
     1353MUY,Q+JJS[HKZ?1G7R(=<3QYH^I7SZ$P]M5SQ)QFN(AVXGIR5NFJYXDO\V\GD
     1354M8J;.6JY\56Q&S6C_Z=PZ<YNX2=PB?B>MGZ,\!^.6*(_$K(8?=?6/N5ET35/\
     1355M>9^%<S>33GLP3XOQO-NFTFU;T421-KA@QI'[B=\BL:-3@8XG"GE#,ZDX[5)7
     1356MTK2+IJ&1[PMT2I.U&*WFJ]R5MBC2R-0';R8UY9YWO0G>[Y)E_.#M1.=T:N@T
     1357M#&Z*3G$F8!L-SM*\:>(T<37U>IS")-8LXA1V@_5JI#DC-W$=O!NMRTVDT\G:
     1358MR87<1$WS0N5#4&',K312XKUR-C>.YIU%G%(NS=N,#FK,K25GZ:/703"YO9ZK
     1359M5#%XG9L<J"",+O@HC8YT2I='P[5Q^X)5H]'2/IJPEJK(Q2ALK??2D,!MO]+4
     1360M-<;HK:U:BI0WSDMWN=1^+HN3U5L3K4R$?=2N--*=5.6XR]RHH\U-E@GU0)@3
     1361M]TMB8`GJ5I\0>+X=O8]1VB:3\2EJ;U/+N&`(Y#3*Y&;I-'D?QT@.DMMEY#8?
     1362MG(M;NV2./VAC8G(Q7<+1*C/1Q'_.K:/ZW*A<R&TKZ63BN2)E0#TEMULE19HX
     1363M!I=:PB5#U,I*G38WS0XA:#MM/I>6().=XF9$;EAU8)X\.J?)$Z5!:9U"7>Z,
     1364MS>VS@PHFV.3@ZY4;:#FCX^12G5Q"2Q1'G9%KY$:4N>3$<TGB\Q1.N7XC+S'*
     1365M6R556CF/COQ,Y18X`HU63,!7?4].8;Q+%7!!D9_8BU6@86(+*Z[>4VAXE>2-
     1366M"-"K*4AS;7Z@%)"LPE<#^:W>?)S/L[H:1XYNYZU/0<K2H0\4C].4E4/O':_V
     1367MY,4KY5WM53:NG(:1'"V_-`Z4#%P@*CJ92B6<0I2>0DR]29G`<W_1H1H'!N-^
     1368MHO`Z#CHZRR^7\#^2'<91F2U%T8*QG\8X!5O"_UCJX$Q"*T7R\E!2P5&6;7YS
     1369M85I/]K1JU9L9/9U;2BA3B7TZ#]/(=I3`H5/2,UIBOU9EQ.#>RXT<7W2CBBJ$
     1370M<=J"GZJF<(NCK\%/1<'&&F1&BM1D*-N$&OQ-/914!LI^$YMY2P145523VCS-
     1371MI\HIS7`OI?CB7HHC17@*?JY$C<&Z'/RZJ8%SB3)A#":67*#E!11TDVO2`?<]
     1372M&8KS3I,0^%Y*$UZ;K4_M@QHXPK6A0)`[M@S!:LJZH'/&\J4LDD'BEL.XQ%MR
     1373M"9?3`QF\I]C7JN:'U@=2I%NZH<D6_!I/1M9MON!"0S'E?),RI-"/2OFQ9(I6
     1374MG@/=:Z>,VO(:XW-PC":G#O8Y'E[2:)G<W3(&[SC8K04ZE19A7C]J$C%V<T6S
     1375MO6X:)QK"2A:QXL+1>+]E,K:VE423THQ4%FC@,267N%J5XGA7-%Y&LPT?.MU!
     1376MH1(]CW-;1N$R.]%<-&X9C`HBU93'I57B9_(ZAI)7?%.38M^BV]WD2VKQK$D3
     1377M`J>VM,7^[)V3J)#D(X;Q);\$?H6FS#EMV:FI@F->6Q]EAK%RP`X4-<91IESR
     1378M.:'JP,[$V<4X0\.+Q.R1Y]D4ZF28'+-<0O/N:$.)V6,9=I5*06]TF6D8>07-
     1379M3VP)7BX(P9$#E8#E(I*TH01LJIFF%'K*$=M6PQ,);0DW#=UT20),9@P2VSQ?
     1380MT-%0%&P1FUJNM#:^!JP44K\9-]9X/:F)=WVHYZA':NBFYB8#E6A-=5*+\T3.
     1381MY_LHY]*H:;:DTTA[3ESD[V/,<:O3"S1E/\G&;LLT7)VB'-@&;+[9T%S#-"%[
     1382M:H[`WC62PRK;1+#<,U"C0JR#?2JT1*!"S34\/1MIDA5SY)H3>5[S\H0JUCE`
     1383MLK<BJ-$T<9R+M77>F29Z4SD-T=/H2_B>5I)&=L_N7[,-M2N&J,<MH)-7N8FF
     1384MJ+%$M$V.H6FN')LPMJV\YJ6`&4T4=ZPYA5](7-I--:=P_U!!!EN3WPXT@=&C
     1385M+\'M3M0YO"E0K;RHIA%65Y20C*]I1*:XSN7YRYICP/(<=`MS?Z+-<4WN9GU-
     1386M&]P'-.]@W)0$2)2RAIOLEB:8(08>&M8<.!--8V2IP%=-4>=(UF1[D]<Z?)$R
     1387M%<W"?1WQCK(VIWN4+_$C]]$HXWV=`4L93_-='=_:RCB>>55@?8Z=]`)/`>QR
     1388M\!O*&3&H%,^KW$##=[!;G$@)A5,[JIW4X61Z92<]C35>$@&-1;R74")$2AW'
     1389MEMGB0^1IOLLY9@ONJLVA[`W-E;<13B>"2`N&/.@LI51[,NDX-=&1.I(6B"KX
     1390M)CCT21T<R[3XI/&X1HK>>I;6`J$)9%I;T#QZ]#DZ3.H_3NNJ1(<Y4>=1FUS2
     1391MJ]"&2K8F#7`T8I3PV$J=3XFM5$%)F'--#@^;WYB@&4P-C^0+FG*N#R4B<F&@
     1392M5:WW30Q2)2,Y:QX64I30BDL%6M:-.29.'8F3A:/%IW5-L!F:C]``Y"0H?#(Y
     1393M+=HH;DM4D;EILCW9'"2&UH[476E"=2RK))J>43<96H9R]>)W=)'FL+1"&(O;
     1394M'>4-GJ!DV6)R3%A:K$[%P_B<UG,RW<S!4.N0*8&AM*WR])N7<K0>GW(2E@(:
     1395M5HPW)>]*&3D5K9UL=2RIAQ9MM,QL%ETGE>DT2U>QYM_T*F."'HOOD[BE/+$M
     1396MQ!(D1;[UP1:/TB?*DD`LI=5I;#Q*IQZC95>>BIM22,$=7./85(&.:1*[>5U5
     1397MYXS!6P2ZNE;JYBF8*:_X-@^V@_.4S,?&?6F]/-G@INQ8]D0[90H:<*+.3I8M
     1398M1@YBFIDI@P0R?1#'$B.2<SC>-UE*`2W35<A>5JM(2WIK0TZF1U[J4C1M&QQ2
     1399M8&@9U^0)+J)4;4H.-5+D*;MO4]]C67"3F.SK4,1/*KL8K=C)0S8CRHMI"A-L
     1400MF0.G>SA^0C69%/*T7,?-8"?U\"2`VLU[`\5_J*&4DK;U3C(GUQZUB=5@J90<
     1401MRS?K:GTB+H,_3=2=C8VOD%2@%>>TY063A`*M);7/)DN=0\NDB=?-U1F*MAUE
     1402M<N24S2MQFUZA/4\K-JL["CV.JFQ/QRG8N;2Z._*^'@6ZR@,*%Q1U7LV3:>IV
     1403MAY;[U5:6[>=I'J]X2%JR("VK:#&;)C&KW$!A/DU;IYW4P<%+LTL;RMI!)$*@
     1404MV;XJIB)-Q9.4W%G2#EI.T,1BRZ'Z1%7F\)%"N\PL4M,I.C6GN=R1GI.HB7D5
     1405MD4IHTL>JJ>NJ(@<K+="<3QUUO`H\^YRVF2`7,*5SFQMP@:8,1P-^[J=`2TA:
     1406MHN0%$!<4=5F>CX08LNU3!13SKD[S`\VD:%62+"T5T&1]\IP4M@)>Z5`FS#!5
     1407MGV.5%HHV.>[Q*O+"GVX5(_(YI3D:TK<@C3SCE$F25$RGO&NVS5%D[X=F*;G2
     1408M6&KA53EG2]Z2I@M3'YVQXR@U3)0KJ+-CFG9,`PWM'!#'*S7^7`3JFPZ*WU]_
     1409MU5[^--JZG4^29J90TYZ_B&*@Y@3Y$@KJZW&<]4*CLS'>S0N-1I:_OM_1K$.'
     1410MV:X#)QVZ=Z5)753\J8*5;AF-G1>S]I;_@`G?%)2=S2J[O89NHB--"\5YR8\9
     1411M\/<NK[14I(%YUJN\":34O*Q<[\@?Z*0C.U+12@TP_.<95MNOCE8!5LV6%L11
     1412M\^=]>:4L;3A*;%-[#:_0^>O?J60<M:=&''N:HO-=*Y=1+N-6\)81?_**+P='
     1413M;=!'FF&Z2&W0:8>%FYKNHE:0+,_LJ(%'&IJL6DF?C$B==N2%FIY8_Z@IH01-
     1414M\ERH)_ZZ]B,O5KW65`,?4I7447PX\7>+<V'/8^-,=5$9_^4(/J()A1E7T7::
     1415M7WSD#>2HPKSPD>6_$,)/9C@:?^;U:&13?9$#.TV3/+7!,^KY2-VG:=JV\`%U
     1416MK%WE@%+^T94WO^@6-^F9-V3U2.[`NY].W,%XR]:CF9Z+DS@#33<B?^2:@H"<
     1417MH9]HB2O.8"EJLC,XDF=G&&S@ORY`)?PHBW@#!Z5X0]JP$W>@N2M_B3W[A;R2
     1418M34_]Y-@;9)/1BC<H7@`F=^`/`(H[\$R)',CRULVHV2N/XM(VN42DN;-X!'==
     1419M7/@V3DWL$I1QW.82FEXB+L&OY6_BE\+HK'A%;ZVVR2LF^>2P>`J-HN(4AC_G
     1420M*MY!QB&GH(YAQV=3C\8%<0IB==P0L?#(WR-/9<90`(KYJ2$NN826SV-S&?6F
     1421M3BX1V.G8(VB6&U81GL@X;&!^OX/]88C\-2[B(MP;Y`4]56.3.]!LRHH[*'[K
     1422M2?Q!\0=#Y8`B._N#"\>'?_DKYYOFX1W%#^^<OGFG^'F=!\]7/?+>G>)G>$[?
     1423MNZ.I2'W+\X),E,<C_J-J_)`4SV04CZTJOQ>S+3VH[S@[ROWCFQT_=4+7U7!,
     1424M=^JQI]?$@7[8/H_._%OUM"!^4VMW#99_94H=3$FHJQZ/2O<K-636:N"/=BWR
     1425MA\$7/1SK5Q$L?!O[+2V(TT>ZR*8TAR6SRR<B*0R>,$-HVDO3,NZT_(S94*97
     1426M0^HV[AI/QSI-75(?4?'`_4A#5>X60Q>.^;V7/(?*+RH3>GF'>1WRZF<X7N7I
     1427M9-./]2$'&M]>VX_-^\QND(1#$;^L-4/-;O%'"GGN+`YS/4CN*._:K_Z8.EN"
     1428MAN\P_/T._`>(UI[SQ\-'5TJ;5=/^LT<@**U6]];BVB=N[<\>?*#<U+R3O[N8
     1429M>^[_F;NREZ=*MN->M>7YS,B9J<>GY0_.'EY-.K4EOD%[]8."U3+%&E1;Z?@Y
     1430MPY1GJ&;3%GBY@^U0'IO*Y]L=45Y"%I_+$U+Y?+N#GXG:BHHP/PN5"K/8LX\F
     1431ME6YH)E)^>OMB&Y6^#4U6#/_\DVM_MF_;KO1M5S[VZ<VM>;IIJDF9H^44=CJW
     1432M<F[[)KB#;5[J?L`S)!L<@]J&M%(1)?^ARG.@TH[&J_D1H'.<VOS&VN&UT^8G
     1433MFB\M?C13Q\8UXOF`&1MS1-,^#'N67>)Y=HE-=OFS5HQ-C\4?D`=^A!5C8YJ8
     1434M`_'*=$-'>:PT?&IZ<OH!038L38/*ON+4&&0Z>T9134T,3,TSBNZ1)[O4U'0U
     1435M/W7QP'I30\U/-51+TJ"\](:G,S(^]S*SH8,=A?]83$E+]"*@QQ_0(TM?Q]AY
     1436M;4VYGENO5*R;1KPHH>C1-B_]GY%0].B;-H7LBFH47[2UY;&YZ[6YY&2>0ZF[
     1437MG=_PZ6/Y1*O&YNHLG]#BI<Y0:'5;'M'\=/*(IE9G$W"MV@GX]?"!S'7-6[6[
     1438M#[ONXV#EU`T?^H^T4MA]DME'?:UK&O7:Z;.VI3N&Z_Y#[0T]7=O^PT=:_16#
     1439M#M9?N_Z3Z:W_0,?4OK.O+"CM"4W;XGF'30]7+.5QP\N[R_M+^41"VW5Z/.LZ
     1440MK=K'-7W9OKPP::W"'^`8TI8JOV'*[\7)!%I.8YF6'_.L6\F[L=OF9I_?3N1U
     1441MT#RTJQ:MF]#C=_%>Z84^UHZ?%*^(EUZ6I[0^YFT83<M9QT]T:OGJ+W[#9%R/
     1442M-=(668AJ[[T<A&F*,W\%&A6("*WMYSHUKW%8)RX/;*<OS:4O8$V2X'?VV#VU
     1443MO*\XJ/(@TU`>9K&#V=[6LM)E:7$S;._-\8)1GBZB#C?;HT>^5RI=R@^<#>F]
     1444MQ::KF[2@7SMJ#FZJ/D[K$4?U.4_=S<_;!<<KE"'P7H+F;Y.C_\G:1UG^:BO>
     1445MG;/6S/6##+P(ZN4S.C._B>,"?WVL%-BGDH=NTI9.X^R)C\HC;N*6\H21J4[9
     1446M6WD/[]3_3).+S&O''UV=CS=U"(("?>(_:<CGDUW3.3E>WSB=[(99_ICL\0E6
     1447MTP2'R>,2#ZOS8&0P?7A4J1J',S]@5"+]=3"/S#6T:9S*A#]NXG:DFZ/:[,:V
     1448MY@=,;Z79S;<FGF'H"M)\Q$[SVR$"(OL%$I+]G<P&+F3OY0VGQJ[O^#,9NCYI
     1449MTRMYH(ENNZM/K\C6Q-K7SPCIYM-YVKXVY=5]&HZ]?M7]70-*1>N=W@)IS4=S
     1450M.N#O&:S3"KOJ._[\/37QJ>&G^;R@MJYTS2#@O=BT=A1/^)XD;YSE]1_TJ\'&
     1451MR8*8S`EXOY[2_0%;XW(VIY,T9LG8U:>]-MF_8$S*4F_Z-;,VGMOL*6KWST]C
     1452M>:.8MQV6M9U3R0;VO/*W&ZV/)PS7N);;)K+45@XU:C=->]*,-EF,"2@DIF8Z
     1453M[AI3NQ^0.,A`LUFEYHK!W]O$.]%2]Q,@C:>X)Z>PKC&>^W\ZA6T^YZ=]SA;R
     1454M7AU_ED4>UYWE^28N.?;RIIZXT"-WU,YO/ENF_6L30T.S\A>MK501C3/MJJ@M
     1455MIF,Z/#Y!V7B#=YL[4>!38*P4^MOZB#]!QI-!U<1ZLU>G7[U7-[3!SEM#@YG+
     1456M'%I<:>!%WMH_9:;&0?+NV,6+8[O9&=,_8F<LQ?5J7A;:S::7+IM>/,RD)76.
     1457MZT6\*R7EO.^=)M^4AGDNGTKDX:@^-(B-H5^]+>:;5:Q\R<!)R,LW`)AF)S#-
     1458M\_CK,_BW;[8$ES1KFM/OLXWNID\:'\L[9VF[/ST3*N^>./FP>7H'FQ\LH8M]
     1459M#/*`Q"*;_T%N"/D&GE='*N&G;>I+N&2*L;DG],[F4YZVJ[%W>JO$IH(I5Y+J
     1460MK&+IR4<CCS2F)J22]%1D+9&/R<=)WN%_4!K"[E3/E@:Z$TVK;$N>RG3+L4M/
     1461MP#9M+7K3^*!42]VFP9RDU,6FD?*TMYJ<RX"VU.+S7:[>Y4.&WNXR_>1SK=RO
     1462M<:LUFK8W<VG4IKDWY';S4YCU7C4FPJUO2JNK\S=)XM6;JO_3EZ#-'JZ.V_1V
     1463MVXW;/;I=5SJHV>#5\0>,2S1IHUI/MNFHZI.=.JK_J1E;;')5='6.LTCF7MM9
     1464MSC8)Y41_.L]I=I#UC]A!?NT\I]DUUGG7^&(>>*ZPR$\:5WEZG8]7*6]F#,U^
     1465MLG[U?O+)(-ML/P[S-FO@W:JRL<HI>C@6KUNVXT!>.1P??]>JM+'QI"D/8OQ!
     1466M,S9=/Q%=?C1,WB6:Y3.&#6QC^.G5@]1883G%\3MN/7]&MV`[#C0>H_G#M'0H
     1467M/Q\=BDIC&F>:POF61/HHW9_;CV@VU/7TVF1TOA^Q[4,,+]V#,,T&O1E5G0/R
     1468MQ\_X`WW;/GE^*"'/"$^O_EP$="/V`S*)/IE#Y6KGI6\6N'-N:BI]/*>89A??
     1469MC*ZL`F6BRSBR6Y&WE;8);^.:IMEQ-^./>$.J3&NKH2B5#/*%MU3S$Z:*32NF
     1470M\C9&OTH*67C?@I/(4-^^,,U6O%$_8&[;M^^_#,VI3:?#^I0)5.,:RA03]"D?
     1471M3-O`M#WKT2`TME,_8,E*?4P]/S5N13W'UGB\TU5C>M4$/\_G:DS(+&PP:1.<
     1472M9^%-^QNKJ5=//_Q)R$\NK992U%<O2ENMZ1)/OI]X-L?HQBVTRLMOV_7\9B;]
     1473MI)E4:7ZS@6]>O8%?NW]U/;_M]=B7>YAF&]WD;?2!^*RDG,%I?HJ5OVC#FIR%
     1474MTK/F`S^K*ZX?J6/D@)_+:\*WV1DWK]\9YZ94-TIU5"^2RINL)(U+;6N6/D*1
     1475M(9Y<]YAF#]SH[;WF2(:9NUYU!:O9VS:OWML^R;;SR9JNIQ%Q'NK@R5R6NX''
     1476M&QLF3LC.>!I"@QKC4X'?;'*;O,E-LW8[J,K1V/V'[&8W$+TN$W<KI]:9:H^>
     1477M9EC-<S\]K0ICF>W,\DQE3A11SJUR^?9)7*">RR,_0_,">=QGJ()*G*;6I\1I
     1478M:G/X2XWHO+16R3SL#YX2>N@XS6Z]X=WZTS<23;/_;GC_/;VIV/&[59?7;\X>
     1479MYS"\9_[;[3=YWY"_%(?WQ*_I7S6=K6\K7LB5-[PDD\\[1<XGM5"/7*@">_&5
     1480M?#Q?*2TGDRPV:\:QVS?+?*%*9_X;##194Z&_N"8=_GL)Z8C_<J(<\%])NKCF
     1481M+1+^@X92MBA=B\QVJ)<I'XKF1+*VUGKV=K/A??&;W[]W%[??#MWM.\+N;KN_
     1482M<=R-^F<NN.V->5/N)L_][W+BWY+-]LO^\/FW[N*OP_#]^MNGWW_[ZV5W6].2
     1483MC7S3F;=OE]W(EV]ONHN]7/I*;OZF^Y=WG2MU.LVWE%KYN^;X?Q7!^53RX?OG
     1484MZU]KJ53\C^W4CW^BL5Z?-_9+<UFJ?A"G[75JR#^>V1"/R6YALU6-X,"/T8GE
     1485MV)KIMH=_:!*ZT(4N=*$+7>A"%[K0A2YTH0M=Z$(7NM"%+G2A"UWH0A>ZT(4N
    14871486M=*$+7>A"%[K0A2YTH0M=Z$(7NM"%+G2A"UWH0A>ZT(4N=*$+7>A"%[K0A2YT
    14881487MH0M=Z$(7NM"%+G2A"UWH0A>ZT(4N=*$+7>A"%[K0A2YTH0M=Z$(7NM"%+G2A
     
    14931492M%[K0A2YTH0M=Z$(7NM"%+G2A"UWH0A>ZT(4N=*$+7>A"%[K0A2YTH0M=Z$(7
    14941493MNM"%+G2A"UWH0A>ZT(4N=*$+7>A"%[K0A2YTH0M=Z$(7NM"%+G2A"UWH0A>Z
    1495 MT(4N=*$+7>A"%[K0A2YTH0O=QW7_XS__]=_^?3`^O!WJ<7P]?+W[\FGX.KP9
    1496 M]-7%<K6^NOKPMY__]--/P^7E\/7CAX^W=U_R#9>7]5/I[?"WWSZOP^V;Y=H/
    1497 MX[!>._ISD3_7:_OS=F.8RXV?ZHV^WKA<&_Z3_E/M`ZI\X)?R@>5R+:I%NY1I
    1498 M.3/[#^NWP^>[^\/P65T-GS7]9]HU\W:X_>WK<''WY3#<O:%/#7?#7P9CYEG_
    1499 MS`5WHS&OZMWV]?#?]<2]IBZ\7^\/'W\=+OX\35]OOGSX[=<_7PUWKYI^X)L^
    1500 MJS?#[<W[PV]?[TX?AXO;[GJ2ZWIW_5.['I5<-[OKOW373=9O!2X+MH+<@H8<
    1501 MI<J[V^'B7M0^*_*F5\._D*$K:))J*VJ26G;U))>+WGW]>//75BJ5_;V>/JQ*
    1502 M;U75/K7SKBH[;U55`CL_5I6==U79^6%5YKPJM:]*;575OK'JT:K4OBI%5?W]
    1503 M/!+N.!*>B-#%CXL;5_K_7?`]>;L>5STNHVJ!;,=%4]E*?_,EN4$]".2GU,:U
    1504 M5W+C8M=Q,2(CZ8$T.WG#A^/6A/4/UP)$(`(1B$`$(A"!"$0@`A&(0`0B$($(
     1494MT(4N=*$+7>A"%[K0A2YTH0M=Z$(7NM"%+G2A"UWH0A>ZT(4N=*$+7>A"%[K0
     1495MA2YTH0M=Z$(7NM"%+G2A"UWH0A>ZT(4N=*'[N.Y__.>__MN_=\:']UTYCF^[
     1496M[[??OG3?NW>=OKR8+Y<WEY_^_O-??OJIV^VZ[Y\_?;ZY_99NV.W*JZ;WW=]_
     1497M_[IT-^_F*]_UW7+EZ.<L/Y<K^_-V8QCSC5_*C;[<.%\9_DG_5'V!RB_X);]@
     1498MWBU9-6OG,BUGYO3%^GWW]79_Z+ZJR^ZKIG^F7C/ONYO?OW<7M]\.W>T[>E5W
     1499MV_VM,V8<]<]<<-L;\Z;<;=]V_UU.W%OJPOVR/WS^K;OXZS!\O_[VZ???_GK9
     1500MW;ZI^H%O^JK>=3?7'P^_?[]=/W<7-\WU2:[KD^M?ZO6HY+HYN?Y+<]TD_5K@
     1501MDF`M2"VHR%&JO+WI+O:B]E61-[WI_H4,74`GJ;:@3E++23V32T4?OG^^_K66
     1502M2F7_**</J]);5:5/[7A2E1VWJ@J!'1^KRHXG5=GQ857FO"IU6I7:JBI]8]6C
     1503M5:G3JA15]8_S2+CE2'@B0F??SZY?Z/\GP??D[;I?=#_WJ@:R[6=-90O]YDMR
     1504M@WH0R$^I]4NKY/K9+OUL1$;2`VDV\H8/^ZT)RY^N!8A`!"(0@0A$(`(1B$`$
     1505M(A"!"$0@`A&(0`0B$($(1"`"$8A`!"(0@0A$(`(1B$`$(A"!"$0@`A&(0`0B
     1506M$($(1"`"$8A`!"(0@0A$(`(1B$`$(A"!"$0@`A&(0`0B$($(1"`"$8A`!"(0
     1507M@0A$(`(1B$`$(A"!"$0@`A&(0`0B$($(1"`"$8A`!"(0@0A$(`(1B$`$(A"!
     1508M"$0@`A&(0`0B$($(1"`"$8A`!"(0@0A$(`(1B$`$(A"!"$0@`A&(0`0B$($(
    15051509M1"`"$8A`!"(0@0A$(`(1B$`$(A"!"$0@`A&(0`0B$($(1"`"$8A`!"(0@0A$
    15061510M(`(1B$`$(A"!"$0@`A&(0`0B$($(1"`"$8A`!"(0@0A$(`(1B$`$(A"!"$0@
     
    15251529M@0A$(`(1B$`$(A"!"$0@`A&(0`0B$($(1"`"$8A`!"(0@0A$(`(1B$`$(A"!
    15261530M"$0@`A&(0`0B$($(1"`"$8A`!"(0@0A$(`(1B$`$(A"!"$0@`A&(0`0B$($(
    1527 M1"`"$8A`!"(0@0A$(`(1B$`$(A"!"$0@`A&(0`0B$($(1"`"$8A`!"(0@0A$
    1528 M(`(1B$`$(A"!"$0@`A&(0`0B$($(1"`"$8A`!"(0@0A$(`(1B$`$(A"!"$0@
    1529 M`A&(0`0B$($(1"`"$8A`!"(0@0A$(`(1B$`$(A"!"$0@`A&(0`0B$($(1"`"
    1530 M$8A`!"(0@0A$(`(1B$`$(A"!"$0@`A&(0`0B$($(1"`"$8A`!"(0@0A$(`(1
    1531 MB$`$(A"!"$0@`A&(0`0B$/__1_R/__S7?_OWP>KY[5"/U>OAIY^&P]?7@[5S
    1532 M+=6OA[_>??X\?/VY%IFWP]>[+Y^&KV_"U<5RM;ZZ^O"W=M6^'?[VV^=UN!W>
    1533 M#.NUNURN[3#1D::C($=F&(?EVK2/N+?#Y[O[P_#YS>W-^\-O7^].'R]N7[7K
    1534 M_NUP3V7#Q6?JE%?#7P;_\Y]:"\/;X?#Q_I`_>D\W7?%GG^Q)0_U1.W+2]<S2
    1535 M63UQ;+_:XU[.I@>=>+7ORMAU97I=C\U\UH%&U0[4YQUH]-:!;X:+Y=I?DAVO
    1536 M[25U(/U-=J>.S,?T]RA'KR[S?72\7@>Z8NC8\*?&M?6B,;67A]K-0]_/QI[U
    1537 MY/#=KES\RGZH.2[$];C/^*_FJ)X=,K"G&G;0]7$_-*YUGO&O"[HI2(Q"@2*8
    1538 M#.]KAZR,R->YD^B.AD).\31G?"XGQQD#Z#X&]>HS/06<A*`$^^-\J?'9N3F'
    1539 M53UK8<FDEVS*S+H9/'-V)K7Z.Y36/)\R@_209#O&%.,*XQ,6M+8C=!UAM:8M
    1540 M3JF%5%Q9N'9VI3]SN7WHZ!W8]VQKGVO;M4O/8F).GTX2M*J)@4I=SK%KS:QG
    1541 MV:`VH3.VZXSMJK$W]%70[<Z\G1.[[YG7/=N\&6K'NQGU";=UG5%=9U17C:K%
    1542 MJ%N(YDS$&<A)UFI7>ZKOF<\].S1WSFK$?YO9J"ENS2,D_?^3%G.=Q7QG,=^'
    1543 M9[$.$[I\UCFI_-=3^N_9SK\@-+.9V@1@S?XH`[Y^>H3WG0E]9T*_BTL]/D"4
    1544 M.%RWX>8\O_KO&='_<T;LX\[4,QJ1)0;/K=C!=G8,G1V#ZHYU!L^IU67?K2G(
    1545 MY"&EL03S'=#PW`%S[4</G7UR8UWS])+]]PDW#=TH&7R'%(HM+\M86+-JG0CL
    1546 M$TN(WX-*S[6>#'Z[H3&/]D\Z9>RFG;&S3=2/."7_72//LU.VML;O62<^>SJC
    1547 MU_WX/NZ=D2IW3]DF=K:)G6UBJ$F_2XG+-A:.?;S1>=?Z[]DH/MM&#:LGRFN(
    1548 M-JJM8[?.*!'W=+BESHRI,V/2^^$A>^2R)<_M?.^3Z7NF3,\V91[LE@<&S8[Z
    1549 MY#0M=49,G1%3-:+?&E]&[VPV3IU[F.\9+SW;>+ZN%RL,6\:L3^9]-S?;N+G9
    1550 MQLU]^BMS3EN&Z,N:%/=SK[VEW/P=2[GYV2G1[U8/.XOQ-9Z3VD=&[UJAZT!]
    1551 M!]H"K^7XRV:O;,'6[N]8S,W/MICK)B(RJ&5SB0D?Q5"=O51G+R7VRO9PW4)P
    1552 MFT5;0:EI<C<E*9.R/'97&/4]\ZES\_VCE/F8W62I]%28.=693'4F4^'A4MDI
    1553 M,LM//PVW7W_[=?C?KX?_NOOUUX]??[WY\F7X_>Z&EK/O[FD=_>WSS=?IP\??
    1554 M/WZN'Z,%>%YA#V\&6F.O5X=^C>UXWZ-M4EP>KN,PRF;%X5KS$?WMZ>_#=9!R
    1555 MOUV5OS5=M?6([J^J9#<IE(^:?(L<ZU8SS0L_?+SMMSIV!M#/G1H>>`PY])U_
    1556 MH'%*'RAF#GFWRO`M=,ZG'$D'OLQ%9CQ(9*T'F4,>]./FXAV=P_WA_]P?;@[?
    1557 1[B\H$_RO/_U?.CZGWX[="```
     1531M1"`"$8A`!"(0@0A$(`(1B$`$(A"!"$0@_O^/^!__^:__]N^=U>/[KARKM]U/
     1532M/W6'[V\[:\=2JM]VO]Y^_=I]_[D4F??=]]MO7[KO[\+EQ7RYO+G\]/=ZU;[O
     1533M_O[[UZ6[Z=YURY7;S5>V&^A(TU&0(]/UW7QEZDO<^^[K[?[0?7UW<_WQ\/OW
     1534MV_7SQ<V;>MV_[_94UEU\I4YYT_VM\S__I;8PO.\.G_>']-(]W73)KWVR)PWU
     1535M1^G(09<S2V?EQ+']2H][.1L>=.+E:5?&IBNGM^78C&<=:%3I0'W>@49O'?BN
     1536MNYBO_([L>&5WU('TF^Q.'9F.Z7<O1V]VZ3XZ7JX"73%T;/A5_5)[T9C2RUWI
     1537MYJ[M9V//>K)[MBMGO[`?:HX+<3WN,_Y5'=6S0P;V5,,.NCSNA\;5SC/^;48W
     1538M&8E1*%`$D^%]Z9"%$?DZ=Q+=45'(*9[FC"_EY#AC`-W&H%Y\HJ>`DQ"48'^<
     1539M;ZI\=JS.857+FED2Z8Y-F5@W@R?.QJ16/T-IS<LI$T@+2;9C3#&N,#YA06L;
     1540M0M<0%FO:[)1:2,65A>O$KO0SE=N'CMZ`/6=;^U+;+DUZ%A-S^G22H%5)#%3J
     1541M4HY=2F8]RP:E"8VQ76-L5XR]H2^";D_,VSBQ>\Z\[L7F35`GO)M1GW!;UQC5
     1542M-49UQ:A:C+J%:,I$G(&<9*UZM:5ZSGSNQ:%YXJQ&_+>:C9KBEC1"TO^?M)AK
     1543M+.8;B_DV/+-UF-"EL\9)Y5]+Z9^SG7]%:"8SU0G`DOQ1!GS]]`CO&Q/ZQH3^
     1544M)"YU_P!1XG#9AIOS_.J?,Z+_YXS8QITI9S0B2PR>6[&!;>P8&CL&U1SK!)Y2
     1545MJTN^6U*024-*90GF&=#PT@%S:4</G7QR8UW2])+]]PDW#<TH&7R#%+(M=WDL
     1546M+%FU3`1.$TN(ST%-+[6>#'XG0V,:[9]TRMA,.V-CFZ@?<4K^72+/LU/6ML;G
     1547MK!-?/)W1R^GXWI\Z(U7NGK)-;&P3&]O$4))^DQ+G;2SLVWBC\Z;US]DHOMA&
     1548M%:LE2FN(.JHM?;/.R!'W=+A-C1FGQHR3/AT>DD?.6_+<SD]]<GK.E-.+39D&
     1549MN_F!09.C/CE-FQHC3HT1IV)$OS4^C][);)PZ3V&>,][T8N/YLEXL,&P9LSR9
     1550M]]U8;>/&:ALWMNDOSSEM'J)W)2F>SKU.+>7&9RSEQA>G1'^R>CBQ&%_C.:E]
     1551M9/0N%;H&U#>@-?!JCM]5>R4+UG8_8S$WOMABKIF(R*"6S"4F?!1#-?92C;V4
     1552MV"O9PS4+P6T6;06EI,F3*4F>E*6QN\"HY\RGSLWW1RGS,;O)4NFI,'.J,9GR
     1553M#Y?'3H4'R^/+]7)_>;B\N[QO%\I.Q;I07G;K;D_@!^D<ZI3='7<`E](1=<%N
     1554MI:MR3+_Y^&[KL-V]E!VXA(]WHK4[]/(*OI*.DC8G-+IK2>=ROUSE&2!KI-?W
     1555MK'%?6SKEEGYYUVWU[S<STI&15Z^E#BJ1HTJPT+E]T/KTFD,F2>V1\GR45:6]
     1556M<Z+?6ER.<[WR*K[SD&J0VC,UW;6FGI4CL[NCW_M$RT>[^Y1`A%W:EFNX[^EZ
     1557M7O)1']*_N](CO/$D/?)+ZA'JA7XMO6TR:2+?9\U%ZF/2NTR1+'-(U^CG(=U?
     1558M:U&YEE_?W>R^['ZI%VAV_NGSS8,X^+7&@7YDAO[K'P0"$>PU-<E04_2>6K+7
     1559M=+3<45OW_&.E:W2=2OKYP)=KO/`+-<^8J-BL>W[9RA*S7O4=#V.67J\/=_J>
     1560MK^Q92*K2>W[98LB0=,1U:/)$NI%OZY?UOEG!\DLX5/?D%WJ5%^[-0><*EX,M
     1561MU='E`]=*]_`9_927F'OADFKD%\O0]=4<^)4DQ>VY9TBZ2-U`SD%-H9_WG,#O
     1562MN'7\8T^.<<\9@@#()YZ843E=5RY.N[,LP9N"/_W4W7S__;?N?[_M_NOVM]\^
     1563M?__M^MNW[O[VNOMZ^V%/*>3NZ_7WX=/G^\]?R\MH6$C)I7O747I9+@\G247'
     1564M=ON2O#YVO6QCDO_S$?WV]/MP%:3<;U?E-T>)+4=T?U&=WJ9">:E)M\BQ+C6;
     1565M<?/)QU,S[QJ^:!!BV_:'-BT?/#L'&>.0]K'%_'3.IVRB`U_F(M,?9,Q=#K*Z
     1566A/.C'$SEO51[VA_^S/UP?[O87-$?X7W_YOP/G&G>HX0@`
    15581567`
    15591568end
  • Tst/Short/factorizep_s.stat

    ra601d5 rd4b25e  
    1 1 >> tst_memory_0 :: 1354291118:3150:3-1-5:ix86-Linux:mamawutz:173336
    2 1 >> tst_memory_1 :: 1354291118:3150:3-1-5:ix86-Linux:mamawutz:2240284
    3 1 >> tst_memory_2 :: 1354291118:3150:3-1-5:ix86-Linux:mamawutz:2273068
    4 1 >> tst_timer :: 1354291118:3150:3-1-5:ix86-Linux:mamawutz:276
    5 2 >> tst_memory_0 :: 1354291118:3150:3-1-5:ix86-Linux:mamawutz:4047200
    6 2 >> tst_memory_1 :: 1354291118:3150:3-1-5:ix86-Linux:mamawutz:6025216
    7 2 >> tst_memory_2 :: 1354291118:3150:3-1-5:ix86-Linux:mamawutz:6025216
    8 2 >> tst_timer_1 :: 1354291118:3150:3-1-5:ix86-Linux:mamawutz:5530
     11 >> tst_memory_0 :: 1363959468:3160:3-1-6:ix86-Linux:mamawutz:154684
     21 >> tst_memory_1 :: 1363959468:3160:3-1-6:ix86-Linux:mamawutz:2215700
     31 >> tst_memory_2 :: 1363959468:3160:3-1-6:ix86-Linux:mamawutz:2256672
     41 >> tst_timer :: 1363959468:3160:3-1-6:ix86-Linux:mamawutz:279
     52 >> tst_memory_0 :: 1363959468:3160:3-1-6:ix86-Linux:mamawutz:3881384
     62 >> tst_memory_1 :: 1363959468:3160:3-1-6:ix86-Linux:mamawutz:9900032
     72 >> tst_memory_2 :: 1363959468:3160:3-1-6:ix86-Linux:mamawutz:11997184
     82 >> tst_timer_1 :: 1363959468:3160:3-1-6:ix86-Linux:mamawutz:11946
  • Tst/Short/factorizep_s.tst

    ra601d5 rd4b25e  
    472472testfactors (l,f);
    473473
     474kill r;
     475ring r=2,(x,y,z,s,t,u,v),dp;
     476poly f= y*z*s^2*t^2+x^4*y*u+y^3*z*s*u+x*y*z^2*s*u+x^2*z^2*u^2+x*y^4*v+x^2*t*u^2*v+x*y*z*s*t+z^2*s^2*t+z^2*s*t^2+x*y^3*v+y*s*t^2*v+x*z^2*s+y^2*t*u+x*y*z+y*z*v;
     477poly g= x^2*z^2*s^2+x^2*y*s^3+y^2*z*s*t^2+x*s^3*t^2+y^3*z*s*u+y*t^4*u+x^2*z^2*u^2+y^2*z*t*u^2+x*s*t^2*u^2+y*t^2*u^3+y^2*z^3*v+x^2*s*u^2*v+x*z*s*u^2*v+y^2*z*s^2+y*z^3*t+x^2*z*t^2+z^2*s*t*v+z^2*t^2*v+z^3*u*v+s^2*t*u*v+s*v^4+y^3*u+x*z^2*u+x*z*s*v+u*v^3+x^2*t+z*t+u;
     478poly h= x^2*y*s+z*s^2*t+z^3*u+x^2*s*u+y*s^2*u+x*y*u*v+x*s*u*v+x*z*t+z^2*t+x*y*u+x*t*u+y*s;
     479poly k=f*g*h;
     480def l= factorize (k);
     481testfactors (l, k);
    474482
    475483kill r;
  • Tst/Short/ok_s.lst

    ra601d5 rd4b25e  
    11;; Test which should pass shifted exponents
     2abusalem
    23alexpoly
    34algebralib
  • factory/facBivar.cc

    ra601d5 rd4b25e  
    583583
    584584  TIMING_START (fac_bi_factor_recombination);
    585   factors= factorRecombination (uniFactors, A, MODl, degs, 1,
     585  factors= factorRecombination (uniFactors, A, MODl, degs, evaluation, 1,
    586586                                uniFactors.length()/2, b, den);
    587587  TIMING_END_AND_PRINT (fac_bi_factor_recombination,
     
    595595    factors= earlyFactors;
    596596
    597   for (CFListIterator i= factors; i.hasItem(); i++)
    598     i.getItem()= i.getItem() (y - evaluation, y);
    599 
    600597  appendSwapDecompress (factors, conv (contentAxFactors),
    601598                        conv (contentAyFactors), swap, swap2, N);
  • factory/facFqBivar.cc

    ra601d5 rd4b25e  
    4848TIMING_DEFINE_PRINT(fac_fq_bi_evaluation)
    4949TIMING_DEFINE_PRINT(fac_fq_bi_shift_to_zero)
     50TIMING_DEFINE_PRINT(fac_fq_logarithmic)
     51TIMING_DEFINE_PRINT(fac_fq_compute_lattice_lift)
     52TIMING_DEFINE_PRINT(fac_fq_till_reduced)
     53TIMING_DEFINE_PRINT(fac_fq_reconstruction)
     54TIMING_DEFINE_PRINT(fac_fq_lift)
     55TIMING_DEFINE_PRINT(fac_fq_uni_total)
    5056
    5157CanonicalForm prodMod0 (const CFList& L, const CanonicalForm& M, const modpk& b)
     
    481487CFList
    482488factorRecombination (CFList& factors, CanonicalForm& F,
    483                      const CanonicalForm& N, DegreePattern& degs, int s,
    484                      int thres, const modpk& b, const CanonicalForm& den
     489                     const CanonicalForm& N, DegreePattern& degs, const
     490                     CanonicalForm& eval, int s, int thres, const modpk& b,
     491                     const CanonicalForm& den
    485492                    )
    486493{
     
    492499  if (F.inCoeffDomain())
    493500    return CFList();
     501  Variable y= Variable (2);
    494502  if (degs.getLength() <= 1 || factors.length() == 1)
    495503  {
    496     CFList result= CFList (F);
     504    CFList result= CFList (F(y-eval,y));
    497505    F= 1;
    498506    return result;
     
    513521  T= factors;
    514522  CFList result;
    515   Variable y= Variable (2);
    516523  Variable x= Variable (1);
    517524  CanonicalForm denom= den, denQuot;
     
    550557            g= b(g);
    551558          T.removeFirst();
    552           result.append (g/content (g, x));
     559          g /= content (g,x);
     560          result.append (g(y-eval,y));
    553561          F= 1;
    554562          return result;
     
    556564        else
    557565        {
    558           result= CFList (F);
     566          result= CFList (F(y-eval,y));
    559567          F= 1;
    560568          return result;
     
    610618            denom *= abs (lc (g));
    611619            recombination= true;
    612             result.append (g);
     620            result.append (g (y-eval,y));
    613621            if (b.getp() != 0)
    614622            {
     
    638646              if (recombination)
    639647              {
    640                 result.append (buf);
     648                result.append (buf (y-eval,y));
    641649                F= 1;
    642650                return result;
     
    644652              else
    645653              {
    646                 result= CFList (F);
     654                result= CFList (F (y-eval,y));
    647655                F= 1;
    648656                return result;
     
    664672      if (recombination)
    665673      {
    666         result.append (buf);
     674        result.append (buf(y-eval,y));
    667675        F= 1;
    668676        return result;
     
    670678      else
    671679      {
    672         result= CFList (F);
     680        result= CFList (F(y-eval,y));
    673681        F= 1;
    674682        return result;
     
    682690  if (T.length() < 2*s)
    683691  {
    684     result.append (F);
     692    result.append (F(y-eval,y));
    685693    F= 1;
    686694    return result;
     
    735743earlyFactorDetection (CFList& reconstructedFactors, CanonicalForm& F, CFList&
    736744                      factors, int& adaptedLiftBound, int*& factorsFoundIndex,
    737                       DegreePattern& degs, bool& success, int deg,
    738                       const modpk& b, CanonicalForm& den)
     745                      DegreePattern& degs, bool& success, int deg, const
     746                      CanonicalForm& eval, const modpk& b, CanonicalForm& den)
    739747{
    740748  DegreePattern bufDegs1= degs;
     
    743751  CanonicalForm buf= F;
    744752  Variable x= Variable (1);
     753  Variable y= Variable (2);
    745754  CanonicalForm g, quot;
    746755  CanonicalForm M= power (F.mvar(), deg);
     
    798807          {
    799808            den *= abs (lc (g));
    800             reconstructedFactors.append (g);
     809            reconstructedFactors.append (g (y-eval,y));
    801810            factorsFoundIndex[l]= 1;
    802811            if (b.getp() != 0)
     
    827836              if (!buf.inCoeffDomain())
    828837              {
    829                 reconstructedFactors.append (buf);
     838                reconstructedFactors.append (buf (y-eval,y));
    830839                F= 1;
    831840              }
     
    852861earlyFactorDetection (CFList& reconstructedFactors, CanonicalForm& F, CFList&
    853862                      factors, int& adaptedLiftBound, int*& factorsFoundIndex,
    854                       DegreePattern& degs, bool& success, int deg,
    855                       const modpk& b)
     863                      DegreePattern& degs, bool& success, int deg, const
     864                      CanonicalForm& eval, const modpk& b)
    856865{
    857866  CanonicalForm den= 1;
    858   earlyFactorDetection (reconstructedFactors, F, factors, adaptedLiftBound, factorsFoundIndex, degs, success, deg,b, den);
     867  earlyFactorDetection (reconstructedFactors, F, factors, adaptedLiftBound,
     868                        factorsFoundIndex, degs, success, deg, eval, b, den);
    859869}
    860870
     
    11271137        earlyFactorDetection (earlyFactors, bufA, bufUniFactors, newLiftBound,
    11281138                              factorsFoundIndex, degs, earlySuccess,
    1129                               smallFactorDeg, b, den);
     1139                              smallFactorDeg, eval, b, den);
    11301140      else
    11311141        earlyFactorDetection(earlyFactors, bufA, bufBufUniFactors, newLiftBound,
    11321142                             factorsFoundIndex, degs, earlySuccess,
    1133                              smallFactorDeg, b, den);
     1143                             smallFactorDeg, eval, b, den);
    11341144    }
    11351145    else
     
    11561166          earlyFactorDetection (earlyFactors, bufA, bufUniFactors, newLiftBound,
    11571167                                factorsFoundIndex, degs, earlySuccess,
    1158                                 liftPre[sizeOfLiftPre-1] + 1, b, den);
     1168                                liftPre[sizeOfLiftPre-1] + 1, eval, b, den);
    11591169          else
    11601170          earlyFactorDetection (earlyFactors,bufA,bufBufUniFactors,newLiftBound,
    11611171                                factorsFoundIndex, degs, earlySuccess,
    1162                                 liftPre[sizeOfLiftPre-1] + 1, b, den);
     1172                                liftPre[sizeOfLiftPre-1] + 1, eval, b, den);
    11631173        }
    11641174        else
     
    11901200          earlyFactorDetection (earlyFactors, bufA, bufUniFactors, newLiftBound,
    11911201                                factorsFoundIndex, degs, earlySuccess,
    1192                                 liftPre[i-1] + 1, b, den);
     1202                                liftPre[i-1] + 1, eval, b, den);
    11931203          else
    11941204          earlyFactorDetection (earlyFactors,bufA,bufBufUniFactors,newLiftBound,
    11951205                                factorsFoundIndex, degs, earlySuccess,
    1196                                 liftPre[i-1] + 1, b, den);
     1206                                liftPre[i-1] + 1, eval, b, den);
    11971207        }
    11981208        else
     
    12331243      earlyFactorDetection (earlyFactors, bufA, bufUniFactors, newLiftBound,
    12341244                            factorsFoundIndex, degs, earlySuccess,
    1235                             smallFactorDeg, b, den);
     1245                            smallFactorDeg, eval, b, den);
    12361246      else
    12371247      earlyFactorDetection (earlyFactors, bufA, bufBufUniFactors, newLiftBound,
    12381248                            factorsFoundIndex, degs, earlySuccess,
    1239                             smallFactorDeg, b, den);
     1249                            smallFactorDeg, eval, b, den);
    12401250    }
    12411251    else
     
    12621272        if (v==alpha)
    12631273        earlyFactorDetection (earlyFactors, bufA, bufUniFactors, newLiftBound,
    1264                               factorsFoundIndex, degs, earlySuccess, dummy, b,
    1265                               den);
     1274                              factorsFoundIndex, degs, earlySuccess, dummy,eval,
     1275                              b, den);
    12661276        else
    12671277        earlyFactorDetection (earlyFactors, bufA,bufBufUniFactors, newLiftBound,
    1268                               factorsFoundIndex, degs, earlySuccess, dummy, b,
    1269                               den);
     1278                              factorsFoundIndex, degs, earlySuccess, dummy,eval,
     1279                              b, den);
    12701280      }
    12711281      else
     
    12921302          if (v==alpha)
    12931303          earlyFactorDetection (earlyFactors, bufA, bufUniFactors, newLiftBound,
    1294                                 factorsFoundIndex, degs, earlySuccess, dummy,b,
    1295                                 den);
     1304                                factorsFoundIndex, degs, earlySuccess, dummy,
     1305                                eval, b, den);
    12961306          else
    12971307          earlyFactorDetection (earlyFactors,bufA,bufBufUniFactors,newLiftBound,
    1298                                 factorsFoundIndex, degs, earlySuccess, dummy,b,
    1299                                 den);
     1308                                factorsFoundIndex, degs, earlySuccess, dummy,
     1309                                eval, b, den);
    13001310        }
    13011311        else
     
    14711481reconstructionTry (CFList& reconstructedFactors, CanonicalForm& F, const CFList&
    14721482                   factors, const int liftBound, int& factorsFound, int*&
    1473                    factorsFoundIndex, mat_zz_pE& N, bool beenInThres
     1483                   factorsFoundIndex, mat_zz_pE& N, const CanonicalForm& eval,
     1484                   bool beenInThres
    14741485                  )
    14751486{
     
    14771488  Variable x= Variable (1);
    14781489  CanonicalForm yToL= power (y, liftBound);
     1490  CanonicalForm bufF= F (y-eval, y);
    14791491  if (factors.length() == 2)
    14801492  {
     
    14821494    tmp1= factors.getFirst();
    14831495    tmp2= factors.getLast();
    1484     tmp1 *= LC (F, x);
    1485     tmp1= mod (tmp1, yToL);
     1496    tmp1= mulMod2 (tmp1, LC (F,x), yToL);
    14861497    tmp1 /= content (tmp1, x);
    1487     tmp2 *= LC (F, x);
    1488     tmp2= mod (tmp2, yToL);
     1498    tmp1= tmp1 (y-eval, y);
     1499    tmp2= mulMod2 (tmp2, LC (F,x), yToL);
    14891500    tmp2 /= content (tmp2, x);
     1501    tmp2= tmp2 (y-eval, y);
    14901502    tmp3 = tmp1*tmp2;
    1491     if (tmp3/Lc (tmp3) == F/Lc (F))
     1503    if (tmp3/Lc (tmp3) == bufF/Lc (bufF))
    14921504    {
    14931505      factorsFound++;
     
    15241536      }
    15251537    }
    1526     buf *= LC (F, x);
    1527     buf= mod (buf, yToL);
     1538    buf= mulMod2 (buf, LC (F,x), yToL);
    15281539    buf /= content (buf, x);
    1529     if (fdivides (buf, F, quot))
     1540    buf= buf (y-eval,y);
     1541    if (fdivides (buf, bufF, quot))
    15301542    {
    15311543      factorsFoundIndex[i - 1]= 1;
    15321544      factorsFound++;
    1533       F= quot;
    1534       F /= Lc (F);
     1545      bufF= quot;
     1546      bufF /= Lc (bufF);
    15351547      reconstructedFactors.append (buf);
    15361548    }
    1537     if (degree (F) <= 0)
     1549    if (degree (bufF) <= 0)
    15381550      return;
    15391551    if (factorsFound + 1 == N.NumCols())
    15401552    {
    1541       reconstructedFactors.append (F);
     1553      reconstructedFactors.append (bufF);
     1554      F= 1;
    15421555      return;
    15431556    }
    15441557  }
     1558  if (reconstructedFactors.length() != 0)
     1559    F= bufF (y+eval,y);
    15451560}
    15461561
     
    15481563reconstructionTry (CFList& reconstructedFactors, CanonicalForm& F, const CFList&
    15491564                   factors, const int liftBound, int& factorsFound, int*&
    1550                    factorsFoundIndex, mat_zz_p& N, bool beenInThres
     1565                   factorsFoundIndex, mat_zz_p& N, const CanonicalForm& eval,
     1566                   bool beenInThres
    15511567                  )
    15521568{
     
    15541570  Variable x= Variable (1);
    15551571  CanonicalForm yToL= power (y, liftBound);
     1572  CanonicalForm bufF= F (y-eval, y);
    15561573  if (factors.length() == 2)
    15571574  {
     
    15591576    tmp1= factors.getFirst();
    15601577    tmp2= factors.getLast();
    1561     tmp1 *= LC (F, x);
    1562     tmp1= mod (tmp1, yToL);
     1578    tmp1= mulMod2 (tmp1, LC (F,x), yToL);
    15631579    tmp1 /= content (tmp1, x);
    1564     tmp2 *= LC (F, x);
    1565     tmp2= mod (tmp2, yToL);
     1580    tmp1= tmp1 (y-eval, y);
     1581    tmp2= mulMod2 (tmp2, LC (F,x), yToL);
    15661582    tmp2 /= content (tmp2, x);
     1583    tmp2= tmp2 (y-eval,y);
    15671584    tmp3 = tmp1*tmp2;
    1568     if (tmp3/Lc (tmp3) == F/Lc (F))
     1585    if (tmp3/Lc (tmp3) == bufF/Lc (bufF))
    15691586    {
    15701587      factorsFound++;
     
    16011618      }
    16021619    }
    1603     buf *= LC (F, x);
    1604     buf= mod (buf, yToL);
     1620    buf= mulMod2 (buf, LC (F,x), yToL);
    16051621    buf /= content (buf, x);
    1606     if (fdivides (buf, F, quot))
     1622    buf= buf (y-eval,y);
     1623    if (fdivides (buf, bufF, quot))
    16071624    {
    16081625      factorsFoundIndex[i - 1]= 1;
    16091626      factorsFound++;
    1610       F= quot;
    1611       F /= Lc (F);
     1627      bufF= quot;
     1628      bufF /= Lc (bufF);
    16121629      reconstructedFactors.append (buf);
    16131630    }
    1614     if (degree (F) <= 0)
     1631    if (degree (bufF) <= 0)
    16151632      return;
    16161633    if (factorsFound + 1 == N.NumCols())
    16171634    {
    1618       reconstructedFactors.append (F);
     1635      reconstructedFactors.append (bufF);
     1636      F=1;
    16191637      return;
    16201638    }
    16211639  }
     1640  if (reconstructedFactors.length() != 0)
     1641    F= bufF (y+eval,y);
    16221642}
    16231643
     
    16261646reconstructionTry (CFList& reconstructedFactors, CanonicalForm& F, const CFList&
    16271647                   factors, const int liftBound, int& factorsFound, int*&
    1628                    factorsFoundIndex, nmod_mat_t N, bool beenInThres
     1648                   factorsFoundIndex, nmod_mat_t N, const CanonicalForm& eval,
     1649                   bool beenInThres
    16291650                  )
    16301651{
     
    16321653  Variable x= Variable (1);
    16331654  CanonicalForm yToL= power (y, liftBound);
     1655  CanonicalForm bufF= F (y-eval, y);
    16341656  if (factors.length() == 2)
    16351657  {
     
    16371659    tmp1= factors.getFirst();
    16381660    tmp2= factors.getLast();
    1639     tmp1 *= LC (F, x);
    1640     tmp1= mod (tmp1, yToL);
     1661    tmp1= mulMod2 (tmp1, LC (F,x), yToL);
    16411662    tmp1 /= content (tmp1, x);
    1642     tmp2 *= LC (F, x);
    1643     tmp2= mod (tmp2, yToL);
     1663    tmp1= tmp1 (y-eval, y);
     1664    tmp2= mulMod2 (tmp2, LC (F,x), yToL);
    16441665    tmp2 /= content (tmp2, x);
     1666    tmp2= tmp2 (y-eval, y);
    16451667    tmp3 = tmp1*tmp2;
    1646     if (tmp3/Lc (tmp3) == F/Lc (F))
     1668    if (tmp3/Lc (tmp3) == bufF/Lc (bufF))
    16471669    {
    16481670      factorsFound++;
     
    16791701      }
    16801702    }
    1681     buf *= LC (F, x);
    1682     buf= mod (buf, yToL);
     1703    buf= mulMod2 (buf, LC (F,x), yToL);
    16831704    buf /= content (buf, x);
    1684     if (fdivides (buf, F, quot))
     1705    buf= buf (y-eval,y);
     1706    if (fdivides (buf, bufF, quot))
    16851707    {
    16861708      factorsFoundIndex[i]= 1;
    16871709      factorsFound++;
    1688       F= quot;
    1689       F /= Lc (F);
     1710      bufF= quot;
     1711      bufF /= Lc (bufF);
    16901712      reconstructedFactors.append (buf);
    16911713    }
     
    16941716    if (factorsFound + 1 == nmod_mat_ncols (N))
    16951717    {
    1696       reconstructedFactors.append (F);
     1718      F= 1;
     1719      reconstructedFactors.append (bufF);
    16971720      return;
    16981721    }
    16991722  }
     1723  if (reconstructedFactors.length() != 0)
     1724    F= bufF (y+eval,y);
    17001725}
    17011726#endif
     
    17031728CFList
    17041729reconstruction (CanonicalForm& G, CFList& factors, int* zeroOneVecs, int
    1705                 precision, const mat_zz_pE& N
     1730                precision, const mat_zz_pE& N, const CanonicalForm& eval
    17061731               )
    17071732{
     
    17291754      }
    17301755    }
    1731     buf *= LC (F, x);
    1732     buf= mod (buf, yToL);
     1756    buf= mulMod2 (buf, LC (F,x), yToL);
    17331757    buf /= content (buf, x);
    17341758    if (fdivides (buf, F, quot))
     
    17361760      F= quot;
    17371761      F /= Lc (F);
    1738       result.append (buf);
     1762      result.append (buf (y-eval,y));
    17391763      bufFactors= Difference (bufFactors, factorsConsidered);
    17401764    }
     
    17811805    }
    17821806    buf2= buf;
    1783     buf *= LC (F, x);
    1784     buf= mod (buf, yToL);
     1807    buf= mulMod2 (buf, LC (F,x), yToL);
    17851808    buf /= content (buf, x);
    17861809    if (fdivides (buf, F, quot))
     
    18381861      }
    18391862    }
    1840     buf *= LC (F, x);
    1841     buf= mod (buf, yToL);
     1863    buf= mulMod2 (buf, LC (F,x), yToL);
    18421864    buf /= content (buf, x);
    18431865    buf2= buf (y-evaluation, y);
     
    19191941      }
    19201942    }
    1921     buf *= LC (F, x);
    1922     buf= mod (buf, yToL);
     1943    buf= mulMod2 (buf, LC (F,x), yToL);
    19231944    buf /= content (buf, x);
    19241945    buf2= buf (y-evaluation, y);
     
    19671988CFList
    19681989reconstruction (CanonicalForm& G, CFList& factors, int* zeroOneVecs,
    1969                 int precision, const mat_zz_p& N)
     1990                int precision, const mat_zz_p& N, const CanonicalForm& eval)
    19701991{
    19711992  Variable y= Variable (2);
     
    19932014      }
    19942015    }
    1995     buf *= LC (F, x);
    1996     buf= mod (buf, yToL);
     2016    buf= mulMod2 (buf, LC (F,x), yToL);
    19972017    buf /= content (buf, x);
    19982018    if (fdivides (buf, F, quot))
     
    20002020      F= quot;
    20012021      F /= Lc (F);
    2002       result.append (buf);
     2022      result.append (buf (y-eval,y));
    20032023      bufFactors= Difference (bufFactors, factorsConsidered);
    20042024    }
     
    20182038CFList
    20192039reconstruction (CanonicalForm& G, CFList& factors, int* zeroOneVecs,
    2020                 int precision, const nmod_mat_t N)
     2040                int precision, const nmod_mat_t N, const CanonicalForm& eval)
    20212041{
    20222042  Variable y= Variable (2);
     
    20442064      }
    20452065    }
    2046     buf *= LC (F, x);
    2047     buf= mod (buf, yToL);
     2066    buf= mulMod2 (buf, LC (F,x), yToL);
    20482067    buf /= content (buf, x);
    20492068    if (fdivides (buf, F, quot))
     
    20512070      F= quot;
    20522071      F /= Lc (F);
    2053       result.append (buf);
     2072      result.append (buf (y-eval,y));
    20542073      bufFactors= Difference (bufFactors, factorsConsidered);
    20552074    }
     
    20882107    tmp1= factors.getFirst();
    20892108    tmp2= factors.getLast();
    2090     tmp1 *= LC (F, x);
    2091     tmp1= mod (tmp1, yToL);
     2109    tmp1= mulMod2 (tmp1, LC (F,x), yToL);
    20922110    tmp1 /= content (tmp1, x);
    2093     tmp2 *= LC (F, x);
    2094     tmp2= mod (tmp2, yToL);
     2111    tmp2= mulMod2 (tmp2, LC (F,x), yToL);
    20952112    tmp2 /= content (tmp2, x);
    20962113    tmp3 = tmp1*tmp2;
     
    21512168      }
    21522169    }
    2153     buf *= LC (F, x);
    2154     buf= mod (buf, yToL);
     2170    buf= mulMod2 (buf, LC (F,x), yToL);
    21552171    buf /= content (buf, x);
    21562172    buf2= buf (y - evaluation, y);
     
    22202236    tmp1= factors.getFirst();
    22212237    tmp2= factors.getLast();
    2222     tmp1 *= LC (F, x);
    2223     tmp1= mod (tmp1, yToL);
     2238    tmp1= mulMod2 (tmp1, LC (F,x), yToL);
    22242239    tmp1 /= content (tmp1, x);
    2225     tmp2 *= LC (F, x);
    2226     tmp2= mod (tmp2, yToL);
     2240    tmp2= mulMod2 (tmp2, LC (F,x), yToL);
    22272241    tmp2 /= content (tmp2, x);
    22282242    tmp3 = tmp1*tmp2;
     
    22832297      }
    22842298    }
    2285     buf *= LC (F, x);
    2286     buf= mod (buf, yToL);
     2299    buf= mulMod2 (buf, LC (F,x), yToL);
    22872300    buf /= content (buf, x);
    22882301    buf2= buf (y - evaluation, y);
     
    23552368  while (l <= liftBound)
    23562369  {
     2370    TIMING_START (fac_fq_compute_lattice_lift);
    23572371    if (start)
    23582372    {
     
    23672381        henselLift12 (F, factors, l, Pi, diophant, M);
    23682382    }
     2383    TIMING_END_AND_PRINT (fac_fq_compute_lattice_lift,
     2384                          "time to lift in compute lattice: ");
    23692385
    23702386    factors.insert (LCF);
     
    23732389
    23742390    truncF= mod (F, power (y, l));
     2391    TIMING_START (fac_fq_logarithmic);
    23752392    for (int i= 0; i < factors.length() - 1; i++, j++)
    23762393    {
     
    23812398                                     bufQ[i]);
    23822399    }
     2400    TIMING_END_AND_PRINT (fac_fq_logarithmic,
     2401                          "time to compute logarithmic derivative: ");
    23832402
    23842403    for (int i= 0; i < sizeBounds; i++)
     
    24722491  while (l <= liftBound)
    24732492  {
     2493    TIMING_START (fac_fq_compute_lattice_lift);
    24742494    if (start)
    24752495    {
     
    24842504        henselLift12 (F, factors, l, Pi, diophant, M);
    24852505    }
     2506    TIMING_END_AND_PRINT (fac_fq_compute_lattice_lift,
     2507                          "time to lift in compute lattice: ");
    24862508
    24872509    factors.insert (LCF);
     
    24902512
    24912513    truncF= mod (F, power (y, l));
     2514    TIMING_START (fac_fq_logarithmic);
    24922515    for (int i= 0; i < factors.length() - 1; i++, j++)
    24932516    {
     
    24982521                                     bufQ[i]);
    24992522    }
     2523    TIMING_END_AND_PRINT (fac_fq_logarithmic,
     2524                          "time to compute logarithmic derivative: ");
    25002525
    25012526    for (int i= 0; i < sizeBounds; i++)
     
    26192644  while (l <= liftBound)
    26202645  {
     2646    TIMING_START (fac_fq_compute_lattice_lift);
    26212647    if (start)
    26222648    {
     
    26312657        henselLift12 (F, factors, l, Pi, diophant, M);
    26322658    }
     2659    TIMING_END_AND_PRINT (fac_fq_compute_lattice_lift,
     2660                          "time to lift in compute lattice: ");
    26332661
    26342662    factors.insert (LCF);
     
    26592687
    26602688    truncF= mod (F, power (y, l));
     2689    TIMING_START (fac_fq_logarithmic);
    26612690    for (int i= 0; i < factors.length() - 1; i++, j++)
    26622691    {
     
    26672696                                     bufQ[i]);
    26682697    }
     2698    TIMING_END_AND_PRINT (fac_fq_logarithmic,
     2699                          "time to compute logarithmic derivative: ");
    26692700
    26702701    for (int i= 0; i < sizeBounds; i++)
     
    29973028  while (l <= liftBound)
    29983029  {
     3030    TIMING_START (fac_fq_compute_lattice_lift);
    29993031    if (start)
    30003032    {
     
    30093041        henselLift12 (F, factors, l, Pi, diophant, M);
    30103042    }
     3043    TIMING_END_AND_PRINT (fac_fq_compute_lattice_lift,
     3044                          "time to lift in compute lattice: ");
    30113045
    30123046    factors.insert (LCF);
     
    30153049
    30163050    truncF= mod (F, power (y,l));
     3051    TIMING_START (fac_fq_logarithmic);
    30173052    for (int i= 0; i < factors.length() - 1; i++, j++)
    30183053    {
     
    30283063      }
    30293064    }
     3065    TIMING_END_AND_PRINT (fac_fq_logarithmic,
     3066                          "time to compute logarithmic derivative: ");
    30303067
    30313068    for (int i= 0; i < sizeBounds; i++)
     
    31393176  while (l <= liftBound)
    31403177  {
     3178    TIMING_START (fac_fq_compute_lattice_lift);
    31413179    if (start)
    31423180    {
     
    31513189        henselLift12 (F, factors, l, Pi, diophant, M);
    31523190    }
     3191    TIMING_END_AND_PRINT (fac_fq_compute_lattice_lift,
     3192                          "time to lift in compute lattice: ");
    31533193
    31543194    factors.insert (LCF);
     
    31573197
    31583198    truncF= mod (F, power (y,l));
     3199    TIMING_START (fac_fq_logarithmic);
    31593200    for (int i= 0; i < factors.length() - 1; i++, j++)
    31603201    {
     
    31703211      }
    31713212    }
     3213    TIMING_END_AND_PRINT (fac_fq_logarithmic,
     3214                          "time to compute logarithmic derivative: ");
    31723215
    31733216    for (int i= 0; i < sizeBounds; i++)
     
    32763319CFList
    32773320increasePrecision (CanonicalForm& F, CFList& factors, int factorsFound,
    3278                    int oldNumCols, int oldL, int precision
     3321                   int oldNumCols, int oldL, int precision,
     3322                   const CanonicalForm& eval
    32793323                  )
    32803324{
     
    32823326  bool isIrreducible= false;
    32833327  int* bounds= computeBounds (F, d, isIrreducible);
     3328  Variable y= F.mvar();
    32843329  if (isIrreducible)
    32853330  {
     
    32873332    CanonicalForm G= F;
    32883333    F= 1;
    3289     return CFList (G);
     3334    return CFList (G (y-eval, y));
    32903335  }
    32913336  CFArray * A= new CFArray [factors.length()];
     
    33203365  mat_zz_p* NTLC, NTLK;
    33213366#endif
    3322   Variable y= F.mvar();
    33233367  CanonicalForm truncF;
    33243368  while (l <= precision)
     
    33933437          CanonicalForm G= F;
    33943438          F= 1;
    3395           return CFList (G);
     3439          return CFList (G (y-eval,y));
    33963440        }
    33973441      }
     
    34193463#ifdef HAVE_FLINT
    34203464        reconstructionTry (result, bufF, factors, degree (F) + 1, factorsFound2,
    3421                            factorsFoundIndex, FLINTN, false
     3465                           factorsFoundIndex, FLINTN, eval, false
    34223466                          );
    34233467        if (result.length() == nmod_mat_ncols (FLINTN))
     
    34263470#else
    34273471        reconstructionTry (result, bufF, factors, degree (F) + 1, factorsFound2,
    3428                            factorsFoundIndex, NTLN, false
     3472                           factorsFoundIndex, NTLN, eval, false
    34293473                          );
    34303474        if (result.length() == NTLN.NumCols())
     
    34443488#ifdef HAVE_FLINT
    34453489        int * zeroOne= extractZeroOneVecs (FLINTN);
    3446         CFList result= reconstruction (bufF,factors,zeroOne,precision,FLINTN);
     3490        CFList result= reconstruction (bufF,factors,zeroOne,precision,FLINTN, eval);
    34473491        nmod_mat_clear (FLINTN);
    34483492#else
    34493493        int * zeroOne= extractZeroOneVecs (NTLN);
    3450         CFList result= reconstruction (bufF, factors, zeroOne, precision, NTLN);
     3494        CFList result= reconstruction (bufF, factors, zeroOne, precision, NTLN, eval);
    34513495#endif
    34523496        F= bufF;
     
    34823526increasePrecision (CanonicalForm& F, CFList& factors, int factorsFound,
    34833527                   int oldNumCols, int oldL, const Variable&,
    3484                    int precision
     3528                   int precision, const CanonicalForm& eval
    34853529                  )
    34863530{
    34873531  int d;
    34883532  bool isIrreducible= false;
     3533  Variable y= F.mvar();
    34893534  int* bounds= computeBounds (F, d, isIrreducible);
    34903535  if (isIrreducible)
     
    34933538    CanonicalForm G= F;
    34943539    F= 1;
    3495     return CFList (G);
     3540    return CFList (G (y-eval,y));
    34963541  }
    34973542  CFArray * A= new CFArray [factors.length()];
     
    35143559  mat_zz_pE* NTLC, NTLK;
    35153560  CFArray buf;
    3516   Variable y= F.mvar();
    35173561  CanonicalForm truncF;
    35183562  while (l <= precision)
     
    35593603          CanonicalForm G= F;
    35603604          F= 1;
    3561           return CFList (G);
     3605          return CFList (G (y-eval,y));
    35623606        }
    35633607      }
     
    35753619        CanonicalForm bufF= F;
    35763620        reconstructionTry (result, bufF, factors, degree (F) + 1, factorsFound2,
    3577                            factorsFoundIndex, NTLN, false);
     3621                           factorsFoundIndex, NTLN, eval, false);
    35783622        if (result.length() == NTLN.NumCols())
    35793623        {
     
    35903634        CanonicalForm bufF= F;
    35913635        int * zeroOne= extractZeroOneVecs (NTLN);
    3592         CFList result= reconstruction (bufF, factors, zeroOne, precision, NTLN);
     3636        CFList result= reconstruction (bufF, factors, zeroOne, precision, NTLN, eval);
    35933637        F= bufF;
    35943638        delete [] zeroOne;
     
    39584002increasePrecisionFq2Fp (CanonicalForm& F, CFList& factors, int factorsFound,
    39594003                        int oldNumCols, int oldL, const Variable& alpha,
    3960                         int precision
     4004                        int precision, const CanonicalForm& eval
    39614005                       )
    39624006{
    39634007  int d;
    39644008  bool isIrreducible= false;
     4009  Variable y= F.mvar();
    39654010  int* bounds= computeBounds (F, d, isIrreducible);
    39664011  if (isIrreducible)
     
    39694014    CanonicalForm G= F;
    39704015    F= 1;
    3971     return CFList (G);
     4016    return CFList (G (y-eval,y));
    39724017  }
    39734018  int extensionDeg= degree (getMipo (alpha));
     
    40034048#endif
    40044049  CFArray buf;
    4005   Variable y= F.mvar();
    40064050  CanonicalForm truncF;
    40074051  while (l <= precision)
     
    40764120          CanonicalForm G= F;
    40774121          F= 1;
    4078           return CFList (G);
     4122          return CFList (G (y-eval,y));
    40794123        }
    40804124      }
     
    41024146#ifdef HAVE_FLINT
    41034147        reconstructionTry (result, bufF, factors, degree (F) + 1, factorsFound2,
    4104                            factorsFoundIndex, FLINTN, false
     4148                           factorsFoundIndex, FLINTN, eval, false
    41054149                          );
    41064150        if (result.length() == nmod_mat_ncols (FLINTN))
     
    41094153#else
    41104154        reconstructionTry (result, bufF, factors, degree (F) + 1, factorsFound2,
    4111                            factorsFoundIndex, NTLN, false
     4155                           factorsFoundIndex, NTLN, eval, false
    41124156                          );
    41134157        if (result.length() == NTLN.NumCols())
     
    41274171#ifdef HAVE_FLINT
    41284172        int * zeroOne= extractZeroOneVecs (FLINTN);
    4129         CFList result= reconstruction (bufF,factors,zeroOne,precision,FLINTN);
     4173        CFList result= reconstruction (bufF,factors,zeroOne,precision,FLINTN, eval);
    41304174        nmod_mat_clear (FLINTN);
    41314175#else
    41324176        int * zeroOne= extractZeroOneVecs (NTLN);
    4133         CFList result= reconstruction (bufF, factors, zeroOne, precision, NTLN);
     4177        CFList result= reconstruction (bufF, factors, zeroOne, precision, NTLN, eval);
    41344178#endif
    41354179        F= bufF;
     
    41654209CFList
    41664210increasePrecision (CanonicalForm& F, CFList& factors, int oldL, int
    4167                    l, int d, int* bounds, CFArray& bufQ, nmod_mat_t FLINTN
     4211                   l, int d, int* bounds, CFArray& bufQ, nmod_mat_t FLINTN,
     4212                   const CanonicalForm& eval
    41684213                  )
    41694214#else
    41704215CFList
    41714216increasePrecision (CanonicalForm& F, CFList& factors, int oldL, int
    4172                    l, int d, int* bounds, CFArray& bufQ, mat_zz_p& NTLN
     4217                   l, int d, int* bounds, CFArray& bufQ, mat_zz_p& NTLN,
     4218                   const CanonicalForm& eval
    41734219                  )
    41744220#endif
     
    42744320        {
    42754321          delete [] A;
    4276           return CFList (F);
     4322          return CFList (F (y-eval,y));
    42774323        }
    42784324      }
     
    42854331    {
    42864332      delete [] A;
    4287       return CFList (F);
     4333      return CFList (F (y-eval,y));
    42884334    }
    42894335    int * zeroOneVecs;
     
    42964342    bufUniFactors= factors;
    42974343#ifdef HAVE_FLINT
    4298     result= reconstruction (bufF, bufUniFactors, zeroOneVecs, oldL, FLINTN);
    4299 #else
    4300     result= reconstruction (bufF, bufUniFactors, zeroOneVecs, oldL, NTLN);
     4344    result= reconstruction (bufF, bufUniFactors, zeroOneVecs, oldL, FLINTN, eval);
     4345#else
     4346    result= reconstruction (bufF, bufUniFactors, zeroOneVecs, oldL, NTLN, eval);
    43014347#endif
    43024348    delete [] zeroOneVecs;
     
    43294375CFList
    43304376increasePrecision (CanonicalForm& F, CFList& factors, int oldL, int
    4331                    l, int d, int* bounds, CFArray& bufQ, mat_zz_pE& NTLN
     4377                   l, int d, int* bounds, CFArray& bufQ, mat_zz_pE& NTLN,
     4378                   const CanonicalForm& eval
    43324379                  )
    43334380{
     
    43874434        {
    43884435          delete [] A;
    4389           return CFList (F);
     4436          return CFList (F (y-eval,y));
    43904437        }
    43914438      }
     
    43944441    {
    43954442      delete [] A;
    4396       return CFList (F);
     4443      return CFList (F (y-eval,y));
    43974444    }
    43984445
     
    44014448    bufF= F;
    44024449    bufUniFactors= factors;
    4403     result= reconstruction (bufF, bufUniFactors, zeroOneVecs, oldL, NTLN);
     4450    result= reconstruction (bufF, bufUniFactors, zeroOneVecs, oldL, NTLN, eval);
    44044451    delete [] zeroOneVecs;
    44054452    if (degree (bufF) + 1 + degree (LC (bufF, 1)) < l && result.length() > 0)
     
    46044651increasePrecisionFq2Fp (CanonicalForm& F, CFList& factors, int oldL, int l,
    46054652                        int d, int* bounds, CFArray& bufQ, nmod_mat_t FLINTN,
    4606                         const Variable& alpha
     4653                        const Variable& alpha, const CanonicalForm& eval
    46074654                       )
    46084655#else
     
    46104657increasePrecisionFq2Fp (CanonicalForm& F, CFList& factors, int oldL, int l,
    46114658                        int d, int* bounds, CFArray& bufQ, mat_zz_p& NTLN,
    4612                         const Variable& alpha
     4659                        const Variable& alpha, const CanonicalForm& eval
    46134660                       )
    46144661#endif
     
    47114758        {
    47124759          delete [] A;
    4713           return CFList (F);
     4760          return CFList (F(y-eval,y));
    47144761        }
    47154762      }
     
    47264773    bufUniFactors= factors;
    47274774#ifdef HAVE_FLINT
    4728     result= reconstruction (bufF, bufUniFactors, zeroOneVecs, oldL, FLINTN);
    4729 #else
    4730     result= reconstruction (bufF, bufUniFactors, zeroOneVecs, oldL, NTLN);
     4775    result= reconstruction (bufF, bufUniFactors, zeroOneVecs, oldL, FLINTN, eval);
     4776#else
     4777    result= reconstruction (bufF, bufUniFactors, zeroOneVecs, oldL, NTLN, eval);
    47314778#endif
    47324779    delete [] zeroOneVecs;
     
    47624809                                    factors, int l, int liftBound, int d, int*
    47634810                                    bounds, nmod_mat_t FLINTN, CFList& diophant,
    4764                                     CFMatrix& M, CFArray& Pi, CFArray& bufQ
     4811                                    CFMatrix& M, CFArray& Pi, CFArray& bufQ,
     4812                                    const CanonicalForm& eval
    47654813                                   )
    47664814#else
     
    47694817                                    factors, int l, int liftBound, int d, int*
    47704818                                    bounds, mat_zz_p& NTLN, CFList& diophant,
    4771                                     CFMatrix& M, CFArray& Pi, CFArray& bufQ
     4819                                    CFMatrix& M, CFArray& Pi, CFArray& bufQ,
     4820                                    const CanonicalForm& eval
    47724821                                   )
    47734822#endif
     
    48964945    bufF= F;
    48974946#ifdef HAVE_FLINT
    4898     result= reconstruction (bufF, bufFactors, zeroOneVecs, l, FLINTN);
    4899 #else
    4900     result= reconstruction (bufF, bufFactors, zeroOneVecs, l, NTLN);
     4947    result= reconstruction (bufF, bufFactors, zeroOneVecs, l, FLINTN, eval);
     4948#else
     4949    result= reconstruction (bufF, bufFactors, zeroOneVecs, l, NTLN, eval);
    49014950#endif
    49024951    delete [] zeroOneVecs;
     
    49284977      if (l < liftBound)
    49294978        reconstructionTry (result, bufF, bufFactors, l, factorsFound,
    4930                            factorsFoundIndex, FLINTN, false
     4979                           factorsFoundIndex, FLINTN, eval, false
    49314980                          );
    49324981      else
    49334982        reconstructionTry (result, bufF, bufFactors, degree (bufF) + 1 +
    49344983                           degree (LCF), factorsFound, factorsFoundIndex,
    4935                            FLINTN, false
     4984                           FLINTN, eval, false
    49364985                          );
    49374986
     
    49404989      if (l < liftBound)
    49414990        reconstructionTry (result, bufF, bufFactors, l, factorsFound,
    4942                            factorsFoundIndex, NTLN, false
     4991                           factorsFoundIndex, NTLN, eval, false
    49434992                          );
    49444993      else
    49454994        reconstructionTry (result, bufF, bufFactors, degree (bufF) + 1 +
    49464995                           degree (LCF), factorsFound, factorsFoundIndex,
    4947                            NTLN, false
     4996                           NTLN, eval, false
    49484997                          );
    49494998
     
    49755024  {
    49765025    delete [] A;
    4977     return CFList (F);
     5026    return CFList (F (y-eval,y));
    49785027  }
    49795028  delete [] A;
     
    49875036                                    factors, int l, int liftBound, int d, int*
    49885037                                    bounds, mat_zz_pE& NTLN, CFList& diophant,
    4989                                     CFMatrix& M, CFArray& Pi, CFArray& bufQ
     5038                                    CFMatrix& M, CFArray& Pi, CFArray& bufQ,
     5039                                    const CanonicalForm& eval
    49905040                                   )
    49915041{
     
    50595109    int * zeroOneVecs= extractZeroOneVecs (NTLN);
    50605110    bufF= F;
    5061     result= reconstruction (bufF, bufFactors, zeroOneVecs, l, NTLN);
     5111    result= reconstruction (bufF, bufFactors, zeroOneVecs, l, NTLN, eval);
    50625112    delete [] zeroOneVecs;
    50635113    if (result.length() > 0 && degree (bufF) + 1 + degree (LC (bufF, 1)) <= l)
     
    50785128      if (l < liftBound)
    50795129        reconstructionTry (result, bufF, bufFactors, l, factorsFound,
    5080                            factorsFoundIndex, NTLN, false
     5130                           factorsFoundIndex, NTLN, eval, false
    50815131                          );
    50825132      else
    50835133        reconstructionTry (result, bufF, bufFactors, degree (bufF) + 1 +
    50845134                           degree (LCF), factorsFound, factorsFoundIndex,
    5085                            NTLN, false
     5135                           NTLN, eval, false
    50865136                          );
    50875137      if (NTLN.NumCols() == result.length())
     
    51115161  {
    51125162    delete [] A;
    5113     return CFList (F);
     5163    return CFList (F (y-eval,y));
    51145164  }
    51155165  delete [] A;
     
    53275377                                         nmod_mat_t FLINTN, CFList& diophant,
    53285378                                         CFMatrix& M, CFArray& Pi, CFArray& bufQ,
    5329                                          const Variable& alpha
     5379                                         const Variable& alpha,
     5380                                         const CanonicalForm& eval
    53305381                                        )
    53315382#else
     
    53355386                                         mat_zz_p& NTLN, CFList& diophant,
    53365387                                         CFMatrix& M, CFArray& Pi, CFArray& bufQ,
    5337                                          const Variable& alpha
     5388                                         const Variable& alpha,
     5389                                         const CanonicalForm& eval
    53385390                                        )
    53395391#endif
     
    54605512    CanonicalForm bufF= F;
    54615513#ifdef HAVE_FLINT
    5462     result= reconstruction (bufF, bufFactors, zeroOneVecs, l, FLINTN);
    5463 #else
    5464     result= reconstruction (bufF, bufFactors, zeroOneVecs, l, NTLN);
     5514    result= reconstruction (bufF, bufFactors, zeroOneVecs, l, FLINTN, eval);
     5515#else
     5516    result= reconstruction (bufF, bufFactors, zeroOneVecs, l, NTLN,  eval);
    54655517#endif
    54665518    delete [] zeroOneVecs;
     
    54925544      if (l < degree (bufF) + 1 + degree (LCF))
    54935545        reconstructionTry (result, bufF, bufFactors, l, factorsFound,
    5494                            factorsFoundIndex, FLINTN, false
     5546                           factorsFoundIndex, FLINTN, eval, false
    54955547                          );
    54965548      else
    54975549        reconstructionTry (result, bufF, bufFactors, degree (bufF) + 1 +
    54985550                           degree (LCF), factorsFound, factorsFoundIndex,
    5499                            FLINTN, false
     5551                           FLINTN, eval, false
    55005552                          );
    55015553      if (nmod_mat_ncols (FLINTN) == result.length())
     
    55035555      if (l < degree (bufF) + 1 + degree (LCF))
    55045556        reconstructionTry (result, bufF, bufFactors, l, factorsFound,
    5505                            factorsFoundIndex, NTLN, false
     5557                           factorsFoundIndex, NTLN, eval, false
    55065558                          );
    55075559      else
    55085560        reconstructionTry (result, bufF, bufFactors, degree (bufF) + 1 +
    55095561                           degree (LCF), factorsFound, factorsFoundIndex,
    5510                            NTLN, false
     5562                           NTLN, eval, false
    55115563                          );
    55125564      if (NTLN.NumCols() == result.length())
     
    55375589  {
    55385590    delete [] A;
    5539     return CFList (F);
     5591    return CFList (F (y-eval,y));
    55405592  }
    55415593  delete [] A;
     
    56785730    if (l < smallFactorDeg)
    56795731    {
     5732      TIMING_START (fac_fq_lift);
    56805733      factors.insert (LCF);
    56815734      henselLiftResume12 (F, factors, l, smallFactorDeg, Pi, diophant, M);
     5735      TIMING_END_AND_PRINT (fac_fq_lift, "time to lift in reconstruction0: ");
    56825736      l= smallFactorDeg;
    56835737    }
    56845738#ifdef HAVE_FLINT
     5739    TIMING_START (fac_fq_reconstruction);
    56855740    reconstructionTry (result, bufF, factors, smallFactorDeg, factorsFound,
    5686                        factorsFoundIndex, FLINTN, beenInThres
     5741                       factorsFoundIndex, FLINTN, evaluation, beenInThres
    56875742                      );
     5743    TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct0: ");
    56885744    if (result.length() == nmod_mat_ncols (FLINTN))
    56895745    {
    56905746      nmod_mat_clear (FLINTN);
    56915747#else
     5748    TIMING_START (fac_fq_reconstruction);
    56925749    reconstructionTry (result, bufF, factors, smallFactorDeg, factorsFound,
    5693                        factorsFoundIndex, NTLN, beenInThres
     5750                       factorsFoundIndex, NTLN, evaluation, beenInThres
    56945751                      );
     5752    TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct0: ");
    56955753    if (result.length() == NTLN.NumCols())
    56965754    {
     
    57115769      {
    57125770        factors.insert (LCF);
     5771        TIMING_START (fac_fq_lift);
    57135772        henselLiftResume12 (F, factors, l, liftPre[i-1] + 1, Pi, diophant, M);
     5773        TIMING_END_AND_PRINT (fac_fq_lift, "time to lift in reconstruction1: ");
    57145774        l= liftPre[i-1] + 1;
    57155775      }
     
    57215781      }
    57225782#ifdef HAVE_FLINT
     5783      TIMING_START (fac_fq_reconstruction);
    57235784      reconstructionTry (result, bufF, factors, l, factorsFound,
    5724                          factorsFoundIndex, FLINTN, beenInThres
     5785                         factorsFoundIndex, FLINTN, evaluation, beenInThres
    57255786                        );
     5787      TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct1: ");
    57265788      if (result.length() == nmod_mat_ncols (FLINTN))
    57275789      {
    57285790        nmod_mat_clear (FLINTN);
    57295791#else
     5792      TIMING_START (fac_fq_reconstruction);
    57305793      reconstructionTry (result, bufF, factors, l, factorsFound,
    5731                          factorsFoundIndex, NTLN, beenInThres
     5794                         factorsFoundIndex, NTLN, evaluation, beenInThres
    57325795                        );
     5796      TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct1: ");
    57335797      if (result.length() == NTLN.NumCols())
    57345798      {
     
    57525816      {
    57535817        factors.insert (LCF);
     5818        TIMING_START (fac_fq_lift);
    57545819        henselLiftResume12 (F, factors, l, dummy, Pi, diophant, M);
     5820        TIMING_END_AND_PRINT (fac_fq_lift, "time to lift in reconstruction2: ");
    57555821        l= dummy;
    57565822        if (i == 1 && degree (F)%4==0 && symmetric && factors.length() == 2 &&
     
    57815847          check1= gg (y-evaluation,y);
    57825848          check2= hh (y-evaluation,y);
     5849          CanonicalForm oldcheck1= check1;
    57835850          check1= swapvar (check1, x, y);
    57845851          if (check1/Lc (check1) == check2/Lc (check2))
     
    57875854            nmod_mat_clear (FLINTN);
    57885855#endif
    5789             result.append (gg);
    5790             result.append (hh);
     5856            result.append (oldcheck1);
     5857            result.append (check2);
    57915858            delete [] liftPre;
    57925859            delete [] factorsFoundIndex;
     
    58025869      }
    58035870#ifdef HAVE_FLINT
     5871      TIMING_START (fac_fq_reconstruction);
    58045872      reconstructionTry (result, bufF, factors, l, factorsFound,
    5805                          factorsFoundIndex, FLINTN, beenInThres
     5873                         factorsFoundIndex, FLINTN, evaluation, beenInThres
    58065874                        );
     5875      TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct2: ");
    58075876      if (result.length() == nmod_mat_ncols (FLINTN))
    58085877      {
    58095878        nmod_mat_clear (FLINTN);
    58105879#else
     5880      TIMING_START (fac_fq_reconstruction);
    58115881      reconstructionTry (result, bufF, factors, l, factorsFound,
    5812                          factorsFoundIndex, NTLN, beenInThres
     5882                         factorsFoundIndex, NTLN, evaluation, beenInThres
    58135883                        );
     5884      TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct2: ");
    58145885      if (result.length() == NTLN.NumCols())
    58155886      {
     
    58555926    if (l < smallFactorDeg)
    58565927    {
     5928      TIMING_START (fac_fq_lift);
    58575929      factors.insert (LCF);
    58585930      henselLiftResume12 (F, factors, l, smallFactorDeg, Pi, diophant, M);
     5931      TIMING_END_AND_PRINT (fac_fq_lift, "time to lift in reconstruction0: ");
    58595932      l= smallFactorDeg;
    58605933    }
     5934    TIMING_START (fac_fq_reconstruction);
    58615935    reconstructionTry (result, bufF, factors, smallFactorDeg, factorsFound,
    5862                        factorsFoundIndex, NTLN, beenInThres
     5936                       factorsFoundIndex, NTLN, evaluation, beenInThres
    58635937                      );
     5938    TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct0: ");
    58645939    if (result.length() == NTLN.NumCols())
    58655940    {
     
    58795954      {
    58805955        factors.insert (LCF);
     5956        TIMING_START (fac_fq_lift);
    58815957        henselLiftResume12 (F, factors, l, liftPre[i-1] + 1, Pi, diophant, M);
     5958        TIMING_END_AND_PRINT (fac_fq_lift, "time to lift in reconstruction1: ");
    58825959        l= liftPre[i-1] + 1;
    58835960      }
     
    58885965          continue;
    58895966      }
     5967      TIMING_START (fac_fq_reconstruction);
    58905968      reconstructionTry (result, bufF, factors, l, factorsFound,
    5891                          factorsFoundIndex, NTLN, beenInThres
     5969                         factorsFoundIndex, NTLN, evaluation, beenInThres
    58925970                        );
     5971      TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct1: ");
    58935972      if (result.length() == NTLN.NumCols())
    58945973      {
     
    59115990      {
    59125991        factors.insert (LCF);
     5992        TIMING_START (fac_fq_lift);
    59135993        henselLiftResume12 (F, factors, l, dummy, Pi, diophant, M);
     5994        TIMING_END_AND_PRINT (fac_fq_lift, "time to lift in reconstruction2: ");
    59145995        l= dummy;
    59155996        if (i == 1 && degree (F)%4==0 && symmetric && factors.length() == 2 &&
     
    59406021          check1= gg (y-evaluation,y);
    59416022          check2= hh (y-evaluation,y);
     6023          CanonicalForm oldcheck1= check1;
    59426024          check1= swapvar (check1, x, y);
    59436025          if (check1/Lc (check1) == check2/Lc (check2))
    59446026          {
    5945             result.append (gg);
    5946             result.append (hh);
     6027            result.append (oldcheck1);
     6028            result.append (check2);
    59476029            delete [] liftPre;
    59486030            delete [] factorsFoundIndex;
     
    59576039          continue;
    59586040      }
     6041      TIMING_START (fac_fq_reconstruction);
    59596042      reconstructionTry (result, bufF, factors, l, factorsFound,
    5960                          factorsFoundIndex, NTLN, beenInThres
     6043                         factorsFoundIndex, NTLN, evaluation, beenInThres
    59616044                        );
     6045      TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct2: ");
    59626046      if (result.length() == NTLN.NumCols())
    59636047      {
     
    60016085    if (l < smallFactorDeg)
    60026086    {
     6087      TIMING_START (fac_fq_lift);
    60036088      factors.insert (LCF);
    60046089      henselLiftResume12 (F, factors, l, smallFactorDeg, Pi, diophant, M);
     6090      TIMING_END_AND_PRINT (fac_fq_lift, "time to lift in reconstruction0: ");
    60056091      l= smallFactorDeg;
    60066092    }
     6093    TIMING_START (fac_fq_reconstruction);
    60076094    extReconstructionTry (result, bufF, factors, smallFactorDeg, factorsFound,
    60086095                          factorsFoundIndex, NTLN, beenInThres, info,
    60096096                          evaluation
    60106097                      );
     6098    TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct0: ");
    60116099    if (result.length() == NTLN.NumCols())
    60126100    {
     
    60266114      {
    60276115        factors.insert (LCF);
     6116        TIMING_START (fac_fq_lift);
    60286117        henselLiftResume12 (F, factors, l, liftPre[i-1] + 1, Pi, diophant, M);
     6118        TIMING_END_AND_PRINT (fac_fq_lift, "time to lift in reconstruction1: ");
    60296119        l= liftPre[i-1] + 1;
    60306120      }
     
    60356125          continue;
    60366126      }
     6127      TIMING_START (fac_fq_reconstruction);
    60376128      extReconstructionTry (result, bufF, factors, l, factorsFound,
    60386129                            factorsFoundIndex, NTLN, beenInThres, info,
    60396130                            evaluation
    60406131                           );
     6132      TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct1: ");
    60416133      if (result.length() == NTLN.NumCols())
    60426134      {
     
    60596151      {
    60606152        factors.insert (LCF);
     6153        TIMING_START (fac_fq_lift);
    60616154        henselLiftResume12 (F, factors, l, dummy, Pi, diophant, M);
     6155        TIMING_END_AND_PRINT (fac_fq_lift, "time to lift in reconstruction2: ");
    60626156        l= dummy;
    60636157      }
     
    60686162          continue;
    60696163      }
     6164      TIMING_START (fac_fq_reconstruction);
    60706165      extReconstructionTry (result, bufF, factors, l, factorsFound,
    60716166                            factorsFoundIndex, NTLN, beenInThres, info,
    60726167                            evaluation
    60736168                           );
     6169      TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct2: ");
    60746170      if (result.length() == NTLN.NumCols())
    60756171      {
     
    60906186sieveSmallFactors (const CanonicalForm& G, CFList& uniFactors, DegreePattern&
    60916187                   degPat, CanonicalForm& H, CFList& diophant, CFArray& Pi,
    6092                    CFMatrix& M, bool& success, int d
     6188                   CFMatrix& M, bool& success, int d, const CanonicalForm& eval
    60936189                  )
    60946190{
     
    61066202  CFList earlyFactors;
    61076203  earlyFactorDetection (earlyFactors, F, bufUniFactors, adaptedLiftBound,
    6108                         factorsFoundIndex, degs, success, smallFactorDeg);
     6204                        factorsFoundIndex, degs, success, smallFactorDeg, eval);
    61096205  delete [] factorsFoundIndex;
    61106206  if (degs.getLength() == 1)
     
    61836279henselLiftAndLatticeRecombi (const CanonicalForm& G, const CFList& uniFactors,
    61846280                             const Variable& alpha, const DegreePattern& degPat,
    6185                              bool symmetric, const CanonicalForm& evaluation
     6281                             bool symmetric, const CanonicalForm& eval
    61866282                            )
    61876283{
     
    62166312  bool success= false;
    62176313  smallFactors= sieveSmallFactors (F, bufUniFactors, degs, H, diophant, Pi, M,
    6218                                    success, minBound + 1
     6314                                   success, minBound + 1, eval
    62196315                                  );
    62206316
     
    62266322      {
    62276323        delete [] bounds;
    6228         return CFList (G);
     6324        return CFList (G (y-eval,y));
    62296325      }
    62306326    }
     
    62416337  {
    62426338    index= 1;
    6243     tmp1= mod (i.getItem(),y);
     6339    tmp1= mod (i.getItem(),y-eval);
    62446340    tmp1 /= Lc (tmp1);
    62456341    for (CFListIterator j= bufUniFactors; j.hasItem(); j++, index++)
     
    62696365    if (isIrreducible)
    62706366    {
    6271       smallFactors.append (F);
     6367      smallFactors.append (F (y-eval,y));
    62726368      delete [] bounds;
    62736369      return smallFactors;
     
    62906386    if (degs.getLength() <= 1)
    62916387    {
    6292       smallFactors.append (F);
     6388      smallFactors.append (F (y-eval,y));
    62936389      delete [] bounds;
    62946390      return smallFactors;
     
    63466442
    63476443  int oldL;
     6444  TIMING_START (fac_fq_till_reduced);
    63486445  if (success)
    63496446  {
     
    64106507  }
    64116508
     6509  TIMING_END_AND_PRINT (fac_fq_till_reduced,
     6510                        "time to compute a reduced lattice: ");
    64126511  bufUniFactors.removeFirst();
    64136512  if (oldL > liftBound)
     
    64216520                  factorRecombination (bufUniFactors, F,
    64226521                                       power (y, degree (F) + 1),
    6423                                        degs, 1, bufUniFactors.length()/2
     6522                                       degs, eval, 1, bufUniFactors.length()/2
    64246523                                      )
    64256524                 );
     
    64346533#endif
    64356534    delete [] bounds;
    6436     return Union (CFList (F), smallFactors);
     6535    return Union (CFList (F(y-eval,y)), smallFactors);
    64376536  }
    64386537
     
    64656564      reconstructionTry (result, bufF, bufUniFactors, degree (F) + 1,
    64666565#ifdef HAVE_FLINT
    6467                          factorsFound, factorsFoundIndex, FLINTN, false
    6468 #else
    6469                          factorsFound, factorsFoundIndex, NTLN, false
     6566                         factorsFound, factorsFoundIndex, FLINTN, eval, false
     6567#else
     6568                         factorsFound, factorsFoundIndex, NTLN, eval, false
    64706569#endif
    64716570                        );
    64726571    else
    64736572        reconstructionTry (result, bufF, bufUniFactors, degree (F) + 1,
    6474                            factorsFound, factorsFoundIndex, NTLNe, false
     6573                           factorsFound, factorsFoundIndex, NTLNe, eval, false
    64756574                          );
    64766575    if (alpha.level() == 1 || (alpha.level() != 1 && reduceFq2Fp))
     
    65266625      reconstructionTry (result, bufF, bufUniFactors, degree (F) + 1,
    65276626#ifdef HAVE_FLINT
    6528                          factorsFound, factorsFoundIndex, FLINTN, false
    6529 #else
    6530                          factorsFound, factorsFoundIndex, NTLN, false
     6627                         factorsFound, factorsFoundIndex, FLINTN, eval, false
     6628#else
     6629                         factorsFound, factorsFoundIndex, NTLN, eval, false
    65316630#endif
    65326631                        );
    65336632    else
    65346633      reconstructionTry (result, bufF, bufUniFactors, degree (F) + 1,
    6535                          factorsFound, factorsFoundIndex, NTLNe, false
     6634                         factorsFound, factorsFoundIndex, NTLNe, eval, false
    65366635                        );
    65376636    if (alpha.level() == 1 || (alpha.level() != 1 && reduceFq2Fp))
     
    66056704#endif
    66066705                                           factorsFound, beenInThres, M, Pi,
    6607                                            diophant, symmetric, evaluation
     6706                                           diophant, symmetric, eval
    66086707                                          );
    66096708
     
    66246723    result= earlyReconstructionAndLifting (F, NTLNe, bufF, bufUniFactors, l,
    66256724                                           factorsFound, beenInThres, M, Pi,
    6626                                            diophant, symmetric, evaluation
     6725                                           diophant, symmetric, eval
    66276726                                          );
    66286727
     
    66426741      {
    66436742        index= 1;
    6644         tmp1= mod (i.getItem(), y);
     6743        tmp1= mod (i.getItem(), y-eval);
    66456744        tmp1 /= Lc (tmp1);
    66466745        for (CFListIterator j= bufUniFactors; j.hasItem(); j++, index++)
     
    67176816        for (iter2= result; iter2.hasItem(); iter2++)
    67186817        {
    6719           tmp= mod (iter2.getItem(), y);
     6818          tmp= mod (iter2.getItem(), y-eval);
    67206819          tmp /= Lc (tmp);
    67216820          if (tmp == buf)
     
    67426841#endif
    67436842      resultBufF= increasePrecision (bufF, bufUniFactors, factorsFound,
    6744                                      oldNumCols, oldL, l
     6843                                     oldNumCols, oldL, l, eval
    67456844                                    );
    67466845    }
     
    67566855
    67576856        resultBufF= increasePrecisionFq2Fp (bufF, bufUniFactors, factorsFound,
    6758                                             oldNumCols, oldL, alpha, l
     6857                                            oldNumCols, oldL, alpha, l, eval
    67596858                                           );
    67606859      }
     
    67646863
    67656864        resultBufF= increasePrecision (bufF, bufUniFactors, factorsFound,
    6766                                        oldNumCols, oldL,  alpha, l
     6865                                       oldNumCols, oldL, alpha, l, eval
    67676866                                      );
    67686867      }
     
    67956894        nmod_mat_clear (FLINTN);
    67966895#endif
    6797       result.append (bufF);
     6896      result.append (bufF (y-eval,y));
    67986897      return result;
    67996898    }
     
    68046903    return Union (result, henselLiftAndLatticeRecombi (bufF, bufUniFactors,
    68056904                                                       alpha, degs, symmetric,
    6806                                                        evaluation
     6905                                                       eval
    68076906                                                      )
    68086907                 );
     
    68156914        result=increasePrecision (F, bufUniFactors, oldL, l, d, bounds, bufQ,
    68166915#ifdef HAVE_FLINT
    6817                                   FLINTN
    6818 #else
    6819                                   NTLN
     6916                                  FLINTN, eval
     6917#else
     6918                                  NTLN, eval
    68206919#endif
    68216920                                 );
     
    68276926          result=increasePrecisionFq2Fp (F, bufUniFactors, oldL, l, d, bounds,
    68286927#ifdef HAVE_FLINT
    6829                                          bufQ, FLINTN, alpha
    6830 #else
    6831                                          bufQ, NTLN, alpha
     6928                                         bufQ, FLINTN, alpha, eval
     6929#else
     6930                                         bufQ, NTLN, alpha, eval
    68326931#endif
    68336932                                        );
     
    68366935      {
    68376936          result=increasePrecision (F, bufUniFactors, oldL, l, d, bounds, bufQ,
    6838                                     NTLNe
     6937                                    NTLNe, eval
    68396938                                   );
    68406939      }
     
    68746973                                                    liftBound, d, bounds, NTLN,
    68756974#endif
    6876                                                     diophant, M, Pi, bufQ
     6975                                                    diophant, M, Pi, bufQ, eval
    68776976                                                   );
    68786977      else
     
    68866985                                                           NTLN, diophant, M,
    68876986#endif
    6888                                                            Pi, bufQ, alpha
     6987                                                           Pi, bufQ, alpha, eval
    68896988                                                          );
    68906989        else
     
    68926991                                                      liftBound, d, bounds,
    68936992                                                      NTLNe, diophant, M,
    6894                                                       Pi, bufQ
     6993                                                      Pi, bufQ, eval
    68956994                                                     );
    68966995      }
     
    69397038    delete [] bounds;
    69407039    result= Union (result, smallFactors);
    6941     result.append (F);
     7040    result.append (F (y-eval,y));
    69427041    return result;
    69437042  }
     
    69547053    CanonicalForm MODl= power (y, degree (F) + 1);
    69557054    delete [] bounds;
    6956     return Union (result, factorRecombination (bufUniFactors, F, MODl, degs, 1,
    6957                                                bufUniFactors.length()/2
     7055    return Union (result, factorRecombination (bufUniFactors, F, MODl, degs,
     7056                                               eval, 1, bufUniFactors.length()/2
    69587057                                              )
    69597058                 );
     
    69667065    delete [] bounds;
    69677066    return Union (result, henselLiftAndLatticeRecombi (F, bufUniFactors, alpha,
    6968                                                        degs,symmetric, evaluation
     7067                                                       degs,symmetric, eval
    69697068                                                      )
    69707069                 );
     
    71827281
    71837282  int oldL;
     7283  TIMING_START (fac_fq_till_reduced);
    71847284  if (success)
    71857285  {
     
    71987298                                   );
    71997299  }
     7300  TIMING_END_AND_PRINT (fac_fq_till_reduced,
     7301                        "time to compute a reduced lattice: ");
    72007302
    72017303  bufUniFactors.removeFirst();
     
    76367738  }
    76377739
     7740  int minBound= bounds[0];
     7741  for (int i= 1; i < boundsLength; i++)
     7742  {
     7743    if (bounds[i] != 0)
     7744      minBound= tmin (minBound, bounds[i]);
     7745  }
     7746
     7747  int boundsLength2;
     7748  int * bounds2= computeBoundsWrtDiffMainvar (A, boundsLength2, isIrreducible);
     7749  int minBound2= bounds2[0];
     7750  for (int i= 1; i < boundsLength2; i++)
     7751  {
     7752    if (bounds2[i] != 0)
     7753      minBound2= tmin (minBound2, bounds2[i]);
     7754  }
     7755
     7756
    76387757  bool fail= false;
    76397758  CanonicalForm Aeval, evaluation, bufAeval, bufEvaluation, buf, tmp;
     
    76567775  int subCheck2= substituteCheck (A, y);
    76577776  bool symmetric= false;
     7777
     7778  TIMING_START (fac_fq_uni_total);
    76587779  for (int i= 0; i < factorNums; i++)
    76597780  {
     
    77027823                            swap, swap2, N);
    77037824      normalize (factors);
     7825      delete [] bounds;
     7826      delete [] bounds2;
    77047827      return factors;
    77057828    }
     
    77447867      if (!extension)
    77457868        normalize (factors);
     7869      delete [] bounds;
     7870      delete [] bounds2;
    77467871      return factors;
    77477872    }
     
    77637888          if (!extension)
    77647889            normalize (factors);
     7890          delete [] bounds;
     7891          delete [] bounds2;
    77657892          return factors;
    77667893        }
     
    77817908          if (!extension)
    77827909            normalize (factors);
     7910          delete [] bounds;
     7911          delete [] bounds2;
    77837912          return factors;
    77847913        }
     
    78297958      list2.append (bufEvaluation2);
    78307959  }
     7960  TIMING_END_AND_PRINT (fac_fq_uni_total,
     7961                        "total time for univariate factorizations: ");
    78317962
    78327963  if (!derivXZero && !fail2 && !symmetric)
    78337964  {
    7834     if (uniFactors.length() > uniFactors2.length() ||
     7965    if ((uniFactors.length() > uniFactors2.length() && minBound2 <= minBound)||
    78357966        (uniFactors.length() == uniFactors2.length()
    7836          && degs.getLength() > degs2.getLength()))
     7967         && degs.getLength() > degs2.getLength() && minBound2 <= minBound))
    78377968    {
    78387969      degs= degs2;
     
    78587989    if (!extension)
    78597990      normalize (factors);
     7991    delete [] bounds;
     7992    delete [] bounds2;
    78607993    return factors;
    78617994  }
     
    78647997
    78657998  if (swap2)
    7866     bounds= computeBounds (A, boundsLength, isIrreducible);
    7867 
    7868   int minBound= bounds[0];
    7869   for (int i= 1; i < boundsLength; i++)
    7870   {
    7871     if (bounds[i] != 0)
    7872       minBound= tmin (minBound, bounds[i]);
     7999  {
     8000    delete [] bounds;
     8001    bounds= bounds2;
     8002    minBound= minBound2;
    78738003  }
    78748004
     
    79038033                                       evaluation, 1, uniFactors.length()/2);
    79048034    else
    7905       factors= factorRecombination (uniFactors, A, MODl, degs, 1,
     8035      factors= factorRecombination (uniFactors, A, MODl, degs, evaluation, 1,
    79068036                                    uniFactors.length()/2);
    79078037    TIMING_END_AND_PRINT (fac_fq_bi_factor_recombination,
     
    79558085    {
    79568086      TIMING_START (fac_fq_bi_factor_recombination);
    7957       factors= factorRecombination (uniFactors, A, MODl, degs, 1, 3);
     8087      factors= factorRecombination (uniFactors, A, MODl, degs, evaluation, 1, 3);
    79588088      TIMING_END_AND_PRINT (fac_fq_bi_factor_recombination,
    79598089                            "time for small subset naive recombi over Fq: ");
     
    79668096        if (alpha.level() == 1)
    79678097          tmp= increasePrecision (A, uniFactors, 0, uniFactors.length(), 1,
    7968                                   liftBound
     8098                                  liftBound, evaluation
    79698099                                 );
    79708100        else
     
    79728102          if (degree (A) > getCharacteristic())
    79738103            tmp= increasePrecisionFq2Fp (A, uniFactors, 0, uniFactors.length(),
    7974                                          1, alpha, liftBound
     8104                                         1, alpha, liftBound, evaluation
    79758105                                        );
    79768106          else
    79778107            tmp= increasePrecision (A, uniFactors, 0, uniFactors.length(), 1,
    7978                                     alpha, liftBound
     8108                                    alpha, liftBound, evaluation
    79798109                                   );
    79808110        }
     
    79908120          degs.refine ();
    79918121          factors= Union (factors, factorRecombination (uniFactors, A, MODl,
    7992                                                         degs, 4,
     8122                                                        degs, evaluation, 4,
    79938123                                                        uniFactors.length()/2
    79948124                                                       )
     
    80658195      factors= earlyFactors;
    80668196  }
     8197
     8198  if (!swap2)
     8199    delete [] bounds2;
    80678200  delete [] bounds;
    8068   if (!extension)
    8069   {
    8070     for (CFListIterator i= factors; i.hasItem(); i++)
    8071       i.getItem()= i.getItem() (y - evaluation, y);
    8072   }
    80738201
    80748202  appendSwapDecompress (factors, contentAxFactors, contentAyFactors,
  • factory/facFqBivar.h

    ra601d5 rd4b25e  
    545545            const CanonicalForm& M,     ///< [in] Variable (2)^liftBound
    546546            DegreePattern& degs,        ///< [in] degree pattern
     547            const CanonicalForm& eval,  ///< [in] evaluation point
    547548            int s,                      ///< [in] algorithm starts checking
    548549                                        ///< subsets of size s
     
    598599           bool& success,          ///< [in,out] indicating success
    599600           int deg,                ///< [in] stage of Hensel lifting
    600            const modpk& b= modpk() ///< [in] coeff bound
     601           const CanonicalForm& eval, ///<[in] evaluation point
     602           const modpk& b= modpk()///< [in] coeff bound
    601603                     );
    602604
  • factory/facFqBivarUtil.cc

    ra601d5 rd4b25e  
    1212
    1313#include "config.h"
     14
     15#include "timing.h"
    1416
    1517#include "cf_map.h"
     
    2830#include "facMul.h"
    2931
     32TIMING_DEFINE_PRINT(fac_log_deriv_div)
     33TIMING_DEFINE_PRINT(fac_log_deriv_mul)
     34TIMING_DEFINE_PRINT(fac_log_deriv_pre)
    3035
    3136void append (CFList& factors1, const CFList& factors2)
     
    450455  CanonicalForm logDeriv;
    451456
     457  TIMING_START (fac_log_deriv_div);
    452458  q= newtonDiv (F, G, xToL);
    453 
     459  TIMING_END_AND_PRINT (fac_log_deriv_div, "time for division in logderiv1: ");
     460
     461  TIMING_START (fac_log_deriv_mul);
    454462  logDeriv= mulMod2 (q, deriv (G, y), xToL);
    455 
    456   logDeriv= swapvar (logDeriv, x, y);
    457   int j= degree (logDeriv) + 1;
     463  TIMING_END_AND_PRINT (fac_log_deriv_mul, "time to multiply in logderiv1: ");
     464
     465  int j= degree (logDeriv, y) + 1;
    458466  CFArray result= CFArray (j);
     467  CFIterator ii;
    459468  for (CFIterator i= logDeriv; i.hasTerms() && !logDeriv.isZero(); i++)
    460469  {
    461     if (i.exp() == j - 1)
    462     {
    463       result [j - 1]= swapvar (i.coeff(), x, y);
    464       j--;
    465     }
    466     else
    467     {
    468       for (; i.exp() < j - 1; j--)
    469         result [j - 1]= 0;
    470       result [j - 1]= swapvar (i.coeff(), x, y);
    471       j--;
    472     }
    473   }
    474   for (; j > 0; j--)
    475     result [j - 1]= 0;
     470    for (ii= i.coeff(); ii.hasTerms(); ii++)
     471      result[ii.exp()] += ii.coeff()*power (x,i.exp());
     472  }
    476473  Q= q;
    477474  return result;
     
    492489
    493490  CanonicalForm bufF;
     491  TIMING_START (fac_log_deriv_pre);
    494492  if ((oldL > 100 && l - oldL < 50) || (oldL < 100 && l - oldL < 30))
    495493  {
     
    523521    bufF -= Up;
    524522  }
    525 
     523  TIMING_END_AND_PRINT (fac_log_deriv_pre, "time to preprocess: ");
     524
     525  TIMING_START (fac_log_deriv_div);
    526526  if (l-oldL > 0)
    527527    q= newtonDiv (bufF, G, xToLOldL);
     
    530530  q *= xToOldL;
    531531  q += oldQ;
    532 
     532  TIMING_END_AND_PRINT (fac_log_deriv_div, "time for div in logderiv2: ");
     533
     534  TIMING_START (fac_log_deriv_mul);
    533535  logDeriv= mulMod2 (q, deriv (G, y), xToL);
    534 
    535   logDeriv= swapvar (logDeriv, x, y);
    536   int j= degree (logDeriv) + 1;
     536  TIMING_END_AND_PRINT (fac_log_deriv_mul, "time for mul in logderiv2: ");
     537
     538  int j= degree (logDeriv,y) + 1;
    537539  CFArray result= CFArray (j);
     540  CFIterator ii;
    538541  for (CFIterator i= logDeriv; i.hasTerms() && !logDeriv.isZero(); i++)
    539542  {
    540     if (i.exp() == j - 1)
    541     {
    542       result [j - 1]= swapvar (i.coeff(), x, y);
    543       j--;
    544     }
    545     else
    546     {
    547       for (; i.exp() < j - 1; j--)
    548         result [j - 1]= 0;
    549       result [j - 1]= swapvar (i.coeff(), x, y);
    550       j--;
    551     }
    552   }
    553   for (; j > 0; j--)
    554     result [j - 1]= 0;
     543    for (ii= i.coeff(); ii.hasTerms(); ii++)
     544      result[ii.exp()] += ii.coeff()*power (x,i.exp());
     545  }
    555546  Q= q;
    556547  return result;
     
    759750}
    760751
     752int *
     753computeBoundsWrtDiffMainvar (const CanonicalForm& F, int& n,
     754                             bool& isIrreducible)
     755{
     756  n= degree (F, 2);
     757  int* result= new int [n];
     758  int sizeOfNewtonPolygon;
     759  int** newtonPolyg= newtonPolygon (F, sizeOfNewtonPolygon);
     760
     761  isIrreducible= false;
     762  if (sizeOfNewtonPolygon == 3)
     763  {
     764    bool check1=
     765        (newtonPolyg[0][0]==0 || newtonPolyg[1][0]==0 || newtonPolyg[2][0]==0);
     766    if (check1)
     767    {
     768      bool check2=
     769        (newtonPolyg[0][1]==0 || newtonPolyg[1][1]==0 || newtonPolyg[2][0]==0);
     770      if (check2)
     771      {
     772        int p=getCharacteristic();
     773        int d=1;
     774        char bufGFName='Z';
     775        bool GF= (CFFactory::gettype()==GaloisFieldDomain);
     776        if (GF)
     777        {
     778          d= getGFDegree();
     779          bufGFName=gf_name;
     780        }
     781        setCharacteristic(0);
     782        CanonicalForm tmp= gcd (newtonPolyg[0][0],newtonPolyg[0][1]);
     783        tmp= gcd (tmp, newtonPolyg[1][0]);
     784        tmp= gcd (tmp, newtonPolyg[1][1]);
     785        tmp= gcd (tmp, newtonPolyg[2][0]);
     786        tmp= gcd (tmp, newtonPolyg[2][1]);
     787        isIrreducible= (tmp==1);
     788        if (GF)
     789          setCharacteristic (p, d, bufGFName);
     790        else
     791          setCharacteristic(p);
     792      }
     793    }
     794  }
     795
     796  int minX, minY, maxX, maxY;
     797  minX= newtonPolyg [0] [0];
     798  minY= newtonPolyg [0] [1];
     799  maxX= minX;
     800  maxY= minY;
     801  for (int i= 1; i < sizeOfNewtonPolygon; i++)
     802  {
     803    if (minX > newtonPolyg [i] [0])
     804      minX= newtonPolyg [i] [0];
     805    if (maxX < newtonPolyg [i] [0])
     806      maxX= newtonPolyg [i] [0];
     807    if (minY > newtonPolyg [i] [1])
     808      minY= newtonPolyg [i] [1];
     809    if (maxY < newtonPolyg [i] [1])
     810      maxY= newtonPolyg [i] [1];
     811  }
     812
     813  int k= maxY;
     814  for (int i= 0; i < n; i++)
     815  {
     816    if (i + 1 > maxX || i + 1 < minX)
     817    {
     818      result [i]= 0;
     819      continue;
     820    }
     821    int* point= new int [2];
     822    point [0]= i + 1;
     823    point [1]= k;
     824    while (!isInPolygon (newtonPolyg, sizeOfNewtonPolygon, point) && k > 0)
     825    {
     826      k--;
     827      point [1]= k;
     828    }
     829    result [i]= k;
     830    k= maxY;
     831    delete [] point;
     832  }
     833
     834  return result;
     835}
     836
    761837int
    762838substituteCheck (const CanonicalForm& F, const Variable& x)
  • factory/facFqBivarUtil.h

    ra601d5 rd4b25e  
    210210              );
    211211
     212/// as above just wrt to the other variable
     213///
     214/// @return @a computeBounds returns bounds as described above
     215int *
     216computeBoundsWrtDiffMainvar
     217              (const CanonicalForm& F,///< [in] compressed bivariate polynomial
     218               int& n,                ///< [in,out] length of output
     219               bool& isIrreducible    ///< [in,out] check if poly is irreducible
     220              );
     221
    212222/// extract coefficients of \f$ x^i \f$ for \f$i\geq k\f$ where \f$ x \f$ is
    213223/// a variable of level 1
  • factory/facHensel.cc

    ra601d5 rd4b25e  
    77 *
    88 * ABSTRACT: Hensel lifting is described in "Efficient Multivariate
    9  * Factorization over Finite Fields" by L. Bernardin & M. Monagon. Division with
    10  * remainder is described in "Fast Recursive Division" by C. Burnikel and
    11  * J. Ziegler. Karatsuba multiplication is described in "Modern Computer
    12  * Algebra" by J. von zur Gathen and J. Gerhard.
     9 * Factorization over Finite Fields" by L. Bernardin & M. Monagon.
    1310 *
    1411 * @author Martin Lee
     
    892889    {
    893890      if (k > 0)
    894         remainder= modNTL (E, bufFactors[k] [0], b);
     891        remainder= modNTL (E, bufFactors[k] [0], b); //TODO precompute inverses of bufFactors[k][0]
    895892      else
    896893        remainder= E;
     
    17581755      M (j + 2, 1)= mulNTL (bufFactors[0] [j + 1], bufFactors[1] [j + 1]);
    17591756  }
     1757  else
     1758    M (j + 1, 1)= 0;
     1759
    17601760  CanonicalForm uIZeroJ;
    17611761  if (degBuf0 > 0 && degBuf1 > 0)
    1762     uIZeroJ= mulNTL(bufFactors[0][0],buf[1])+mulNTL (bufFactors[1][0], buf[0]);
     1762    uIZeroJ= mulNTL(bufFactors[0][0], buf[1]) +
     1763             mulNTL (bufFactors[1][0], buf[0]);
    17631764  else if (degBuf0 > 0)
    1764     uIZeroJ= mulNTL (buf[0], bufFactors[1]);
     1765    uIZeroJ= mulNTL (buf[0], bufFactors[1]) +
     1766             mulNTL (buf[1], bufFactors[0][0]);
    17651767  else if (degBuf1 > 0)
    1766     uIZeroJ= mulNTL (bufFactors[0], buf [1]);
     1768    uIZeroJ= mulNTL (bufFactors[0], buf[1]) +
     1769             mulNTL (buf[0], bufFactors[1][0]);
    17671770  else
    1768     uIZeroJ= 0;
     1771    uIZeroJ= mulNTL (bufFactors[0], buf[1]) +
     1772             mulNTL (buf[0], bufFactors[1]);
     1773
    17691774  Pi [0] += xToJ*uIZeroJ;
    17701775
     
    17811786    for (k= 1; k <= (int) ceil (j/2.0); k++)
    17821787    {
    1783       if (one.hasTerms() && two.hasTerms())
    1784       {
    1785         if (k != j - k + 1)
    1786         {
    1787           if ((one.hasTerms() && one.exp() == j - k + 1) && +
    1788               (two.hasTerms() && two.exp() == j - k + 1))
     1788      if (k != j - k + 1)
     1789      {
     1790        if ((one.hasTerms() && one.exp() == j - k + 1) && +
     1791            (two.hasTerms() && two.exp() == j - k + 1))
    17891792        {
    17901793          tmp[0] += mulNTL ((bufFactors[0][k]+one.coeff()),(bufFactors[1][k] +
    1791                       two.coeff())) - M (k + 1, 1) - M (j - k + 2, 1);
     1794                    two.coeff())) - M (k + 1, 1) - M (j - k + 2, 1);
    17921795          one++;
    17931796          two++;
     
    17961799        {
    17971800          tmp[0] += mulNTL ((bufFactors[0][k]+one.coeff()), bufFactors[1] [k]) -
    1798                       M (k + 1, 1);
     1801                    M (k + 1, 1);
    17991802          one++;
    18001803        }
     
    18081811      else
    18091812        tmp[0] += M (k + 1, 1);
    1810       }
    18111813    }
    18121814  }
     
    18471849        M (j + 2, l + 1)= mulNTL (Pi [l - 1][j + 1], bufFactors[l + 1] [j + 1]);
    18481850    }
     1851    else
     1852      M (j + 1, l + 1)= 0;
    18491853
    18501854    if (degPi > 0 && degBuf > 0)
    1851       uIZeroJ= mulNTL (Pi[l -1] [0], buf[l + 1]) +
     1855      uIZeroJ= mulNTL (Pi[l - 1] [0], buf[l + 1]) +
    18521856               mulNTL (uIZeroJ, bufFactors[l+1] [0]);
    18531857    else if (degPi > 0)
    1854       uIZeroJ= mulNTL (uIZeroJ, bufFactors[l + 1]);
     1858      uIZeroJ= mulNTL (uIZeroJ, bufFactors[l + 1]) +
     1859               mulNTL (Pi[l - 1][0], buf[l + 1]);
    18551860    else if (degBuf > 0)
    1856       uIZeroJ= mulNTL (Pi[l - 1], buf[l+1]);
    1857     else
    1858       uIZeroJ= 0;
     1861      uIZeroJ= mulNTL (uIZeroJ, bufFactors[l + 1][0]) +
     1862               mulNTL (Pi[l - 1], buf[l + 1]);
     1863    else
     1864      uIZeroJ= mulNTL (uIZeroJ, bufFactors[l + 1]) +
     1865               mulNTL (Pi[l - 1], buf[l + 1]);
    18591866
    18601867    Pi [l] += xToJ*uIZeroJ;
     
    21382145      M (j + 2, 1)= mulMod (bufFactors[0] [j + 1], bufFactors[1] [j + 1], MOD);
    21392146  }
     2147  else
     2148    M (j + 1, 1)= 0;
     2149
    21402150  CanonicalForm uIZeroJ;
    2141 
    21422151  if (degBuf0 > 0 && degBuf1 > 0)
    21432152    uIZeroJ= mulMod (bufFactors[0] [0], buf[1], MOD) +
    21442153             mulMod (bufFactors[1] [0], buf[0], MOD);
    21452154  else if (degBuf0 > 0)
    2146     uIZeroJ= mulMod (buf[0], bufFactors[1], MOD);
     2155    uIZeroJ= mulMod (buf[0], bufFactors[1], MOD) +
     2156             mulMod (buf[1], bufFactors[0][0], MOD);
    21472157  else if (degBuf1 > 0)
    2148     uIZeroJ= mulMod (bufFactors[0], buf[1], MOD);
     2158    uIZeroJ= mulMod (bufFactors[0], buf[1], MOD) +
     2159             mulMod (buf[0], bufFactors[1][0], MOD);
    21492160  else
    2150     uIZeroJ= 0;
     2161    uIZeroJ= mulMod (bufFactors[0], buf[1], MOD) +
     2162             mulMod (buf[0], bufFactors[1], MOD);
    21512163  Pi [0] += xToJ*uIZeroJ;
    21522164
     
    22302242                                  MOD);
    22312243    }
     2244    else
     2245      M (j + 1, l + 1)= 0;
    22322246
    22332247    if (degPi > 0 && degBuf > 0)
    2234       uIZeroJ= mulMod (Pi[l -1] [0], buf[l + 1], MOD) +
    2235                mulMod (uIZeroJ, bufFactors[l+1] [0], MOD);
     2248      uIZeroJ= mulMod (Pi[l - 1] [0], buf[l + 1], MOD) +
     2249               mulMod (uIZeroJ, bufFactors[l + 1] [0], MOD);
    22362250    else if (degPi > 0)
    2237       uIZeroJ= mulMod (uIZeroJ, bufFactors[l + 1], MOD);
     2251      uIZeroJ= mulMod (uIZeroJ, bufFactors[l + 1], MOD) +
     2252               mulMod (Pi[l - 1][0], buf[l + 1], MOD);
    22382253    else if (degBuf > 0)
    2239       uIZeroJ= mulMod (Pi[l - 1], buf[l + 1], MOD);
    2240     else
    2241       uIZeroJ= 0;
     2254      uIZeroJ= mulMod (Pi[l - 1], buf[l + 1], MOD) +
     2255               mulMod (uIZeroJ, bufFactors[l + 1][0], MOD);
     2256    else
     2257      uIZeroJ= mulMod (Pi[l - 1], buf[l + 1], MOD) +
     2258               mulMod (uIZeroJ, bufFactors[l + 1], MOD);
    22422259
    22432260    Pi [l] += xToJ*uIZeroJ;
  • factory/facMul.cc

    ra601d5 rd4b25e  
    21512151  int fallBackToNaive= 50;
    21522152  if (sizeF < fallBackToNaive || sizeG < fallBackToNaive)
    2153     return mod (F*G, M);
     2153  {
     2154    if (sizeF < sizeG)
     2155      return mod (G*F, M);
     2156    else
     2157      return mod (F*G, M);
     2158  }
    21542159
    21552160#ifdef HAVE_FLINT
Note: See TracChangeset for help on using the changeset viewer.