Changeset d4b25e in git
- Timestamp:
- Mar 23, 2013, 10:17:45 AM (11 years ago)
- Branches:
- (u'spielwiese', '5b153614cbc72bfa198d75b1e9e33dab2645d9fe')
- Children:
- 0dff6bc7750e8ac23591245c682dede4e272698b15913a696349fcc40d93d2f1edb152b6effea44a
- Parents:
- a601d5555bc411c2f00957c8f324951e8d88085f0f2fcb41f5f91fd6d98a4561921a7640b70e7147
- Files:
-
- 3 added
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
Tst/Short/factorizep_s.res.gz.uu
ra601d5 rd4b25e 1 1 begin 644 factorizep_s.res.gz 2 M'XL("* [7N%```V9A8W1O<FEZ97!?<RYR97,`E/U-DRQ/>MV)[?DIKLU�<2 M'XL("*U>3%$``V9A8W1O<FEZ97!?<RYR97,`E/U-DRQ/>MV)[?DIKLU�< 3 3 M<\O?2Q2P&)L-S<9F,[,;(V@4"5!M:@$T=$N\1=E\=X6?YSS',SRB;KJ,1E3T 4 4 M_Z:'9U5F^-OS.^?\;__[__SO_M<?/WY\_/V/_^7?_4\__H>__/DO?_NG/_[? … … 1334 1334 M_?CX67K\Z__V#^FO__L_Y"-^I%CLZK/&G^=_S^?_2D=,YS?KK_\;KC]B3I_G 1335 1335 MO]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 1336 M_$]_^9=__>-__\<??_BGO_JW/_[RCW_^B_VG/__XPY_^YL?YW_Y_[9U+;^0X 1337 MEN_W_2DTC;MPAJPL\4VA.G,UF]D,+C"SFH4OG`]G&965U<@(.R0-^KO?<PXI 1338 MDN&P765WXF(N\._JM"5*\2=_/`\^0A$^LP\WI=CH:'JK5SVHT7NS'H>IO'6V 1339 MZJ,9)F7YH@Y3?/!(RM:,QA[VW!ZNL8=K[7'97>PO#R?&<&2,!P9PIGFYK0;8 1340 M7]'DZ.+P9D<'E@ZNM!R:_F)0N\.5BGSJPW8ZR:F7&T<Y=D65S"KE2LJ3F*CY 1341 M34U;.57;J9/34>X49>>+FD]J1AI@MP88N8U&AW1JI0TT+.93J<YNU5DCI[IH 1342 M!M9,EZ1JFMGG4\^GM)BA&FV0X\C'3LKUE&_S4IVNR+$(>J'60NVE7JWE6)"U 1343 MDF.I5&^5>A%74U&;JIJT04D;8E*30Q:3`U?CV#>.X=5K7;FX\=X.>W/H]_J@ 1344 M^X,M/KRW4C3L#Z84VUI\J._:LD!;Y$\U2:!<"MNEX>Q2I$N^WSNZ9+E:P_7Z 1345 M=&WB:P-=ZZ687DNM.+AR78WI!KHXG%]4FW+/RGVZJ[U!5_E2-<N<WL5]0CV4 1346 MWR!75D[WAZ&4<%=P?]42[HG^\-@FX<E_1OY3IABU2:W>G"4&WZ16[YK$H,>1 1347 MD\/-Y9?+^\OE\NYR?G/9-5G"^[,LX6FPD,SP"SD19=6[*S/8W<V5WGW9W>\6 1348 M.M==WUW$'5^\IV):0FV7Z>?<T\V[+W0DUSB7W!5IBI5A>Z'9S4.]E<YV"^E^ 1349 MV:Y=Z=JBJ=*%\:%W__*(=__RG'?;FR_Z7B_Z;I`CL\S]%W-O9MW'&T,7N%Q_ 1350 MN5_N],`%9NX]G^N[N;\Q=^:Q`3:HIH7ZS#R!$N]#DUQ??KC\>'ES:HY@S\P1 1351 M7#7'-77,!_IW0Z.CBGYW35WW@<;'C]REO5+.Z-TUE;C=1[IRPZ.@-6.@$D\E 1352 M]+JJVHQ]X6SL>W&7WI0<\:&D!:\_?.RO;TY<G9RZU-H,=>%\J(OCPRZ[F,F! 1353 MUY,Q+JJS[HKZ?1G7R(=<3QYH^I7SZ$P]M5SQ)QFN(AVXGIR5NFJYXDO\V\GD 1354 M8J;.6JY\56Q&S6C_Z=PZ<YNX2=PB?B>MGZ,\!^.6*(_$K(8?=?6/N5ET35/\ 1355 M>9^%<S>33GLP3XOQO-NFTFU;T421-KA@QI'[B=\BL:-3@8XG"GE#,ZDX[5)7 1356 MTK2+IJ&1[PMT2I.U&*WFJ]R5MBC2R-0';R8UY9YWO0G>[Y)E_.#M1.=T:N@T 1357 M#&Z*3G$F8!L-SM*\:>(T<37U>IS")-8LXA1V@_5JI#DC-W$=O!NMRTVDT\G: 1358 MR87<1$WS0N5#4&',K312XKUR-C>.YIU%G%(NS=N,#FK,K25GZ:/703"YO9ZK 1359 M5#%XG9L<J"",+O@HC8YT2I='P[5Q^X)5H]'2/IJPEJK(Q2ALK??2D,!MO]+4 1360 M-<;HK:U:BI0WSDMWN=1^+HN3U5L3K4R$?=2N--*=5.6XR]RHH\U-E@GU0)@3 1361 M]TMB8`GJ5I\0>+X=O8]1VB:3\2EJ;U/+N&`(Y#3*Y&;I-'D?QT@.DMMEY#8? 1362 MG(M;NV2./VAC8G(Q7<+1*C/1Q'_.K:/ZW*A<R&TKZ63BN2)E0#TEMULE19HX 1363 M!I=:PB5#U,I*G38WS0XA:#MM/I>6().=XF9$;EAU8)X\.J?)$Z5!:9U"7>Z, 1364 MS>VS@PHFV.3@ZY4;:#FCX^12G5Q"2Q1'G9%KY$:4N>3$<TGB\Q1.N7XC+S'* 1365 M6R556CF/COQ,Y18X`HU63,!7?4].8;Q+%7!!D9_8BU6@86(+*Z[>4VAXE>2- 1366 M"-"K*4AS;7Z@%)"LPE<#^:W>?)S/L[H:1XYNYZU/0<K2H0\4C].4E4/O':_V 1367 MY,4KY5WM53:NG(:1'"V_-`Z4#%P@*CJ92B6<0I2>0DR]29G`<W_1H1H'!N-^ 1368 MHO`Z#CHZRR^7\#^2'<91F2U%T8*QG\8X!5O"_UCJX$Q"*T7R\E!2P5&6;7YS 1369 M85I/]K1JU9L9/9U;2BA3B7TZ#]/(=I3`H5/2,UIBOU9EQ.#>RXT<7W2CBBJ$ 1370 M<=J"GZJF<(NCK\%/1<'&&F1&BM1D*-N$&OQ-/914!LI^$YMY2P145523VCS- 1371 MI\HIS7`OI?CB7HHC17@*?JY$C<&Z'/RZJ8%SB3)A#":67*#E!11TDVO2`?<] 1372 M&8KS3I,0^%Y*$UZ;K4_M@QHXPK6A0)`[M@S!:LJZH'/&\J4LDD'BEL.XQ%MR 1373 M"9?3`QF\I]C7JN:'U@=2I%NZH<D6_!I/1M9MON!"0S'E?),RI-"/2OFQ9(I6 1374 MG@/=:Z>,VO(:XW-PC":G#O8Y'E[2:)G<W3(&[SC8K04ZE19A7C]J$C%V<T6S 1375 MO6X:)QK"2A:QXL+1>+]E,K:VE423THQ4%FC@,267N%J5XGA7-%Y&LPT?.MU! 1376 MH1(]CW-;1N$R.]%<-&X9C`HBU93'I57B9_(ZAI)7?%.38M^BV]WD2VKQK$D3 1377 M`J>VM,7^[)V3J)#D(X;Q);\$?H6FS#EMV:FI@F->6Q]EAK%RP`X4-<91IESR 1378 M.:'JP,[$V<4X0\.+Q.R1Y]D4ZF28'+-<0O/N:$.)V6,9=I5*06]TF6D8>07- 1379 M3VP)7BX(P9$#E8#E(I*TH01LJIFF%'K*$=M6PQ,);0DW#=UT20),9@P2VSQ? 1380 MT-%0%&P1FUJNM#:^!JP44K\9-]9X/:F)=WVHYZA':NBFYB8#E6A-=5*+\T3. 1381 MY_LHY]*H:;:DTTA[3ESD[V/,<:O3"S1E/\G&;LLT7)VB'-@&;+[9T%S#-"%[ 1382 M:H[`WC62PRK;1+#<,U"C0JR#?2JT1*!"S34\/1MIDA5SY)H3>5[S\H0JUCE` 1383 MLK<BJ-$T<9R+M77>F29Z4SD-T=/H2_B>5I)&=L_N7[,-M2N&J,<MH)-7N8FF 1384 MJ+%$M$V.H6FN')LPMJV\YJ6`&4T4=ZPYA5](7-I--:=P_U!!!EN3WPXT@=&C 1385 M+\'M3M0YO"E0K;RHIA%65Y20C*]I1*:XSN7YRYICP/(<=`MS?Z+-<4WN9GU- 1386 M&]P'-.]@W)0$2)2RAIOLEB:8(08>&M8<.!--8V2IP%=-4>=(UF1[D]<Z?)$R 1387 M%<W"?1WQCK(VIWN4+_$C]]$HXWV=`4L93_-='=_:RCB>>55@?8Z=]`)/`>QR 1388 M\!O*&3&H%,^KW$##=[!;G$@)A5,[JIW4X61Z92<]C35>$@&-1;R74")$2AW' 1389 MEMGB0^1IOLLY9@ONJLVA[`W-E;<13B>"2`N&/.@LI51[,NDX-=&1.I(6B"KX 1390 M)CCT21T<R[3XI/&X1HK>>I;6`J$)9%I;T#QZ]#DZ3.H_3NNJ1(<Y4>=1FUS2 1391 MJ]"&2K8F#7`T8I3PV$J=3XFM5$%)F'--#@^;WYB@&4P-C^0+FG*N#R4B<F&@ 1392 M5:WW30Q2)2,Y:QX64I30BDL%6M:-.29.'8F3A:/%IW5-L!F:C]``Y"0H?#(Y 1393 M+=HH;DM4D;EILCW9'"2&UH[476E"=2RK))J>43<96H9R]>)W=)'FL+1"&(O; 1394 M'>4-GJ!DV6)R3%A:K$[%P_B<UG,RW<S!4.N0*8&AM*WR])N7<K0>GW(2E@(: 1395 M5HPW)>]*&3D5K9UL=2RIAQ9MM,QL%ETGE>DT2U>QYM_T*F."'HOOD[BE/+$M 1396 MQ!(D1;[UP1:/TB?*DD`LI=5I;#Q*IQZC95>>BIM22,$=7./85(&.:1*[>5U5 1397 MYXS!6P2ZNE;JYBF8*:_X-@^V@_.4S,?&?6F]/-G@INQ8]D0[90H:<*+.3I8M 1398 M1@YBFIDI@P0R?1#'$B.2<SC>-UE*`2W35<A>5JM(2WIK0TZF1U[J4C1M&QQ2 1399 M8&@9U^0)+J)4;4H.-5+D*;MO4]]C67"3F.SK4,1/*KL8K=C)0S8CRHMI"A-L 1400 MF0.G>SA^0C69%/*T7,?-8"?U\"2`VLU[`\5_J*&4DK;U3C(GUQZUB=5@J90< 1401 MRS?K:GTB+H,_3=2=C8VOD%2@%>>TY063A`*M);7/)DN=0\NDB=?-U1F*MAUE 1402 M<N24S2MQFUZA/4\K-JL["CV.JFQ/QRG8N;2Z._*^'@6ZR@,*%Q1U7LV3:>IV 1403 MAY;[U5:6[>=I'J]X2%JR("VK:#&;)C&KW$!A/DU;IYW4P<%+LTL;RMI!)$*@ 1404 MV;XJIB)-Q9.4W%G2#EI.T,1BRZ'Z1%7F\)%"N\PL4M,I.C6GN=R1GI.HB7D5 1405 MD4IHTL>JJ>NJ(@<K+="<3QUUO`H\^YRVF2`7,*5SFQMP@:8,1P-^[J=`2TA: 1406 MHN0%$!<4=5F>CX08LNU3!13SKD[S`\VD:%62+"T5T&1]\IP4M@)>Z5`FS#!5 1407 MGV.5%HHV.>[Q*O+"GVX5(_(YI3D:TK<@C3SCE$F25$RGO&NVS5%D[X=F*;G2 1408 M6&KA53EG2]Z2I@M3'YVQXR@U3)0KJ+-CFG9,`PWM'!#'*S7^7`3JFPZ*WU]_ 1409 MU5[^--JZG4^29J90TYZ_B&*@Y@3Y$@KJZW&<]4*CLS'>S0N-1I:_OM_1K$.' 1410 MV:X#)QVZ=Z5)753\J8*5;AF-G1>S]I;_@`G?%)2=S2J[O89NHB--"\5YR8\9 1411 M\/<NK[14I(%YUJN\":34O*Q<[\@?Z*0C.U+12@TP_.<95MNOCE8!5LV6%L11 1412 M\^=]>:4L;3A*;%-[#:_0^>O?J60<M:=&''N:HO-=*Y=1+N-6\)81?_**+P=' 1413 M;=!'FF&Z2&W0:8>%FYKNHE:0+,_LJ(%'&IJL6DF?C$B==N2%FIY8_Z@IH01- 1414 M\ERH)_ZZ]B,O5KW65`,?4I7447PX\7>+<V'/8^-,=5$9_^4(/J()A1E7T7:: 1415 M7WSD#>2HPKSPD>6_$,)/9C@:?^;U:&13?9$#.TV3/+7!,^KY2-VG:=JV\`%U 1416 MK%WE@%+^T94WO^@6-^F9-V3U2.[`NY].W,%XR]:CF9Z+DS@#33<B?^2:@H"< 1417 MH9]HB2O.8"EJLC,XDF=G&&S@ORY`)?PHBW@#!Z5X0]JP$W>@N2M_B3W[A;R2 1418 M34_]Y-@;9)/1BC<H7@`F=^`/`(H[\$R)',CRULVHV2N/XM(VN42DN;-X!'== 1419 M7/@V3DWL$I1QW.82FEXB+L&OY6_BE\+HK'A%;ZVVR2LF^>2P>`J-HN(4AC_G 1420 M*MY!QB&GH(YAQV=3C\8%<0IB==P0L?#(WR-/9<90`(KYJ2$NN826SV-S&?6F 1421 M3BX1V.G8(VB6&U81GL@X;&!^OX/]88C\-2[B(MP;Y`4]56.3.]!LRHH[*'[K 1422 M2?Q!\0=#Y8`B._N#"\>'?_DKYYOFX1W%#^^<OGFG^'F=!\]7/?+>G>)G>$[? 1423 MNZ.I2'W+\X),E,<C_J-J_)`4SV04CZTJOQ>S+3VH[S@[ROWCFQT_=4+7U7!, 1424 M=^JQI]?$@7[8/H_._%OUM"!^4VMW#99_94H=3$FHJQZ/2O<K-636:N"/=BWR 1425 MA\$7/1SK5Q$L?!O[+2V(TT>ZR*8TAR6SRR<B*0R>,$-HVDO3,NZT_(S94*97 1426 M0^HV[AI/QSI-75(?4?'`_4A#5>X60Q>.^;V7/(?*+RH3>GF'>1WRZF<X7N7I 1427 M9-./]2$'&M]>VX_-^\QND(1#$;^L-4/-;O%'"GGN+`YS/4CN*._:K_Z8.EN" 1428 MAN\P_/T._`>(UI[SQ\-'5TJ;5=/^LT<@**U6]];BVB=N[<\>?*#<U+R3O[N8 1429 M>^[_F;NREZ=*MN->M>7YS,B9J<>GY0_.'EY-.K4EOD%[]8."U3+%&E1;Z?@Y 1430 MPY1GJ&;3%GBY@^U0'IO*Y]L=45Y"%I_+$U+Y?+N#GXG:BHHP/PN5"K/8LX\F 1431 ME6YH)E)^>OMB&Y6^#4U6#/_\DVM_MF_;KO1M5S[VZ<VM>;IIJDF9H^44=CJW 1432 M<F[[)KB#;5[J?L`S)!L<@]J&M%(1)?^ARG.@TH[&J_D1H'.<VOS&VN&UT^8G 1433 MFB\M?C13Q\8UXOF`&1MS1-,^#'N67>)Y=HE-=OFS5HQ-C\4?D`=^A!5C8YJ8 1434 M`_'*=$-'>:PT?&IZ<OH!038L38/*ON+4&&0Z>T9134T,3,TSBNZ1)[O4U'0U 1435 M/W7QP'I30\U/-51+TJ"\](:G,S(^]S*SH8,=A?]83$E+]"*@QQ_0(TM?Q]AY 1436 M;4VYGENO5*R;1KPHH>C1-B_]GY%0].B;-H7LBFH47[2UY;&YZ[6YY&2>0ZF[ 1437 MG=_PZ6/Y1*O&YNHLG]#BI<Y0:'5;'M'\=/*(IE9G$W"MV@GX]?"!S'7-6[6[ 1438 M#[ONXV#EU`T?^H^T4MA]DME'?:UK&O7:Z;.VI3N&Z_Y#[0T]7=O^PT=:_16# 1439 M#M9?N_Z3Z:W_0,?4OK.O+"CM"4W;XGF'30]7+.5QP\N[R_M+^41"VW5Z/.LZ 1440 MK=K'-7W9OKPP::W"'^`8TI8JOV'*[\7)!%I.8YF6'_.L6\F[L=OF9I_?3N1U 1441 MT#RTJQ:MF]#C=_%>Z84^UHZ?%*^(EUZ6I[0^YFT83<M9QT]T:OGJ+W[#9%R/ 1442 M-=(668AJ[[T<A&F*,W\%&A6("*WMYSHUKW%8)RX/;*<OS:4O8$V2X'?VV#VU 1443 MO*\XJ/(@TU`>9K&#V=[6LM)E:7$S;._-\8)1GBZB#C?;HT>^5RI=R@^<#>F] 1444 MQ::KF[2@7SMJ#FZJ/D[K$4?U.4_=S<_;!<<KE"'P7H+F;Y.C_\G:1UG^:BO> 1445 MG;/6S/6##+P(ZN4S.C._B>,"?WVL%-BGDH=NTI9.X^R)C\HC;N*6\H21J4[9 1446 M6WD/[]3_3).+S&O''UV=CS=U"(("?>(_:<CGDUW3.3E>WSB=[(99_ICL\0E6 1447 MTP2'R>,2#ZOS8&0P?7A4J1J',S]@5"+]=3"/S#6T:9S*A#]NXG:DFZ/:[,:V 1448 MY@=,;Z79S;<FGF'H"M)\Q$[SVR$"(OL%$I+]G<P&+F3OY0VGQJ[O^#,9NCYI 1449 MTRMYH(ENNZM/K\C6Q-K7SPCIYM-YVKXVY=5]&HZ]?M7]70-*1>N=W@)IS4=S 1450 M.N#O&:S3"KOJ._[\/37QJ>&G^;R@MJYTS2#@O=BT=A1/^)XD;YSE]1_TJ\'& 1451 MR8*8S`EXOY[2_0%;XW(VIY,T9LG8U:>]-MF_8$S*4F_Z-;,VGMOL*6KWST]C 1452 M>:.8MQV6M9U3R0;VO/*W&ZV/)PS7N);;)K+45@XU:C=->]*,-EF,"2@DIF8Z 1453 M[AI3NQ^0.,A`LUFEYHK!W]O$.]%2]Q,@C:>X)Z>PKC&>^W\ZA6T^YZ=]SA;R 1454 M7AU_ED4>UYWE^28N.?;RIIZXT"-WU,YO/ENF_6L30T.S\A>MK501C3/MJJ@M 1455 MIF,Z/#Y!V7B#=YL[4>!38*P4^MOZB#]!QI-!U<1ZLU>G7[U7-[3!SEM#@YG+ 1456 M'%I<:>!%WMH_9:;&0?+NV,6+8[O9&=,_8F<LQ?5J7A;:S::7+IM>/,RD)76. 1457 MZT6\*R7EO.^=)M^4AGDNGTKDX:@^-(B-H5^]+>:;5:Q\R<!)R,LW`)AF)S#- 1458 M\_CK,_BW;[8$ES1KFM/OLXWNID\:'\L[9VF[/ST3*N^>./FP>7H'FQ\LH8M] 1459 M#/*`Q"*;_T%N"/D&GE='*N&G;>I+N&2*L;DG],[F4YZVJ[%W>JO$IH(I5Y+J 1460 MK&+IR4<CCS2F)J22]%1D+9&/R<=)WN%_4!K"[E3/E@:Z$TVK;$N>RG3+L4M/ 1461 MP#9M+7K3^*!42]VFP9RDU,6FD?*TMYJ<RX"VU.+S7:[>Y4.&WNXR_>1SK=RO 1462 M<:LUFK8W<VG4IKDWY';S4YCU7C4FPJUO2JNK\S=)XM6;JO_3EZ#-'JZ.V_1V 1463 MVXW;/;I=5SJHV>#5\0>,2S1IHUI/MNFHZI.=.JK_J1E;;')5='6.LTCF7MM9 1464 MSC8)Y41_.L]I=I#UC]A!?NT\I]DUUGG7^&(>>*ZPR$\:5WEZG8]7*6]F#,U^ 1465 MLG[U?O+)(-ML/P[S-FO@W:JRL<HI>C@6KUNVXT!>.1P??]>JM+'QI"D/8OQ! 1466 M,S9=/Q%=?C1,WB6:Y3.QC^.G5@]1883G%\3MN/7]&MV`[#C0>H_G#M'0H 1467 M/Q\=BDIC&F>:POF61/HHW9_;CV@VU/7TVF1TOA^Q[4,,+]V#,,T&O1E5G0/R 1468 MQ\_X`WW;/GE^*"'/"$^O_EP$="/V`S*)/IE#Y6KGI6\6N'-N:BI]/*>89A?? 1469 MC*ZL`F6BRSBR6Y&WE;8);^.:IMEQ-^./>$.J3&NKH2B5#/*%MU3S$Z:*32NF 1470 M\C9&OTH*67C?@I/(4-^^,,U6O%$_8&[;M^^_#,VI3:?#^I0)5.,:RA03]"D? 1471 M3-O`M#WKT2`TME,_8,E*?4P]/S5N13W'UGB\TU5C>M4$/\_G:DS(+&PP:1.< 1472 M9^%-^QNKJ5=//_Q)R$\NK992U%<O2ENMZ1)/OI]X-L?HQBVTRLMOV_7\9B;] 1473 MI)E4:7ZS@6]>O8%?NW]U/;_M]=B7>YAF&]WD;?2!^*RDG,%I?HJ5OVC#FIR% 1474 MTK/F`S^K*ZX?J6/D@)_+:\*WV1DWK]\9YZ94-TIU5"^2RINL)(U+;6N6/D*1 1475 M(9Y<]YAF#]SH[;WF2(:9NUYU!:O9VS:OWML^R;;SR9JNIQ%Q'NK@R5R6NX'' 1476 M&QLF3LC.>!I"@QKC4X'?;'*;O,E-LW8[J,K1V/V'[&8W$+TN$W<KI]:9:H^> 1477 M9EC-<S\]K0ICF>W,\DQE3A11SJUR^?9)7*">RR,_0_,">=QGJ()*G*;6I\1I 1478 M:G/X2XWHO+16R3SL#YX2>N@XS6Z]X=WZTS<23;/_;GC_/;VIV/&[59?7;\X> 1479 MYS"\9_[;[3=YWY"_%(?WQ*_I7S6=K6\K7LB5-[PDD\\[1<XGM5"/7*@">_&5 1480 M?#Q?*2TGDRPV:\:QVS?+?*%*9_X;##194Z&_N"8=_GL)Z8C_<J(<\%])NKCF 1481 M+1+^@X92MBA=B\QVJ)<I'XKF1+*VUGKV=K/A??&;W[]W%[??#MWM.\+N;KN_ 1482 M<=R-^F<NN.V->5/N)L_][W+BWY+-]LO^\/FW[N*OP_#]^MNGWW_[ZV5W6].2 1483 MC7S3F;=OE]W(EV]ONHN]7/I*;OZF^Y=WG2MU.LVWE%KYN^;X?Q7!^53RX?OG 1484 MZU]KJ53\C^W4CW^BL5Z?-_9+<UFJ?A"G[75JR#^>V1"/R6YALU6-X,"/T8GE 1485 MV)KIMH=_:!*ZT(4N=*$+7>A"%[K0A2YTH0M=Z$(7NM"%+G2A"UWH0A>ZT(4N 1487 1486 M=*$+7>A"%[K0A2YTH0M=Z$(7NM"%+G2A"UWH0A>ZT(4N=*$+7>A"%[K0A2YT 1488 1487 MH0M=Z$(7NM"%+G2A"UWH0A>ZT(4N=*$+7>A"%[K0A2YTH0M=Z$(7NM"%+G2A … … 1493 1492 M%[K0A2YTH0M=Z$(7NM"%+G2A"UWH0A>ZT(4N=*$+7>A"%[K0A2YTH0M=Z$(7 1494 1493 MNM"%+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$($( 1494 MT(4N=*$+7>A"%[K0A2YTH0M=Z$(7NM"%+G2A"UWH0A>ZT(4N=*$+7>A"%[K0 1495 MA2YTH0M=Z$(7NM"%+G2A"UWH0A>ZT(4N=*'[N.Y__.>__MN_=\:']UTYCF^[ 1496 M[[??OG3?NW>=OKR8+Y<WEY_^_O-??OJIV^VZ[Y\_?;ZY_99NV.W*JZ;WW=]_ 1497 M_[IT-^_F*]_UW7+EZ.<L/Y<K^_-V8QCSC5_*C;[<.%\9_DG_5'V!RB_X);]@ 1498 MWBU9-6OG,BUGYO3%^GWW]79_Z+ZJR^ZKIG^F7C/ONYO?OW<7M]\.W>T[>E5W 1499 MV_VM,V8<]<]<<-L;\Z;<;=]V_UU.W%OJPOVR/WS^K;OXZS!\O_[VZ???_GK9 1500 MW;ZI^H%O^JK>=3?7'P^_?[]=/W<7-\WU2:[KD^M?ZO6HY+HYN?Y+<]TD_5K@ 1501 MDF`M2"VHR%&JO+WI+O:B]E61-[WI_H4,74`GJ;:@3E++23V32T4?OG^^_K66 1502 M2F7_**</J]);5:5/[7A2E1VWJ@J!'1^KRHXG5=GQ857FO"IU6I7:JBI]8]6C 1503 M5:G3JA15]8_S2+CE2'@B0F??SZY?Z/\GP??D[;I?=#_WJ@:R[6=-90O]YDMR 1504 M@WH0R$^I]4NKY/K9+OUL1$;2`VDV\H8/^ZT)RY^N!8A`!"(0@0A$(`(1B$`$ 1505 M(A"!"$0@`A&(0`0B$($(1"`"$8A`!"(0@0A$(`(1B$`$(A"!"$0@`A&(0`0B 1506 M$($(1"`"$8A`!"(0@0A$(`(1B$`$(A"!"$0@`A&(0`0B$($(1"`"$8A`!"(0 1507 M@0A$(`(1B$`$(A"!"$0@`A&(0`0B$($(1"`"$8A`!"(0@0A$(`(1B$`$(A"! 1508 M"$0@`A&(0`0B$($(1"`"$8A`!"(0@0A$(`(1B$`$(A"!"$0@`A&(0`0B$($( 1505 1509 M1"`"$8A`!"(0@0A$(`(1B$`$(A"!"$0@`A&(0`0B$($(1"`"$8A`!"(0@0A$ 1506 1510 M(`(1B$`$(A"!"$0@`A&(0`0B$($(1"`"$8A`!"(0@0A$(`(1B$`$(A"!"$0@ … … 1525 1529 M@0A$(`(1B$`$(A"!"$0@`A&(0`0B$($(1"`"$8A`!"(0@0A$(`(1B$`$(A"! 1526 1530 M"$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[="``` 1531 M1"`"$8A`!"(0@0A$(`(1B$`$(A"!"$0@_O^/^!__^:__]N^=U>/[KARKM]U/ 1532 M/W6'[V\[:\=2JM]VO]Y^_=I]_[D4F??=]]MO7[KO[\+EQ7RYO+G\]/=ZU;[O 1533 M_O[[UZ6[Z=YURY7;S5>V&^A(TU&0(]/UW7QEZDO<^^[K[?[0?7UW<_WQ\/OW 1534 MV_7SQ<V;>MV_[_94UEU\I4YYT_VM\S__I;8PO.\.G_>']-(]W73)KWVR)PWU 1535 M1^G(09<S2V?EQ+']2H][.1L>=.+E:5?&IBNGM^78C&<=:%3I0'W>@49O'?BN 1536 MNYBO_([L>&5WU('TF^Q.'9F.Z7<O1V]VZ3XZ7JX"73%T;/A5_5)[T9C2RUWI 1537 MYJ[M9V//>K)[MBMGO[`?:HX+<3WN,_Y5'=6S0P;V5,,.NCSNA\;5SC/^;48W 1538 M&8E1*%`$D^%]Z9"%$?DZ=Q+=45'(*9[FC"_EY#AC`-W&H%Y\HJ>`DQ"48'^< 1539 M;ZI\=JS.857+FED2Z8Y-F5@W@R?.QJ16/T-IS<LI$T@+2;9C3#&N,#YA06L; 1540 M0M<0%FO:[)1:2,65A>O$KO0SE=N'CMZ`/6=;^U+;+DUZ%A-S^G22H%5)#%3J 1541 M4HY=2F8]RP:E"8VQ76-L5XR]H2^";D_,VSBQ>\Z\[L7F35`GO)M1GW!;UQC5 1542 M-49UQ:A:C+J%:,I$G(&<9*UZM:5ZSGSNQ:%YXJQ&_+>:C9KBEC1"TO^?M)AK 1543 M+.8;B_DV/+-UF-"EL\9)Y5]+Z9^SG7]%:"8SU0G`DOQ1!GS]]`CO&Q/ZQH3^ 1544 M)"YU_P!1XG#9AIOS_.J?,Z+_YXS8QITI9S0B2PR>6[&!;>P8&CL&U1SK!)Y2 1545 MJTN^6U*024-*90GF&=#PT@%S:4</G7QR8UW2])+]]PDW#<TH&7R#%+(M=WDL 1546 M+%FU3`1.$TN(ST%-+[6>#'XG0V,:[9]TRMA,.V-CFZ@?<4K^72+/LU/6ML;G 1547 MK!-?/)W1R^GXWI\Z(U7NGK)-;&P3&]O$4))^DQ+G;2SLVWBC\Z;US]DHOMA& 1548 M%:LE2FN(.JHM?;/.R!'W=+A-C1FGQHR3/AT>DD?.6_+<SD]]<GK.E-.+39D& 1549 MN_F!09.C/CE-FQHC3HT1IV)$OS4^C][);)PZ3V&>,][T8N/YLEXL,&P9LSR9 1550 M]]U8;>/&:ALWMNDOSSEM'J)W)2F>SKU.+>7&9RSEQA>G1'^R>CBQ&%_C.:E] 1551 M9/0N%;H&U#>@-?!JCM]5>R4+UG8_8S$WOMABKIF(R*"6S"4F?!1#-?92C;V4 1552 MV"O9PS4+P6T6;06EI,F3*4F>E*6QN\"HY\RGSLWW1RGS,;O)4NFI,'.J,9GR 1553 M#Y?'3H4'R^/+]7)_>;B\N[QO%\I.Q;I07G;K;D_@!^D<ZI3='7<`E](1=<%N 1554 MI:MR3+_Y^&[KL-V]E!VXA(]WHK4[]/(*OI*.DC8G-+IK2>=ROUSE&2!KI-?W 1555 MK'%?6SKEEGYYUVWU[S<STI&15Z^E#BJ1HTJPT+E]T/KTFD,F2>V1\GR45:6] 1556 M<Z+?6ER.<[WR*K[SD&J0VC,UW;6FGI4CL[NCW_M$RT>[^Y1`A%W:EFNX[^EZ 1557 M7O)1']*_N](CO/$D/?)+ZA'JA7XMO6TR:2+?9\U%ZF/2NTR1+'-(U^CG(=U? 1558 M:U&YEE_?W>R^['ZI%VAV_NGSS8,X^+7&@7YDAO[K'P0"$>PU-<E04_2>6K+7 1559 M=+3<45OW_&.E:W2=2OKYP)=KO/`+-<^8J-BL>W[9RA*S7O4=#V.67J\/=_J> 1560 MK^Q92*K2>W[98LB0=,1U:/)$NI%OZY?UOEG!\DLX5/?D%WJ5%^[-0><*EX,M 1561 MU='E`]=*]_`9_927F'OADFKD%\O0]=4<^)4DQ>VY9TBZ2-U`SD%-H9_WG,#O 1562 MN'7\8T^.<<\9@@#()YZ843E=5RY.N[,LP9N"/_W4W7S__;?N?[_M_NOVM]\^ 1563 M?__M^MNW[O[VNOMZ^V%/*>3NZ_7WX=/G^\]?R\MH6$C)I7O747I9+@\G247' 1564 M=ON2O#YVO6QCDO_S$?WV]/MP%:3<;U?E-T>)+4=T?U&=WJ9">:E)M\BQ+C6; 1565 M<?/)QU,S[QJ^:!!BV_:'-BT?/#L'&>.0]K'%_'3.IVRB`U_F(M,?9,Q=#K*Z 1566 A/.C'$SEO51[VA_^S/UP?[O87-$?X7W_YOP/G&G>HX0@` 1558 1567 ` 1559 1568 end -
Tst/Short/factorizep_s.stat
ra601d5 rd4b25e 1 1 >> tst_memory_0 :: 13 54291118:3150:3-1-5:ix86-Linux:mamawutz:1733362 1 >> tst_memory_1 :: 13 54291118:3150:3-1-5:ix86-Linux:mamawutz:22402843 1 >> tst_memory_2 :: 13 54291118:3150:3-1-5:ix86-Linux:mamawutz:22730684 1 >> tst_timer :: 13 54291118:3150:3-1-5:ix86-Linux:mamawutz:2765 2 >> tst_memory_0 :: 13 54291118:3150:3-1-5:ix86-Linux:mamawutz:40472006 2 >> tst_memory_1 :: 13 54291118:3150:3-1-5:ix86-Linux:mamawutz:60252167 2 >> tst_memory_2 :: 13 54291118:3150:3-1-5:ix86-Linux:mamawutz:60252168 2 >> tst_timer_1 :: 13 54291118:3150:3-1-5:ix86-Linux:mamawutz:55301 1 >> tst_memory_0 :: 1363959468:3160:3-1-6:ix86-Linux:mamawutz:154684 2 1 >> tst_memory_1 :: 1363959468:3160:3-1-6:ix86-Linux:mamawutz:2215700 3 1 >> tst_memory_2 :: 1363959468:3160:3-1-6:ix86-Linux:mamawutz:2256672 4 1 >> tst_timer :: 1363959468:3160:3-1-6:ix86-Linux:mamawutz:279 5 2 >> tst_memory_0 :: 1363959468:3160:3-1-6:ix86-Linux:mamawutz:3881384 6 2 >> tst_memory_1 :: 1363959468:3160:3-1-6:ix86-Linux:mamawutz:9900032 7 2 >> tst_memory_2 :: 1363959468:3160:3-1-6:ix86-Linux:mamawutz:11997184 8 2 >> tst_timer_1 :: 1363959468:3160:3-1-6:ix86-Linux:mamawutz:11946 -
Tst/Short/factorizep_s.tst
ra601d5 rd4b25e 472 472 testfactors (l,f); 473 473 474 kill r; 475 ring r=2,(x,y,z,s,t,u,v),dp; 476 poly 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; 477 poly 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; 478 poly 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; 479 poly k=f*g*h; 480 def l= factorize (k); 481 testfactors (l, k); 474 482 475 483 kill r; -
Tst/Short/ok_s.lst
ra601d5 rd4b25e 1 1 ;; Test which should pass shifted exponents 2 abusalem 2 3 alexpoly 3 4 algebralib -
factory/facBivar.cc
ra601d5 rd4b25e 583 583 584 584 TIMING_START (fac_bi_factor_recombination); 585 factors= factorRecombination (uniFactors, A, MODl, degs, 1,585 factors= factorRecombination (uniFactors, A, MODl, degs, evaluation, 1, 586 586 uniFactors.length()/2, b, den); 587 587 TIMING_END_AND_PRINT (fac_bi_factor_recombination, … … 595 595 factors= earlyFactors; 596 596 597 for (CFListIterator i= factors; i.hasItem(); i++)598 i.getItem()= i.getItem() (y - evaluation, y);599 600 597 appendSwapDecompress (factors, conv (contentAxFactors), 601 598 conv (contentAyFactors), swap, swap2, N); -
factory/facFqBivar.cc
ra601d5 rd4b25e 48 48 TIMING_DEFINE_PRINT(fac_fq_bi_evaluation) 49 49 TIMING_DEFINE_PRINT(fac_fq_bi_shift_to_zero) 50 TIMING_DEFINE_PRINT(fac_fq_logarithmic) 51 TIMING_DEFINE_PRINT(fac_fq_compute_lattice_lift) 52 TIMING_DEFINE_PRINT(fac_fq_till_reduced) 53 TIMING_DEFINE_PRINT(fac_fq_reconstruction) 54 TIMING_DEFINE_PRINT(fac_fq_lift) 55 TIMING_DEFINE_PRINT(fac_fq_uni_total) 50 56 51 57 CanonicalForm prodMod0 (const CFList& L, const CanonicalForm& M, const modpk& b) … … 481 487 CFList 482 488 factorRecombination (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 485 492 ) 486 493 { … … 492 499 if (F.inCoeffDomain()) 493 500 return CFList(); 501 Variable y= Variable (2); 494 502 if (degs.getLength() <= 1 || factors.length() == 1) 495 503 { 496 CFList result= CFList (F );504 CFList result= CFList (F(y-eval,y)); 497 505 F= 1; 498 506 return result; … … 513 521 T= factors; 514 522 CFList result; 515 Variable y= Variable (2);516 523 Variable x= Variable (1); 517 524 CanonicalForm denom= den, denQuot; … … 550 557 g= b(g); 551 558 T.removeFirst(); 552 result.append (g/content (g, x)); 559 g /= content (g,x); 560 result.append (g(y-eval,y)); 553 561 F= 1; 554 562 return result; … … 556 564 else 557 565 { 558 result= CFList (F );566 result= CFList (F(y-eval,y)); 559 567 F= 1; 560 568 return result; … … 610 618 denom *= abs (lc (g)); 611 619 recombination= true; 612 result.append (g );620 result.append (g (y-eval,y)); 613 621 if (b.getp() != 0) 614 622 { … … 638 646 if (recombination) 639 647 { 640 result.append (buf );648 result.append (buf (y-eval,y)); 641 649 F= 1; 642 650 return result; … … 644 652 else 645 653 { 646 result= CFList (F );654 result= CFList (F (y-eval,y)); 647 655 F= 1; 648 656 return result; … … 664 672 if (recombination) 665 673 { 666 result.append (buf );674 result.append (buf(y-eval,y)); 667 675 F= 1; 668 676 return result; … … 670 678 else 671 679 { 672 result= CFList (F );680 result= CFList (F(y-eval,y)); 673 681 F= 1; 674 682 return result; … … 682 690 if (T.length() < 2*s) 683 691 { 684 result.append (F );692 result.append (F(y-eval,y)); 685 693 F= 1; 686 694 return result; … … 735 743 earlyFactorDetection (CFList& reconstructedFactors, CanonicalForm& F, CFList& 736 744 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) 739 747 { 740 748 DegreePattern bufDegs1= degs; … … 743 751 CanonicalForm buf= F; 744 752 Variable x= Variable (1); 753 Variable y= Variable (2); 745 754 CanonicalForm g, quot; 746 755 CanonicalForm M= power (F.mvar(), deg); … … 798 807 { 799 808 den *= abs (lc (g)); 800 reconstructedFactors.append (g );809 reconstructedFactors.append (g (y-eval,y)); 801 810 factorsFoundIndex[l]= 1; 802 811 if (b.getp() != 0) … … 827 836 if (!buf.inCoeffDomain()) 828 837 { 829 reconstructedFactors.append (buf );838 reconstructedFactors.append (buf (y-eval,y)); 830 839 F= 1; 831 840 } … … 852 861 earlyFactorDetection (CFList& reconstructedFactors, CanonicalForm& F, CFList& 853 862 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) 856 865 { 857 866 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); 859 869 } 860 870 … … 1127 1137 earlyFactorDetection (earlyFactors, bufA, bufUniFactors, newLiftBound, 1128 1138 factorsFoundIndex, degs, earlySuccess, 1129 smallFactorDeg, b, den);1139 smallFactorDeg, eval, b, den); 1130 1140 else 1131 1141 earlyFactorDetection(earlyFactors, bufA, bufBufUniFactors, newLiftBound, 1132 1142 factorsFoundIndex, degs, earlySuccess, 1133 smallFactorDeg, b, den);1143 smallFactorDeg, eval, b, den); 1134 1144 } 1135 1145 else … … 1156 1166 earlyFactorDetection (earlyFactors, bufA, bufUniFactors, newLiftBound, 1157 1167 factorsFoundIndex, degs, earlySuccess, 1158 liftPre[sizeOfLiftPre-1] + 1, b, den);1168 liftPre[sizeOfLiftPre-1] + 1, eval, b, den); 1159 1169 else 1160 1170 earlyFactorDetection (earlyFactors,bufA,bufBufUniFactors,newLiftBound, 1161 1171 factorsFoundIndex, degs, earlySuccess, 1162 liftPre[sizeOfLiftPre-1] + 1, b, den);1172 liftPre[sizeOfLiftPre-1] + 1, eval, b, den); 1163 1173 } 1164 1174 else … … 1190 1200 earlyFactorDetection (earlyFactors, bufA, bufUniFactors, newLiftBound, 1191 1201 factorsFoundIndex, degs, earlySuccess, 1192 liftPre[i-1] + 1, b, den);1202 liftPre[i-1] + 1, eval, b, den); 1193 1203 else 1194 1204 earlyFactorDetection (earlyFactors,bufA,bufBufUniFactors,newLiftBound, 1195 1205 factorsFoundIndex, degs, earlySuccess, 1196 liftPre[i-1] + 1, b, den);1206 liftPre[i-1] + 1, eval, b, den); 1197 1207 } 1198 1208 else … … 1233 1243 earlyFactorDetection (earlyFactors, bufA, bufUniFactors, newLiftBound, 1234 1244 factorsFoundIndex, degs, earlySuccess, 1235 smallFactorDeg, b, den);1245 smallFactorDeg, eval, b, den); 1236 1246 else 1237 1247 earlyFactorDetection (earlyFactors, bufA, bufBufUniFactors, newLiftBound, 1238 1248 factorsFoundIndex, degs, earlySuccess, 1239 smallFactorDeg, b, den);1249 smallFactorDeg, eval, b, den); 1240 1250 } 1241 1251 else … … 1262 1272 if (v==alpha) 1263 1273 earlyFactorDetection (earlyFactors, bufA, bufUniFactors, newLiftBound, 1264 factorsFoundIndex, degs, earlySuccess, dummy, b,1265 den);1274 factorsFoundIndex, degs, earlySuccess, dummy,eval, 1275 b, den); 1266 1276 else 1267 1277 earlyFactorDetection (earlyFactors, bufA,bufBufUniFactors, newLiftBound, 1268 factorsFoundIndex, degs, earlySuccess, dummy, b,1269 den);1278 factorsFoundIndex, degs, earlySuccess, dummy,eval, 1279 b, den); 1270 1280 } 1271 1281 else … … 1292 1302 if (v==alpha) 1293 1303 earlyFactorDetection (earlyFactors, bufA, bufUniFactors, newLiftBound, 1294 factorsFoundIndex, degs, earlySuccess, dummy, b,1295 den);1304 factorsFoundIndex, degs, earlySuccess, dummy, 1305 eval, b, den); 1296 1306 else 1297 1307 earlyFactorDetection (earlyFactors,bufA,bufBufUniFactors,newLiftBound, 1298 factorsFoundIndex, degs, earlySuccess, dummy, b,1299 den);1308 factorsFoundIndex, degs, earlySuccess, dummy, 1309 eval, b, den); 1300 1310 } 1301 1311 else … … 1471 1481 reconstructionTry (CFList& reconstructedFactors, CanonicalForm& F, const CFList& 1472 1482 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 1474 1485 ) 1475 1486 { … … 1477 1488 Variable x= Variable (1); 1478 1489 CanonicalForm yToL= power (y, liftBound); 1490 CanonicalForm bufF= F (y-eval, y); 1479 1491 if (factors.length() == 2) 1480 1492 { … … 1482 1494 tmp1= factors.getFirst(); 1483 1495 tmp2= factors.getLast(); 1484 tmp1 *= LC (F, x); 1485 tmp1= mod (tmp1, yToL); 1496 tmp1= mulMod2 (tmp1, LC (F,x), yToL); 1486 1497 tmp1 /= content (tmp1, x); 1487 tmp 2 *= LC (F, x);1488 tmp2= m od (tmp2, yToL);1498 tmp1= tmp1 (y-eval, y); 1499 tmp2= mulMod2 (tmp2, LC (F,x), yToL); 1489 1500 tmp2 /= content (tmp2, x); 1501 tmp2= tmp2 (y-eval, y); 1490 1502 tmp3 = tmp1*tmp2; 1491 if (tmp3/Lc (tmp3) == F/Lc (F))1503 if (tmp3/Lc (tmp3) == bufF/Lc (bufF)) 1492 1504 { 1493 1505 factorsFound++; … … 1524 1536 } 1525 1537 } 1526 buf *= LC (F, x); 1527 buf= mod (buf, yToL); 1538 buf= mulMod2 (buf, LC (F,x), yToL); 1528 1539 buf /= content (buf, x); 1529 if (fdivides (buf, F, quot)) 1540 buf= buf (y-eval,y); 1541 if (fdivides (buf, bufF, quot)) 1530 1542 { 1531 1543 factorsFoundIndex[i - 1]= 1; 1532 1544 factorsFound++; 1533 F= quot;1534 F /= Lc (F);1545 bufF= quot; 1546 bufF /= Lc (bufF); 1535 1547 reconstructedFactors.append (buf); 1536 1548 } 1537 if (degree ( F) <= 0)1549 if (degree (bufF) <= 0) 1538 1550 return; 1539 1551 if (factorsFound + 1 == N.NumCols()) 1540 1552 { 1541 reconstructedFactors.append (F); 1553 reconstructedFactors.append (bufF); 1554 F= 1; 1542 1555 return; 1543 1556 } 1544 1557 } 1558 if (reconstructedFactors.length() != 0) 1559 F= bufF (y+eval,y); 1545 1560 } 1546 1561 … … 1548 1563 reconstructionTry (CFList& reconstructedFactors, CanonicalForm& F, const CFList& 1549 1564 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 1551 1567 ) 1552 1568 { … … 1554 1570 Variable x= Variable (1); 1555 1571 CanonicalForm yToL= power (y, liftBound); 1572 CanonicalForm bufF= F (y-eval, y); 1556 1573 if (factors.length() == 2) 1557 1574 { … … 1559 1576 tmp1= factors.getFirst(); 1560 1577 tmp2= factors.getLast(); 1561 tmp1 *= LC (F, x); 1562 tmp1= mod (tmp1, yToL); 1578 tmp1= mulMod2 (tmp1, LC (F,x), yToL); 1563 1579 tmp1 /= content (tmp1, x); 1564 tmp 2 *= LC (F, x);1565 tmp2= m od (tmp2, yToL);1580 tmp1= tmp1 (y-eval, y); 1581 tmp2= mulMod2 (tmp2, LC (F,x), yToL); 1566 1582 tmp2 /= content (tmp2, x); 1583 tmp2= tmp2 (y-eval,y); 1567 1584 tmp3 = tmp1*tmp2; 1568 if (tmp3/Lc (tmp3) == F/Lc (F))1585 if (tmp3/Lc (tmp3) == bufF/Lc (bufF)) 1569 1586 { 1570 1587 factorsFound++; … … 1601 1618 } 1602 1619 } 1603 buf *= LC (F, x); 1604 buf= mod (buf, yToL); 1620 buf= mulMod2 (buf, LC (F,x), yToL); 1605 1621 buf /= content (buf, x); 1606 if (fdivides (buf, F, quot)) 1622 buf= buf (y-eval,y); 1623 if (fdivides (buf, bufF, quot)) 1607 1624 { 1608 1625 factorsFoundIndex[i - 1]= 1; 1609 1626 factorsFound++; 1610 F= quot;1611 F /= Lc (F);1627 bufF= quot; 1628 bufF /= Lc (bufF); 1612 1629 reconstructedFactors.append (buf); 1613 1630 } 1614 if (degree ( F) <= 0)1631 if (degree (bufF) <= 0) 1615 1632 return; 1616 1633 if (factorsFound + 1 == N.NumCols()) 1617 1634 { 1618 reconstructedFactors.append (F); 1635 reconstructedFactors.append (bufF); 1636 F=1; 1619 1637 return; 1620 1638 } 1621 1639 } 1640 if (reconstructedFactors.length() != 0) 1641 F= bufF (y+eval,y); 1622 1642 } 1623 1643 … … 1626 1646 reconstructionTry (CFList& reconstructedFactors, CanonicalForm& F, const CFList& 1627 1647 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 1629 1650 ) 1630 1651 { … … 1632 1653 Variable x= Variable (1); 1633 1654 CanonicalForm yToL= power (y, liftBound); 1655 CanonicalForm bufF= F (y-eval, y); 1634 1656 if (factors.length() == 2) 1635 1657 { … … 1637 1659 tmp1= factors.getFirst(); 1638 1660 tmp2= factors.getLast(); 1639 tmp1 *= LC (F, x); 1640 tmp1= mod (tmp1, yToL); 1661 tmp1= mulMod2 (tmp1, LC (F,x), yToL); 1641 1662 tmp1 /= content (tmp1, x); 1642 tmp 2 *= LC (F, x);1643 tmp2= m od (tmp2, yToL);1663 tmp1= tmp1 (y-eval, y); 1664 tmp2= mulMod2 (tmp2, LC (F,x), yToL); 1644 1665 tmp2 /= content (tmp2, x); 1666 tmp2= tmp2 (y-eval, y); 1645 1667 tmp3 = tmp1*tmp2; 1646 if (tmp3/Lc (tmp3) == F/Lc (F))1668 if (tmp3/Lc (tmp3) == bufF/Lc (bufF)) 1647 1669 { 1648 1670 factorsFound++; … … 1679 1701 } 1680 1702 } 1681 buf *= LC (F, x); 1682 buf= mod (buf, yToL); 1703 buf= mulMod2 (buf, LC (F,x), yToL); 1683 1704 buf /= content (buf, x); 1684 if (fdivides (buf, F, quot)) 1705 buf= buf (y-eval,y); 1706 if (fdivides (buf, bufF, quot)) 1685 1707 { 1686 1708 factorsFoundIndex[i]= 1; 1687 1709 factorsFound++; 1688 F= quot;1689 F /= Lc (F);1710 bufF= quot; 1711 bufF /= Lc (bufF); 1690 1712 reconstructedFactors.append (buf); 1691 1713 } … … 1694 1716 if (factorsFound + 1 == nmod_mat_ncols (N)) 1695 1717 { 1696 reconstructedFactors.append (F); 1718 F= 1; 1719 reconstructedFactors.append (bufF); 1697 1720 return; 1698 1721 } 1699 1722 } 1723 if (reconstructedFactors.length() != 0) 1724 F= bufF (y+eval,y); 1700 1725 } 1701 1726 #endif … … 1703 1728 CFList 1704 1729 reconstruction (CanonicalForm& G, CFList& factors, int* zeroOneVecs, int 1705 precision, const mat_zz_pE& N 1730 precision, const mat_zz_pE& N, const CanonicalForm& eval 1706 1731 ) 1707 1732 { … … 1729 1754 } 1730 1755 } 1731 buf *= LC (F, x); 1732 buf= mod (buf, yToL); 1756 buf= mulMod2 (buf, LC (F,x), yToL); 1733 1757 buf /= content (buf, x); 1734 1758 if (fdivides (buf, F, quot)) … … 1736 1760 F= quot; 1737 1761 F /= Lc (F); 1738 result.append (buf );1762 result.append (buf (y-eval,y)); 1739 1763 bufFactors= Difference (bufFactors, factorsConsidered); 1740 1764 } … … 1781 1805 } 1782 1806 buf2= buf; 1783 buf *= LC (F, x); 1784 buf= mod (buf, yToL); 1807 buf= mulMod2 (buf, LC (F,x), yToL); 1785 1808 buf /= content (buf, x); 1786 1809 if (fdivides (buf, F, quot)) … … 1838 1861 } 1839 1862 } 1840 buf *= LC (F, x); 1841 buf= mod (buf, yToL); 1863 buf= mulMod2 (buf, LC (F,x), yToL); 1842 1864 buf /= content (buf, x); 1843 1865 buf2= buf (y-evaluation, y); … … 1919 1941 } 1920 1942 } 1921 buf *= LC (F, x); 1922 buf= mod (buf, yToL); 1943 buf= mulMod2 (buf, LC (F,x), yToL); 1923 1944 buf /= content (buf, x); 1924 1945 buf2= buf (y-evaluation, y); … … 1967 1988 CFList 1968 1989 reconstruction (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) 1970 1991 { 1971 1992 Variable y= Variable (2); … … 1993 2014 } 1994 2015 } 1995 buf *= LC (F, x); 1996 buf= mod (buf, yToL); 2016 buf= mulMod2 (buf, LC (F,x), yToL); 1997 2017 buf /= content (buf, x); 1998 2018 if (fdivides (buf, F, quot)) … … 2000 2020 F= quot; 2001 2021 F /= Lc (F); 2002 result.append (buf );2022 result.append (buf (y-eval,y)); 2003 2023 bufFactors= Difference (bufFactors, factorsConsidered); 2004 2024 } … … 2018 2038 CFList 2019 2039 reconstruction (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) 2021 2041 { 2022 2042 Variable y= Variable (2); … … 2044 2064 } 2045 2065 } 2046 buf *= LC (F, x); 2047 buf= mod (buf, yToL); 2066 buf= mulMod2 (buf, LC (F,x), yToL); 2048 2067 buf /= content (buf, x); 2049 2068 if (fdivides (buf, F, quot)) … … 2051 2070 F= quot; 2052 2071 F /= Lc (F); 2053 result.append (buf );2072 result.append (buf (y-eval,y)); 2054 2073 bufFactors= Difference (bufFactors, factorsConsidered); 2055 2074 } … … 2088 2107 tmp1= factors.getFirst(); 2089 2108 tmp2= factors.getLast(); 2090 tmp1 *= LC (F, x); 2091 tmp1= mod (tmp1, yToL); 2109 tmp1= mulMod2 (tmp1, LC (F,x), yToL); 2092 2110 tmp1 /= content (tmp1, x); 2093 tmp2 *= LC (F, x); 2094 tmp2= mod (tmp2, yToL); 2111 tmp2= mulMod2 (tmp2, LC (F,x), yToL); 2095 2112 tmp2 /= content (tmp2, x); 2096 2113 tmp3 = tmp1*tmp2; … … 2151 2168 } 2152 2169 } 2153 buf *= LC (F, x); 2154 buf= mod (buf, yToL); 2170 buf= mulMod2 (buf, LC (F,x), yToL); 2155 2171 buf /= content (buf, x); 2156 2172 buf2= buf (y - evaluation, y); … … 2220 2236 tmp1= factors.getFirst(); 2221 2237 tmp2= factors.getLast(); 2222 tmp1 *= LC (F, x); 2223 tmp1= mod (tmp1, yToL); 2238 tmp1= mulMod2 (tmp1, LC (F,x), yToL); 2224 2239 tmp1 /= content (tmp1, x); 2225 tmp2 *= LC (F, x); 2226 tmp2= mod (tmp2, yToL); 2240 tmp2= mulMod2 (tmp2, LC (F,x), yToL); 2227 2241 tmp2 /= content (tmp2, x); 2228 2242 tmp3 = tmp1*tmp2; … … 2283 2297 } 2284 2298 } 2285 buf *= LC (F, x); 2286 buf= mod (buf, yToL); 2299 buf= mulMod2 (buf, LC (F,x), yToL); 2287 2300 buf /= content (buf, x); 2288 2301 buf2= buf (y - evaluation, y); … … 2355 2368 while (l <= liftBound) 2356 2369 { 2370 TIMING_START (fac_fq_compute_lattice_lift); 2357 2371 if (start) 2358 2372 { … … 2367 2381 henselLift12 (F, factors, l, Pi, diophant, M); 2368 2382 } 2383 TIMING_END_AND_PRINT (fac_fq_compute_lattice_lift, 2384 "time to lift in compute lattice: "); 2369 2385 2370 2386 factors.insert (LCF); … … 2373 2389 2374 2390 truncF= mod (F, power (y, l)); 2391 TIMING_START (fac_fq_logarithmic); 2375 2392 for (int i= 0; i < factors.length() - 1; i++, j++) 2376 2393 { … … 2381 2398 bufQ[i]); 2382 2399 } 2400 TIMING_END_AND_PRINT (fac_fq_logarithmic, 2401 "time to compute logarithmic derivative: "); 2383 2402 2384 2403 for (int i= 0; i < sizeBounds; i++) … … 2472 2491 while (l <= liftBound) 2473 2492 { 2493 TIMING_START (fac_fq_compute_lattice_lift); 2474 2494 if (start) 2475 2495 { … … 2484 2504 henselLift12 (F, factors, l, Pi, diophant, M); 2485 2505 } 2506 TIMING_END_AND_PRINT (fac_fq_compute_lattice_lift, 2507 "time to lift in compute lattice: "); 2486 2508 2487 2509 factors.insert (LCF); … … 2490 2512 2491 2513 truncF= mod (F, power (y, l)); 2514 TIMING_START (fac_fq_logarithmic); 2492 2515 for (int i= 0; i < factors.length() - 1; i++, j++) 2493 2516 { … … 2498 2521 bufQ[i]); 2499 2522 } 2523 TIMING_END_AND_PRINT (fac_fq_logarithmic, 2524 "time to compute logarithmic derivative: "); 2500 2525 2501 2526 for (int i= 0; i < sizeBounds; i++) … … 2619 2644 while (l <= liftBound) 2620 2645 { 2646 TIMING_START (fac_fq_compute_lattice_lift); 2621 2647 if (start) 2622 2648 { … … 2631 2657 henselLift12 (F, factors, l, Pi, diophant, M); 2632 2658 } 2659 TIMING_END_AND_PRINT (fac_fq_compute_lattice_lift, 2660 "time to lift in compute lattice: "); 2633 2661 2634 2662 factors.insert (LCF); … … 2659 2687 2660 2688 truncF= mod (F, power (y, l)); 2689 TIMING_START (fac_fq_logarithmic); 2661 2690 for (int i= 0; i < factors.length() - 1; i++, j++) 2662 2691 { … … 2667 2696 bufQ[i]); 2668 2697 } 2698 TIMING_END_AND_PRINT (fac_fq_logarithmic, 2699 "time to compute logarithmic derivative: "); 2669 2700 2670 2701 for (int i= 0; i < sizeBounds; i++) … … 2997 3028 while (l <= liftBound) 2998 3029 { 3030 TIMING_START (fac_fq_compute_lattice_lift); 2999 3031 if (start) 3000 3032 { … … 3009 3041 henselLift12 (F, factors, l, Pi, diophant, M); 3010 3042 } 3043 TIMING_END_AND_PRINT (fac_fq_compute_lattice_lift, 3044 "time to lift in compute lattice: "); 3011 3045 3012 3046 factors.insert (LCF); … … 3015 3049 3016 3050 truncF= mod (F, power (y,l)); 3051 TIMING_START (fac_fq_logarithmic); 3017 3052 for (int i= 0; i < factors.length() - 1; i++, j++) 3018 3053 { … … 3028 3063 } 3029 3064 } 3065 TIMING_END_AND_PRINT (fac_fq_logarithmic, 3066 "time to compute logarithmic derivative: "); 3030 3067 3031 3068 for (int i= 0; i < sizeBounds; i++) … … 3139 3176 while (l <= liftBound) 3140 3177 { 3178 TIMING_START (fac_fq_compute_lattice_lift); 3141 3179 if (start) 3142 3180 { … … 3151 3189 henselLift12 (F, factors, l, Pi, diophant, M); 3152 3190 } 3191 TIMING_END_AND_PRINT (fac_fq_compute_lattice_lift, 3192 "time to lift in compute lattice: "); 3153 3193 3154 3194 factors.insert (LCF); … … 3157 3197 3158 3198 truncF= mod (F, power (y,l)); 3199 TIMING_START (fac_fq_logarithmic); 3159 3200 for (int i= 0; i < factors.length() - 1; i++, j++) 3160 3201 { … … 3170 3211 } 3171 3212 } 3213 TIMING_END_AND_PRINT (fac_fq_logarithmic, 3214 "time to compute logarithmic derivative: "); 3172 3215 3173 3216 for (int i= 0; i < sizeBounds; i++) … … 3276 3319 CFList 3277 3320 increasePrecision (CanonicalForm& F, CFList& factors, int factorsFound, 3278 int oldNumCols, int oldL, int precision 3321 int oldNumCols, int oldL, int precision, 3322 const CanonicalForm& eval 3279 3323 ) 3280 3324 { … … 3282 3326 bool isIrreducible= false; 3283 3327 int* bounds= computeBounds (F, d, isIrreducible); 3328 Variable y= F.mvar(); 3284 3329 if (isIrreducible) 3285 3330 { … … 3287 3332 CanonicalForm G= F; 3288 3333 F= 1; 3289 return CFList (G );3334 return CFList (G (y-eval, y)); 3290 3335 } 3291 3336 CFArray * A= new CFArray [factors.length()]; … … 3320 3365 mat_zz_p* NTLC, NTLK; 3321 3366 #endif 3322 Variable y= F.mvar();3323 3367 CanonicalForm truncF; 3324 3368 while (l <= precision) … … 3393 3437 CanonicalForm G= F; 3394 3438 F= 1; 3395 return CFList (G );3439 return CFList (G (y-eval,y)); 3396 3440 } 3397 3441 } … … 3419 3463 #ifdef HAVE_FLINT 3420 3464 reconstructionTry (result, bufF, factors, degree (F) + 1, factorsFound2, 3421 factorsFoundIndex, FLINTN, false3465 factorsFoundIndex, FLINTN, eval, false 3422 3466 ); 3423 3467 if (result.length() == nmod_mat_ncols (FLINTN)) … … 3426 3470 #else 3427 3471 reconstructionTry (result, bufF, factors, degree (F) + 1, factorsFound2, 3428 factorsFoundIndex, NTLN, false3472 factorsFoundIndex, NTLN, eval, false 3429 3473 ); 3430 3474 if (result.length() == NTLN.NumCols()) … … 3444 3488 #ifdef HAVE_FLINT 3445 3489 int * zeroOne= extractZeroOneVecs (FLINTN); 3446 CFList result= reconstruction (bufF,factors,zeroOne,precision,FLINTN );3490 CFList result= reconstruction (bufF,factors,zeroOne,precision,FLINTN, eval); 3447 3491 nmod_mat_clear (FLINTN); 3448 3492 #else 3449 3493 int * zeroOne= extractZeroOneVecs (NTLN); 3450 CFList result= reconstruction (bufF, factors, zeroOne, precision, NTLN );3494 CFList result= reconstruction (bufF, factors, zeroOne, precision, NTLN, eval); 3451 3495 #endif 3452 3496 F= bufF; … … 3482 3526 increasePrecision (CanonicalForm& F, CFList& factors, int factorsFound, 3483 3527 int oldNumCols, int oldL, const Variable&, 3484 int precision 3528 int precision, const CanonicalForm& eval 3485 3529 ) 3486 3530 { 3487 3531 int d; 3488 3532 bool isIrreducible= false; 3533 Variable y= F.mvar(); 3489 3534 int* bounds= computeBounds (F, d, isIrreducible); 3490 3535 if (isIrreducible) … … 3493 3538 CanonicalForm G= F; 3494 3539 F= 1; 3495 return CFList (G );3540 return CFList (G (y-eval,y)); 3496 3541 } 3497 3542 CFArray * A= new CFArray [factors.length()]; … … 3514 3559 mat_zz_pE* NTLC, NTLK; 3515 3560 CFArray buf; 3516 Variable y= F.mvar();3517 3561 CanonicalForm truncF; 3518 3562 while (l <= precision) … … 3559 3603 CanonicalForm G= F; 3560 3604 F= 1; 3561 return CFList (G );3605 return CFList (G (y-eval,y)); 3562 3606 } 3563 3607 } … … 3575 3619 CanonicalForm bufF= F; 3576 3620 reconstructionTry (result, bufF, factors, degree (F) + 1, factorsFound2, 3577 factorsFoundIndex, NTLN, false);3621 factorsFoundIndex, NTLN, eval, false); 3578 3622 if (result.length() == NTLN.NumCols()) 3579 3623 { … … 3590 3634 CanonicalForm bufF= F; 3591 3635 int * zeroOne= extractZeroOneVecs (NTLN); 3592 CFList result= reconstruction (bufF, factors, zeroOne, precision, NTLN );3636 CFList result= reconstruction (bufF, factors, zeroOne, precision, NTLN, eval); 3593 3637 F= bufF; 3594 3638 delete [] zeroOne; … … 3958 4002 increasePrecisionFq2Fp (CanonicalForm& F, CFList& factors, int factorsFound, 3959 4003 int oldNumCols, int oldL, const Variable& alpha, 3960 int precision 4004 int precision, const CanonicalForm& eval 3961 4005 ) 3962 4006 { 3963 4007 int d; 3964 4008 bool isIrreducible= false; 4009 Variable y= F.mvar(); 3965 4010 int* bounds= computeBounds (F, d, isIrreducible); 3966 4011 if (isIrreducible) … … 3969 4014 CanonicalForm G= F; 3970 4015 F= 1; 3971 return CFList (G );4016 return CFList (G (y-eval,y)); 3972 4017 } 3973 4018 int extensionDeg= degree (getMipo (alpha)); … … 4003 4048 #endif 4004 4049 CFArray buf; 4005 Variable y= F.mvar();4006 4050 CanonicalForm truncF; 4007 4051 while (l <= precision) … … 4076 4120 CanonicalForm G= F; 4077 4121 F= 1; 4078 return CFList (G );4122 return CFList (G (y-eval,y)); 4079 4123 } 4080 4124 } … … 4102 4146 #ifdef HAVE_FLINT 4103 4147 reconstructionTry (result, bufF, factors, degree (F) + 1, factorsFound2, 4104 factorsFoundIndex, FLINTN, false4148 factorsFoundIndex, FLINTN, eval, false 4105 4149 ); 4106 4150 if (result.length() == nmod_mat_ncols (FLINTN)) … … 4109 4153 #else 4110 4154 reconstructionTry (result, bufF, factors, degree (F) + 1, factorsFound2, 4111 factorsFoundIndex, NTLN, false4155 factorsFoundIndex, NTLN, eval, false 4112 4156 ); 4113 4157 if (result.length() == NTLN.NumCols()) … … 4127 4171 #ifdef HAVE_FLINT 4128 4172 int * zeroOne= extractZeroOneVecs (FLINTN); 4129 CFList result= reconstruction (bufF,factors,zeroOne,precision,FLINTN );4173 CFList result= reconstruction (bufF,factors,zeroOne,precision,FLINTN, eval); 4130 4174 nmod_mat_clear (FLINTN); 4131 4175 #else 4132 4176 int * zeroOne= extractZeroOneVecs (NTLN); 4133 CFList result= reconstruction (bufF, factors, zeroOne, precision, NTLN );4177 CFList result= reconstruction (bufF, factors, zeroOne, precision, NTLN, eval); 4134 4178 #endif 4135 4179 F= bufF; … … 4165 4209 CFList 4166 4210 increasePrecision (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 4168 4213 ) 4169 4214 #else 4170 4215 CFList 4171 4216 increasePrecision (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 4173 4219 ) 4174 4220 #endif … … 4274 4320 { 4275 4321 delete [] A; 4276 return CFList (F );4322 return CFList (F (y-eval,y)); 4277 4323 } 4278 4324 } … … 4285 4331 { 4286 4332 delete [] A; 4287 return CFList (F );4333 return CFList (F (y-eval,y)); 4288 4334 } 4289 4335 int * zeroOneVecs; … … 4296 4342 bufUniFactors= factors; 4297 4343 #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); 4301 4347 #endif 4302 4348 delete [] zeroOneVecs; … … 4329 4375 CFList 4330 4376 increasePrecision (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 4332 4379 ) 4333 4380 { … … 4387 4434 { 4388 4435 delete [] A; 4389 return CFList (F );4436 return CFList (F (y-eval,y)); 4390 4437 } 4391 4438 } … … 4394 4441 { 4395 4442 delete [] A; 4396 return CFList (F );4443 return CFList (F (y-eval,y)); 4397 4444 } 4398 4445 … … 4401 4448 bufF= F; 4402 4449 bufUniFactors= factors; 4403 result= reconstruction (bufF, bufUniFactors, zeroOneVecs, oldL, NTLN );4450 result= reconstruction (bufF, bufUniFactors, zeroOneVecs, oldL, NTLN, eval); 4404 4451 delete [] zeroOneVecs; 4405 4452 if (degree (bufF) + 1 + degree (LC (bufF, 1)) < l && result.length() > 0) … … 4604 4651 increasePrecisionFq2Fp (CanonicalForm& F, CFList& factors, int oldL, int l, 4605 4652 int d, int* bounds, CFArray& bufQ, nmod_mat_t FLINTN, 4606 const Variable& alpha 4653 const Variable& alpha, const CanonicalForm& eval 4607 4654 ) 4608 4655 #else … … 4610 4657 increasePrecisionFq2Fp (CanonicalForm& F, CFList& factors, int oldL, int l, 4611 4658 int d, int* bounds, CFArray& bufQ, mat_zz_p& NTLN, 4612 const Variable& alpha 4659 const Variable& alpha, const CanonicalForm& eval 4613 4660 ) 4614 4661 #endif … … 4711 4758 { 4712 4759 delete [] A; 4713 return CFList (F );4760 return CFList (F(y-eval,y)); 4714 4761 } 4715 4762 } … … 4726 4773 bufUniFactors= factors; 4727 4774 #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); 4731 4778 #endif 4732 4779 delete [] zeroOneVecs; … … 4762 4809 factors, int l, int liftBound, int d, int* 4763 4810 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 4765 4813 ) 4766 4814 #else … … 4769 4817 factors, int l, int liftBound, int d, int* 4770 4818 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 4772 4821 ) 4773 4822 #endif … … 4896 4945 bufF= F; 4897 4946 #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); 4901 4950 #endif 4902 4951 delete [] zeroOneVecs; … … 4928 4977 if (l < liftBound) 4929 4978 reconstructionTry (result, bufF, bufFactors, l, factorsFound, 4930 factorsFoundIndex, FLINTN, false4979 factorsFoundIndex, FLINTN, eval, false 4931 4980 ); 4932 4981 else 4933 4982 reconstructionTry (result, bufF, bufFactors, degree (bufF) + 1 + 4934 4983 degree (LCF), factorsFound, factorsFoundIndex, 4935 FLINTN, false4984 FLINTN, eval, false 4936 4985 ); 4937 4986 … … 4940 4989 if (l < liftBound) 4941 4990 reconstructionTry (result, bufF, bufFactors, l, factorsFound, 4942 factorsFoundIndex, NTLN, false4991 factorsFoundIndex, NTLN, eval, false 4943 4992 ); 4944 4993 else 4945 4994 reconstructionTry (result, bufF, bufFactors, degree (bufF) + 1 + 4946 4995 degree (LCF), factorsFound, factorsFoundIndex, 4947 NTLN, false4996 NTLN, eval, false 4948 4997 ); 4949 4998 … … 4975 5024 { 4976 5025 delete [] A; 4977 return CFList (F );5026 return CFList (F (y-eval,y)); 4978 5027 } 4979 5028 delete [] A; … … 4987 5036 factors, int l, int liftBound, int d, int* 4988 5037 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 4990 5040 ) 4991 5041 { … … 5059 5109 int * zeroOneVecs= extractZeroOneVecs (NTLN); 5060 5110 bufF= F; 5061 result= reconstruction (bufF, bufFactors, zeroOneVecs, l, NTLN );5111 result= reconstruction (bufF, bufFactors, zeroOneVecs, l, NTLN, eval); 5062 5112 delete [] zeroOneVecs; 5063 5113 if (result.length() > 0 && degree (bufF) + 1 + degree (LC (bufF, 1)) <= l) … … 5078 5128 if (l < liftBound) 5079 5129 reconstructionTry (result, bufF, bufFactors, l, factorsFound, 5080 factorsFoundIndex, NTLN, false5130 factorsFoundIndex, NTLN, eval, false 5081 5131 ); 5082 5132 else 5083 5133 reconstructionTry (result, bufF, bufFactors, degree (bufF) + 1 + 5084 5134 degree (LCF), factorsFound, factorsFoundIndex, 5085 NTLN, false5135 NTLN, eval, false 5086 5136 ); 5087 5137 if (NTLN.NumCols() == result.length()) … … 5111 5161 { 5112 5162 delete [] A; 5113 return CFList (F );5163 return CFList (F (y-eval,y)); 5114 5164 } 5115 5165 delete [] A; … … 5327 5377 nmod_mat_t FLINTN, CFList& diophant, 5328 5378 CFMatrix& M, CFArray& Pi, CFArray& bufQ, 5329 const Variable& alpha 5379 const Variable& alpha, 5380 const CanonicalForm& eval 5330 5381 ) 5331 5382 #else … … 5335 5386 mat_zz_p& NTLN, CFList& diophant, 5336 5387 CFMatrix& M, CFArray& Pi, CFArray& bufQ, 5337 const Variable& alpha 5388 const Variable& alpha, 5389 const CanonicalForm& eval 5338 5390 ) 5339 5391 #endif … … 5460 5512 CanonicalForm bufF= F; 5461 5513 #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); 5465 5517 #endif 5466 5518 delete [] zeroOneVecs; … … 5492 5544 if (l < degree (bufF) + 1 + degree (LCF)) 5493 5545 reconstructionTry (result, bufF, bufFactors, l, factorsFound, 5494 factorsFoundIndex, FLINTN, false5546 factorsFoundIndex, FLINTN, eval, false 5495 5547 ); 5496 5548 else 5497 5549 reconstructionTry (result, bufF, bufFactors, degree (bufF) + 1 + 5498 5550 degree (LCF), factorsFound, factorsFoundIndex, 5499 FLINTN, false5551 FLINTN, eval, false 5500 5552 ); 5501 5553 if (nmod_mat_ncols (FLINTN) == result.length()) … … 5503 5555 if (l < degree (bufF) + 1 + degree (LCF)) 5504 5556 reconstructionTry (result, bufF, bufFactors, l, factorsFound, 5505 factorsFoundIndex, NTLN, false5557 factorsFoundIndex, NTLN, eval, false 5506 5558 ); 5507 5559 else 5508 5560 reconstructionTry (result, bufF, bufFactors, degree (bufF) + 1 + 5509 5561 degree (LCF), factorsFound, factorsFoundIndex, 5510 NTLN, false5562 NTLN, eval, false 5511 5563 ); 5512 5564 if (NTLN.NumCols() == result.length()) … … 5537 5589 { 5538 5590 delete [] A; 5539 return CFList (F );5591 return CFList (F (y-eval,y)); 5540 5592 } 5541 5593 delete [] A; … … 5678 5730 if (l < smallFactorDeg) 5679 5731 { 5732 TIMING_START (fac_fq_lift); 5680 5733 factors.insert (LCF); 5681 5734 henselLiftResume12 (F, factors, l, smallFactorDeg, Pi, diophant, M); 5735 TIMING_END_AND_PRINT (fac_fq_lift, "time to lift in reconstruction0: "); 5682 5736 l= smallFactorDeg; 5683 5737 } 5684 5738 #ifdef HAVE_FLINT 5739 TIMING_START (fac_fq_reconstruction); 5685 5740 reconstructionTry (result, bufF, factors, smallFactorDeg, factorsFound, 5686 factorsFoundIndex, FLINTN, beenInThres5741 factorsFoundIndex, FLINTN, evaluation, beenInThres 5687 5742 ); 5743 TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct0: "); 5688 5744 if (result.length() == nmod_mat_ncols (FLINTN)) 5689 5745 { 5690 5746 nmod_mat_clear (FLINTN); 5691 5747 #else 5748 TIMING_START (fac_fq_reconstruction); 5692 5749 reconstructionTry (result, bufF, factors, smallFactorDeg, factorsFound, 5693 factorsFoundIndex, NTLN, beenInThres5750 factorsFoundIndex, NTLN, evaluation, beenInThres 5694 5751 ); 5752 TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct0: "); 5695 5753 if (result.length() == NTLN.NumCols()) 5696 5754 { … … 5711 5769 { 5712 5770 factors.insert (LCF); 5771 TIMING_START (fac_fq_lift); 5713 5772 henselLiftResume12 (F, factors, l, liftPre[i-1] + 1, Pi, diophant, M); 5773 TIMING_END_AND_PRINT (fac_fq_lift, "time to lift in reconstruction1: "); 5714 5774 l= liftPre[i-1] + 1; 5715 5775 } … … 5721 5781 } 5722 5782 #ifdef HAVE_FLINT 5783 TIMING_START (fac_fq_reconstruction); 5723 5784 reconstructionTry (result, bufF, factors, l, factorsFound, 5724 factorsFoundIndex, FLINTN, beenInThres5785 factorsFoundIndex, FLINTN, evaluation, beenInThres 5725 5786 ); 5787 TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct1: "); 5726 5788 if (result.length() == nmod_mat_ncols (FLINTN)) 5727 5789 { 5728 5790 nmod_mat_clear (FLINTN); 5729 5791 #else 5792 TIMING_START (fac_fq_reconstruction); 5730 5793 reconstructionTry (result, bufF, factors, l, factorsFound, 5731 factorsFoundIndex, NTLN, beenInThres5794 factorsFoundIndex, NTLN, evaluation, beenInThres 5732 5795 ); 5796 TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct1: "); 5733 5797 if (result.length() == NTLN.NumCols()) 5734 5798 { … … 5752 5816 { 5753 5817 factors.insert (LCF); 5818 TIMING_START (fac_fq_lift); 5754 5819 henselLiftResume12 (F, factors, l, dummy, Pi, diophant, M); 5820 TIMING_END_AND_PRINT (fac_fq_lift, "time to lift in reconstruction2: "); 5755 5821 l= dummy; 5756 5822 if (i == 1 && degree (F)%4==0 && symmetric && factors.length() == 2 && … … 5781 5847 check1= gg (y-evaluation,y); 5782 5848 check2= hh (y-evaluation,y); 5849 CanonicalForm oldcheck1= check1; 5783 5850 check1= swapvar (check1, x, y); 5784 5851 if (check1/Lc (check1) == check2/Lc (check2)) … … 5787 5854 nmod_mat_clear (FLINTN); 5788 5855 #endif 5789 result.append ( gg);5790 result.append ( hh);5856 result.append (oldcheck1); 5857 result.append (check2); 5791 5858 delete [] liftPre; 5792 5859 delete [] factorsFoundIndex; … … 5802 5869 } 5803 5870 #ifdef HAVE_FLINT 5871 TIMING_START (fac_fq_reconstruction); 5804 5872 reconstructionTry (result, bufF, factors, l, factorsFound, 5805 factorsFoundIndex, FLINTN, beenInThres5873 factorsFoundIndex, FLINTN, evaluation, beenInThres 5806 5874 ); 5875 TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct2: "); 5807 5876 if (result.length() == nmod_mat_ncols (FLINTN)) 5808 5877 { 5809 5878 nmod_mat_clear (FLINTN); 5810 5879 #else 5880 TIMING_START (fac_fq_reconstruction); 5811 5881 reconstructionTry (result, bufF, factors, l, factorsFound, 5812 factorsFoundIndex, NTLN, beenInThres5882 factorsFoundIndex, NTLN, evaluation, beenInThres 5813 5883 ); 5884 TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct2: "); 5814 5885 if (result.length() == NTLN.NumCols()) 5815 5886 { … … 5855 5926 if (l < smallFactorDeg) 5856 5927 { 5928 TIMING_START (fac_fq_lift); 5857 5929 factors.insert (LCF); 5858 5930 henselLiftResume12 (F, factors, l, smallFactorDeg, Pi, diophant, M); 5931 TIMING_END_AND_PRINT (fac_fq_lift, "time to lift in reconstruction0: "); 5859 5932 l= smallFactorDeg; 5860 5933 } 5934 TIMING_START (fac_fq_reconstruction); 5861 5935 reconstructionTry (result, bufF, factors, smallFactorDeg, factorsFound, 5862 factorsFoundIndex, NTLN, beenInThres5936 factorsFoundIndex, NTLN, evaluation, beenInThres 5863 5937 ); 5938 TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct0: "); 5864 5939 if (result.length() == NTLN.NumCols()) 5865 5940 { … … 5879 5954 { 5880 5955 factors.insert (LCF); 5956 TIMING_START (fac_fq_lift); 5881 5957 henselLiftResume12 (F, factors, l, liftPre[i-1] + 1, Pi, diophant, M); 5958 TIMING_END_AND_PRINT (fac_fq_lift, "time to lift in reconstruction1: "); 5882 5959 l= liftPre[i-1] + 1; 5883 5960 } … … 5888 5965 continue; 5889 5966 } 5967 TIMING_START (fac_fq_reconstruction); 5890 5968 reconstructionTry (result, bufF, factors, l, factorsFound, 5891 factorsFoundIndex, NTLN, beenInThres5969 factorsFoundIndex, NTLN, evaluation, beenInThres 5892 5970 ); 5971 TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct1: "); 5893 5972 if (result.length() == NTLN.NumCols()) 5894 5973 { … … 5911 5990 { 5912 5991 factors.insert (LCF); 5992 TIMING_START (fac_fq_lift); 5913 5993 henselLiftResume12 (F, factors, l, dummy, Pi, diophant, M); 5994 TIMING_END_AND_PRINT (fac_fq_lift, "time to lift in reconstruction2: "); 5914 5995 l= dummy; 5915 5996 if (i == 1 && degree (F)%4==0 && symmetric && factors.length() == 2 && … … 5940 6021 check1= gg (y-evaluation,y); 5941 6022 check2= hh (y-evaluation,y); 6023 CanonicalForm oldcheck1= check1; 5942 6024 check1= swapvar (check1, x, y); 5943 6025 if (check1/Lc (check1) == check2/Lc (check2)) 5944 6026 { 5945 result.append ( gg);5946 result.append ( hh);6027 result.append (oldcheck1); 6028 result.append (check2); 5947 6029 delete [] liftPre; 5948 6030 delete [] factorsFoundIndex; … … 5957 6039 continue; 5958 6040 } 6041 TIMING_START (fac_fq_reconstruction); 5959 6042 reconstructionTry (result, bufF, factors, l, factorsFound, 5960 factorsFoundIndex, NTLN, beenInThres6043 factorsFoundIndex, NTLN, evaluation, beenInThres 5961 6044 ); 6045 TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct2: "); 5962 6046 if (result.length() == NTLN.NumCols()) 5963 6047 { … … 6001 6085 if (l < smallFactorDeg) 6002 6086 { 6087 TIMING_START (fac_fq_lift); 6003 6088 factors.insert (LCF); 6004 6089 henselLiftResume12 (F, factors, l, smallFactorDeg, Pi, diophant, M); 6090 TIMING_END_AND_PRINT (fac_fq_lift, "time to lift in reconstruction0: "); 6005 6091 l= smallFactorDeg; 6006 6092 } 6093 TIMING_START (fac_fq_reconstruction); 6007 6094 extReconstructionTry (result, bufF, factors, smallFactorDeg, factorsFound, 6008 6095 factorsFoundIndex, NTLN, beenInThres, info, 6009 6096 evaluation 6010 6097 ); 6098 TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct0: "); 6011 6099 if (result.length() == NTLN.NumCols()) 6012 6100 { … … 6026 6114 { 6027 6115 factors.insert (LCF); 6116 TIMING_START (fac_fq_lift); 6028 6117 henselLiftResume12 (F, factors, l, liftPre[i-1] + 1, Pi, diophant, M); 6118 TIMING_END_AND_PRINT (fac_fq_lift, "time to lift in reconstruction1: "); 6029 6119 l= liftPre[i-1] + 1; 6030 6120 } … … 6035 6125 continue; 6036 6126 } 6127 TIMING_START (fac_fq_reconstruction); 6037 6128 extReconstructionTry (result, bufF, factors, l, factorsFound, 6038 6129 factorsFoundIndex, NTLN, beenInThres, info, 6039 6130 evaluation 6040 6131 ); 6132 TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct1: "); 6041 6133 if (result.length() == NTLN.NumCols()) 6042 6134 { … … 6059 6151 { 6060 6152 factors.insert (LCF); 6153 TIMING_START (fac_fq_lift); 6061 6154 henselLiftResume12 (F, factors, l, dummy, Pi, diophant, M); 6155 TIMING_END_AND_PRINT (fac_fq_lift, "time to lift in reconstruction2: "); 6062 6156 l= dummy; 6063 6157 } … … 6068 6162 continue; 6069 6163 } 6164 TIMING_START (fac_fq_reconstruction); 6070 6165 extReconstructionTry (result, bufF, factors, l, factorsFound, 6071 6166 factorsFoundIndex, NTLN, beenInThres, info, 6072 6167 evaluation 6073 6168 ); 6169 TIMING_END_AND_PRINT (fac_fq_reconstruction, "time to reconstruct2: "); 6074 6170 if (result.length() == NTLN.NumCols()) 6075 6171 { … … 6090 6186 sieveSmallFactors (const CanonicalForm& G, CFList& uniFactors, DegreePattern& 6091 6187 degPat, CanonicalForm& H, CFList& diophant, CFArray& Pi, 6092 CFMatrix& M, bool& success, int d 6188 CFMatrix& M, bool& success, int d, const CanonicalForm& eval 6093 6189 ) 6094 6190 { … … 6106 6202 CFList earlyFactors; 6107 6203 earlyFactorDetection (earlyFactors, F, bufUniFactors, adaptedLiftBound, 6108 factorsFoundIndex, degs, success, smallFactorDeg );6204 factorsFoundIndex, degs, success, smallFactorDeg, eval); 6109 6205 delete [] factorsFoundIndex; 6110 6206 if (degs.getLength() == 1) … … 6183 6279 henselLiftAndLatticeRecombi (const CanonicalForm& G, const CFList& uniFactors, 6184 6280 const Variable& alpha, const DegreePattern& degPat, 6185 bool symmetric, const CanonicalForm& eval uation6281 bool symmetric, const CanonicalForm& eval 6186 6282 ) 6187 6283 { … … 6216 6312 bool success= false; 6217 6313 smallFactors= sieveSmallFactors (F, bufUniFactors, degs, H, diophant, Pi, M, 6218 success, minBound + 1 6314 success, minBound + 1, eval 6219 6315 ); 6220 6316 … … 6226 6322 { 6227 6323 delete [] bounds; 6228 return CFList (G );6324 return CFList (G (y-eval,y)); 6229 6325 } 6230 6326 } … … 6241 6337 { 6242 6338 index= 1; 6243 tmp1= mod (i.getItem(),y );6339 tmp1= mod (i.getItem(),y-eval); 6244 6340 tmp1 /= Lc (tmp1); 6245 6341 for (CFListIterator j= bufUniFactors; j.hasItem(); j++, index++) … … 6269 6365 if (isIrreducible) 6270 6366 { 6271 smallFactors.append (F );6367 smallFactors.append (F (y-eval,y)); 6272 6368 delete [] bounds; 6273 6369 return smallFactors; … … 6290 6386 if (degs.getLength() <= 1) 6291 6387 { 6292 smallFactors.append (F );6388 smallFactors.append (F (y-eval,y)); 6293 6389 delete [] bounds; 6294 6390 return smallFactors; … … 6346 6442 6347 6443 int oldL; 6444 TIMING_START (fac_fq_till_reduced); 6348 6445 if (success) 6349 6446 { … … 6410 6507 } 6411 6508 6509 TIMING_END_AND_PRINT (fac_fq_till_reduced, 6510 "time to compute a reduced lattice: "); 6412 6511 bufUniFactors.removeFirst(); 6413 6512 if (oldL > liftBound) … … 6421 6520 factorRecombination (bufUniFactors, F, 6422 6521 power (y, degree (F) + 1), 6423 degs, 1, bufUniFactors.length()/26522 degs, eval, 1, bufUniFactors.length()/2 6424 6523 ) 6425 6524 ); … … 6434 6533 #endif 6435 6534 delete [] bounds; 6436 return Union (CFList (F ), smallFactors);6535 return Union (CFList (F(y-eval,y)), smallFactors); 6437 6536 } 6438 6537 … … 6465 6564 reconstructionTry (result, bufF, bufUniFactors, degree (F) + 1, 6466 6565 #ifdef HAVE_FLINT 6467 factorsFound, factorsFoundIndex, FLINTN, false6468 #else 6469 factorsFound, factorsFoundIndex, NTLN, false6566 factorsFound, factorsFoundIndex, FLINTN, eval, false 6567 #else 6568 factorsFound, factorsFoundIndex, NTLN, eval, false 6470 6569 #endif 6471 6570 ); 6472 6571 else 6473 6572 reconstructionTry (result, bufF, bufUniFactors, degree (F) + 1, 6474 factorsFound, factorsFoundIndex, NTLNe, false6573 factorsFound, factorsFoundIndex, NTLNe, eval, false 6475 6574 ); 6476 6575 if (alpha.level() == 1 || (alpha.level() != 1 && reduceFq2Fp)) … … 6526 6625 reconstructionTry (result, bufF, bufUniFactors, degree (F) + 1, 6527 6626 #ifdef HAVE_FLINT 6528 factorsFound, factorsFoundIndex, FLINTN, false6529 #else 6530 factorsFound, factorsFoundIndex, NTLN, false6627 factorsFound, factorsFoundIndex, FLINTN, eval, false 6628 #else 6629 factorsFound, factorsFoundIndex, NTLN, eval, false 6531 6630 #endif 6532 6631 ); 6533 6632 else 6534 6633 reconstructionTry (result, bufF, bufUniFactors, degree (F) + 1, 6535 factorsFound, factorsFoundIndex, NTLNe, false6634 factorsFound, factorsFoundIndex, NTLNe, eval, false 6536 6635 ); 6537 6636 if (alpha.level() == 1 || (alpha.level() != 1 && reduceFq2Fp)) … … 6605 6704 #endif 6606 6705 factorsFound, beenInThres, M, Pi, 6607 diophant, symmetric, eval uation6706 diophant, symmetric, eval 6608 6707 ); 6609 6708 … … 6624 6723 result= earlyReconstructionAndLifting (F, NTLNe, bufF, bufUniFactors, l, 6625 6724 factorsFound, beenInThres, M, Pi, 6626 diophant, symmetric, eval uation6725 diophant, symmetric, eval 6627 6726 ); 6628 6727 … … 6642 6741 { 6643 6742 index= 1; 6644 tmp1= mod (i.getItem(), y );6743 tmp1= mod (i.getItem(), y-eval); 6645 6744 tmp1 /= Lc (tmp1); 6646 6745 for (CFListIterator j= bufUniFactors; j.hasItem(); j++, index++) … … 6717 6816 for (iter2= result; iter2.hasItem(); iter2++) 6718 6817 { 6719 tmp= mod (iter2.getItem(), y );6818 tmp= mod (iter2.getItem(), y-eval); 6720 6819 tmp /= Lc (tmp); 6721 6820 if (tmp == buf) … … 6742 6841 #endif 6743 6842 resultBufF= increasePrecision (bufF, bufUniFactors, factorsFound, 6744 oldNumCols, oldL, l 6843 oldNumCols, oldL, l, eval 6745 6844 ); 6746 6845 } … … 6756 6855 6757 6856 resultBufF= increasePrecisionFq2Fp (bufF, bufUniFactors, factorsFound, 6758 oldNumCols, oldL, alpha, l 6857 oldNumCols, oldL, alpha, l, eval 6759 6858 ); 6760 6859 } … … 6764 6863 6765 6864 resultBufF= increasePrecision (bufF, bufUniFactors, factorsFound, 6766 oldNumCols, oldL, alpha,l6865 oldNumCols, oldL, alpha, l, eval 6767 6866 ); 6768 6867 } … … 6795 6894 nmod_mat_clear (FLINTN); 6796 6895 #endif 6797 result.append (bufF );6896 result.append (bufF (y-eval,y)); 6798 6897 return result; 6799 6898 } … … 6804 6903 return Union (result, henselLiftAndLatticeRecombi (bufF, bufUniFactors, 6805 6904 alpha, degs, symmetric, 6806 eval uation6905 eval 6807 6906 ) 6808 6907 ); … … 6815 6914 result=increasePrecision (F, bufUniFactors, oldL, l, d, bounds, bufQ, 6816 6915 #ifdef HAVE_FLINT 6817 FLINTN 6818 #else 6819 NTLN 6916 FLINTN, eval 6917 #else 6918 NTLN, eval 6820 6919 #endif 6821 6920 ); … … 6827 6926 result=increasePrecisionFq2Fp (F, bufUniFactors, oldL, l, d, bounds, 6828 6927 #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 6832 6931 #endif 6833 6932 ); … … 6836 6935 { 6837 6936 result=increasePrecision (F, bufUniFactors, oldL, l, d, bounds, bufQ, 6838 NTLNe 6937 NTLNe, eval 6839 6938 ); 6840 6939 } … … 6874 6973 liftBound, d, bounds, NTLN, 6875 6974 #endif 6876 diophant, M, Pi, bufQ 6975 diophant, M, Pi, bufQ, eval 6877 6976 ); 6878 6977 else … … 6886 6985 NTLN, diophant, M, 6887 6986 #endif 6888 Pi, bufQ, alpha 6987 Pi, bufQ, alpha, eval 6889 6988 ); 6890 6989 else … … 6892 6991 liftBound, d, bounds, 6893 6992 NTLNe, diophant, M, 6894 Pi, bufQ 6993 Pi, bufQ, eval 6895 6994 ); 6896 6995 } … … 6939 7038 delete [] bounds; 6940 7039 result= Union (result, smallFactors); 6941 result.append (F );7040 result.append (F (y-eval,y)); 6942 7041 return result; 6943 7042 } … … 6954 7053 CanonicalForm MODl= power (y, degree (F) + 1); 6955 7054 delete [] bounds; 6956 return Union (result, factorRecombination (bufUniFactors, F, MODl, degs, 1,6957 bufUniFactors.length()/27055 return Union (result, factorRecombination (bufUniFactors, F, MODl, degs, 7056 eval, 1, bufUniFactors.length()/2 6958 7057 ) 6959 7058 ); … … 6966 7065 delete [] bounds; 6967 7066 return Union (result, henselLiftAndLatticeRecombi (F, bufUniFactors, alpha, 6968 degs,symmetric, eval uation7067 degs,symmetric, eval 6969 7068 ) 6970 7069 ); … … 7182 7281 7183 7282 int oldL; 7283 TIMING_START (fac_fq_till_reduced); 7184 7284 if (success) 7185 7285 { … … 7198 7298 ); 7199 7299 } 7300 TIMING_END_AND_PRINT (fac_fq_till_reduced, 7301 "time to compute a reduced lattice: "); 7200 7302 7201 7303 bufUniFactors.removeFirst(); … … 7636 7738 } 7637 7739 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 7638 7757 bool fail= false; 7639 7758 CanonicalForm Aeval, evaluation, bufAeval, bufEvaluation, buf, tmp; … … 7656 7775 int subCheck2= substituteCheck (A, y); 7657 7776 bool symmetric= false; 7777 7778 TIMING_START (fac_fq_uni_total); 7658 7779 for (int i= 0; i < factorNums; i++) 7659 7780 { … … 7702 7823 swap, swap2, N); 7703 7824 normalize (factors); 7825 delete [] bounds; 7826 delete [] bounds2; 7704 7827 return factors; 7705 7828 } … … 7744 7867 if (!extension) 7745 7868 normalize (factors); 7869 delete [] bounds; 7870 delete [] bounds2; 7746 7871 return factors; 7747 7872 } … … 7763 7888 if (!extension) 7764 7889 normalize (factors); 7890 delete [] bounds; 7891 delete [] bounds2; 7765 7892 return factors; 7766 7893 } … … 7781 7908 if (!extension) 7782 7909 normalize (factors); 7910 delete [] bounds; 7911 delete [] bounds2; 7783 7912 return factors; 7784 7913 } … … 7829 7958 list2.append (bufEvaluation2); 7830 7959 } 7960 TIMING_END_AND_PRINT (fac_fq_uni_total, 7961 "total time for univariate factorizations: "); 7831 7962 7832 7963 if (!derivXZero && !fail2 && !symmetric) 7833 7964 { 7834 if ( uniFactors.length() > uniFactors2.length()||7965 if ((uniFactors.length() > uniFactors2.length() && minBound2 <= minBound)|| 7835 7966 (uniFactors.length() == uniFactors2.length() 7836 && degs.getLength() > degs2.getLength() ))7967 && degs.getLength() > degs2.getLength() && minBound2 <= minBound)) 7837 7968 { 7838 7969 degs= degs2; … … 7858 7989 if (!extension) 7859 7990 normalize (factors); 7991 delete [] bounds; 7992 delete [] bounds2; 7860 7993 return factors; 7861 7994 } … … 7864 7997 7865 7998 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; 7873 8003 } 7874 8004 … … 7903 8033 evaluation, 1, uniFactors.length()/2); 7904 8034 else 7905 factors= factorRecombination (uniFactors, A, MODl, degs, 1,8035 factors= factorRecombination (uniFactors, A, MODl, degs, evaluation, 1, 7906 8036 uniFactors.length()/2); 7907 8037 TIMING_END_AND_PRINT (fac_fq_bi_factor_recombination, … … 7955 8085 { 7956 8086 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); 7958 8088 TIMING_END_AND_PRINT (fac_fq_bi_factor_recombination, 7959 8089 "time for small subset naive recombi over Fq: "); … … 7966 8096 if (alpha.level() == 1) 7967 8097 tmp= increasePrecision (A, uniFactors, 0, uniFactors.length(), 1, 7968 liftBound 8098 liftBound, evaluation 7969 8099 ); 7970 8100 else … … 7972 8102 if (degree (A) > getCharacteristic()) 7973 8103 tmp= increasePrecisionFq2Fp (A, uniFactors, 0, uniFactors.length(), 7974 1, alpha, liftBound 8104 1, alpha, liftBound, evaluation 7975 8105 ); 7976 8106 else 7977 8107 tmp= increasePrecision (A, uniFactors, 0, uniFactors.length(), 1, 7978 alpha, liftBound 8108 alpha, liftBound, evaluation 7979 8109 ); 7980 8110 } … … 7990 8120 degs.refine (); 7991 8121 factors= Union (factors, factorRecombination (uniFactors, A, MODl, 7992 degs, 4,8122 degs, evaluation, 4, 7993 8123 uniFactors.length()/2 7994 8124 ) … … 8065 8195 factors= earlyFactors; 8066 8196 } 8197 8198 if (!swap2) 8199 delete [] bounds2; 8067 8200 delete [] bounds; 8068 if (!extension)8069 {8070 for (CFListIterator i= factors; i.hasItem(); i++)8071 i.getItem()= i.getItem() (y - evaluation, y);8072 }8073 8201 8074 8202 appendSwapDecompress (factors, contentAxFactors, contentAyFactors, -
factory/facFqBivar.h
ra601d5 rd4b25e 545 545 const CanonicalForm& M, ///< [in] Variable (2)^liftBound 546 546 DegreePattern& degs, ///< [in] degree pattern 547 const CanonicalForm& eval, ///< [in] evaluation point 547 548 int s, ///< [in] algorithm starts checking 548 549 ///< subsets of size s … … 598 599 bool& success, ///< [in,out] indicating success 599 600 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 601 603 ); 602 604 -
factory/facFqBivarUtil.cc
ra601d5 rd4b25e 12 12 13 13 #include "config.h" 14 15 #include "timing.h" 14 16 15 17 #include "cf_map.h" … … 28 30 #include "facMul.h" 29 31 32 TIMING_DEFINE_PRINT(fac_log_deriv_div) 33 TIMING_DEFINE_PRINT(fac_log_deriv_mul) 34 TIMING_DEFINE_PRINT(fac_log_deriv_pre) 30 35 31 36 void append (CFList& factors1, const CFList& factors2) … … 450 455 CanonicalForm logDeriv; 451 456 457 TIMING_START (fac_log_deriv_div); 452 458 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); 454 462 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; 458 466 CFArray result= CFArray (j); 467 CFIterator ii; 459 468 for (CFIterator i= logDeriv; i.hasTerms() && !logDeriv.isZero(); i++) 460 469 { 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 } 476 473 Q= q; 477 474 return result; … … 492 489 493 490 CanonicalForm bufF; 491 TIMING_START (fac_log_deriv_pre); 494 492 if ((oldL > 100 && l - oldL < 50) || (oldL < 100 && l - oldL < 30)) 495 493 { … … 523 521 bufF -= Up; 524 522 } 525 523 TIMING_END_AND_PRINT (fac_log_deriv_pre, "time to preprocess: "); 524 525 TIMING_START (fac_log_deriv_div); 526 526 if (l-oldL > 0) 527 527 q= newtonDiv (bufF, G, xToLOldL); … … 530 530 q *= xToOldL; 531 531 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); 533 535 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; 537 539 CFArray result= CFArray (j); 540 CFIterator ii; 538 541 for (CFIterator i= logDeriv; i.hasTerms() && !logDeriv.isZero(); i++) 539 542 { 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 } 555 546 Q= q; 556 547 return result; … … 759 750 } 760 751 752 int * 753 computeBoundsWrtDiffMainvar (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 761 837 int 762 838 substituteCheck (const CanonicalForm& F, const Variable& x) -
factory/facFqBivarUtil.h
ra601d5 rd4b25e 210 210 ); 211 211 212 /// as above just wrt to the other variable 213 /// 214 /// @return @a computeBounds returns bounds as described above 215 int * 216 computeBoundsWrtDiffMainvar 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 212 222 /// extract coefficients of \f$ x^i \f$ for \f$i\geq k\f$ where \f$ x \f$ is 213 223 /// a variable of level 1 -
factory/facHensel.cc
ra601d5 rd4b25e 7 7 * 8 8 * 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. 13 10 * 14 11 * @author Martin Lee … … 892 889 { 893 890 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] 895 892 else 896 893 remainder= E; … … 1758 1755 M (j + 2, 1)= mulNTL (bufFactors[0] [j + 1], bufFactors[1] [j + 1]); 1759 1756 } 1757 else 1758 M (j + 1, 1)= 0; 1759 1760 1760 CanonicalForm uIZeroJ; 1761 1761 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]); 1763 1764 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]); 1765 1767 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]); 1767 1770 else 1768 uIZeroJ= 0; 1771 uIZeroJ= mulNTL (bufFactors[0], buf[1]) + 1772 mulNTL (buf[0], bufFactors[1]); 1773 1769 1774 Pi [0] += xToJ*uIZeroJ; 1770 1775 … … 1781 1786 for (k= 1; k <= (int) ceil (j/2.0); k++) 1782 1787 { 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)) 1789 1792 { 1790 1793 tmp[0] += mulNTL ((bufFactors[0][k]+one.coeff()),(bufFactors[1][k] + 1791 1794 two.coeff())) - M (k + 1, 1) - M (j - k + 2, 1); 1792 1795 one++; 1793 1796 two++; … … 1796 1799 { 1797 1800 tmp[0] += mulNTL ((bufFactors[0][k]+one.coeff()), bufFactors[1] [k]) - 1798 1801 M (k + 1, 1); 1799 1802 one++; 1800 1803 } … … 1808 1811 else 1809 1812 tmp[0] += M (k + 1, 1); 1810 }1811 1813 } 1812 1814 } … … 1847 1849 M (j + 2, l + 1)= mulNTL (Pi [l - 1][j + 1], bufFactors[l + 1] [j + 1]); 1848 1850 } 1851 else 1852 M (j + 1, l + 1)= 0; 1849 1853 1850 1854 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]) + 1852 1856 mulNTL (uIZeroJ, bufFactors[l+1] [0]); 1853 1857 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]); 1855 1860 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]); 1859 1866 1860 1867 Pi [l] += xToJ*uIZeroJ; … … 2138 2145 M (j + 2, 1)= mulMod (bufFactors[0] [j + 1], bufFactors[1] [j + 1], MOD); 2139 2146 } 2147 else 2148 M (j + 1, 1)= 0; 2149 2140 2150 CanonicalForm uIZeroJ; 2141 2142 2151 if (degBuf0 > 0 && degBuf1 > 0) 2143 2152 uIZeroJ= mulMod (bufFactors[0] [0], buf[1], MOD) + 2144 2153 mulMod (bufFactors[1] [0], buf[0], MOD); 2145 2154 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); 2147 2157 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); 2149 2160 else 2150 uIZeroJ= 0; 2161 uIZeroJ= mulMod (bufFactors[0], buf[1], MOD) + 2162 mulMod (buf[0], bufFactors[1], MOD); 2151 2163 Pi [0] += xToJ*uIZeroJ; 2152 2164 … … 2230 2242 MOD); 2231 2243 } 2244 else 2245 M (j + 1, l + 1)= 0; 2232 2246 2233 2247 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); 2236 2250 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); 2238 2253 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); 2242 2259 2243 2260 Pi [l] += xToJ*uIZeroJ; -
factory/facMul.cc
ra601d5 rd4b25e 2151 2151 int fallBackToNaive= 50; 2152 2152 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 } 2154 2159 2155 2160 #ifdef HAVE_FLINT
Note: See TracChangeset
for help on using the changeset viewer.