Changeset 001cc15 in git


Ignore:
Timestamp:
Sep 6, 2012, 7:11:17 PM (10 years ago)
Author:
Oleksandr Motsak <malex984@…>
Branches:
(u'jengelh-datetime', 'ceac47cbc86fe4a15902392bdbb9bd2ae0ea02c6')(u'spielwiese', 'ad2543eab51733612ba7d118afc77edca719600e')
Children:
0b27942997f2964b33d7b6fb15f97e372d54fc5f
Parents:
24a77fb14c59fc78cc67eb5f6934a45d8862d99e107aac1a78fd9b689a33a864d23b7cfb1caa5bdf
Message:
Merge pull request #179 from mmklee/factory_fix_sw

Factory fix sw
Files:
30 edited

Legend:

Unmodified
Added
Removed
  • Tst/Long/gcdp_l.res.gz.uu

    r24a77fb r001cc15  
    11begin 644 gcdp_l.res.gz
    2 M'XL("%F94TX``V=C9'!?;"YR97,`[%M=;QU'<GWWKQ@("RQUKR[=7?TM0P(V
    3 M,;`PD`0!O,E#'K0>BY1,@"(%DK9G$^2_YYRJGIZA)>\NLFL$=NP'<V9N?];'
    4 M.575K2__\/D7_S)-DW\Y??KI])LO+IY/;U]?O/_C]?G#_</D18*?Q+EV\O[D
    5 M9/+NN9?G(O\Q?3/?W%S>3[_YY,L^@IQ/XSF<8[3Q%OFV'_8T7=_>O)T>+N\?
    6 M[J<WMW?\;7H]7[_^]GI^N+J]N9_>W5Y,[\_'".G1>%G'^]WU]?3MS=5W\]W5
    7 M_'`YW=S>G![NKKZ[FJ^GRV5^]_X:JWM]^^YR>G-W^XXS_!L:_^OYF\ME#%1T
    8 M()M??_W=]?MO9C;9IJZ/IF[:XP_?7*YS3%<WDR[A:\[WU?S;9]-7K_F_2_SO
    9 M_/P<VUJ7\-6W-P]7#]>7%W*6/WW_J7_ZVW58[W18#'7_</'/WUX_8"F_?WUQ
    10 M?G4SUN']?AU>;!VWT^>WS\?'1U+W)O7;Z9V.UZ7T@:"_OWKX9GH_WV&5#Y=W
    11 M]Z/W(XG[O.G60VC_],4_3$^@R//KJZ^??#9^J2\G?/SCU<W5P]G3SS[AW^GE
    12 MRU7Q-Y??G]\_S`^C>>O-W][<WEV>/?G'?_]R^N+S:7K^O['")Y@/N]W&>S[]
    13 M3>.MBQ3W<NQ<'JE`3`6GZ<VW-Z]5ED-7\D@1$C?AR2.QBAGR_14,Z>K-GZ#Q
    14 MLZ<8\/W=U<V#:FJ&?BYAYOB+/;V;KZ_^\_*"OVQ3E4<#PEC?W]V^W@\YG4WO
    15 M;Z__-+UY9G_?3D]'<UCS?ZTO`38X69.+%YCBC#W0>*@W"!M<;.^1[^M,9]/%
    16 ML\GOFV-S_SU>RB;&\,BC0NMBQ*;?3G?^18!>PK/EV<7F_M'M>T2_R3-B33L;
    17 MFIY\.,IG3Z8/;>,CS<:0X>6?_3EN.XG0ILEV^SF_[&+>/NWV'K'W-R^\RX?E
    18 ME0^G5`,?Y(0OCD_^6%W2']W1Y\:G=@I2\+<>O217\52.50H_Y6/*KN$AG;S4
    19 MPJ=X],''B*=PDJ0/LJT$'O?VA<=_',;'4XHNVDJ:CLR5A/[HC\%7?7*G6K5'
    20 M.WH7`Z>I)Q^K][H8GU+@XO,IUL9/Z9B#B"TF56FZ&!]RS8]6DW:NE:#3O1O0
    21 M]*"UQ0N&:"TM6`X?ZH+5X$%D:?P0Z@*YI)+=4O`]1UDR?Z]^2?P>9,$B8ET@
    22 MC;C(WW_`=?VRVTN@CB&@[%6[Y0BX27S*)VDJT72,$+WJX%C$FPZ.*;9H2@A>
    23 MY0=PBD6<F4,-SJDY9,A45=!,4T77%U0#J3I1>Z@Y1-5`J4T5`-4EM2PYYA:@
    24 MIJ.'T85-&Y&V`4/TF8.*.^9<=#GMB)GUJ=*XUDVU&)MNZMA<*[JK$\35=Y6<
    25 M[2F&OB6?1'*WJZ(&3<%'EY-NJI7DS:Y2::)VE6U6;,HE-?*C1+/Q$SW!;!S+
    26 M$5TOGP*>3E6JVW:5=GK)'[<QZ-4Y[Y:(12P<,4M:(*4D>8'9BI._JLTZR\[;
    27 MDWI[J)X;$CGEJA(53U<V;W`4KDH4,D@J>HH9_ZF(RG0L2:+)&1^#F0]6$8,)
    28 MVE<5%T3M)=9DPDZYF?E44?E"U+!U;RX<BE-1'R4K/I13:"&KI.&N):FH@2<&
    29 M)Z&IU6#/H,NFDL[9XQ/,U?E-T`8M4*?NU9VBH9`GQ5;O;%]5@FT+]EG,)2##
    30 MF&Q3(>O"N*F85.78577-V:9J*!V8?)24NE>47-2`@%M!#"9]5B>`7SBS*D4F
    31 M,R'X13%DBJZN)F0P+,=4Z5G'6M/85]Z!5/X1D/K[&E#>04D.?[,!_4SL)^]H
    32 M-8-6?Y&VE'=[+#^TI9_"E.INPJ:L5&+DQD,^EJ*\$Q*WJX`<J"W=>`A'T+4^
    33 M,39Q*O/@CYA">R,X";7H1FD0(;&[5(A5OT%:*@^!S:5<U$ZQZB#*"@+\3JH=
    34 M`3^X6,RVO;3BNW%7%2PTWY(QD`^=6>H1K-H9R(OJ!K3JG4@G5@SMU"X0W8A+
    35 MA\ZLR<(;DEXQ&H(>>W33:K/HID2-IDAS0<.60H/3'_.I9&^A5DUJ[5"[%'48
    36 MN`Y:96,AP<_0.V*O-A1?=B!2/(T[>>,O4IGDH"(_>0OF(/)<=+C@$3!H3`")
    37 M%V=$AWC0J>8@;R\Y=X%+$-]%#A6+B3QD'1L2!^=FDWBV6$$@"]&@4R@*TXS#
    38 M?&45.99HK`^:#AKAP==R":W+'#IN7>;B.YH$DPB)WW1(YL=`G?EA-19)P-DL
    39 MN&QXD.YK+E9V`?-7W2`BBZ2Z3O0K72'DY:JZ;CCE#B<^JF<>0XV;KY4=BI;P
    40 M45^#5"("B@4R@5V[16TP"S[X4X;=+L+(,)6RJ#0@UL60M2)Z1/S3LBPJA^@6
    41 M"L''UA:87<D-/P0LWC/<#"TCV.1((6FPV:)?&@7M$6J&BEB4ZH-U(=+$:UT2
    42 M+%<\XTP8!#P\Y!`6=1`IRPG>YG_>BU_5LH/\DBQFQOJH\)@![YZ6%*'[*`H#
    43 M,>*CL4HXE6X/:L7V"/-R5:T\PHYC5/AJR$6JHA>]Q?P+R-'LUWR4HM,$`D=5
    44 M9`C,6J)]A;<4S;0(@V@J!H-@2@WH@X,OYA4&G2A`T"WQG_H3V+<JH`JB6`D&
    45 MA/359&Z),-D<#\YOZ13<,F=='!09C*^@RN(4&\F``-&.A)!I,BB$5Z3NE_S:
    46 M61Y\5WLX#M?0_DCT,+OY972*&'#+:'`,_>+)<L[HUIPS*'^7D[AB3IEU4=2+
    47 M03OAW*!;=V'T5PH'@%#*#@9W_%>*<KQI.QV1FGA5\8D9IJJ8BE6!1TW9="9_
    48 M:L9`T0%@%-,#Z3IIL!,JL4\#ED"KC,F4C/59-`2N@T<D`]Z:E%&(N\$K4:B2
    49 M?3,E`Q-U(=!Q\HK!0%YQ*GLA0Q3-;`"]47Q'7CA>[,#;@E$=72YUY(4[IA5Y
    50 MHZ9,PF3(6;[%;613\C%'953HN-3<XSALP=+#K`L64W%(AJV<R!D*PVBC17>"
    51 M),V;CI$9UJYC+D@S26RB><OFQ7+50H5YC>7PY-4&$GQ-'R(U'@Q[6S6"9S"$
    52 ML="_;+%<V84=I7T4>Z%H26&)M$>'OQIEQ+1`PP*<@`-C<KS#?X%0/B[0+9+Q
    53 ML,!YH6T`"\/9$O-"SPT8`FZ+7<L"?8)<$1AA\\`L>&MLU2T@T!#\`AU&0"$4
    54 M6&,&6,),$,C410B%!2MBG`)<+0M51_2#WIA"*\!"P($`"[#$(A%Z^Q1*(L(F
    55 M%XH!;,":/"LT50$62$%\+1(BX159<,4'M3F$<$38@ND)L8ZU!I9]1(L1L+6E
    56 MTJ_QMU`(6HE`L$J(;7"2A;[B\&O@J,4IR-::ER,HVO\JXI]>Q-W$ZRZZJYX\
    57 M)J+18Z(`DS))`L19O21!+>:]R6HR&N`()&M%#C]1+^J-B2J*!I&-&94QHH*/
    58 MHF5A/<:"T<P060$ZIDD+6<[P%/F7-SP%$W<X37U0EL"B+A5X2J`R0)V8]FC!
    59 MCZ0)%15CS:`1/\T"E&NL"3UYS3X!J*T9?X;I%)O2"`S$NZ;[`J#FJN0-0(VV
    60 M/UA*RZ6G#N`U0]DR@6%T=EJ,6-6(D"J2#%);M/2`,*2)JAE.L^QA@D'8H+HG
    61 M#2EI/L6`DA6F:,E"@=!=+\SY'!0>TZ25RIY!Y)QZ;:Y:P,X,0KRF+,P@L@H/
    62 M%M4#!H@.>&S9,:BH67HL26,$%LJ*98[8K&D0X9&Q##;0=`:9D*,IIN92MV)I
    63 MW<6S-9`[I5H-&&&")::.@5A1RVJG8NEZ`K1'2U<+TD4K%N>)FVC=+(.J$F9)
    64 MJW)FER'H%A/M/6DTDK3DH)6$Y";ZGNMFF2R/4K-,2KZT2]!P,[MLI9I9TGZT
    65 M99R()SHLT`E1J[(+2X26E<,N2X_IW*E::HH=I69QW'044Q`#.40N>37*NAIE
    66 MS=%(?N5A!'(]IPPR87?)+-+[IJ1(DXR^<WRQ.`?XU6-#1''`-<MG3U91AXM5
    67 MRY2)8:GG_-B+LQA/`!]KI::%U@LUC!F4MMN$&+WT4@V"4M\9/GJMZ<`<$3:Z
    68 M0\^ML!NSQGY:`/]"2*N&)R>DF6K!7HO35BI&D*1"H7(L<:-[V9$!K#%KSIAA
    69 M9SJ;)E?9"#[[;,6:$*VZ=`I"42)N;UNIN.X"]YH^GEO17&#11/`"+%^T=E/P
    70 M@0B>'-,*AF@^*((38WUB>*5)"(F*$,Z8IE:MV2/,]L3PUEQ2"/<LP@/"JW.L
    71 MV$,BA2`.8%X0B`$*@>$!T2(Q/`32$\LFF1`.I'#+J<!%?CX+7<6]"Z'KHZ._
    72 M6A^=H\F+,SN\FI_:^=7T[NJ&!U,OYE=(!QB\SJ_"<7[%DDA%=#P?_3AOJVT_
    73 M<G/;>5OS'SUO^V"V'S]S^Z#I&%I>_L4FX>5?L8VM^<Y.VX='=>W#H[JV*]XW
    74 M$^B;J[O[AV?3/2\2W+Z9'KZYG.[\N&`P&K<A(RCO_TG1%IS[<MNU_"*+MHAN
    75 M=GN,?ZYH>]"*[&$MR1YZ3?;PP\+M7VJW3I9V$^=?B[?_1\5;3+G30_VU>/O3
    76 M%V\1"F\BY]6H'R_>'M8"Z&%40`]K"?0P:J"'400]C"KH82V#'M8ZZ&$40@]K
    77 M)?302Z&'7@L]C&+H8:V&'GHY]-#KH8>U('KH%=%#+XD>>DWTT(NBA[4J>OA!
    78 M3?>7M*=5B3NBZ%?7;FZ_?[;=T[NZ^>[V^CNR/PEVOGY[^?7=?/5ZW*P;G?5`
    79 M]"SRJ!_$;ZX0G`#.$`/8JX0,=YG["WBF-P/\C4Z$*0>^[)T\2W?6Q3-G3QW+
    80 M,-0VD4.H3@CM??C*"NIL+]EN\&C%HO'SJ]!=T2&`ZYV8AP;PU;P"HZ2>GF*F
    81 MLL[$I,`W_-([X55<<=9+\:V,[\S9>R_>,XG<N?7":R%2S_92>_[+F@%3\MXI
    82 ML\(=US[YR$*>=0')1"L0$Y58T.Y=$H3JMCX`*L\[2[.]M'YA!:U2Y>=7'5VD
    83 M\)I([\1R94*P,=M+*YH8LQ6L:\P$(D/@,G84CH*<NL^$ES080LJ8"&0:5V/`
    84 M"QN)]:!EE-X&T<50D6<*1D%9'[RF`*^:^PLRL=X,&-?&VIS6=MS:2R.ZW#<$
    85 MTP"CE_X8!.JR7@WHJ"^B+Z"X8MMI&I?E_A5A0>]060I.O8->O^D6!\=,BL%H
    86 M47+HS0OOXJS&5K0D9$M""NN-9<F\"`IZA[S&T*(OOL`DM0,#SZ8G!7E<Z0..
    87 M[-Q8#^G/Q)/MAE=)8!%Z>)5'1.*&7V4K8(OFJJ5L?J6%R,VO@&0EK7Z%4*]T
    88 MQQ+$D7ES+`2&>?,K,K&LC@4>;RL1MN(VOX(`'_F5KQTJ^%M)G3,Q&./4S:\"
    89 MJP.;7]6A:;QX+SU_%W"NWQSK4:^];/G2FL4\&5RKK<+J2Z6VS;5@1RVLKB6]
    90 M1*3?7=JY5FS-[URK\?A@7MTN6`TK(@A)<7,M'PASP[5JZ9K2;#98-0Q.YNHF
    91 M";I3DK1Y%TBANLV[JEUBQ/=2!M;2<7+(:>=?@,J\^A?HI=]\3+6TO7?%&#?O
    92 MJJ[FX5RPV1[]`WE\'<XE(+HPO`L;E-6[D+98$RW9K;X%G_-M.)<PIS#?`OFY
    93 MW@3"W+P+=N'"YEZ."+2ZET4TA2(:_D[DE##<"XA8PW`O*QGNW2OOW.NC]T/.
    94 MD'(5F8%X)<]RDNCS3/_/3TGOQS,P5ZQS.*4PBQ9T9^)^>*J<?\8CS%!F1I&2
    95 M9N8&B,OF8W*M/M5HX`RHB.XP(%=T`"EMUK)48P./"7PM'$'/9#F$Q%+G$[03
    96 MV<*A!=.JF=5WI+`<A%6TF4>SGDT:6@`/,UJTV"H;0$MA9OTSL$$]GI62=`Z@
    97 M@K,Y,J9HNLJ";43P'/M7AY\1M6:9H3%Q^#E_HG(0+B`BI&'WC!0(_4-N70Y:
    98 M*>``31<08.(S$VDG70P(@EKC"L!L'BVBPTPP:HE=#*R58M&!YD1%%)<AA19*
    99 M6J4`N_0<`3&P<),1KH(AJG0AG!+8E:MTI5+6R-BXAN3%9`!#25QB:-PC_#%2
    100 MB$E,!-"^>2F[1B2#L[VI!%8+JCMKTLL_9\%ACYL?(@=P8>=Q>8T6D*^T[(9;
    101 M)>.+[E72?%DY*Z3N5D#9$2``25NN8?@5<KJ5LYB:61FB%N>'6R&#D>%5A15?
    102 M<RJ,VGQW+P:5JU.E.(B7+SV@RMQ!*"N1U14@$Z_.KJ"/:+CQI'VV9R2PH7]M
    103 M<>T`T/1YT$3DR7XQM\4OP3*PN+GM[I\(>/&=%3?)(O+4O'W$IW0%-^)3OO56
    104 M;D5G8;(^X@3R9>$UZHU']71%],)#6[%&(\\A%WU+'3.5.\,X$Y$X:(#AJ1N0
    105 MIE=]&5#VGUK1>H/7PZ>-!J`]^.X^.ETYJI+TZEK8;KF,B?1,<=@>5%N1D@\.
    106 M#6$M"PB/YG8<BBQC\#5K_,[7P:&YUX-X660+`#7?V8>GK8S@-!4[#F<(6X=!
    107 M\;IR'FMC94ACHOYBQ0$RJ0]N+`T0[$=@1LK$POS&G^87^IUW/09_`CU'R`A+
    108 MR+RUL=*GSW;4S[/`-IB0$:C;HGJ]E=]6\LR2>D5,$,7O8E.@\XC#Z-H-<+SZ
    109 M-B\/U)4^0UU71U/8LZ>+70CMV+*=;AU[SF1>7N%)&WE&'I'TR!2@MK)G7H4,
    110 M+P]U"TT1%&_4Z5+_EP221@#%&"GE==^,IOJV:11VZ+.C3I&=#W[TNM<9B0!@
    111 MOB$X>($HRJ\=M8EZ)%>OQ*)(!^(`?G7,]K1T@C9B>K8@LLT&:AVU@6ID!>`9
    112 M?B:2S>SD.VR?%+>)7NP,W)IY=4;9.W-XA(*D7\+5W.^BS(91:)%T`7!/98T`
    113 M3A1#)M*ODE_\1+?&$6#`_#G;`LEW?8LL"#K7:;'O"V"ER[:?;"<KP_%,H@R*
    114 MH\'95EJM><]OD@:[<2L%JM,PI6@@$>#M\PD!I]A&(,!*!HY9HPAD"8@S2M8]
    115 MK%K<Y1JBM\/.,NN;9AT!$6%UJ__A+3DQ>PH:%(KOC["SU6*%A-7B:E)\+=5W
    116 M6%4@#.MWGK3W3K!S5T9R4O5`NZ,J4J^:>B/H;GB2`,;TSEKO5(Y:$IGM6=W`
    117 MONJQ8N]#/&MAY$Z\?\-BS6PO")%R_]YX--H[,<EF4M4[,7W(Z^J`=M+Z=:3H
    118 MVY@H$F,'H?-UE4'D"5@_8P\6HUL7ZKF.69@40-76A\%B7NO!$D800)Y#=+TO
    119 MRX@F>?TE]'^V@70]^-7GE=S<2)J83S;^(Y!.?,&.#/A9W+8ZI]''RA*B`-?<
    120 MR!]3,WD[GN?Z@?G0<JME!3![;6E0'SQJ_<<ONTX,;;:LA!07_%:7`7RF]3'[
    121 M7?[H@9\#]K4`DV5P7XM:FM9F(8^LB5<39<N:-&&H(W\$W_7K?H*9QE2,8W(<
    122 MA*EA38N#_>Q(BNS'H\5=_ABV346KZ0[V*W8Z%<D[6_8=UI+4J,SX7$=EIK7U
    123 MVD22$8:1XFI(N^Q1F*ZL],=3A4Y_R#FW"(7*KG7,1)/P81`@KWVL#"B\Z[%%
    124 MLW64%/3&3QS9H[/C+BW-Y+0NCVB0!T%IHKBR7Q/?&Z3!Y?7X/^U]RXXMN;'=
    125 MO+]"`P]:5;UQ,_DFC*MO\,#C!@K;=72,PK4,289_W[%6/!AU)#5DPS`,NQHX
    126 MC<KD3I))!H,K(E8PVT$F7/[;06Y9]++B;F\!9@!YZO!AGF!Y5ML`=V&$;Z;M
    127 M+%F"A4Q)6'[AM0,%=8AQXNKOIJVKP*C""5.5S\B?!:H$/^NNQ8$.M&-?-M6\
    128 MJ-7NCR/RT(;RWK$D<8F8ARM-,?*FW8>G^FA-N=RA9&A<&SZ"LMS[GO8G_<VA
    129 M-T7_'-7$,*BK36E5-0;\+-?1,P/N@'ADO`ITFJXU9>EJ9$=NU]#H@/WCJ'0L
    130 MDGZ4YMK.X1QWV$`%JR*\N.2MM=%<:W8-:N'V5<.U!M4X=@PW+J\]IZM-L-=,
    131 M:X[:8[A%^F5P8H]":'"VT)K3?&'R9^O)6C"/69@+[6['7-@:D(%1<58PU&%/
    132 M#UV(VU17FG/J/L`?Q<A12;:CR00/(JKJ/K=M[C/X,L<Q+,$##$F`SERE[]"9
    133 M6Z/0O-\/ZI5%<=_AG:)<U*0QES-F%C@OQY6]POD)S;ANUWV`C\:5AE2TG3QN
    134 MY:ZQ"R`">;<5#C?X2^S/KC:J!^`%X6:/VP@3"+)QJ8(!-6ADDP&A_.1R*ZOY
    135 M4Q6;TS"?VVR!<Z@-RR>;H8+]9DJSWO8C^$B2PTUD:&6']AJ^X<A%4WXYM.<]
    136 M([P!=0B+\>A,66;S^-SFM:9KUK&/SZW>/0"(7#73:E";I#ULQ`%]N#6!-/FS
    137 M[_MRJZ%WO3<.OL%2+^'9E*NQQW+?0+M(D0",VA$Z&7#"7BX$L"%:F`WU4N25
    138 MS8;D(RE_EZE,P-S@CI)U0*O@&H*M7[$W"UPM`+-BGA$^@QKZAA6[X4^2:>,O
    139 M&G&[*%K!NU-PX1MSK`4O(]6U\R?TS:VF@%J4T1M((X*,'["+\8/R^G-MP.@(
    140 MOL-?]!!@+9!9M!`K$-0O`U_I%"K5FA#C!3Z``E@M*_GG3=L!3INFSCWIRV,W
    141 M6D2P;F1TQ?J!HVS0^A!H\\;P(_V'"][%ZX+U,6_Z%U=;%T#]HO=1;`(P,/`.
    142 M8@YM*8='!:]`XTC6G72@8A`$6&*8^J)33420/9"!+.UJ]"U*DV^D`]8+#LSE
    143 M[LV]8)&40?-H](+^B_9WMU[3%YAXC''(#=>DF*#AUA,#_N(@WC<]CTV&0#JR
    144 MK[`*1457M6L:&ME]TX23+<(-*-&(M-'P"D->2"RCJX6!N!=*0>1#N?PG-M-U
    145 MFWGX:+*T,<0WIT!F#%91:7>8AV7Q!??F"\`ZH@>YJFNST`:$)F*K.\3KHK=0
    146 M,,O&U#4!DA!`V;9#ND03P:,IJ_56NY&3*_#5Q.LA<E+H\BPWVD;,F&VW;0(F
    147 MTGK1.0PV!^J`M(.RXO(%XO6@<2K#`/F0P7PCY66;B(%HI)Y92@`E31I6[S+&
    148 M1T!1H_MZPC$[91MYDXV`KT\!ZW>AS7[U0:M3*H1]6VYUO,+R%"6&3@C.015K
    149 M3+QG;^KBUO$3XYDK11;/&S95]&*5L4S*9#N&"-`+32<Y%Y)(W7(_^NCN@-TT
    150 M;\7<D!E9H[@#6;0EG;NB&CE4730/W;?U>)!OE,&^%MR*=IKH2>GJ:,,D370V
    151 M*A%9PKO"3?'8-Z7=?!%=)772"RSFO#2Q+JY6+M:J6JE.=;-?`N#AK)!E:>+6
    152 M1^-HKH4.C$N$!^BX9"]R3<[->JL7&<E3@7$*L@L2QA']>SO&@3O;B"M2[S%!
    153 M80FL8Q\7.LS"-A2-,,PVE.8/IH23:R2GJ(BP[6IRT::28(!^VT@^4<#]Y!0M
    154 MW!WL[ZW)/G2*]O!LP?P;!R=K$-%=X\0\=ELT=4`C'AH1_C`-+1ZGZ-)<I5MY
    155 M,LDI*EW(D<6)'+%PBA;%4V13MQ2QA]F2<`[F[\3L+\\#DXTB>@>?:/B3@69D
    156 M,RF.<D;=?EOP:>"!ACC=2G:A2&J+B/W8-2+V+6.<<MT'1%3J]QY^T5Z+&89P
    157 M#D13A1D-T3^(QS2/NU)J]4@4K-594MR^BJ))GE%!+U<8AB*6EMV&L&QT$!)0
    158 M1@K;BQW;PC4J<]@<Y8@()-NPKGELPX%3*Q3EP#-O%$NQ^1/.6;,E\U"VHN,=
    159 MK98A4*Z=K,/2P]JG*V"Z>5B,L8V[5S_^4=G$?,@$W'1#1L"WFCH)80BQ0:;8
    160 M<"3582*VRX(@4RV>?F!13=[4RF2#GP5N."JKRH0(YYO,`XXU<>.S*/L4OYH]
    161 MK"&ZY4I)'CO9BL9PXW/?X<<+81*;LA[+7Z[ZLOFEZZYI;B0&?@7V+1C?.\QL
    162 M&)[;P^YR,2U#\_5$@6%/WKTFHU,$VES9<M$U!`+3=*D[RZW.`OP99J=L'_=Q
    163 MUEEVWX"#:&?#LQT#`,Z[VLQJA[FI)/S"8V9VM-1>F5<3EB<\?-TM3S&^U2B&
    164 M4V_=62V/<L53B/C>X;";.D%0UK/TSSRJ$6XTQ/JW!YWHS-ONUROKO)/F'7SR
    165 MV"T+[N/B,BOW9D9(&/IPR*QC&O/R*JZ7JV4!RY_Q"*S*/K-2EC<LP:02Q5"-
    166 M227V6[@\H'N/QPE1BGL=OH?EJ%`KKXC^D3BU6C8^>T2=<%'=7P>71#R%F.-N
    167 MH5B0C]5=L4`.-M,O-(95/RGF'5$.<CR<4P;-;/>6,J=,+8]R@F\(5@U;1M#%
    168 MLL+LOFP>/;GK!,Y?H<NQYSN?#*(RE]\6VR9I99&`&L[$DC9<9)9>W6]?]Z'8
    169 M8*);)E,QU\N4\K9T*S@L=)%&N"HF]D+.ZA5FIY&6J;=#`XD&+LLWF<WQN=SJ
    170 M5/H9N77%7X7NIYA1J.,Z(R0MBZW;W>"L8&[/ALG,G#9#'2\F`2,C=_5D>-X[
    171 MG-"XNKJ'I5MW1JS/(C5!<!8[R(CFW^@@?(T?U'$*A=1_D&\CL!26A>R`A.]=
    172 MC#/89L/Q/7`'303`?#$16H?E(PC6T+U83<3FHKF`6$5ZY/&+R!S8OH+$46',
    173 MP3)!+.Y-?JJD#T209"5)Y7LTFHX7"1E7-U@O:@3!'EDW)%/(LA6@:F;9I%E6
    174 M+K6:$#9#F@/`\F;4C)B^7IM1+ZQ+-"_UD!52#=.+<,-$?\ARA%TE:Z@#T3/:
    175 M1%J,J&KT;\R.[J\*P[!=:E=6&*:[T_`TPHFH.H'BG<81X+STZZ91T1&YD]<'
    176 M4A;3,`43V<$-,PQ@1E3!&[)OJT%Y$3^X$&8EUT.DCQ:%&C:;;!%">3BSU>20
    177 M`1RC&A=$YH9VX=VN63@YB.IM03@*Y&]6WHS44XO:93/"BO)V-'BJ0`^,KUA/
    178 M,`3&@D'3OX3G2WC^UX7'U5(*6-1I9*,=\+:3)!(DF+[H%M#=D1?3?B4;?X#H
    179 M3D__T9+D-R_=B#O.G[OLMI@8@3.1<]U6^&8[D=E23=P1'6"(CK?O"/+VSE,S
    180 M?'_LV(:[V8ERH=G(N-NOT.#M58SZ>*$&RJ/NC;TQ`M3M]G5X11W,@"!&:?JW
    181 MV7L=W.;*Y!;\.<F.T(=`'KL"G_9">\"P._9DS>7&GV,TW_&['H82K*<;#$@;
    182 M.@+SJLGF))?$.\$%?,8;MI'9L)UYC)I!11YN!-4;'/\G0-X8);/02".KN=O/
    183 MX$1S5-M`%.IA^>)R>"@>B<1;<]YPGQPF?0@<HI`AN6I.N6GD7Y(3@MSC>\0C
    184 MW'P=7K7!"*1.$S+F0;[3/WERASV#*/JN\48=!$D5H,;,;2)N_KGO&(:&I*$>
    185 M+0&*N46`<VN41-0`WZ_#,\.DGY@_4O1!Z-*'<'2B9LW`V5ACY!A(#VB/LU&,
    186 MFD9/%E/D>6!*L%:1Y:_."'WB%N5@SA;Y>ZE](W\Q%]X>(2`/JZ-=)UK9&"BR
    187 M(UC$BHQ(0-VO<P1:Q*$2LUOXI9*0K:EKB`N$E%;,^PZ2`,YO$5VI#?&B5;N/
    188 MQ-MX"B;:';1:7$X/6<N%9<;-U]4C8E.Q\L-:KI0#BP@C<_RZ+K\/WZ4_)(*P
    189 MJ@]"Q7$ZE_6-_#&2EBHY%R'8%8N_GC?"Y;3@HERLX2<,C1U+J#*+,X*Y9&:;
    190 M#ZV2>:&)Z_3M!Z2MV*EFD%EPN9>!6KE8FF56L6.Z"07C'+[N8[?+3F/BQD.-
    191 M9K?[/%H@['81MP#TO-P^#+#IVV54&S$C@M)9N/)GLMWOY1Q*1HTM_@MM<5P:
    192 MA<M]);)-GP:B&4$NW1+S9?2N'#3NAVX*@LT.ZWWU9><P[7&<@G"17+%%X-R>
    193 MX:%/1I-WY.+MD"!8ZR(<R7B_+8H)ULUEQSAU]B5<"\AR&349[W>L(Y8I\P/&
    194 M>UUG%&"MUQ0V%D7BL>;*D&1[L0AR6)]DC\8D%5W_QZ&Z+S];JO?3._C/]DZF
    195 M.[Q?MYONLS<[H:@PG_(X5$]6`ZDW=40.U%J:!$HN\8DLDEH1^PHI->4*J@W8
    196 M'7:_YZBQ*/00;R:X(6?-':HS3/?>3^`3@&$<>Q\,_=MHAG"N3G4C)IY%3?$_
    197 M'$3]QW_]><\P9CO]?N'&ZSB7R2*B^%L/TI*_UEEC"F9\\@A[?//`Q;ZV_RH8
    198 M%@`PH@0#L<#35(QZ"9C#/"*`GSHCKZ#3_[2B'3K]3,V@S*ALO#_"&P($4T(+
    199 M=F:7],M13N&:T#_G65^"84CP"J`CX,0D'Q=CTVM%I+."4R089M<2#RG+<CK2
    200 MN6\UZCO)8S4AG8+Q3DAG5%O+<K$UY[3#3W5H-0)AYHZ]0*Y:<4L:\8+='><8
    201 MV<MP#B0P(-6%?/?+@4[74Y45#(6^!8`!!?+@'!GP>@7.F5O/)1-IZ.%"`91I
    202 MASS?Z/RM@7*:GB(G?^X9$?^&#)(KA$XN1_<M7A3::G:7QZ8$RJ';(U`.7(0S
    203 M4$X;?J9>/Z_3:2/Y#,GEODJ`'$&2]*(`"LDZCG9$%%8D$`#,3`L(-$0']!`V
    204 M0)\6-*G&<&ZP,G"Y]QT0I]QZJ`_^7(<\V((";1A'YJ<[RIF:VPZ\,^ZP,`3`
    205 MU'5@*#Q,PYCLC<Y'/UE&<&>)=DAR:/%&I([6`#H%IJ/^64]*'B#,B$VJ\@0<
    206 M<Z[BXM+#W>7/E2`+V?`1%P&VF=5\:2BCG\TPSP'Q.-_F/GL.<4\WM2X7O=]V
    207 MG&$]Z!5(IP2;CTAG.3-6!*"2DZ$`*!SM.-_KSD`'SM[;D0[CZ/IGO7KXF`%M
    208 M2CT47.B"?@72P8*W^_*J,_`1G,XS/)&5"/@*L%/T(`:<8*!+P*`.#F(/:`GD
    209 M,XP454E]T7.K"C/X4I1B'[9A)0_*415(,+?]J!YO;.6^%7('3'.YL%8Z((?]
    210 M;,R@*B%*<3,Y+:#.W0R(R46S]`[YJX1/?XDQ?Z4811@RQ#9ZU"/_'(?DA6R8
    211 M%0%&8)MA=%7RB_44#/Q*C;9`.M?1/X`TU(+Z-RB;W6ZG4"8)<3-<S$:7NQWK
    212 MR/0-(\B5.U%W,>7M!#=P&L4(J#.N8C\"72@QY`KT\H$Z"(U=`75J7P9UI*<S
    213 M89U2SWY)6EPWVYL7>@Q:0?#_\.J8[11$+V*?YM$DLHXO0SO(.DLIWS(4,YJR
    214 MD^,B?MQO.[L1.'ADFEP_&3^,'YNX,N=;SRAE!&.=G`WL#>U0=^$*V?7$*J8=
    215 M#;,XS`GP@-1\`(\E'ME%*Y<==#;GB3I#*`Y(&GIVD0<J[JI"?B>65$L<@/8W
    216 M9Z`K2PJQ.3CQKE*8DG;?;XC)PXW4U0NW2!Y1-L-#3,/YAKP2>I'@A1,$S*2^
    217 M369-0S[<0W0D,Q_:Z\]KW,P)1)*IYM-U:4'T(<I!_@%?G6ZNH70'F+SPLS6X
    218 M&04T_(SO+("XLT"N@<TWVQN.MR`[I<,1M\6L)&NCT%,(H_T-!U2PCR"XB$'.
    219 M-L3482=`0P>M8S>F7S"M3Q`+*5)TUB';%`P7=J(QK:(S,5#&:Z.-03+9JO2F
    220 M-?@S98'2&RB6`LHWR"F@$;*%`7?E&E/]>6`837"L-/>Q@=W2UN);[ELI1+W2
    221 MG8IA;(WT&&2`XM@P.A/;KF\/'%6$<E!;*M-+\74*)"6"&0)*))V=#32AUN2-
    222 M,`27IHCB2$4X##&(#2PAD).8_4DJDEBO<*?*/LT:X`R^;V:H0D+*HR'[\;$[
    223 M,USJUDF82ENANU3T%^J7;0\M5)*$BN;`S$U^3A<-^P9PCS&N=`E?LEW@%W`R
    224 MDGYSBW#B>!QTHF(0^V8BSV[T^8JI`R+2'A@&V>=^EI="!:)`T$G!/`TT+CI%
    225 M:[,6EK[F13)=*R+6V$O@EZX82,3LX+75D022?8/W#Q-5"Y-@64/KS)"!\P@+
    226 MAMR<BG$4Q7A37$W4%ON@@E(OSC23=@3-H(^53*A&-E_A.+9!ORWRMS'0>VRX
    227 MM4D/*N0'W1R!S036NW5DZ0)9HYSLH#TT"U?4DK*Y.MS2R@?#&,K+7J24::[P
    228 M[O0<ZQ"0J=8AA)5'"-)W7[%:1+L6YZTA1LFP`GHHFQN$#2>@!&M-M"U\V\`(
    229 M;&-6TKT$23EM#8M5J59@-R*;Y$*:TB#ID+2U:R#Z`+\Y!Q)>]M>J1*S"A*B"
    230 M+&B\J#:A#O!].6D-*U)IB5AX_)")2#!I>$Z,I!`J*Y!M(']+5LJZ+4A1:Z4\
    231 M-G7AWP(K27VLFE`\?J*.A`N::<EWI^23G$A)-1V)4WLHV&*MH)YU8?%#XYF2
    232 M%/-=FYF()(`']:9YV*8D']A&J)U4:LDU)?'_-B4)55,Q:>N:Y'#*ND)FUE5=
    233 M20JZJ20*(F];L\RE53%2ZF5J<FP-2!09`(H64I_!H;RF:TF1'298RQB1S-JH
    234 M)&JGJH6>O+VG8F"RIQUT6!PS;7H2AYBP&Q=C2B88L@FXFKPTNZ\LZJ'%L,6<
    235 MI'%241;C(@K^UPQK`=ZDN\[0E7N12M@T3[W(J+\]9`56TY6M<#+@+.9NP3EM
    236 M<T[3E:+"F"LOLTHZJ]C>S!:\KF'*DE_W.5G>F[N%[`B7Z4IL'&_J`F1H1S>D
    237 M6KF"J"WQD:&FE-%"RNW@5#37E0A10TOLC1E_X/0+I-*3J`A=B?V8^P$D$DE^
    238 MM[0@;^J*4K/\I)"[R85^DA*\3%&"O4MM+:^`YP>(D+);W:XIQ12DH@3P1/A(
    239 MC&CIH>8\5F6F%HU/W9I*+WBPDJ9(IB-4I>R%?$?0)[EI%?!?]^3R@Z[L5]4*
    240 M]!T%]'#+9,XC5*6@+#NSP/,Z,0J]5U>6;>F..IGIN+#.H4**J4JL=6Y:\-_H
    241 M*(HNEEV_FJY$Y(;$X\8((P)N.`WW,DV)[0*J$B55L4>KW-0H"=25M3)A<E,+
    242 MR1XK;SCNX9H2E@?G@8)4Q4B16;JTN&JR)JC/"(PR\;3?C5'2'FI2HZAPMU"%
    243 M(9:),1J'W5M4#BC,#=L;YIO[%=5DK98C*EL%7A*R"J-_N9Y$-,7(U=QU!:C)
    244 M+TI1^K=&(F]-7EVZYP#A8M6*`6>*$GH;H=BEH=0;*$4>4T4:G-26Z&DM?VI/
    245 M-H]/AV#6.$CRE^<O[[__1=#J]U\^?I\^+7>W_NGY\YU#D8:_>]3E/Z[S-PZ]
    246 M_(V'HKGUA_^)'Z<#TOKE)UO^!_E__*3??KKEY]MI[/BA,I0BNPQ'13U_%5OB
    247 M7:R$;_+OXU=\GN#"S4MN-KE9Y"8<`I?^]K+?MI?O4B#"PU]ON=M?OLF=`5C!
    248 MGVZKH/*7[5'/3U%!?_G.NAF]Y@-+2H;<F3Q[PVYT=N$[.S'/[:9=8`WU,:^H
    249 M`%4/*9!WX6<3<'^RXF^L91"_^=VN_6,U[>$O.:V>*24\8Y]WA]R=K`,G+L6M
    250 MH1WT<:H(*VE)MSYB6.'<B$>:];&]?#`.);<[*_]F]<"!I_5T:Z%:/<W?M5L#
    251 M7>OYM?B@=6L`G>^/AO#54VZP>G:TZE@B94X+AO6S<2PQ",5*NG6T2T=QK\J]
    252 MQ5Y6#J54TNWVM$XV[:367JWVKG7\:@>S6$FW7HY7OUOD[K;:YZ/:G64=;SK"
    253 M^("?E4SK>6?/]=ZP/@\(@-;+6K]9#>/U:756>[*EWTWK+>2P'&NX)S96QR%8
    254 MGU>0U"XUGL4C@LAWD_X^MLOF-[Q:6C.0LL+.<L*[#OODH\O63/>??L/*^W'!
    255 MC%A*)I.7W2PZLFQ_=DK`8+T[EDQS<?R&]<\AUT-;5()L&7&6<?R:WBW:-5TN
    256 MKU7O>M\JI7!Y'7*WZ/JQ5=5,,+NM(9BC=ML76W'1[%90K,]<0@+H7#*]U\TF
    257 M^3*1\I55=*6+J`PKJ=9U740HV592_`6XC![KB**OKT)QM*54TOJJ(9';2JIU
    258 MV-92R)6O)*Z;5WT1JVC%JF'39UU0WI,,)KI-__&D*,CC+RJ6FL"&A+^G8(5O
    259 M]3NP0)GW?K[+9?E>/EZM_!WE<HWD%=GIGY7E'TSZ&M>SX/??4:JUX>??/ZJR
    260 MI^ZGX,UO'XHS<%GEUQ_U)VT/S;W__E_LP6C66_6"TS[G]NGM(^@>C3]^?,IZ
    261 M@=%B#?[\_=0N^!BE.%_?L>LM/9G(MK)"#0)IUKEZ2SM4GEV_7T*`ZVO4Y!N2
    262 MJNX9]\X^V?#C'04EB:E]FY1E\].6R;890#];4H\%3)_IT2(FCJ^%=WW[T9T3
    263 M`E=G%.2]4U;QBH*T=V(_B?N^[-NC:*.^^?C6V1^]18&M<5NS(.(DG6)R;97[
    264 M[N/[YWBMIR!OGX@O14':/K%>>=]W&M\GNS=<7S[OD]6:]JW"-[YTME/Z_..-
    265 MSS_^,0D.T9)J7,ZI0R43HZ,,Y*9K4"JN*PE0#>U4]&X(E<F)[BBN$4,GN4Q1
    266 M'_&0BY4$JCE*VJ/%'C2RO.@NM!P=`?<GT:JF[B=<T$>P>DA*6[$_S20ENCUM
    267 ME8\D8BI[$V;X3`+60F9V2?(U0F+*%=N5J49,_I&M&L+"U^]I9:BH-(=!Y0@<
    268 MOEJ4Y,H%#A]R2E+50GI81TMK0F5G)8ER44/H/6T_+FB-#98DR#_H\_3-SWO\
    269 M>'S1#_J\4=NN[_1##NK:;_-[^T#^[%/U^)#+HL7O4.1=KN&P>,>332[4A_GL
    270 M?+3*HW4]VSN?K'RR-ZFX\-&*1RNJKGRZ\NGU9&55+COU[WX./D\53F7U[.^L
    271 MH*B&KE.:**RBL(IR21M5MR54@B::[0_FH]W/R2I0PWR.=S[]T;2P2P.ZJ^'I
    272 M(K7;IC5L0UCX.7\-??Z<>-R[>TMM>%B:^BD&$]M4>Z;QY$[3GI_'5)K!S1\&
    273 M]E]L8FQXM?<QOKK"/X^P59X'V:HN>:"M[GI&FT>V6:=TN,'C>:;1YJGO/PRV
    274 MU9W&VVHN9\P)!>W-4`_`^];-7\<=/]#=WX9=<4T:>71.`8&.0V&-,?1:7&+L
    275 M7>@3J,;G7VV#5FV'N-43$/+]*$P"/2NX;7VK+JSI]E&%C^*WS6J5FPN>_4_W
    276 MR]%]IE-/8=9_/+;+&]JABE7)"=HPDM51\Z'I7DLJ^J3K[&B.@!"L;3U*O]+]
    277 MFI7>8Y5]I\*259^\6ZVG,*N_U]O.Y3LHXRC!NY=^I]+Z21?"$5M3:?FD$N]U
    278 MBDQER^[XJ#[&!D6LK85T[U32LB*%O_A.A?63.JU&W?YDXIA9F:JTO0AA;[_;
    279 MD]:ONG>6N5)ARQH:?)#\I.\`75^W7*G,D1&,S;:\I*4=HMF+C5SH^X1:GZVU
    280 M5.8H:9B]G(K<&L))>G;;<8_;QV)6C97*?._I?+//98ZC!E\LIB5;2V+"/J+`
    281 M(9/;S>/AAUQ_-I>&B6(J<H-I4A2]]PF"#?8O%;C!A"=JVC23$83/*;LA[NZI
    282 M1AD+$%9M24TB$VH3KC`!2>O2.Y_09PD=DM;&)B(C[DOPLAS]X:*-X\-";[BP
    283 M\8-ZXW9(&'@34:^C+$(RQVBA)VJ(9)V7@4(7&YQV$/I!'Y:UU3(@+$?\D`'I
    284 M*J&%X%6KXH@!@I(._FJX3'AZ64FKOX9$X=UB[?<0)IRBI+C09EU[JRM>*UV/
    285 MR>'RA5Y"JO!UL;3*6XC4N%:L<9>-XC6KP(),Y:B0^M2<(RM\&*Y-5>+6<&CI
    286 MBG3:,E_AW<`K+`#FG;%BL3K&HS>'EJXWI^X7\7O7F$LU<7$8Z=IOZEC&?5=\
    287 MZTRTKZ)FM[.]D@S=\>.!-C\Z!A#8-*Q!_`,^(E%$)?QAN6[4CGT0N`@DPF,>
    288 M2U=X4`S66"6TY@EJ[KK6>#JN(_(9W1"!@A7K!UT*!"N];<6FBD&:"!S1J2(0
    289 M*074_&@_:;_9(I`;JXG>6^?M=GJ+0&;U(+.97D'K*ZE">Y%`7?XB]7E>XO3^
    290 M8"CMOH+/XOT/?/011UVFSX/?^#RX@Q]\Q5%I6*(PEBVK#SVGH!H)6TKFR_%=
    291 M\$.OEGZ@16%Z@K$Z["!9*1HOQ[-QE\>XU\Y%Q[EQ7^8F/Z7)(.49B,O+^LOQ
    292 M?N`[M*6W7'2<(/A*U;5S6?:#;'X\<:;BY+&#7ES1HNVOJ)+)5K7FDN-`N9D?
    293 M-7-A]J'@)?NZ/I4G5PIUR;3#E;4X.?>00>*?J>!&H[&+&U^^26_I>[#B1!Z'
    294 ML5?-I=D;(R,T>[US<?;)X*M:W<Y@L.)PS7"0YNRYY1=S;%)5/^J,-[6=7/LD
    295 M6W6IGXJR:X?GC-6[Y_+LX8%@MO7Y^>3HP:ZXVZ>G'<68LA]CI](7<^Q2X9_\
    296 M!@/\ZM.6,>[7&8;[!R<2!WGV3P]F7Y(,\FA'9.X?/$K\%.#*I0Z&NFV%LWVJ
    297 M._S'W%%DDYJY:R_F!^>V@EA[/'N]Y)`//XAR[UR8_5G,Q+>3$*PX>[5$E.?X
    298 M7!PQ($4&:8H\A+=]!WMM>^3"XK.@^]C</?<+A=4WLS#*S),5X0&9I.8<?2W)
    299 M\2><%]KFG4JS+PZG!HR8X/WR*1`E$]3[G9MT)[K&#H'><[/5IT<W67Y$[906
    300 MGY^EV[[9?\<O=Z-36W9_,QL==)TP&(_#J2.5Y5@8#NP+>5DOG^-A/*0T%)2'
    301 M.QW]+WG1&$'W,6][$W[@O.9'J\^:1J)V2V7%)VTKR#M%*$!WJ`SW]HG&_N*!
    302 M%WY4?JQ4DB-R-^G]+97FJ!P^BMEBX"P0&W!SO\XS.!Z/-;OC5ST8M*;2YE.Y
    303 M%"]U/P'X6*V<RZVV=>Y3\:F4YS].T7C)H4&H0D_DT;(<)L09[6NFPAPKQ!$6
    304 MGGI[XL)N\LCZ\V-@CV]^VXO@:S`[E36?Q\UY;+D_U><1KR$3J2782B."A>_)
    305 M^*!U?;W`UCAG<L\KE:X$L/D]V=)+*IX):>,[1FVGPL#<.EF]S5S:?;(VU>*G
    306 M5IO/%%^C/GRI-WT1A^TW/I6<BG:"[C=YIB,_N1*"Q^>90W8\^FU`GM]1RO4.
    307 MFXW-V8B>NAG/R6!/95596;6>AAEP\^2WE<MWL@;PN;405@NCATF`=)+5KU0Z
    308 M;6CWB_FH3]'P<66/9&"MK'B/W*#`5[%2F1N/2T>GYN>6#<Y6U--2D?OVV=IP
    309 MS>%MN36"CS-&R;97VU36YPD//K"JE)`WDR-\UK#I<9Q"/8#6MHUS,[#J_:J@
    310 M.:%8W5'%ZF"(P."KH5`>-]%OO7_PIRI`K<9PJVYC=6F+#EAK0#GD)P14#51Y
    311 M*_M12PZ:W-%U!:D?_.0SOA*>H*G!1$$^R,9-F#00(AEYM+D-D#HXE#EMR.!@
    312 MP0&%Z['M9>O+<3'B8/!1:@:9`?@JOWP<CV0'(]Y-ELYU\*7#/)EGG!NG+I>`
    313 M=_/AY!G#E6P;9_;.E<%D0#=1P/?]"4<&:D-*J[N$?\TN2)FX@=/,`D`Z5EM@
    314 M)E_SQ=P\@='&0Y._#S8,S`+$7UN&A0'`*KQ=GS!A@*\;I)DV,R!TY+5YD$,"
    315 M@PZZ)KXWU%_,KQ1HBY^9#OY5R"8BN,?CE'V9D!4<;)107\"H\CKO[/X.",6/
    316 M_;1H)GDQL559?Z]C0,P7<XZ?T&:`IN94HNU&A8,&V"H9P`4DJJ\5QUT?]!9X
    317 MZ`;87`FY.1:"(7O-G5";`R%ZZ%8_@,TA4`^RT<[H)U@9!M6LNW"2[>GNL^Q2
    318 M!3*_]D@`+<`-CI[)X,QQ#?3KOK+_WD'->C2O*61RQ>BN@\D<Q[179[',L!=T
    319 MFR>_.8&JP"D`9*4G1!4@!5\H;UZ2?;*;NB\#*4<G'-[MK+BP#/:G`1X&_$VK
    320 M^80X2`KX`9]8RP`IH`</+Z9T.3QRV('E[;PF5VRZB:.9[$$,M#$>"=YXV[*R
    321 MG-SD^-SV[9(!30`(?!\5IUD?-./P@8.U<DC:P<-\=5>](^1AKRUCZ!%EA\>Z
    322 M1T=8VO<BVY]]U!V$.!I8CXP@8J^GRS5H4(Y,5[S(=M>BPU+=G#/QSJ'@,FV;
    323 MBAP&;O8M[=PI@C=_/*3L;RA)UQB++K[U70G28PR-0,_OXT/OS-MBT$-N\10J
    324 MW"H6T1[JD\-S%M8>ZEZ3FM\[W7O#8KV%H>GYO:/BH6'I(5?%O'^7!::[W%-*
    325 MN@6FF]QHK&)8;+K*'40]GVRBR!7/'$8;,P>)]RX:KK8(,=*U[F$!:P\1RZ`V
    326 MBUK#9]GQ`:+=I>UFWDJI6]JE)[1]D*TOQB7#VA8Q!NE]5HUL6\"XK%8LMFWA
    327 M8GQJO4G3U7R<"-+6RG!\4^_F?/4IJ6A-[C!!J%_W<Y\8,FB)];G>3P29'Q:6
    328 MUG,$&5\<>0XV)G>FT[$ZVI(;FI2`FG$`E061L3=+4^\G?(\?+/4B6^\T@E_A
    329 M164=[9;NXF#M;]IN'6-*G:A#G^`/-NKX6#^IG%%<R$7CRX:T4;*45<:")'0J
    330 MB(R=VP@=Z5.Q911=RY(</EP0O2R))#;)9TCDO9(\4AQ33XY4WKD3Y0@GAC?W
    331 MH1XI3:VW(ZV#TGR$533;>"91A9/_DYSR&_(MM7[DE:S?U'@Y@OM(K=>08/*P
    332 MNPVBDAZP+DH2X,?J93P_";"HV#N+[X/RF]H-,?YQU(M+,ZGHE\V0^NF9B6/4
    333 M!)7G1VG;.30FSP@./'^0YNO(<D&E_;`A0$M7/::"/%!>DR`#TJD.HQR3ODOU
    334 MI)R76]>*";&6-I-A5ZXI[#EGSEZ8ZU/V0_M732/XF7D$O_QM[L/<^>EU\>G_
    335 M^/W]?);[VY__]&]2T>_>_OS^N[]^_]-?WNU._=U__\]__?Z[__KVY[=_>__K
    336 M^Y__$I7<K.3Y_>V__/']/_WNKW_2OOAGO/\2;:_RJ>UZ\BY6^[MY%__H;7XC
    337 MZ^(?/A)-]3_\TS]-H[[FW\VX6.OO9ERLE*NQKZ^,BZ^,BZ^,BV2B_!,9%_M.
    338 M*ZA\95R\?&5<_!_/N-@UR6#[3?/&$RZ8_J#)%$`#EG>AZ0^6-H%\!4^P0(:#
    339 MYS<P$R*2*3YXB!*S+KY_U)^T9LV2L)J]6D)MUKI(5F"EKU[?4BKFARQ6K<G?
    340 MIZ=W&U_9$5_9$?]D=L2>27#65W;$5W9$R,[_SNR(?1"T[&:_J7O;<X#-C^2&
    341 M2>K]@UX7)?0S2V$9:;ZNYW@W-GZ!&Z:80:S\L*T,>$UDF.]*K$=:A)C&:KIJ
    342 M\D4ULYFZ];Y(>I_/]:Y\>68]#'E";<Y*=X\9NDQW,!M;.6+[G1QYS6V8[X5&
    343 M)=(DNCQ$$_4!#TTSNUAS'.1G,!WA\ZEJ=**1IO;K3SH<]DXV(BT&1"EM-B*Z
    344 MS,Z@C#,F2FGS(6&R@0^)+JXT*BT-BGIM=%0TE<`'A@D*9V1TB:7!R6-3SMAH
    345 M^D$,34\C4]+(:+LV-$;`B^%)H^,R=2?Y*E_)!U_)!U_)!U_)![_^5O)!N6K2
    346 M&>TK^>`K^>#_^^2#<O6T)L9OXK2Q2GUBLV\\2^^I.S>.-FJ(!C"^@"A\%?!C
    347 M?/N[31B\[\;39PW8X0E0R@#R4WC2";/(RX\*BY+XQ8B>SPF\43IR#-Z!1;0O
    348 M[VBE_:2=,L!DO2K>(P-,UB/-'#@].KTA7&)W'C6Z4DXW+)KU8;XOZT?TP8=P
    349 MIN%<7VD!7VD!+U]I`5]I`;GP*RT@2K_2`K[2`K[2`K[2`K[2`G[]?RXMH%S)
    350 M`WQ?7VD!7VD!7VD!7VD!7VD!7VD!7VD!`4+^;TP+*'>*K=WEMWV"LA<S7CF@
    351 MKRK#E5VLJCHU8#G`*2S[9L`2;C99C!;$!7?Z!LM=0Y8#SKEZM\*8957^S+XT
    352 M:-G@BQ/KWV*6G9'<Z6%+$+O%*EV,6C(T.8>%+2O\=6V487%+!C7+G!:V!!L;
    353 M?=7()4C@I8W[>=\:JYS-HIBD&H^V/([)@"7I/1K,;/QQG1;/['+)D7GOQA]O
    354 MLKT_;PW[PO&"".N[A7YW:QKW_,[(IUB'TR*?%==B4'MTN.%:AA/'NW7EAC_P
    355 MQ3+I\/NWC_DHX,Z#M/R8=4]0[\F`YL'Z&+NFC&NMHDH5)'AKWZ[W\K%XGOXE
    356 MO:E@.LN88MP::=-\G_:.J5D_^93#EVI3WGW"7TE67QZ9S[-]Y;DFJ=SGFH1V
    357 MGVJLDC'S7%]GIHT4[E/]2BZZSS6/Z>]GKL5F2C/=\SRS$IMG997[1"N9/4WT
    358 M'O>99T1_>IKG,\?*_-9)5E*YS[%RU,\<@QM_IA@@8)T9?JUG=I5*:]/[2F*Z
    359 MS?`K_=@QP^NZ5DSPHY[)M4[I[)+(KI-+UDY,;DRLK_KZ!W*S__+7M[_^M[_\
    360 1?/_^W_^[G_X'$7*;('72````
     2M'XL(",:>2%```V=C9'!?;"YR97,`[%O;CAQ'<GW75Q2(!7;8S:8R(^\22&!M
     3M`88`VS"@M1^Y*I%#:H#A##$<2;TV_.\^)R(SJT:D=A?P"H9DZ4%359W7N)P3
     4M$9G\ZH]??/FOR[+XY\NGGRZ_^_+5[S[YJG^2I\M\#D_Q\WR+?%O>O'SU[D_7
     5M3^_?WR^GY?KVYLUR?_G^_OWR^O:.ORTOU^N7WUVO]U>W-^^7M[>OEG=/YPCI
     6MP7A9Q_O#]?7RW<W5]^O=U7I_N=S<WISN[ZZ^OUJOE\OS^O;=]>7[Y>7MV\OE
     7M]=WM6\[P[VC\;T]?7Y[G0$4'LOGUUS]<O_MV99-MZOI@ZJ8]_OCMY9ACN;I9
     8M=`G?<+ZOU]\_6;Y^R?]=XG]/GS[%ML82OO[NYO[J_OKRE5SD3]]]ZA__?@SK
     9MG0Z+H=[?O_J7[Z[OL91_>OGJZ=7-7(?W^W5XL77<+E_<?C8_/I"Z-ZG?+F]U
     10MO"ZE#P3]P]7]M\N[]0ZKO+^\>S][/Y"XSYMN/83VSU_^P_((BGQZ??7-H\_G
     11M+_7Y@H]_NKJYNK]X_/DG_+L\?SX4?W/YP]/W]^O];-YZ\S<WMW>7%X_^\3^^
     12M6K[\8ED^4[-ZA`&P_*W!9\O#!F,8<<_GVN2!D,2$=%I>?W?S4G<[I2D/1"5Q
     13MVYX\V+B8J;V_@JJO7O\9.KEXC`'?W5W=W*LL5TCP$H:(OUCDV_7ZZC\O7_&7
     14M;:KR8$"8T[N[VY?[(9>+Y=WM]9^7UT_L[YOE\6P.>_NO\1)@)8LU>?4,4URP
     15M!QI/!01A@U?;>^3[F.EB>?5D\?OFV-Q_SY>RB3$\L/G0NABQZ3?+G7\6Q+GP
     16MY/SDU>:@T>U[1+_),V)-.RTOCSX<Y?-'RX?*_DBS.61X_A=_CMM.(K1ILMU^
     17MSL^[F+=/N[U'[/WU,^_RX?S"AU.J@0]RPA?')W^L+NF/[NASXU,[!2GX6X]>
     18MDJMX*L<JA9_R,677\)!.7FKA4SSZX&/$4SA)T@?95@*?>//,XS\.X^,I11=M
     19M)4U'YDI"?_3'X*L^N5.MVJ,=O8N!T]23C]5[78Q/*7#Q^11KXZ=TS$'$%I.J
     20M-%V,#[GF!ZM).]=*T.G>#6AZT-K9"X9H+9VQ'#[4,U:#!Y%SXX=0SY!+*MF=
     21M"[[G*.?,WZL_)WX/<L8B8CU#&O$L?_\!Q_IEMY=`'4-`V:MVRU$D)#[EDS25
     22M:#I&B%YU<"SB30?'%%LT)02O\O/^%(LX,X<:G%-SR)"IJJ"9IHJN+Z@&4G6B
     23M]E!SB*J!4ILJ`*I+:EERS"U`34</HPN;-B)M`X;H,P<5=\RYZ'+:$3/K4Z5Q
     24MC4VU&)MNZMA<*[JK$\35=Y6<[2F&OB6?1'*WJZ(&3<%'EY-NJI7DS:Y2::)V
     25ME6U6;,HE-?*C1+/Q$SW!;!S+$5TOGP*>3E6JVW:5=GK)'[<QZ-4Y[\X1BSAS
     26MQ"SI#"DER6>8K3CYF]J,67;>GM3;0_7<D,@I5Y6H>+JR>8.C<%6BD$%2T5/,
     27M^$]%5)9C21)-SO@8S'RPBAA,T+ZJN"!J+[$F$W;*S<RGBLH7HH:M>W/A4)R*
     28M^BA9\:&<0@M9)0UW+4E%#3PQ.`E-K09[=DXM"=O('I]@KLYO@C9H@3IUK^X4
     29M#86P+:"-=[:O*L&V!?LLYA*084RVJ9!U8=Q43*IR[*JZYFQ3-90.3#Y*2MTK
     30M2BYJ0,"M(`:3/JL3P"^<694BDYD0_*(8,D57APD9#,LQ57K6L=8T]Y5W()5_
     31M`J3^O@:4=U"2P__:@'XA]I-WM)I!J[]*6\J[/98?V]+/84IU-V%35BHQ<N,A
     32M'TM1W@F)VU5`#M26;CR$(^A:GQB;.)5Y\$=,H;T1G(1:=*,TB)#872K$JM\@
     33M+96'P.92+FJG6'40904!?B?5CH`?7"QFVUY:\=VXJPH6FF_)&,B'SBSU"%;M
     34M#.1%=0-:]4ZD$RN&=FH7B&[$I4-GUF3A#4FO&`U!CSVZ:;59=%.B1E.DN:!A
     35M2Z'!Z8_Y5+*W4*LFM7:H78HZ#%P'K;*QD.!GZ!VQ5YN*+SL0*9[&G;SQ%ZE,
     36M<E"1G[P%<Q!Y+CI<\`@8-":`Q(LSHD,\Z%1SD+>7G+O`)8CO(H>*Q40>LHX-
     37MB8-SLTD\6ZP@D(5HT"D4A6G&8;XR1(XE&NN#IH-&>/"U7$+K,H>.6Y>Y^(XF
     38MP21"XC<=DODQ4&=^6(U%$G`V"RX;'J3[FHN57<#\53>(R"*IKA/]2E<(>;FJ
     39MKAM.N<.)C^J9QU#CYFMEAZ(E?-37()6(@.(,F<"NW5EM,`L^^%.&W9Z%D6$J
     40MY:S2@%C/AJP5T2/BGY;EK'*([DPA^-C:&697<L,/`8OW##=#RP@V.5)(&FRV
     41MZ,^-@O8(-4-%+$KUP;H0:>*UGA,L5SSC3!@$/#SD$,[J(%+.)WB;_V4O?JAE
     42M!_DE6<R,]5'A,0/>/2TI0O=1%`9BQ$=CE7`JW1[4BNT1YN6J6GF$'<>H\-60
     43MBU1%+WJ+^1>0H]FO^2A%IPD$CJK($)BU1/L*;RF::1$&T50,!L&4&M`'!U_,
     44M`P:=*$#0+?&?^A/8MRJ@"J)8"0:$]-5D;HDPV1P/SF_I%-PR9UT<%!F,KZ#*
     45MXA0;R8``T8Z$D&DR*(17I.Z7_-I9'GQ7>S@.U]#^2/0PN_EE=(H8<,MH<`S]
     46MXLERSNA&SAF4O\M)7#&GS+HHZL6@G7!NT*V[,/HKA0-`*&4'@SO^*T4YWK2=
     47MCDA-O*KXQ`Q354S%JL"CIFPZDS\U8Z#H`#"*Z8%TG338"978IP%+H%7&9$K&
     48M^BP:`M?!(Y(!;TW**,3=X)4H5,F^F9*!B;H0Z#AYQ6`@KSB5O9`ABF8V@-XH
     49MOB,O'"]VX&W!J(XNESKRPAW30-ZH*9,P&7*6;W$;V91\S%$9%3HN-?<X#ENP
     50M]##K@L54'))A*R=RAL(PVFC1G2!)\Z9C9(:UZY@+TDP2FVC>LGFQ7+5085YC
     51M.3QYM8$$7].'2(T'P]Y6C>`9#&$L]"];+%=V84=I'\5>*%I2.$?:H\-?C3)B
     52M.D/#`IR``V-RO,-_@5`^GJ%;)./A#.>%M@$L#&=+S&=Z;L`0<%OL6L[0)\@5
     53M@1$V#\R"M\96W1D$&H(_0X<14`@%UI@!EC`3!#+U+(3"@A4Q3@&NEC-51_2#
     54MWIA"*\!"P($`"[#$(A%Z^Q1*(L(F%XH!;,":/"LT50$62$%\+1(BX159<,4'
     55MM3F$<$38@ND)L8ZU!I9]1(L1L+5SI5_C;Z$0M!*!8)40V^`D9_J*PZ^!HQ:G
     56M(%MK/A]!T?XW$?_\(NXF7G?17?7D,1&-'A,%F)1)$B#.ZB4):C'O35:3T0!'
     57M(%DK<OB%>E%O3%11-(ALS*B,$15\%"T+ZS$6C&:&R`K0,2U:R'*&I\B_O.$I
     58MF+C#:>J#L@06=:G`4P*5`>K"M$<+?B1-J*@8:P:-^&D6H%QC3>C):_8)0&W-
     59M^#,LI]B41F`@WC7=%P`U5R5O`&JT_<%26BX]=0"O&<J6!0RCL]-BQ*I&A%21
     60M9)#:HJ4'A"%-5,UPFF4/"PS"!M4]:4A)\RD&E*PP14L6"H3N>F'.YZ#PF!:M
     61M5/8,(N?4:W/5`G9F$.(U96$&D55XL*@>,$!TP&/+CD%%S=)C21HCL%!6+'/$
     62M9DV#"(^,9;"!IC/(@AQ-,367NA5+ZRZ>K8'<*=5JP`@3+#%U#,2*6E8[%4O7
     63M$Z`]6KI:D"Y:L3@OW$3K9AE4E3!+6I4SNPQ!MYAH[TFCD:0E!ZTD)+?0]UPW
     64MRV1YE)IE4O*E78*&F]EE*]7,DO:C+>-"/-%A@4Z(6I5=6"*TK!QV67I,YT[5
     65M4E/L*#6+XY:CF((8R"%RR<,HZS#*FJ.1_.!A!'(]IPRR8'?)+-+[IJ1(DXR^
     66M<WRQ.`?XU6-#1''`-<MG3U91AXM5RY2)8:GG_-B+LQA/`!^C4M-"ZX4:Q@Q*
     67MVVU!C%YZJ09!J>\,'[W6=&"."!O=H>=6V(U98S\M@'\AI%7#DQ/23+5@K\5I
     68M*Q4C2%*A4#F6N-&][,@`UI@U9\RP,YU-DZML!)]]MF)-B%9=.@6A*!&WMZU4
     69M7'>!>TT?SZUH+K!H(G@!EI^U=E/P@0B>'-,*AF@^*((38WUB>*5)"(F*$,Z8
     70MIE:MV2/,]L3PUEQ2"/<LP@/"JW.LV$,BA2`.8#XC$`,4`L,#HD5B>`BD)Y9-
     71M,B$<2.'.IP(7^>4L=(A[%T+7!T=_M3XX1Y-G%W9XM3ZV\ZOE[=4-#Z:>K2^0
     72M#C!X75^$X_J")9&*Z'@]^GG>5MM^Y.:V\[;F/WK>]L%L/WWF]D'3.;0\_ZM-
     73MPO._81M;\YV=M@^/ZMJ'1W5M5[QO)M#75W?O[Y\L[WG4?_MZN?_V<KGS\PK`
     74M;-RFC*"\_R=%6W#N\VW7\JLLVB*ZV>TQ_J6B[4$KLH=1DCWTFNSAQX7;O]9N
     75M3)9V$^??BK?_1\5;3+G30_VM>/OS%V\1"F\BY^6EGR[>'D8!]#`KH(=1`CW,
     76M&NAA%D$/LPIZ&&70PZB#'F8A]#`JH8=>"CWT6NAA%D,/HQIZZ.700Z^''D9!
     77M]-`KHH=>$CWTFNBA%T4/HRIZ^%%-]]>TIZ'$'5'TRV4WMS\\V6[27=U\?WO]
     78M/=F?!+M>O[G\YFZ]>CGOOLW.>B!Z$7G4#^(W5PA.`&>(`>Q50H:[K/T%/-.;
     79M`?YF)\*4`U_V3IZE.^OBF;.GCF48:IO((50GA/8^?&4%=;67;#=XM&+1^/E%
     80MZ*[H$,#U3LQ#`_AJ'<`HJ:>GF*F,F9@4^(9?>B>\BBO.>BF^E?F=.7OOQ7LF
     81MD3NW7G@M1.K57FK/?UDS8$K>.V56N./HDX\LY%D7D$RT`C%1B07MWB5!J&[K
     82M`Z#RO+.TVDOK%U;0*E5^?M'110JOB?1.+%<F!!NKO;2BB3%;P;KF3"`R!"YS
     83M1^$HR*G[3'A)DR&DS(E`IG$8`U[82*P'+:/T-H@NIHH\4S`*ROK@-05XU=I?
     84MD(GU9L"X-M?FM+;C1B^-Z'+?$$P#C%[Z8Q"HRWHUH*.^B+Z`XHIMIVE<EOM7
     85MA`6]0V4I./4.>OVF6QP<,RD&HT7)H3<OO(LSC*UH2<B6A!36&\N2>1$4]`YY
     86MQ-"B+[[`)+4#`\^F)P5Y7ND#CNS<6`_I+\23[:9726`1>GJ51T3BIE]E*V"+
     87MYJJE;'ZEA<C-KX!D)0V_0JA7NF,)XLB\.18"P[SY%9E8AF.!Q]L@PE;<YE<0
     88MX`._\K5#!7\KJ7,F!F.<NOE58'5@\ZLZ-8T7[Z7G[P+.]9MC/>BUERU?6K.8
     89M)X-KM548OE1JVUP+=M3"<"WI)2+][M+.M6)K?N=:C<<'ZW"[8#6LB"`DQ<VU
     90M?"#,3=>JI6M*L]E@U3`XF:N;).A.2=+F72"%ZC;OJG:)$=]+F5A+Q\DAIYU_
     91M`2KS\"_02[_YF&II>^^*,6[>55W-T[E@LSWZ!_+X.IU+0'1A>A<V*,.[D+98
     92M$RW9#=^"S_DVG4N84YAO@?Q<;P)A;MX%NW!A<R]'!!KN91%-H8BFOQ,Y)4SW
     93M`B+6,-W+2H9[]\H[]_KH_9`+I%Q%5B!>R:N<)/J\TO_S8]+[\0+,%>L:3BFL
     94MH@7=E;@?'BOG7_`(,Y254:2DE;D!XK+UF%RKCS4:N``JHCL,R!4=0$I;M2S5
     95MV,!C`E\+1]`S60XAL=3U!.U$MG!HP;1J9?4=*2P'815MY=&L9Y.&%L##C!8M
     96MMLH&T%)86?\,;%"/%Z4DG0.HX&R.C"F:KK)@&Q$\Q_[5X6=$K5E6:$P<?LZ?
     97MJ!R$"X@(:=@](P5"_Y!;EX-6"CA`TP4$F/C*1-I)%P."H-:X`C";1XOH,!.,
     98M6F(7`VNE6'2@.5$1Q65(H862AA1@EYXC(`86;C+"53!$E2Z$4P*[<I6N5,H:
     99M&1O7D+R8#&`HB4L,C7N$/T8*,8F)`-HW+V77B&1PM3>5P+"@NK,FO?QS$1SV
     100MN/DA<@`7=AZ71[2`?*5E-]TJ&5]TKY+FR^"LD+I;`65G@``D;;F&Z5?(Z09G
     101M,36S,D0MSD^W0@8CTZL**[[F5!BU^>Y>#"J'4Z4XB9<O/:#*W$$H@\CJ`,C$
     102MJ[,#]!$--YZTK_:,!#;TKRV.#@!-GR=-1)[L%W-;_!(L`XN;V^[^B8`7WUEQ
     103MDRPB3\W;9WQ*5W`S/N5;;^4&.@N3]1DGD"\+KU%O/*JG*Z(7'MK`&HT\IUST
     104M+77,5.X,\TQ$XJ0!AJ=N0II>]65`V7]J1>L-7@^?-AJ`]N"[^^AT<%0EZ=51
     105MV&ZYS(GT3'':'E1;D9)/#@UAE`6$1W,[#D66,?F:-7[GZ^30W.M!O"RR!8":
     106M[^S#TU9F<)J*'8<SA*W3H'A=.<^UL3*D,5%_L>(`F=0'-Y<&"/8S,"-E8F%^
     107MXT_S"_W.NQZ3/X&>,V2$)63>VACTZ;,=]?,LL$TF9`3JMJA>;^6W09Y94J^(
     108M":+X76P*=)YQ&%V[`8Z';_/R0!WT&>I8'4UASYXN=B&T8\MVNG7L.9-Y>84G
     109M;>09>432(U.`VF#//(0,+P]U"TT1%&_4Z5+_EP229@#%&"GEL6]&4WW;-`H[
     110M]-E1I\C.!S]ZW>N"1``PWQ`<O$`4Y=>.VD0]DJM78E&D`W$`OSIF>UHZ01LQ
     111M/5L0V58#M8[:0#6R`O`,/Q/)5G;R';9/BMM$+W8&;JV\.J/LG3D\0D'2+^%J
     112M[7=15L,HM$BZ`+BGLD8`)XHA$^E7R2]^HEOC"#!@_IQM@>2[OD46!)WKM-CW
     113M!;#29=M/MI/!<#R3*)/B:'"VE59KWO.;I,ENW$J!ZC1,*1I(!'C[>D+`*;81
     114M"+"2@6/6*`)9`N*,DG4/0XN[7$/T=MA%9GW3K",@(JQN^!_>DA.SIZ!!H?C^
     115M"#L;%BLDK!:'2?&U5-]A58$PC.\\:>^=8.>NS.2DZH%V1U6D7C7U1M#=]"0!
     116MC.F=M=ZI'+4DLMJSNH%]U6/%WH=XUL+,G7C_AL6:U5X0(N7^O?%HM'=BDLVD
     117MJG=B^I#'ZH!VTOIUI.C;G"@28R>A\W7((/($K)^Q!XO1K0OU7.<L3`J@:NO#
     118M8#&/>K"$&020YQ!=[\LRHDE>?PG]GVT@70]^^+R2FYM)$_/)QG\$THDOV)$!
     119M/XO;5N<T^A@L(0IPS<W\,363M^-YKI^8#RVW6@:`V6M+D_K@4>,?O^PZ,;39
     120MLA)27/!;70;PF<9C]KO\T0,_)^QK`2;+Y+X6M32MS4*>61.O)LJ6-6G"4&?^
     121M"+[KU_T$,\VI&,?D.`E3PYH6)_O9D139CT>+N_PQ;)N*5M.=[%?L="J2=[;L
     122M.XR2U*S,^%QG9::U<6TBR0S#2'$UI%WV*$Q7!OWQ5*'3'W+.+4*ALFN=,]$D
     123M?)@$R&L?@P&%=SVV:+;.DH+>^(DS>W1VW*6EF9S&\H@&>1*4)HJ#_9KXWB!-
     124M+J_'N$4FZOYM!+E2M<K*KRG.8(8A3\A#S(6W/$,GP"9ZPE=V=+;+!$5O2C+S
     125M^Y_VOFU'EAO9[EU?H0<_[.E289)W$L:9;_"#GP4TRKVGC<;Q&",9_GW'6G$A
     126MJZ41QL;!@6&W@"UT)BM))AD,KHA8P0RO'2BH78P35W^)MJX"HP(G3%$^(W\6
     127MJ!+\K%2R`QUHQS9MJGE1BMWO6^2A#>6]8TGB$C$/5YIBY`V[#T_UUIIRN4+)
     128MT+@V?`1EN58:]B?]S:$W1?]LU<0PJ*M-:54U!OPLU]8S'>Z`>*3?!#H-UYJR
     129M=#6R([=+:'3`_KY5.A9)VTIS+N=P]A0V4,:J""\N>6NU5]>:38-:N'V5<*U!
     130M-?85PXW+:XWA:A/L-=.:O;08;I%^&9S8HQ`:'#6TYC!?F/Q9VV$MF,<LS(6:
     131MZC87E@9D8%3L%0QUV(Z'+L1MBBO-,70?X(]BY*@DZ]9D@@<1576?VS+W&7R9
     132M?1N6X`&&)$!GSMQ6Z,RE46C>;QOURJ)(*;Q3E(MR:,SIC)D)SLMV9<]P?D(S
     133MSN2Z#_#1N-*0BKH.CUM.)78!1"!3G>%P@[_$_FQJHWH`7A#NZ7'K80)!-BY5
     134M,*`&]=-D0"C_<+GE6?VI@LVIF\]MU,`YU(;YR68H8+^9TBS)?@0?R>%P$QF:
     135MIT-[=M]PY*(JOQS:,XT(;T`=PF+<.E.6V=@^MW'-X9JUK^US*ZD%`)&K:EH-
     136M:I.TAX4XH`^W)I`>_NR4+K<:6M-[?>,;+/4<GDVYZJM/]PW4BQ0)P*@5H9,.
     137M)^SE0@`;HH;94"Y%7J?9</A(\N\RE0F8*]Q1L@YH%5Q=L/4->[/`U0PP*^89
     138MX3.HH:]8L0O^))DV_J(2MXNB%;P[!!>^,L=:\#)271M_0M_<K`JH11F]@C0B
     139MR/@.NQ@_R+=OI0*C(_@.?]%=@+5`9M%"K$!0OPQ\H5,H%VM"C!?X`#)@M:SD
     140M;XNV`YPV59U[TI?[JK2(8-W(Z(KU`T=9I_4AT.:5X4?Z#R>\B]<%ZV,D^A=G
     141MG1=`_:3W46P",##P#F(.+2F'1P6O0.-(UIUTH&`0!%ABF-JD4TU$D#V0@<SU
     142MJO0M2I.OI`.6"P[,Z>[--6&1Y$[SJ+>,_HOV=[=>U1<8>(QQR`77I)B@X=83
     143M`_[B(*9$SV.5(9".K"NL0E'11>V:BD966S3A9(MP`THT(FTTO$*7%Q++Z*IA
     144M(*Z)4A#Y4"[_B<UT)3,/[U66-H8X<0IDQF`5Y9K"/,R3+[@67P#6$3W(15V;
     145MF38@-!%;72%>%[V%@ED6IJX*D(0`RK8=TB6:"!Y-6:U)[49.KL!7$Z^[R$FF
     146MRS,GM(V8,=NNRP1,I/6B<QAL#M0!:0=EQ>4+Q.M.XU2&`?(A@_E*RLLR$0/1
     147M2#VSE`!*FC2LWF6,CX"B2O?U@&-VR#;R*AL!7Y\"UE*FS7ZU3JM3*H1]FY,Z
     148M7F%YBA)#)P3GH(K9!]ZS575QZ_B)\<R5(HOG%9LJ>C%SGR9ELAU#!.B%II.<
     149M"TFD;KH?O3=WP"Z:MV)NR(S,GMV!+-J2SEU1C1RJ)IJ'[MNR/<@)9;"O!;>B
     150MG2IZ4KK::S=)$YV-2D26\*YP4]Q7HK2;+Z*II`YZ@<6<ER;FQ=7*Q5I4*Y6A
     151M;O9+`#R<%;(L3=Q:KQS-.=&!?HGP`!WGTXM<#N=F2>I%1O)48)R,[((#XXC^
     152M38YQX,XVXHK4NTU06`)SV\>9#K.P#44C=+,-I?F-*>'DZH=35$38=C6YJ$-)
     153M,$"_M1\^4<#]PRF:N3O8WTN3?>@4;>'9@OG7-T[6(**[QHEY[+9HZH!&/#0B
     154M_&$:6MQ.T:FY2DEY,H=35+IP1A8'<L3"*9H53Y%-78^(/<R6`^=@_G;,_O(\
     155M,-DHHG?PB88_&6A&-I/L**>7Y;<%GP8>J(C3S<,N%$FM$;'OJT3$OIX8)U]I
     156M@XA"_=["+]I*-L,0SH%H*C.C(?H'\1CF<5=*K1Z)@K4Z\A&W+Z)H#L^HH)<K
     157M#$,12\MN0U@V.@@)R/T(VXL=6\,U*G-8'>6("!RV89ECVX8=IU8HRH%GWBB6
     158M8O,?.&>.>IB'LA5M[VBQ#(%\K<,ZS"VL?;H"AIN'V1C;N'NU[1^53<R'3,!-
     159M,V0$?*NIDQ"&$!MDBG5'4@TF8KTL"#+4XFD;%I7#FUJ8;/!-X(:CLJ),B'"^
     160MR3S@6!,W/K.R3_&KT<(:HELNY\-C)UM1[VY\KA1^O!`FL2G+MOSEJDV;7[KN
     161MJN9&8N!G8-^,\4UA9L/P7!YVEXMA&9JW'06&/9E:.8Q.$6AS9<M%TQ`(3-.I
     162M[BRW.C/P9YB=LGVD[:RS[+X.!]$Z#<^Z#0`X[THUJQWFII+P,X^96=%2O3&O
     163M)BQ/>/B:6YYB?*M1#*?>3*=:[OF*IQ#Q3>&P&SI!4-8CMV<>50\W&F+]RX-.
     164M=.8M]^OEN=])\PZ>/';3@ONXN,S*3<P("4,?#IFY36->7MGU<K$L8/DS'H%5
     165MV<:IE.4-<S"I1#$48U*)_18N#^C>[7%"E"+-S?>P'!5JY1G1/Q*G9CV-SQ91
     166M)UP4]]?!)1%/(>:X:B@6Y&,U5RR0@\7T"XUAE2?%O"+*08Z'<\J@F>W>5.:4
     167MJ>6>=_`-P:INRPBZ6%:8W9?-HQWN.H'S5^AR[/G.)X.HC.FWQ;8YM+)(0`EG
     168M8CXV7&267LUO7VE3;##1]213,=?+E/*R="LX+'211K@J)O9"SNH59J>1EJFW
     169M0P.)!L[3-YG%\;G<ZE3Z&;EUV5^%[J>84:CC,B(D+8NMV=W@K&!N]X;)S)PZ
     170M0AU/)@$C(W>VP_!,*YS0N+J:AZ5K<T:LSR(U07`6&\B(YM]H('SU3^KX"(64
     171M?Y!O([`4EH7L@(3O38PSV&;=\3UP!TT$P'PQ$6J#Y2,(UM"]6$W$YJ*Y@%A%
     172M>N3QB\@<V+Z`Q%%@S,$R02SN57ZJI`]$D&0E2>6K5YJ.%PD95S-8+VH$P1Y9
     173M-R13R+(5H&IFV:!9EB^UFA`V0YH#P/)BU(R8OER+42^L2S0O]9`54@S3BW##
     174M1+_+<H1=)6NH`=$SVD1:C*AJ]*^/AN[/`L.P7FI7%ABFJ]'P-,*)J#J!XHW&
     175M$>"\]"O1J&B(W,GK`RF+:7@$$]G!!3,,8$94P2NR;XM!>1$_N!!&(==#I(\6
     176MA1HVBVP10GDXL]7DD`'LO1@71.:&=F&JU\B<'$3UEB`<!?*)E5<C]92L=MF(
     177ML**\'0V>(M`#XRO6$PR!/F'0M"_A^1*>_W/A<;5T!"S*,++1"GC;2!()$DR;
     178M=`OH[LB+8;^2C3]`=*.G?VM)\ING;L0-Y\]==EM,C,"9R+FN,WRSC<ALJB9N
     179MB`XP1,?;*8*\K?'4#-\?&[;A9G:B7&@V,NZV*S1XO8E1'R]407G4O;%51H":
     180MW;XVKZB!&1#$*$W_-GNO@=M<F-R"/P?9$?H0R&-7X-.6:0\8=L>>K+G<^+/W
     181MZCM^T\-0@O64P("TH2,P+YIL3G))O!-<P'N\81N9#=N8QZ@95.3A1E"]PO&_
     182M`^2543(+C52RFIO]#$XT1[451*$6EB\NNX?BD4B\-.<-]\EATH?`(0H9DJOJ
     183ME)M*_B4Y(<@]3CT>X>;K\*IV1B!UFI`Q#_*=_LF3.^P91-%7B3=J($BJ`%5F
     184M;A-Q\\^58A@JDH9:M`0HYA8!SJU1$E$%?+\VSPR3OF/^2-$'H4L?PM&)FC4#
     185M9V.)D6,@/:`]SD8Q:AH]64R1YX$IP5I%EK\Z(_2)),K!G"WR]U3[1OYB+KP]
     186M0D`>5D>]=K2R,E!D1["(%1F1@+)NHP=:Q*$2HUGXI9"0K:EKB`N$E!;,^PJ2
     187M`,YO$5VI#?&B%KN/Q-MX"B9:"EHM+H>'K.7",N/&;;:(V!2L_+"6"^7`(L+(
     188M'+^NR^_#=^D/B2#,XH-0<)S.97TC?XRDI4+.10AVP>(O^XUP.2RX*!>S^PE#
     189M?<42*LSBC&`NF=GF0RMD7FCB.GW[`6D+=JH19!9<KFF@5BZF9ID5[)AN0L$X
     190MAZ][V^VRTYBX\5"CT>P^CQ8(NUW$+0`]+Y</`VSZ>AG51LR(H'1FKOQQV.YI
     191M.H>246.+_T);;)=&YG*?!]FF#0/1C"#G9HGY,GK7&31NFVX*@LT*ZWVV:><P
     192MK;Z=@G"17+%%X-R>[J%/1I-7Y.*MD"!8ZR(<A_&>+(H)ULUEQS@U]B5<"\AR
     193MZ>4PWE.L(Y8I\P/&>YE[%&"MER-L+(K$8\V%(<GZ8A'DL#[)'HU)RKK^MT-U
     194M77ZV5&N[=_"?K768[O!^)3?=1ZMV0E%F/N5VJ.ZL!E)O2H\<J#DU"91<XAU9
     195M)+4B]A52:O(55!NP.^Q^.Z/&HM!#O)G@AIPU=ZB.,-U;VX%/`(:^[7TP])/1
     196M#.%<'>I&/'@6Y8C_X2#JO_[+MS7"F&WT^X4;K^%<)HN(XF\]2$O^FGN-*9CQ
     197MR2/L\<T#%^M:_JM@6`#`B!(,Q`)/4S;J)6`.\X@`?LJ(O()&_].,=NCT,S6#
     198M,J.R\7X/;P@03`XMV)A=TBY'.9EK0O\<>WT)AB'!*X".@!.3?%ST1:\5D<X,
     199M3I%@F%5R/*0LR^%()R4UZAO)8^5`.AGC?2"=7FPMR\72G-,&/]6FU0B$&2OV
     200M`KFJV2UIQ`M6<YQC9"_#.9#`@%07\MTO!SI-3U56,!3Z%@`&%,B-<V3`RQ4X
     201M9RP]ETRDH84+!5"F;O)\I?.W!,JI>HJ<_+E&1/PK,DBN$#JY[,VW>%%HL]I=
     202M'IL2*(=NCT`Y<!&.0#FU^YEZ;;].HXWD,R27Z\H!<@1)THL"*"3K.-H149B1
     203M0``P,RP@4!$=T$/8`'UJT*0JP[G!RL#E6BD@3DYZJ`_^G)L\6(,";1A'YJ<Y
     204MRAF:VPZ\TU-8&`)@RMPP%!ZF;DSV2N>CGRPCN#-'.R0YU'@C4D=+`)T,TU'_
     205M+#LE#Q"FQR95>`*..5=Q<>GA[O+G/"`+V?`1%P&V&<5\:2BCG\TPSP;Q.-\F
     206M[3V'N*>96I>+UI(=9U@V>@72R<'F(]*9SHP5`2CD9"@`"D<[SO=*)]"!LS<Y
     207MTF$<7?\L5PL?,Z!-+IN""UW0KD`Z6/!V7UYU!#Z"TWF$)[(0`5\!=K(>Q(`3
     208M#'0)&-3!0>P!+8%\NI&B"JDO>FY59@;?$:58FVU8R(-R5`423+(?E>V-+=RW
     209M0NZ`:2X7UD('9+>?]1%4)40I$I/3`NJD:D!,+JJE=\A?.7SZ4XSYZXA1A"%#
     210M;*-'/?+/ODE>R(:9$6`$MNE&5R6_6$_!P*_4:`ND<VW]`TA#+:A_@[+9[/81
     211MRB0A;H2+V>ARR;&.3%\W@EQ.!W474UYW<`.G4?2`.OW*]B/0A0Z&7(9>WE`'
     212MH;$KH$YITZ".]'0<6">7O5^2%M?,]N:%'H.6$?S?O#IF.P71B]BG>C2)K./+
     213MT`ZRSHZ4;QF*$4W9R7$1/V[)SFX$#NXG3:[MC!_&CTU<F?.M9Y0R@C%WS@;V
     214MAKJINW"%K+)C%<..AID<Y@/P@-2\`8\E'ME%S9<==#;&CCI#*#9(ZGIVD0<J
     215M4E$A3P=+JAX<@/J;,]"5)878')QX5\Y,24OI%3%YN)&:>N$FR2/*9KB+:3A>
     216MD5="+Q*\<(*`F=2WR*RIR(>[BXYDYD.]?9L],2<02:::3]>D!=&'*`?Y!WQU
     217MNKFZTAU@\L+/5N%F%-#P#=]9`'%G@EP#FV_45QQO079*@R-NB5E)UD:FIQ!&
     218M^RL.J&`?07`1@YQMB*G#3H"&#EK'JDR_8%J?(!92I.BL0[8I&"[L1&5:16-B
     219MH(S70AN=9+)9Z$VK\&?*`J4W4"P%E"^04T`C9`L=[LK9A_KSP#`:X%AI[F,%
     220MNZ7.R;=<22E$K="=BF&LE?089(#BV#`Z$^LJKW<<581R4%L*TTOQ=0HD)8(9
     221M`DHDG9T5-*%:Y8TP!)>FB.)(13@,,8@5+"&0DYC]22J26*]PI\H^S1K@#$Z)
     222M&:J0D'ROR'Z\K\8,E[)T$H;25N@N%?V%^F7;0PN%)*&L.3!CD9_31,.^`MQC
     223MC`M=PI=L%_@%G(RDWR013AR/@TX4#&);3.19E3Y?,75`1%H=PR#[W#=Y*50@
     224M"@2=%,Q30>.B4[14:V'J:UXDT]4L8HV]!'[I@H%$S`Y>6QU)(-E7>/\P424S
     225M"98UU,8,&3B/L&#(S2D81U&,B>)JHC;9!Q64<G&FF;0C:`9]+&1"5;+Y,L>Q
     226M=OIMD;^-@5Y]P:U->E`F/RAQ!!836%-MR-(%LD8YV4&K:Q:NJ"5E<S6XI94/
     227MAC&4E[U(*=-<X=7H.=8A(%.M00@+CQ"D[[Y@M8AVS<Y;0XR2807T4#8W"!M.
     228M0`G6FFA;^+:!$=C&**1["9)RVAH6JU*MP&Y$-LF%-*5.TB%I:U=']`%^<PXD
     229MO.RWHD2LS(2HC"QHO*@VH0[P=3EI#2M2:8E8>/R0B4@P:7A.C*00*BN0;2!_
     230M2U;*3!:D**50'JNZ\)/`2E(?BR84]Q^H(^&"9EIR:I1\DA,IJ:8C<6H/!5NL
     231M%=0S+RQ^:#Q3DF*^:S,#D03PH%XU#]N4Y!W;"+632BVYIB3^)U.24#4%DS:O
     232M00ZGK"MD9EW%E:2@FT*B(/*V-<M<6A4CI5RF)OO2@$26`:!H(?49',IKN)84
     233MV6&"M8P1R:R52J(TJEKHR>0]%0.3/6V@P^*8:=.3.,2$W;@84S+!D$W`U>2E
     234MV7UY4@]-ABW&((V3BC(;%U'POV98"_`FW76$KER35,*J>>I91OWU+BNPF*ZL
     235MF9,!9S%W"\YI'6.8KA05QEQYF5726<7V9K;@=753EORZS\[R7MPM9$>X3%=B
     236MXWA5%R!#.[HAE<(51&V)CPQ5I8QF4FX[IZ*ZKD2(&EIB+<SX':=?()6>1$7H
     237M2NS'W`\@D4CR2]*"O*DK2LWRDT+N)A?Z24KP-$4)]BZUM;P"GN\@0LINE5Q3
     238MBBE(10G@B?"1&-'20\UY+,I,S1J?2II*+WBPD*9(IB-4I>R%?$?0)[EI9?!?
     239MU^#R@ZYL5]$*]!T%]'#+9,XC5*6@+#NSP/,Z,0JM%5>6=>J..ICI.+'.H4*R
     240MJ4JL=6Y:\-_H*(HNEEV_F*Y$Y(;$X\H((P)N.`WW,DV)[0*J$B5%L4<MW-0H
     241M"=25I3!A<E$+R1XK;]A3=TT)RX/S0$$J8J3(+%U:7#19$]1G!$:9>-I2992T
     242MA9K4*"K<+51AB&5BC/IF]V:5`PISQ?:&^>9^1359BN6(RE:!EX2LPNB?KB<1
     243M33%R-7==`6KRBYR5_JV1R*3)JU/W'"!<K%HQX$Q10F\C%#LUE)J`4N0Q5:3!
     244M2:T'/:V>G]J3S>/I$,P2!TG^]/CI[4\_"5I]_^GC3\>GY5)M3\_O+Q&*-/SN
     245M49?_N,X_./3R#QZ*YN9?_C=^?!R0UBX_V?(_R?_C)RWYZ9;/MX^QXX?*4(KL
     246M,AP5]?A9;(DWL1*^R[^/G_%Y@@LW+[E9Y6:6FW`(7/K;RWY;7]ZE0(2'OUYR
     247MM[U\ESL=L((_759!X2_KO>R?HH+V\LZZ&;WF`U-*NMP9/'O#;C1VX9V=&/MV
     248MU2ZPAG(?5U2`JKL4R+OPLPFX/UCQ=];2B=_\;M/^L9IZ]Y<<5L^0$IZQS[M=
     249M[@[6@1.7XE;7#OHX%825M*19'S&L<&[$(]7Z6%\^&(>2VXV5?[=ZX,#3>IJU
     250M4*R>ZN_:K(&F]?R<?=":-8#.MWM%^.HA-U@].UIT+)$RIP7=^EDYEAB$;"7-
     251M.MJDH[A7Y-YD+PN'4BII=GM8)ZMV4FLO5GO3.GZV@UFLI%DO^\WO9KF[K/9Q
     252M+W9G6L>KCC`^X&<EPWK>V'.]UZW/'0*@];+6[U9#OSVLSF)/UN-WPWH+.<S;
     253M&FX'&ZOA$*SG%22U2XU[\8@@\MVDO_?ELOD=KW:L&4A99F<YX4V'??#1:6NF
     254M^4^_8^5]7C`]EI+)Y&4WLXXLVQ^-$M!9[XHE4UT<OV/]<\CUT!:5(%M&G&4<
     255MOZ9WLW9-E\NMZ%WO6Z$43J]#[F9=/[:JJ@EFLS4$<]1N^V+++IK-"K+UF4M(
     256M`)U+IO>ZVB1?)E*^LK*N=!&5;B7%NJZ+""7+2K*_`)?1?6Y1]/65*8ZVE/*Q
     257MODI(Y+*28AVVM11RY2N)Z^:F+V(5S5@U;'JO"\K[(8,'W:9]/BD*\OB3BB5<
     258M,P]!"=_+.U!`?KS)W_D]?]R^O>&V_)5IJU[Y45@D)0AS/S)^^<[2!W[Z_E%8
     259MDAZ"+;_[4^E1Y'<?Y0=OX.U/?_[V.-OXL[9_-G2VLUO1WYX-Y:>&M!U_YR-N
     260MUU;L8E-/&K*M*5,C0#IU[%^/'>><+;^?0R#++6KR#495\8A[>]^K^/&*@GR(
     261MG7UKE&7C:0MDVPR([RVFQ8*D#W1K!1.O6^9=WTYT)X0`E1$%YUXHJW)&P;$7
     262M8G^(^[Z,ZSUKH[Z9^%;8[JU&@:U96X,@UAPZPN34*O?=Q/?#?BN[X-P.$2^*
     263M@F,[Q/KC?=\Y?-]KWG!Y>=[WBC7MJM\WLN.LIN-SC@F?<_SK(3A$/ZI!.:<.
     264M?4R,]N*6FZX1J8BN0X!*:)NL=T.H3$YTAW`-%SK&98KZA8=6S$.@JJ.>U6OL
     265M*?V4%]U5IJ,=X/A#M(JI[P&7\A:L%I)29^PWXY`2W6Z6RL<A8BI[`V;U.`2L
     266MALRL?,A7#XG)5VP_INHP^5NV2@@+7[\=*T-%I3JLR5O@\!6B0ZY<X/!AID.J
     267M:D@/ZZC'FE#9F8=$N:@AE'YL)RYHE0WF0Y`_Z>?C&YZI?SZ.Z)-^KM2H\YU^
     268MQ4Z%^GV\UP_DPXH:AA;L<IFU^`UJNLDU'!!O>++*A?HD'XV/%GFTS$=]XY.%
     269M3[8J%6<^6O!H0=6%3Q<^/1^LK,AEH_Y=C\[GJ;BIK![MC15DU=!E2!.95616
     270MD2]IH^AF@TK01+6]P'RNZS%8!6H8C_[&IS^J%C9I0/<J/)VE=MN2NFT($S_G
     271MKZ'/'P./>W>3U(:'I:D?8C"Q&]7',9[<9.KC>4RE&=S\-+!_MHFQX=7>Q_CJ
     272M"G\>8:O\'&2K.I\#;767/=H\@LTZI<,-7L[C&&V>XOYIL*WN8[RMYKS'G-#.
     273MW@SU`(POW=MUW/&#_#B&77'*,?+HG&[Z.@[9=_WOT?=D8HJQ=Z$_0#(^YVH;
     274MM&H[Q*$>@(1O6V$2N%E!LO6MNK`<M[<JO&>_;5:HW)SPU#_=SUOWF4[=A:?^
     275MXS%<WM`*5:Q*3M"&D::VF@]-=\M'T9.NLZ,V`D*PMGG/[3KNEU/IW6=>Z2C,
     276MI^J3=RME%Y[J[Y;LG+V-,K82%(N_I:.T/.E".%;+49J?5&*:N\A4MNR.]^)C
     277M;%#$VII(WSY*ZJE(X?]-1V%Y4J?%J-A/)HN9B4>5MA<AC.UWVZ'UB^Z=><RC
     278ML)X:&OR.\TG?`9J^;KZ.,D=&,![K]))Z[!#57JR?A;Y/J#59:SW*'"5ULW^/
     279M(K=N<#*>W7;<X_:NF$E]'F6^]S2^V7.9XZC.%XMI.:T?,4GO4>"0R>W@?O=#
     280MJY_-GVZB>!2Y`30HBM[[`X)U]N\H<`,(3Y1CTSR,&GP>V0UK=S=5REB`L&)+
     281M:A"94)MPA0E(FI?>>4*?.73(L386$1EQWP$O\]8?+MHX#BSTA@L;/Y#7DT/"
     282MP)N(8FUE$9+9>PT]44(DR[@,%+K8X/2"T`_ZL*RM>@+"O,4/&8VN$FH(7K$J
     283MMA@@R.C@KX0+A*>1Y6/UEY`HO%NL_1;"A%.1%!?:K&MO=<5KI?,^.%R^T'-(
     284M%;X6=JSR&B+5KQEKW&4C>\TJL"!'.2JD/C5GQPR?A&M3E;C9'5JZ(AVVS&=X
     285M*_`*$X!YG5@Q6QW]WJI#2]>;0_>+^+UKS*F:.#N,=.TW="SCOBN^N2?:5U&U
     286MVZ>]<ABZ_?,!-;]GZ%="'S7T"U&/;LV*=A3%./0P&#,4$&0#,@8'%,(H-'$4
     287MA^*BF[_B$MWX#9(0:S0:],6!!%&H(CP"!<&4'_4'[Z5["Z*CYBUXZNVGSCYU
     288MU9T&3[W-3[W=G?W<U?*IJ_FYJY5=M;$_ON"=\`5OQS/XT*(RI40'3%LI'WJ4
     289M0#&>M)2,E^V.X+=8+4-`B\*:!*FTVUFO4M1?MK,BY7M/<YU%VU^1+O-D[]+#
     290MQN0QA=/+VLMV:.!3L;G5LVC[-?`AJ6N=9:=K8_'[AN,H/IQJ4'4S6K0M$U4R
     291M'ZJ4LV3[1!)3F,99>+I%\))M7D_EAW>$ZF'8^<=:?/C?D.3A7Y+@WJ'AA82/
     292MTQQOZ=NJ0C^>6+%F.4M/!XN,T&@EG<6GFP4?OFIV3((5A[>%@S1&.UM^,=\C
     293MM>^]C'A3VYRU3[+[YO)4='IK>!182>TL/YTV$,PZGY\_?#?8Z%9]>MJ!B>GO
     294MWM=1^F*^5^KPG8)@&%[=SC+&[=K#D#[YA3C(HST]>+J'9)![W2*3/CF)^+6^
     295M>98ZOFFVNXWZ5'>X>+E)R+XSSJZ]F*N:.P7"X?'L]7)&9?C-DK3.PM-%Q61Y
     296M.ZS`BD]'E8CRZ,_%$:;1S?Z8(H^R+=^4;G7ULS#[+.C6-%8[^X7"XOM3V%GF
     297MG`H/ODQ2=1J]EIPA(ASI64<Z2D_W&A+[>TSP>GF*%<D$M9;.)MW/K>$]`/*S
     298MV>+3H_LFOW.V2[//S]2=W$RZ[6I+Z-22#=TL0<=1.U+%$VM*/\K.<!7.U`MY
     299MF2_/(2N>(QH*RB.2#NBGO&B,H+N-E[T)OT%>SD>+SYH&BU8]RK)/VE+<MHM0
     300M@.Y0&:[E$XW]Q6,C_.Y[GT?)&31+9.#7H_0,G.&[E34&SF*E@2#7;>S!\9"I
     301MF1(_Z]F=Y2BM/I53(5#S0WJW(<JY7&HNGWW*/I7R_,<NZB]G]`ZJT'-MM.R,
     302MY.$8]3F.PC.<AU,F/#MVAV[=BI'UYR>U;G?[LA?!!UO6459]'A?GL9[]*3Z/
     303M>`V92"W!5AI!)GSRQ0>MZ>L%7,91D&M<1^D\,#,_^9I;/HK'`9[QJ:&ZCL*`
     304MT3I9K8ZSM/ED+:K%IU:KSQ1?H]Q]J5=]$4?B"5\S/HK6@<83J:#]?'(>H!Q?
     305M4`[9\0"U87-^ZNBLM]ML+,Y&]-0M<TX&>RJKRLJ*]320?>+A;/,L7P?`QQ?1
     306M0E@MTATH'QD?LUU'Z;"A72_F=MY%W<>5/9*!M;+L/7(;`1^N.LK<'IPZ.N5\
     307M;MK@+$4]]2AR=SU;ZZXYO"TW,/#]Q"A9]FJ+RGH_X?$$5G7DS(W#MSU*F.DX
     308M\:!L0&O;QKX96#7=%#0?*%9WU'OK]/H;?#44RA,A6M+[&W^J`M1J#+?J-E:F
     309MMNB`M0240PI!0-5`E4D)BEJRT>2*KBM(_>!7F?$A[P.:&DP4Y(.$V0.3!D(D
     310M:8YFM`%2!X<RIQ5)%BS8H'#>E[UL>=E>0YS=W7,Y068`OL*/$\<CI\\0[R9+
     311MY]KXTF&>S#..=E,O2L"[<7=^B^%*MHUC=<<\P61`-U'`*3WAR$!MR#IU+^_/
     312MIU=1)J[CP+$`D([5)LC#UW@QSTU@M'[7_.R-#0.S`/&7>L+"`&`%#JPG3!C@
     313M*X'74L<)"!UY+9ZU<(!!!UT#GP1J+^8J"K3%+T$'12ID$T'9[40ZW9.0%9P]
     314M=*"^@%'Y-M+IT0X(Q>_QU&CF<$QBJ[+^7MN`&"_F[][1R@!-U=D^RXT*!PVP
     315M54X`%Y"HW`I.I-[H+?!0`MB<!W)S+`1#%M^ZWZC-@1"=;K-MP.80J`4?:)WH
     316M)X@3!M6LN_![K>$>L=-+"F1^K7X`M``W.!WF!&>.:Z!?UW6ZY!W4S'OUFD(F
     317M9XSNW)C,<4R].=%DA+V@VSPIR`>H"IP"0);;@:@"I.`CXM5+3C?KHNX[@92C
     318M$P[O<N):6`;K:8"[`7_3:CXA#I("?L#-54^`%-"#YPM3NAP>.>S`\G;JD2LV
     319MW<31S.D4#+31[P>\\;9E93G_R/&Y[=OY!#0!(/`)4QPXO=&,PP<.UCRCS`X>
     320MQLV][XZ0N[VVC*$'B1T>ZQX=D6;?BVQ_]E%W$.)H8-Y/!!%[/;VHP51R9#KC
     321M199["QV6ZN9\<N,<"D[3MD>1P\#%OAT[]Q&4&Y_/$?OL3&P,2B.&V#24/-[[
     322M!WQC%DCN<IDU[)PM*-WA3&L/BTIW>MK>&OUW';%":!Y&E<=[0U53(\I=KM3;
     323MUSVDW.06`JC%(LI5KI'?(()J0>4B=Z3*\F`#6:ZDJS(&G1%F"^Z*1'2-,EM@
     324M%\QK#S-[8'?U9*%FN"$939:>%0M=5X91P8>B9[-^#$T9N1K#T1[IO5+7>'2$
     325M>5ON%I*V*"\X]DG:+N;`[,IL0J"^J@=3JI9VI1WYF[1S?`SAL8ZH+Y,''O-M
     326M!WWON:XJ31]!7[IT.]N1&T.;N:3E2O^GU)Q1+PZ`\J`OV+2/]19!WXX?3/4#
     327MLP9L<])*@8=TWI3L^,"QUM\UM@_<(#6B!OQ>RQ<J^)@_N!RYN]<E:3M\MS`Q
     328MJOTXY8E1[<<GF?JS"N@I6(=<?9:J<!.'7&DS^5FTM*5R2)>V5#])6/XD89\%
     329M[+-X:6//`J9MY5/&M+'R6<S*)S'+OQ&SWTC9;V1,6PLITY;R)T&KOQ&T\AM!
     330MR[\1M,]R]DG*VB<AJY^$K'P6LOQ)R/JSC+5G$:LF8J[5CA#B&">S?\RGS(#Z
     331M+TJQ_T:._4^_S0L8ZWQZ7GSZ/[^_[4]6?__[W_Y5*OKQ]>]O/_[Z_K=?WNQ.
     332M^?%__M=?WW_\[Z]_?_W7MU_?_OY+5))8R>/]];_]]>V__/CKW[0O_HGK7Z+M
     333MF9_:+CLG8=;?S4GX1V_S!QD)__"1:*K]Y9_^Z3'J<_QN-L*<OYN-,(\\AG5]
     334M92-\92-\92,<ML$_D8VPTK&"\E<VPLM7-L*_>S;"*H<,UC^T*QX9>,(2#H`#
     335M0#?0;`%-+@#CWQ(0F!CPEID[X,D&'P7I".\?Y=^P)N]Y.]ZB?^44?.44_),Y
     336M!6L<@C._<@J^<@I"=OXM<PK6QLJR;_VAEJV/#@X\?#.#A'5D#K0WI<&3VS^-
     337M:E[FH[\9ASU7F%-FV2KW:BEO7.G_XTWIZ$@F$!M7C5)-62AF_TYU`Y`J/A[S
     338M35GFS!7H\H1:EP7M%#-AF21@QK+2L-8;F>6:$2"F.\U')!<T>8C&Z)WN&;-X
     339M-3-`?@8C,</OH>8E&JEJJ?Z@PV'O9"-28T"4-68CHLML#TK?8Z*L,1\24O1]
     340M2'1Q':-2CT%1.IF.BA+P?6!(Z]\CHTOL&)QS;/(>&R7MQ]"T8V3R,3+:K@V-
     341M<=QB>([1<9E*AWSE+\K^%V7_B[+_1=G_^8\H^_DJA\ZH7Y3]+\K^__>4_7RU
     342M8TWT/\1I]Y$03\,6?T\UY_G0O1M'%66XPADQ$!@G8OAH1FH'^%$&O#Z._9WP
     343MI+0F,`N4=CPQ`"24^>ZU9:7)R^_Z8WS`[]F`'=X!2Y(&]@!#?M`>&5S2'@FP
     344ML-X87++>6`*!]^BV>T.PI+V)GK`6ZX6B$W1#D0G[<8L^^`".8S#G%^_^BW?_
     345M\L6[_^+=GX5?O/LH_>+=?_'NOWCW7[S[+][]S__/\>[S=?A_T_7%N__BW7_Q
     346M[K]X]U^\^R_>_1?O/D#(_XV\^YR.R%K*?^P1%'R(H]=`F:9+L#!>V3[`WRM+
     347M8Y;]XR96;&;(DK':J_>F(4MPGIN(M44M^T>^MS09M&2P-K5F@=Q*3V!/%K1L
     348MB.OB08U;=ORXUMH9MV1P4NJ9&KE$:!*G?'<+72(^6<3:M,AE@T^/O=7P)4C;
     349M2_:K1TI*!>Z]3X8RR2RN,RT+9B*VV7,:%M"L'_KMH<N"FHUA88S/6U/JMVPV
     350M-3V2!G]QUC]H[6^,<(I5V(9&/Q'EO,L//?P)7C3&-ED0M'[H6",6W8SIW>I$
     351MA]_`-<:7[4"/S^`IPZ!,B+X6LIX1`$1LO2JU6JLI4@TXW-:]ZRU_3'Q.1KHC
     352M`S#O],#V-XSKM!FO;YBAJ:'JSLW"9I[Q79MULO]]UN>>\G0=$ZZT<9OR&QGJ
     353M,>.:9+&GG%[?/>&:%^!Q>K#-]X0S=>*8\+*G^]:.J=;D`IUJXY'[7"M=/>;Z
     354MQMR+/==,[XBIOL<LWRS=0`/9I)''+).5OF>9.19[EIG*$9-\*\<$6\J"SC"I
     355MZ#;!-WJT]_PB1</GEZ??Z-QZIW1R25VWV66VA<WN+2;6UW_Y"]G8O_SZ^NO_
     3563^.5;^M-__`\__"]`&]JY]M``````
    361357`
    362358end
  • Tst/Long/gcdp_l.stat

    r24a77fb r001cc15  
    1 1 >> tst_memory_0 :: 1314101593:3132- 13843 :3-1-3:ix86-Linux:mamawutz:333024
    2 1 >> tst_memory_1 :: 1314101593:3132- 13843 :3-1-3:ix86-Linux:mamawutz:796840
    3 1 >> tst_memory_2 :: 1314101593:3132- 13843 :3-1-3:ix86-Linux:mamawutz:3975352
    4 1 >> tst_timer_1 :: 1314101593:3132- 13843 :3-1-3:ix86-Linux:mamawutz:58
     11 >> tst_memory_0 :: 1346936518:3150:3-1-5:ix86-Linux:mamawutz:332936
     21 >> tst_memory_1 :: 1346936518:3150:3-1-5:ix86-Linux:mamawutz:2369728
     31 >> tst_memory_2 :: 1346936518:3150:3-1-5:ix86-Linux:mamawutz:4499664
     41 >> tst_timer_1 :: 1346936518:3150:3-1-5:ix86-Linux:mamawutz:63
  • Tst/Short/factorizeQ_s.res.gz.uu

    r24a77fb r001cc15  
    11begin 644 factorizeQ_s.res.gz
    2 M'XL("!]4&E```V9A8W1O<FEZ95%?<RYR97,`75++:L,P$+S[*X;0@]48)9*=
    3 M])%*A])+H!1">@M.2-/8"(P=+#FE+?WW2G:02B_2/F9G9U=:OSXM7P`PB>?E
    4 M(T9&&UJIM]$B6E\R7,(&=ZI6)B:+R-V0$L7^8)I6?1U7.TWKXP?59F]\42KA
    5 M[8SBU#8'F*,V0Y5&7"EM4"4X-=4G"N+!,XIO[\RI/7I$*<""I%L7+YH6L:H-
    6 ME,M!X4%`6SV6>\-R8B/CL>=E4U?BF1EW+AQM>=WC-RK?5AON;N(;L<S!?KS;
    7 MZRDA!(J`Z<54WN>VDZ_@+.R!VYZ3B6DILO3.!U.*5M4EVI68)G&7G$GR?@ID
    8 MF;QL"`+==9R>QXQL><C/)(9-BO`@<1$FX'/Y;^^)R[+(CGP?6>$[:P@V6#P7
    9 HW6"EN7"M(AOJ42QA"?><-W^&LM.[W^$>O],Q(XNKZ!<3F14Y4P(`````
     2M'XL("""V2%```V9A8W1O<FEZ95%?<RYR97,`[5??;]HP$'[GKSA->TC(C_K.
     3M9R=9ESQ,>ZDT3:JZMPJJP@I$0H!(Z+1-^]]G$^H`*7NHJE65*@2Q/W\^W]UG
     4MY_#5M\\77P$`"_AR\0G>U54=S\O1N_/>U6Z$"C#@3;DH:\\_[]DG%`5,;L?U
     5M<EW^NKN\J>+%W8^XJF]K-TD6X-H<PVJ]'$-]5]7-K`J\>5G5,`]AM9S_A(GO
     6MR"J&WZZC8_.S94QSP-:EU.*3Y1J\<E%#:<>@A(\Y5,8?8_L:![Y!@L#916&G
     7M.,M(M@O6[+2_Y5^7@^'\FNS3=PLA6]H?U]WZ,X4\ATG+V3HS=WTR*[D9A&T>
     8MR*QY=E:O8V"9.5#&L"X74UA?YB+T-N&]'WY?M<:XV&4(<MCT/7D?H#^D=EP5
     9MT&0R;P7Q)FT$I(NCO(=V%'LFY`\]X_B-:>38M&B0;YJ6'.1VJ9Z!MBP,,21G
     10M,]D+*G5!<>K`["$HX[4G0KB=A3`RWVHF_!"\\8Q"&,_0`FA;%IVW44NQBWIE
     11MIGNCV9#]OB$-.?`025+_=C:D_LC^&(M#BH[0B#C3PO1M3S:<X``+D%"GMLD/
     12M)F0B=;]=BP)/H199JK0UW-`X0B$)LP2I!2DX($:89!))LUW,K#Z:-5,#J5)-
     13MBM)#G+I\XZI$K20>!\H1)TIHC9T1$Y[$3(A4B+TTH$+C56.Y304'E#(R'^,V
     14M!T2I,=&F228"E5"ZS11'FCD3;$AM]HQ%85;?8;[??XIJP2.J1?]+M>"$:M$)
     15MU;K\YU(M.*%:=$*UX&55,PI)ZIZU/2Q`5(H.54,2SW36.$%.T\Y9XXPI2W3W
     16MK!WQC0(B5<INJXYJ2C"KE+BK&F8J$[IQXN&LL>"$CE-ASIK&-$F2SL8V6YF%
     17M8MY334I-F!RHIA*M$Y7R@6J<D1":=ZJU;TU\I!:`M]IC4*<8K/Y5#-ZVPZO;
     18M#JY\OY7-5U<V&^WX2=J]%<^7+9X'_Y3-Q[UR]RY"TMPF[$W*7I0VE8?^^?O>
     19)7QE2;8Y_#0``
    1020`
    1121end
  • Tst/Short/factorizeQ_s.stat

    r24a77fb r001cc15  
    1 1 >> tst_memory_0 :: 1343902751:3150:3-1-5:ix86-Linux:mamawutz:173840
    2 1 >> tst_memory_1 :: 1343902751:3150:3-1-5:ix86-Linux:mamawutz:2240284
    3 1 >> tst_memory_2 :: 1343902751:3150:3-1-5:ix86-Linux:mamawutz:2273068
    4 1 >> tst_timer_1 :: 1343902751:3150:3-1-5:ix86-Linux:mamawutz:3
     11 >> tst_memory_0 :: 1346942495:3150:3-1-5:ix86-Linux:mamawutz:1005280
     21 >> tst_memory_1 :: 1346942495:3150:3-1-5:ix86-Linux:mamawutz:2240284
     31 >> tst_memory_2 :: 1346942495:3150:3-1-5:ix86-Linux:mamawutz:2273068
     41 >> tst_timer_1 :: 1346942495:3150:3-1-5:ix86-Linux:mamawutz:188
  • Tst/Short/factorizeQ_s.tst

    r24a77fb r001cc15  
    1919testfactors (l,f);
    2020
     21//tr. 448
     22ring r = (0, ah, bh, sh0), (ch2, ch1, sh1, ch0), lp;
     23poly p= ((bh^4)*ch0^4+(11232*ah^2*bh^2*sh0^2-11232*ah^2*bh^2-24960*ah*bh^3*sh0^2+24960*ah*bh^3+12168*bh^4*sh0^2-13736*bh^4)*ch0^2+(51609856*ah^4*sh0^4-103219712*ah^4*sh0^2+51609856*ah^4-179312640*ah^3*bh*sh0^4+358625280*ah^3*bh*sh0^2-179312640*ah^3*bh+243165312*ah^2*bh^2*sh0^4-475066112*ah^2*bh^2*sh0^2+231900800*ah^2*bh^2-151856640*ah*bh^3*sh0^4+284144640*ah*bh^3*sh0^2-132288000*ah*bh^3+37015056*bh^4*sh0^4-64490400*bh^4*sh0^2+28090000*bh^4))*((bh^4)*ch0^4+(11232*ah^2*bh^2*sh0^2-11232*ah^2*bh^2+24960*ah*bh^3*sh0^2-24960*ah*bh^3+12168*bh^4*sh0^2-13736*bh^4)*ch0^2+(51609856*ah^4*sh0^4-103219712*ah^4*sh0^2+51609856*ah^4+179312640*ah^3*bh*sh0^4-358625280*ah^3*bh*sh0^2+179312640*ah^3*bh+243165312*ah^2*bh^2*sh0^4-475066112*ah^2*bh^2*sh0^2+231900800*ah^2*bh^2+151856640*ah*bh^3*sh0^4-284144640*ah*bh^3*sh0^2+132288000*ah*bh^3+37015056*bh^4*sh0^4-64490400*bh^4*sh0^2+28090000*bh^4))*((bh^4)*ch0^4+(11232*ah^2*bh^2*sh0^2-11232*ah^2*bh^2-24320*ah*bh^3*sh0^2+24320*ah*bh^3+11552*bh^4*sh0^2-13120*bh^4)*ch0^2+(51609856*ah^4*sh0^4-103219712*ah^4*sh0^2+51609856*ah^4-174714880*ah^3*bh*sh0^4+349429760*ah^3*bh*sh0^2-174714880*ah^3*bh+230855168*ah^2*bh^2*sh0^4-450445824*ah^2*bh^2*sh0^2+219590656*ah^2*bh^2-140472320*ah*bh^3*sh0^4+261877760*ah*bh^3*sh0^2-121405440*ah*bh^3+33362176*bh^4*sh0^4-57667584*bh^4*sh0^2+24920064*bh^4));
     24list l= factorize (p);
     25testfactors (l,p);
     26
    2127tst_status(1);$
  • Tst/Short/gcdp_s.res.gz.uu

    r24a77fb r001cc15  
    11begin 644 gcdp_s.res.gz
    2 M'XL("$&94TX``V=C9'!?<RYR97,`W5I;;QNY%7[WKR""`"N-))L\Y/#BP`:V
    3 M#;`(T!8+9-N'/F0ST<4:6)8,:9QH6_2_]_`R)$<C.8J3AZ(((G'(P\-SX\=O
    4 M*+__[>V[OQ%"V"VYNB*OW\VNR=UT]OC[[K+9-80!<$:`4C-A;$*!,'K-X!K@
    5 MGV19K=?S'7E]\3YH@$L2V_P2M<4G89]RM1.R6VZV#6GFNV9'%INM'233:C5]
    6 M6E5-O5GOR,-F1AXOHXJRHU`ZA3^O5N1I77^NMG75S,EZLYXTV_IS7:W(?%\]
    7 M/*[0O.GF84X6V\V#7>'O*/SKY6*^CXJ44^37=Z,_KQZ7E15)2^O.TL;-^&TY
    8 M;]<@]9HX$S[9]3Y6/XW)QZG]F./'Y>4ENM6:\/%IW=3-:CZ#@;QZO&+#GUJU
    9 MC#JUJ&K7S/[ZM&K0E%^FL\MZ'>U@++>#@;=C0]YNKF-G)^S,AWU#'IR^$*5>
    10 MH+_4S9(\5ENTLIEO=W%V)^),IN0R#-I?WOV)O,),7J[J3Z_>Q!%]2[#S]WI=
    11 M-X/AFPO[36YOV\ROYU\N=TW51'$3Q._6F^U\\.K/_WA/WKTEY/HE9?@*UT-O
    12 MD[YK\EWZ6B.!WD;/H9,"\"F8D,73>NIB&7,%G42`2,&#3EC!%_*NQD*J%W]@
    13 MQ@=#5/BXK=>-RU2%^9ECF>,W^O10K>I_S6=V)"VE.@JQ6!^WFVFND@S(XV;U
    14 M!UF,_?<=&49QK.9_MP\<:Y!XD=D-+C&P,U`XII>#%9BE9V&?VY4&9#8F+!='
    15 MY_X3'U0*(^_L*&Y"&-'I.[)E-QSSPL?[\2QM?T'S&8*E>`JT*:LA\JJOY<TK
    16 MTJ^-(V)1);]]=E@D3P1FT\?V9F+*4A3[#V+"0)L26WS"*`6.+9A(8-A(.N1M
    17 MR$7JR@(DM"\+BUV'B!9E,&PV271,*+I'V_Z2WK;]G`''(?L51YD?%;SD?J)M
    18 MQ5&X[=1BU)VT\YY$6(7AOU9(=(728KE0F?PML5(.M"Y0VD9T+T8NGGL^<M'<
    19 MP\C&<G^Q%Q/8\XG!#A'QO%3=E1=^V1<HTIEUIFL=6(^]A9D_DO:69OW02);T
    20 M2DA9QL3N3J9:(II\8X%)3,%=G,(GG`MFY4:'<F7/ZCNT>`\3C(7_;"5E9KER
    21 M!C$&TMHA,;),6OTEQI9+$ZST?7RDC;1KIT6U-8Y1Z20U>B&5]4*-O#9M-=E>
    22 M;>=CWE#2^3M273WFN/%HA:248F(QK[X))WJ#)I6!O&+..668M0,/""&H='8J
    23 M**4S$Z@!:^D$F`G&0LF#VT)RY_9$L9)V[%7@DL*$YM9=AB*465D&(U9BO&R3
    24 MH>-:VJPQBG$U@CLKC%9V6-L`NYPJU,.5BY>45(20<>-+A$,PPG"A78%XFY,M
    25 M_'CL+F+"589SJG-J*=E!;+@9>)BLAAXIR4.]MNAV4V'RM.*BJ#!W%58?8YJI
    26 MHAJQB.RJ<WPIG9!=F:/(WEOM-+KW1%O5FMY^500WZM?=2.*0@J7YRPX%+7J'
    27 M@LY`4ONH+^KMKAE[U-@L2(-$=,MZD*%5#U$/D%SK,Y!<FS.0W&2;Q["32%ZT
    28 M"%RT$%SL6SQR(%Q8%+9]*!KUP4E`?YD^GMDJSL%UTT?(([AN,G0TZDQ<-_J;
    29 M<=V8LW`=YY_$]6+??K6RZ4QB%+X'V5'DAR`[H^)99"\R$"\R;#_L;[65F8-^
    30 M%ZTW7\;I);%>?]ZL/EM`L-NI6MW-/VVK>AI?Z^)D=^X-@#&A+!B$N*0GQ`DF
    31 M`!_`/8"2B-J5;QO,;M;R$_@P^>Q.Q8%DLM6&T2^Y#-KDJ,1UG;+0[QJJ]+CD
    32 M3!%*!^DR3/5-0W7I6HAU/)J**8[RF`I%2VAME4K1T,)*;&T=`9Z$K7>XYXR7
    33 MYR/)M3QPYOC1/+"'6RDK/BPP9P,7NHJ[H%58DYQ#-0'%Q-!N[H%K.EEN4SRP
    34 MD@C#**DQP96'82>*S\Q*A=590B3&F,\9X-;REC,V*K5I@XRGK))QB&+.%--A
    35 MS%B`X6',C("KX+(9E9X=C``HR"".AS.>_FU(\4EJFQS7!J&4]BTM)`TSE'6=
    36 MA@G(*S0-25,XF7D)=-+(5!$<E(@E@5Q#AY+@C+FSWVY9H#(K3RY,K`I.C3*A
    37 M++1DKC-EC3F",M`NLVUT$)-4"H^1I8G1`2T5Q/"(LN0A.FB"]O$I45D,#Y9?
    38 M"H[@FH;@(*`X!F-;-&XF=-UHX#$Z4H,(P<%**7W$#%<I.(!\C,;@6)0V(3H`
    39 M4CBRE#E[G`$-,(6"NZ)DND)@55Q6Z)NR1:FP*!54"#%HI[8E"[9DM=041R6.
    40 M,HPPUBQN5HK#!DI338RM]@L[V2(3J[PH8C2VP8VU)HFL;G/*Q5B7<O&6MC3#
    41 MSHLR8ZHS*]$IK(ZC=.I0TS-TJB?:JH9(ITZ+9&>,O3<)_&APSN&74@;\D"$Q
    42 MR$+F[U:^PI#(8+>J[Y8-:GG8S.I%/9\-HX+^>VB7-3%01UE3T73H`/KR==Z$
    43 MW#Z9;N]>#GG3E57JD4VX\\U"G(4^1W1.<AQD)S^4,R'B9';R(YSIJCED38SW
    44 M#_`^:V(\.YBY/(\U,:Z^E34QKL]C3?S$"^4QUB2R,T:X>T'R94[N-F2S]E>J
    45 M;75%%D'6U4-RX\3%5=Q!U7@ZG@_':,-R?#\\<V?V)\7E<.O<UZL5"J<^T=NW
    46 MSRC(<B5DNX-_Q<\DHMKMV>W6V4Q$(3?IQF-A,46P7N#_>\Q:Z"GFQ0*?^6B*
    47 M([Q8%O>3N9-96JF$!NZFR^N:HIR=M<0,X7RKLUAV9`_WA)TW]M-1"J<M+A91
    48 M."OXDD>#IQ^$,[,L['(+:PYN$^O`W)L6GIRI'\";X@TI[C-31#1[XA79J5Z-
    49 M]1J2$O0<6B4'OA^^E73]R?98*3-G5'1FHGWT18BV',6.$/0/HNWB+J+WEJW$
    50 MCIB0<M0F$EW!V<Y;RPYC>D,Z["*3K->OXZ1%YIB.T6EE58@O;O#2&(T],L45
    51 MXZRPIVPM0IWW$^T="V7`8VY$7!5]"X[Q(&'9;?35JQ(V_B'#/N.A`IA,CCD%
    52 M-@BN\'B86G8R?@@KW60MEH$83(?%_<%3T"`SL)'YCQ!,0H<8B'!C/6C&^V%.
    53 M#"3OS!*'OV+M_"]46T&J[1S/S,TN_&:UY2=^(6+2'[?39;6^0YAK-MZ&^%M8
    54 M6EMVUE:)E$A]%`0/O7@&^GJB4;6Y_9I(=NO'[*W?RTB)O=4[("6*9XK%=Y(2
    55 M>_?V/"E1\C0I:2Z:**;.("4J`VME?LRU/-/]VX@77<LSG=%(#4>H2-&G(KK/
    56 M\X]0$9WQ2%V>247LE=PW4A&MSJ,BA]=S37'R:I[IC$@:^NU4Q%[:/;<+'2D8
    57 MGT-$3DZ)2T%+0T3JX[V=>G)ZEB53'B4A1AXE(49E,_6/(R'N0NX\$@*]2[D#
    58 M$N*63CP$LHLY<!=S/Y*'@+NK^TX>`KV+ND->-;V81MDR<T?^KS,1H.K_CHD`
    59 MU<^GRR"UGR(#$:7B4[B_L&U/1N`^Z@A_M6'_DN-I-V##-Z\O_@M3I="Z120`
    60 !````
     2M'XL("+N>2%```V=C9'!?<RYR97,`W5I;C]NX%7Z?7T$,`JPM6Q[>Q$N",;!M
     3M@")`6RR0;1^S46QY+(S'&MB:Q-MB__L>7D12ECWQ)'DHBD%LBCP\/#=^_$3G
     4M_:]OW_T3(43FZ.8&O7JW?'7UWG?1&0IM-H/A\,3-$[I;+!]_V\_:?8MRM%\W
     5MNQ:UU;[=HU6S,X-H46X63YNRK9OM'CTT2_0X"RJ*GD)A%?Z\V:"G;?VYW-5E
     6M6Z%ML\W;7?VY+C>H.I0/CYMJCQ;-0X56N^;!K/`O$/YEMJH.09&TBMSZ=O3G
     7MS>.Z-")Q:=5;6ML9OZZK;@U4;Y$UX9-9[V/YTQ1]7)B/"CYFLQFXU9GP\6G;
     8MUNVF6M*1N'F\(>.?.K4$6[6@:M\N__&T:<&4ORV6LWH;["`DM8-09T>#WC:O
     9M0V<O[,2%O4$/5I^/TB#07^IVC1[+'5C95KM]F-V+.!$QN02"]O=W?T'7D,G9
     10MIOYT_2:,J#F"SM_J;=V.QF^NS#>:S[O,;ZLOLWU;MD%<>_&[;;.K1M=__?=[
     11M].XM0J]M75V#`C`_"KQ&?8%.#<7S8!OM!8FZ(.5H];1=6&]#-&DO5)1']VC/
     12M<>I*;5]#JNO5[Y"3T1@4/N[J;6MC64($*RA$^`8C'\I-_9]J:4;B4K*G$,KI
     13M<=<L4I5HA!Z;S>]H-77?=V@<Q*'>_ML],*@2Y$26M[#$R,P`X9``1HW`,CYS
     14M\]RM-$++*2*I.#CW1WB0,8RL5_-,^S""TW=H1VX9Q9A-#]-EW*`<IS,XB?'D
     15M8%.2970]U/+F&@V3?4(LJ&3S9X=Y](1#-EUL;W-=%#P[?.`YH4H7T&(YP9@R
     16M:-%<4`*-J$/,?2YB5Q(@KEQ9&'0YQIP@`V$S2<)3A,$]W/47>-[U,T(9#)FO
     17M,$K<*&<%<Q--*XS2>:\6@^ZHG0TD_"H$_CHAWA>*BZ5"1?2W@$HYTKH":1/1
     18M`Y_8>![8Q$;S0"<FEH>K`\_I@>4:.GA`W$+V5UZY9;]!D4JLTWWKJ/'869CX
     19M(_!@:3(,C2!1KZ`QRY#8_=E4"T"3%Q:8@!3<A2DL9XP3(S<YEBL&5M^!Q0>:
     20M0RS<9R<I$LNE-8@0*HP=`B)+A-%?0&R9T-Y*U\<F2@NS=EQ4&>,(%E92@1="
     21M&B_DQ&E31I/I568^Y`TDK;\3V=>C3QL/5@B,,206\NJ:]$ROUR03D)?$.B<U
     22M,7;HG'".A;53TD)8,RG6U%B:4Z*]L;1@WFTNF'4[EZ3`/7LEM4DA7#'C+@$1
     23M3(PLH1-20+Q,DX#C2IBL$0QQU9Q9*[229EB9`-N<2M##I(V7$)C[D#'M2H11
     24M;X1F7-D"<39'6]CIV%V%A,L$YV3OU)*BA]CT=N1@LAP[I$0/]=:@VVT)R5.2
     25M\:R$W)50?80H(K-R0@*RR][Q)55$=JE/(OM@M?/H/A#M5"L\_ZH(;-2ONQ'%
     26M:0R68M]V*"@^.!14`I+*17U5[_;MU*%&LT(M4,4=&4"&D@-$/4)RI2Y`<J4O
     27M0'*=;!Y-SB)YUB%PUD%P=NCPR()P9E#8](%HT$?/`OJWZ6.)K?P27-=#A#R!
     28MZSI!1RTOQ'6M7HSK6E^$ZS#_+*YGA^ZKDXUG$L'T>Y`=1'X(LA/,GT7V+`'Q
     29M+,'VX_Y.6Y$XZ';1MODRC:]Q]?9SL_EL`,%LIW)S5WW:E?4BO'B%R?;<&U%"
     30MN#1@X.,2GP`G"*?P0.T#E0)0NW1M#=E-6FX"&T>?[:DX$D1TVB#Z!1->FY@4
     31ML*Y5YOMM0Q8.EZPI7"HO7?BIKJFQ*FP+L(X%4R'%01Y2(7%!.UN%E-BWH!([
     32M6R<43L+..]ASVLFSB6!*'#ES^F@>F<.M$"4;9Y"SD0U=R6S02JA)QFB94TGX
     33MV&SND6U:6692/#*2`,,@J2#!I8-A*PK/Q$CYU4E$)$*(RQF%K>4L)V12*-T%
     34M&4Y9*<(0AIQ)HOR8-@##_)B>4":]RWI2.'8PH113X<7A<(;3OPLI/`EEDF/;
     35ME$NI7$MQ@?T,:5S'?@+P"H5]TB1,)DX"G-0B5@2CDH>2`*ZA?$DP0NS9;[8L
     36MQ2(I3\9UJ`J&M=2^+)0@MC-FC5B",E(VLUUT`)-D#(\6A0[1H4I(&L+#BX+Y
     37MZ(`)RL6G`&4A/%!^,3B<*>R#`X!B&8QIX;"9P'6M*`O1$8IR'QRHE,)%3#,9
     38M@T.!C^$0'(/2VD>'4L$M64J</<V`1I!"SFQ1$E4"L$HF2O!-FJ*44)22E@`Q
     39M8*<R)4M-R2JA,(P*&"408:A9V*P8AC4M=)EK4^U79K)!)E(Z4<!H:%,[UIG$
     40MD[I-*1<A?<K%.MK2CGLORH3(WJQ(IZ`Z3M*I8TW/T*F!:*>:!CIU7B0Y8\R]
     41MB>='HTL.OY@RRHX9$J%)R-S=RE<8$AKM-_7=N@4M#\VR7M75<AP4#-]#^ZR)
     42M4'F2-65MCPZ`+U_G3<#MH^GF[N68-]T8I0[9N#W?#,09Z+-$YRS'`7;R0SD3
     43M($YB)SO!F6[:8]9$V/``'[(FPI*#F8G+6!-A\J6LB3!U&6MB9UXH3[$FGIPQ
     44MW-X+HB\5NFM0LW67GEUU!1:!MN5#=./,Q5780>5T,:W&4[!A/;T?7[@SAY/"
     45M<K!U[NO-!H1C'Q_LVV<4)+GBHMO!O\!G%)'=]NQWJV0FH)"==.NP,%L`6*_@
     46MWSUDS?=D5;:"9S99P`C+UME]7EF9M9&*:&!ONIRN!<B966O($,PW.K-U3_9X
     47M3YAY4S<=I%;PUTDFU5ZP8.WB`[<V%IE9:V5L@3UBK*^<7?[)VOF!.CN<%=E]
     48M8@</-N=.D9GJU!B7:50";M-.R9'CQZ\D?6>2#5:(Q!D9G,F5"SWWH1:3T.$C
     49M_H%W7<R&\]Y0E=`1LE%,NBR"*S#;>FNH8<BMSX59)$]ZW3I6FB>.J1"=3E;Z
     50M^,+N+K16T"-B7"'.$GJ*SB+0>9\KYYBO`19RP\.JX)MWC'D)0VV#KTX5-_'W
     51M&789]Q5`1'3,*C!!L%7'_-2BE_%C3#FJO+5G!8MQ=G_TY#6(!&E$^@L$$;3'
     52M"KB_KAZUT\,X906"]6;QXQ^9]NX'I!U'Y:Z"`[/9^Y^4=NS,#SA$N+-VL2ZW
     53M=X!Q;>-L"#]5Q;5%;VT9&8E0)Q'PV(MG<&\@&E3K^==$DBL_8J[\OHV1F"N]
     54M(T8B6:*8?R<C,1=OSS,2*<XSDO:J#6+R`D8B$Z26^L?<R1,UO(KXICMYHA(.
     55MJ>@)'I(->8@:DOP3/$0E)%(5%_(0<Q_W0AZBY&4\Y/ANKLW.WLL3E;!(C5_.
     56M0\R-W7.[T#*"Z24LY.R4L!3M.`B/?6RP4\].3[*DBY,,1(N3#$3+9*;Z<0S$
     57MWL9=QD#HX$;N'`.AR7T<M?=Q/Y*!4'M%]YT,A`[NY_K.Y'QQM0BR1>*.^%_G
     58M(!3+_SL.0K%Z-ET+H!V.==#[_D,WW_]7"O/?*Y[V(S)^\^KJ3VAA:+ZK(P``
    6159`
    6260end
  • Tst/Short/gcdp_s.stat

    r24a77fb r001cc15  
    1 1 >> tst_memory_0 :: 1314101568:3132- 13843 :3-1-3:ix86-Linux:mamawutz:309176
    2 1 >> tst_memory_1 :: 1314101568:3132- 13843 :3-1-3:ix86-Linux:mamawutz:796688
    3 1 >> tst_memory_2 :: 1314101568:3132- 13843 :3-1-3:ix86-Linux:mamawutz:829472
    4 1 >> tst_timer_1 :: 1314101568:3132- 13843 :3-1-3:ix86-Linux:mamawutz:8
     11 >> tst_memory_0 :: 1346936506:3150:3-1-5:ix86-Linux:mamawutz:309112
     21 >> tst_memory_1 :: 1346936506:3150:3-1-5:ix86-Linux:mamawutz:2369600
     31 >> tst_memory_2 :: 1346936506:3150:3-1-5:ix86-Linux:mamawutz:2402384
     41 >> tst_timer_1 :: 1346936506:3150:3-1-5:ix86-Linux:mamawutz:7
  • factory/algext.cc

    r24a77fb r001cc15  
    644644    if(G.inCoeffDomain())
    645645      return CanonicalForm(1);
    646     return G/Lc(G); // return monic G
     646    CanonicalForm lcinv= 1/Lc (G);
     647    return G*lcinv; // return monic G
    647648  }
    648649  if(G.isZero()) // F is non-zero
     
    650651    if(F.inCoeffDomain())
    651652      return CanonicalForm(1);
    652     return F/Lc(F); // return monic F
     653    CanonicalForm lcinv= 1/Lc (F);
     654    return F*lcinv; // return monic F
    653655  }
    654656  if(F.inCoeffDomain() || G.inCoeffDomain())
  • factory/canonicalform.cc

    r24a77fb r001cc15  
    478478// have a taildegree larger than zero.
    479479//
     480// tailcoeff( v ) returns the tail coefficient of CO where CO is
     481// considered an univariate polynomial in the polynomial variable
     482// v.
     483// Note: If v is less than the main variable of CO we have to
     484// swap variables which may be quite expensive.
     485//
    480486// See also: InternalCF::tailcoeff(), InternalCF::tailcoeff(),
    481487// InternalPoly::tailcoeff(), InternalPoly::taildegree,
     
    490496    else
    491497        return value->tailcoeff();
     498}
     499
     500CanonicalForm
     501CanonicalForm::tailcoeff (const Variable& v) const
     502{
     503    if ( is_imm( value ) || value->inCoeffDomain() )
     504        return *this;
     505
     506    Variable x = value->variable();
     507    if ( v > x )
     508        return *this;
     509    else if ( v == x )
     510        return value->tailcoeff();
     511    else {
     512        CanonicalForm f = swapvar( *this, v, x );
     513         if ( f.mvar() == x )
     514             return swapvar( f.value->tailcoeff(), v, x );
     515         else
     516            // v did not occur in f
     517            return *this;
     518    }
    492519}
    493520
  • factory/canonicalform.h

    r24a77fb r001cc15  
    112112
    113113    CanonicalForm tailcoeff () const;
     114    CanonicalForm tailcoeff ( const Variable & v ) const;
    114115    int taildegree () const;
    115116
     
    295296tailcoeff ( const CanonicalForm & f ) { return f.tailcoeff(); }
    296297
     298inline CanonicalForm
     299tailcoeff (const CanonicalForm& f, const Variable& v) { return f.tailcoeff(v); }
     300
    297301inline int
    298302level ( const CanonicalForm & f ) { return f.level(); }
  • factory/cf_factor.cc

    r24a77fb r001cc15  
    127127    if ( f.isImm() )
    128128    {
    129       printf("+%d",f.intval());
     129      if (CFFactory::gettype()==GaloisFieldDomain)
     130      {
     131         int a= imm2int (f.getval());
     132         if ( a == gf_q )
     133           printf ("+%d", a);
     134         else  if ( a == 0 )
     135           printf ("+1");
     136         else  if ( a == 1 )
     137           printf ("+%c",gf_name);
     138         else
     139         {
     140           printf ("+%c",gf_name);
     141           printf ("^%d",a);
     142         }
     143      }
     144      else
     145        printf("+%ld",f.intval());
    130146    }
    131147    else
     
    377393  if ( f.inCoeffDomain() )
    378394        return CFFList( f );
    379   int mv=f.level();
    380   int org_v=mv;
    381395  //out_cf("factorize:",f,"==================================\n");
    382396  if (! f.isUnivariate() )
     
    409423      if(isOn(SW_USE_NTL_SORT)) Unhomoglist.sort(cmpCF);
    410424      return Unhomoglist;
    411     }
    412     mv=find_mvar(f);
    413     if ( getCharacteristic() == 0 )
    414     {
    415       if (mv!=f.level())
    416       {
    417         swapvar(f,Variable(mv),f.mvar());
    418       }
    419     }
    420     else
    421     {
    422       if (mv!=1)
    423       {
    424         swapvar(f,Variable(mv),Variable(1));
    425         org_v=1;
    426       }
    427425    }
    428426  }
     
    678676  }
    679677
    680   if ((mv!=org_v) && (! f.isUnivariate() ))
    681   {
    682     CFFListIterator J=F;
    683     for ( ; J.hasItem(); J++)
    684     {
    685       swapvar(J.getItem().factor(),Variable(mv),Variable(org_v));
    686     }
    687     swapvar(f,Variable(mv),Variable(org_v));
    688   }
    689678  //out_cff(F);
    690679  if(isOn(SW_USE_NTL_SORT)) F.sort(cmpCF);
  • factory/cf_gcd.cc

    r24a77fb r001cc15  
    3636
    3737static CanonicalForm cf_content ( const CanonicalForm &, const CanonicalForm & );
    38 static void cf_prepgcd( const CanonicalForm &, const CanonicalForm &, int &, int &, int & );
    3938
    4039void out_cf(const char *s1,const CanonicalForm &f,const char *s2);
     
    595594        pi = pi1; pi1 = pi2;
    596595        maxNumVars= tmax (getNumVars (pi), getNumVars (pi1));
     596        if (!(pi1.isUnivariate()) && (size (pi1)/maxNumVars > 500))
     597        {
     598            On (SW_USE_FF_MOD_GCD);
     599            C *= gcd (oldPi, oldPi1);
     600            Off (SW_USE_FF_MOD_GCD);
     601            return C;
     602        }
    597603        if ( degree( pi1, v ) > 0 )
    598604        {
     
    697703{
    698704  CanonicalForm fc, gc, d1;
    699   int mp, cc, p1, pe;
    700   mp = f.level()+1;
    701705  bool fc_isUnivariate=f.isUnivariate();
    702706  bool gc_isUnivariate=g.isUnivariate();
    703707  bool fc_and_gc_Univariate=fc_isUnivariate && gc_isUnivariate;
    704   cf_prepgcd( f, g, cc, p1, pe);
    705   if ( cc != 0 )
    706   {
    707     if ( cc > 0 )
    708     {
    709       fc = replacevar( f, Variable(cc), Variable(mp) );
    710       gc = g;
    711     }
    712     else
    713     {
    714       fc = replacevar( g, Variable(-cc), Variable(mp) );
    715       gc = f;
    716     }
    717     return cf_content( fc, gc );
    718   }
    719 // now each appearing variable is in f and g
    720708  fc = f;
    721709  gc = g;
     
    739727    else
    740728    #endif
    741     if ( p1 == fc.level() )
    742       fc = gcd_poly_p( fc, gc );
    743     else
    744     {
    745       fc = replacevar( fc, Variable(p1), Variable(mp) );
    746       gc = replacevar( gc, Variable(p1), Variable(mp) );
    747       fc = replacevar( gcd_poly_p( fc, gc ), Variable(mp), Variable(p1) );
    748     }
     729    fc = gcd_poly_p( fc, gc );
    749730  }
    750731  else if (!fc_and_gc_Univariate)
    751732  {
    752733    if ( isOn( SW_USE_EZGCD ) )
    753     {
    754734      fc= ezgcd (fc, gc);
    755       /*if ( pe == 1 )
    756         fc = ezgcd( fc, gc );
    757       else if ( pe > 0 )// no variable at position 1
    758       {
    759         fc = replacevar( fc, Variable(pe), Variable(1) );
    760         gc = replacevar( gc, Variable(pe), Variable(1) );
    761         fc = replacevar( ezgcd( fc, gc ), Variable(1), Variable(pe) );
    762       }
    763       else
    764       {
    765         pe = -pe;
    766         fc = swapvar( fc, Variable(pe), Variable(1) );
    767         gc = swapvar( gc, Variable(pe), Variable(1) );
    768         fc = swapvar( ezgcd( fc, gc ), Variable(1), Variable(pe) );
    769       }*/
    770     }
    771     else if (
    772     isOn(SW_USE_CHINREM_GCD)
    773     && (isPurePoly_m(fc)) && (isPurePoly_m(gc))
    774     )
    775     {
    776     #if 0
    777       if ( p1 == fc.level() )
    778         fc = chinrem_gcd( fc, gc );
    779       else
    780       {
    781         fc = replacevar( fc, Variable(p1), Variable(mp) );
    782         gc = replacevar( gc, Variable(p1), Variable(mp) );
    783         fc = replacevar( chinrem_gcd( fc, gc ), Variable(mp), Variable(p1) );
    784       }
    785     #else
     735    else if (isOn(SW_USE_CHINREM_GCD))
    786736      fc = chinrem_gcd( fc, gc);
    787     #endif
    788     }
    789737    else
    790738    {
     
    11001048*    p1 in "gcd_poly1"
    11011049*/
    1102 static
     1050/*static
    11031051void optvalues ( const int * df, const int * dg, const int n, int & p1, int &pe )
    11041052{
     
    11301078        i--;
    11311079    }
    1132 }
     1080}*/
    11331081
    11341082/*
    11351083*  make some changes of variables, see optvalues
    11361084*/
    1137 static void
     1085/*static void
    11381086cf_prepgcd( const CanonicalForm & f, const CanonicalForm & g, int & cc, int & p1, int &pe )
    11391087{
     
    11821130    delete [] degsf;
    11831131    delete [] degsg;
    1184 }
     1132}*/
    11851133
    11861134
  • factory/cf_gcd_smallp.cc

    r24a77fb r001cc15  
    818818          CFList u, v;
    819819          DEBOUTLN (cerr, "ppH before mapDown= " << ppH);
     820          ppH /= Lc(ppH);
    820821          ppH= mapDown (ppH, prim_elem, im_prim_elem, alpha, u, v);
    821822          ppCoF= mapDown (ppCoF, prim_elem, im_prim_elem, alpha, u, v);
    822823          ppCoF= mapDown (ppCoG, prim_elem, im_prim_elem, alpha, u, v);
    823           ppH /= Lc(ppH);
    824824          DEBOUTLN (cerr, "ppH after mapDown= " << ppH);
    825825          if (compressConvexDense)
  • factory/facAlgExt.cc

    r24a77fb r001cc15  
    154154  CFListIterator j;
    155155
     156  CanonicalForm lcinv;
    156157  for (CFFListIterator i= sqrf; i.hasItem(); i++)
    157158  {
     
    159160    factorsSqrf= AlgExtSqrfFactorize (i.getItem().factor(), alpha);
    160161    for (j= factorsSqrf; j.hasItem(); j++)
    161       factors.append (CFFactor (j.getItem()/Lc (j.getItem()), i.getItem().exp()));
     162    {
     163      lcinv= 1/Lc (j.getItem());
     164      factors.append (CFFactor (j.getItem()*lcinv, i.getItem().exp()));
     165    }
    162166  }
    163167
  • factory/facBivar.cc

    r24a77fb r001cc15  
    645645  }
    646646
     647  A *= bCommonDen (A);
    647648  A= A (y + evaluation, y);
    648649
     
    723724  }
    724725
     726  On (SW_RATIONAL);
     727  A *= bCommonDen (A);
     728  Off (SW_RATIONAL);
     729
    725730  factors= factorRecombination (uniFactors, A, MODl, degs, 1,
    726731                                uniFactors.length()/2, b);
  • factory/facFactorize.cc

    r24a77fb r001cc15  
    22 * Computer Algebra System SINGULAR
    33\*****************************************************************************/
    4 /** @file facFqFactorize.cc
     4/** @file facFactorize.cc
    55 *
    66 * multivariate factorization over Q(a)
     
    4040
    4141  bool found= false;
     42  bool allZero= true;
     43  bool foundZero= false;
    4244  CanonicalForm deriv_x, gcd_deriv;
    4345  CFListIterator iter;
     
    5052      eval.insert (eval.getFirst()( E [i], i));
    5153      result.append (E[i]);
     54      if (!E[i].isZero())
     55        allZero= false;
     56      else
     57        foundZero= true;
     58      if (!allZero && foundZero)
     59      {
     60        result= CFList();
     61        eval= CFList();
     62        bad= true;
     63        foundZero= false;
     64        break;
     65      }
    5266      if (degree (eval.getFirst(), i - 1) != degree (F, i - 1))
    5367      {
     
    112126  CFList factors;
    113127  CanonicalForm LCA= LC (A,1);
    114   if (!LCA.inCoeffDomain())
    115   {
    116     for (int j= 0; j < A.level() - 2; j++)
    117     {
    118       if (!Aeval[j].isEmpty() && (degree (LCA, j+3) > 0))
    119       {
    120         v= Variable (Aeval[j].getFirst().level());
    121 
    122         factors= ratBiSqrfFactorize (Aeval[j].getFirst(), w);
    123 
    124         if (factors.getFirst().inCoeffDomain())
    125           factors.removeFirst();
    126 
    127         if (minFactorsLength == 0)
    128           minFactorsLength= factors.length();
    129         else
    130           minFactorsLength= tmin (minFactorsLength, factors.length());
    131 
    132         if (factors.length() == 1)
    133         {
    134           irred= true;
    135           return;
    136         }
    137         sortList (factors, x);
    138         Aeval [j]= factors;
    139       }
    140       else if (!Aeval[j].isEmpty())
    141       {
    142         Aeval[j]=CFList();
    143       }
    144     }
    145   }
    146   else
    147   {
    148     for (int j= 0; j < A.level() - 2; j++)
    149       Aeval[j]= CFList();
     128  for (int j= 0; j < A.level() - 2; j++)
     129  {
     130    if (!Aeval[j].isEmpty())
     131    {
     132      v= Variable (Aeval[j].getFirst().level());
     133
     134      factors= ratBiSqrfFactorize (Aeval[j].getFirst(), w);
     135      if (factors.getFirst().inCoeffDomain())
     136        factors.removeFirst();
     137
     138      if (minFactorsLength == 0)
     139        minFactorsLength= factors.length();
     140      else
     141        minFactorsLength= tmin (minFactorsLength, factors.length());
     142
     143      if (factors.length() == 1)
     144      {
     145        irred= true;
     146        return;
     147      }
     148      sortList (factors, x);
     149      Aeval [j]= factors;
     150    }
     151    else if (!Aeval[j].isEmpty())
     152      Aeval[j]=CFList();
    150153  }
    151154}
     
    184187  CanonicalForm test= evalSqrfPartF.getFirst() (evalPoint[0], 2);
    185188
    186   if (degree (test) != degree (sqrfPartF, 1))
     189  if (degree (test) != degree (sqrfPartF, 1) || test.inCoeffDomain())
    187190    return 0;
    188191
     
    267270  }
    268271
    269   CFMap N;
    270   CanonicalForm F= compress (LCF, N);
     272  CFMap N, M;
     273  CFArray dummy= CFArray (2);
     274  dummy [0]= LCF;
     275  dummy [1]= Variable (2);
     276  compress (dummy, M, N);
     277  CanonicalForm F= M (LCF);
    271278  if (LCF.isUnivariate())
    272279  {
     
    305312      result.insert (Lc (LCF));
    306313    else
    307       result.append (LCF);
     314    {
     315      for (CFListIterator i= result; i.hasItem(); i++)
     316        i.getItem() *= LCF;
     317      result.insert (LCF);
     318    }
    308319    return result;
    309320  }
     
    311322  CFList factors= LCFFactors;
    312323
    313   CFMap dummy;
    314324  for (CFListIterator i= factors; i.hasItem(); i++)
    315     i.getItem()= compress (i.getItem(), dummy);
     325    i.getItem()= M (i.getItem());
    316326
    317327  CanonicalForm sqrfPartF;
     
    319329  CFList evalSqrfPartF, bufFactors;
    320330  CFArray evalPoint= CFArray (evaluation.length() - 1);
     331  CFArray buf= CFArray (evaluation.length());
     332  CFArray swap= CFArray (evaluation.length());
    321333  CFListIterator iter= evaluation;
    322   for (int i= evaluation.length() - 2; i > -1; i--, iter++)
    323     evalPoint[i]= iter.getItem();
     334  CanonicalForm vars=getVars (LCF)*Variable (2);
     335  for (int i= evaluation.length() +1; i > 1; i--, iter++)
     336  {
     337    buf[i-2]=iter.getItem();
     338    if (degree (vars, i) > 0)
     339      swap[M(Variable (i)).level()-1]=buf[i-2];
     340  }
     341  buf= swap;
     342  for (int i= 0; i < evaluation.length() - 1; i++)
     343    evalPoint[i]= buf[i+1];
     344
    324345  //TODO sqrfPartF einmal berechnen nicht stÀndig
    325346  int pass= testFactors (F, factors, sqrfPartF,
     
    333354  {
    334355    int lev= 0;
    335     for (int i= 1; i <= LCF.level(); i++)
    336     {
    337       if(degree (LCF, i) > 0)
    338       {
    339         lev= i - 1;
    340         break;
    341       }
    342     }
     356    CanonicalForm bufF;
     357    CFList bufBufFactors;
    343358    for (int i= 0; i < length; i++)
    344359    {
    345       CanonicalForm bufF, swap;
    346       CFList bufBufFactors;
    347       CFArray buf;
    348360      if (!differentSecondVarLCs [i].isEmpty())
    349361      {
     
    355367            allConstant= false;
    356368            y= Variable (iter.getItem().level());
     369            lev= M(y).level();
    357370          }
    358371        }
     
    364377          iter.getItem()= swapvar (iter.getItem(), x, y);
    365378        bufF= F;
    366         z= Variable (y.level() - lev);
     379        z= Variable (lev);
    367380        bufF= swapvar (bufF, x, z);
    368381        bufBufFactors= bufFactors;
    369382        evalPoint= CFArray (evaluation.length() - 1);
    370         buf= CFArray (evaluation.length());
    371         iter= evaluation;
    372         int k= evaluation.length() - 1;
    373         for (; iter.hasItem(); iter++, k--)
    374           buf[k]= iter.getItem();
    375         swap= buf[z.level() - 1];
    376         buf[z.level() - 1]= buf[0];
    377         buf[0]= 0;
    378         int l= 0;
    379         for (k= 0; k < evaluation.length(); k++)
     383        for (int k= 0; k < evaluation.length()-1; k++)
    380384        {
    381           if (buf[k].isZero())
    382             continue;
    383           evalPoint[l]= buf[k];
    384           l++;
     385          if (N (Variable (k+1)).level() != y.level())
     386            evalPoint[k]= buf[k+1];
     387          else
     388            evalPoint[k]= buf[0];
    385389        }
    386390        pass= testFactors (bufF, bufBufFactors, sqrfPartF, bufFactors,
     
    402406          result.append (LCF);
    403407          for (int j= 1; j <= factors.length(); j++)
    404             result.append (LCF);
     408            result.append (1);
     409          result= distributeContent (result, differentSecondVarLCs, length);
     410          if (!result.getFirst().inCoeffDomain())
     411          {
     412            CFListIterator iter= result;
     413            CanonicalForm tmp= iter.getItem();
     414            iter++;
     415            for (; iter.hasItem(); iter++)
     416              iter.getItem() *= tmp;
     417          }
     418
    405419          y= Variable (1);
    406420          delete [] bufSqrfFactors;
     
    425439
    426440  bufFactors= factors;
     441
     442  CFMap MM, NN;
     443  dummy [0]= sqrfPartF;
     444  dummy [1]= 1;
     445  compress (dummy, MM, NN);
     446  sqrfPartF= MM (sqrfPartF);
     447  CanonicalForm varsSqrfPartF= getVars (sqrfPartF);
     448  for (CFListIterator iter= factors; iter.hasItem(); iter++)
     449    iter.getItem()= MM (iter.getItem());
     450
    427451  CFList evaluation2;
    428   if (y == x)
    429     evaluation2= evaluation;
    430   else
    431   {
    432     CanonicalForm tmp;
    433     evaluation2= evaluation;
    434     int i= evaluation.length() + 1;
    435     for (CFListIterator iter= evaluation2; iter.hasItem(); iter++, i--)
    436     {
    437       if (i == y.level())
    438       {
    439         tmp= iter.getItem();
    440         iter.getItem()= evaluation2.getLast();
    441         evaluation2.removeLast();
    442         evaluation2.append (tmp);
    443         break;
    444       }
    445     }
    446   }
     452  for (int i= 2; i <= varsSqrfPartF.level(); i++)
     453    evaluation2.insert (evalPoint[NN (Variable (i)).level()-2]);
    447454
    448455  CFList interMedResult;
    449456  CanonicalForm oldSqrfPartF= sqrfPartF;
    450   sqrfPartF= shift2Zero (sqrfPartF, evalSqrfPartF, evaluation2, 1);
     457  sqrfPartF= shift2Zero (sqrfPartF, evalSqrfPartF, evaluation2);
    451458  if (factors.length() > 1)
    452459  {
     
    456463      leadingCoeffs.append (LC1);
    457464
    458     CFList LC1eval= evaluateAtEval (LC1, evaluation2, 1);
     465    CFList LC1eval= evaluateAtEval (LC1, evaluation2,2);
    459466    CFList oldFactors= factors;
    460467    for (CFListIterator i= oldFactors; i.hasItem(); i++)
     
    463470    bool success= false;
    464471    CanonicalForm oldSqrfPartFPowLC= oldSqrfPartF*power(LC1,factors.length()-1);
     472    CFList heuResult;
    465473    if (size (oldSqrfPartFPowLC)/getNumVars (oldSqrfPartFPowLC) < 500 &&
    466474        LucksWangSparseHeuristic (oldSqrfPartFPowLC,
    467                                   oldFactors, 1, leadingCoeffs, factors))
    468     {
    469       interMedResult= recoverFactors (oldSqrfPartF, factors);
     475                                  oldFactors, 2, leadingCoeffs, heuResult))
     476    {
     477      interMedResult= recoverFactors (oldSqrfPartF, heuResult);
    470478      if (oldFactors.length() == interMedResult.length())
    471479        success= true;
     
    480488
    481489      for (CFListIterator i= factors; i.hasItem(); i++)
    482       {
    483         i.getItem()= i.getItem() (x + evaluation2.getLast(), x);
    484490        i.getItem() *= LC1 (0,2)/Lc (i.getItem());
    485       }
    486491      factors.insert (1);
    487492
     
    527532      }
    528533      for (CFListIterator iter= factors; iter.hasItem(); iter++)
    529         iter.getItem()= reverseShift (iter.getItem(), evaluation2, 1);
     534        iter.getItem()= reverseShift (iter.getItem(), evaluation2);
    530535
    531536      interMedResult=
    532       recoverFactors (reverseShift(evalSqrfPartF.getLast(),evaluation2,1),
     537      recoverFactors (reverseShift(evalSqrfPartF.getLast(),evaluation2),
    533538                      factors);
    534539    }
     
    536541  else
    537542  {
    538     factors= CFList (oldSqrfPartF);
     543    CanonicalForm contF=content (oldSqrfPartF,1);
     544    factors= CFList (oldSqrfPartF/contF);
    539545    interMedResult= recoverFactors (oldSqrfPartF, factors);
    540546  }
     547
     548  for (CFListIterator iter= interMedResult; iter.hasItem(); iter++)
     549    iter.getItem()= NN (iter.getItem());
    541550
    542551  CFList result;
     
    680689  }
    681690
     691  A *= bCommonDen (A);
    682692  // check main variable
    683693  CFList Aeval, list, evaluation, bufEvaluation, bufAeval;
    684   int factorNums= 3;
     694  int factorNums= 1;
    685695  CanonicalForm bivarEval;
    686696  CFList biFactors, bufBiFactors;
    687697  CanonicalForm evalPoly;
    688   int lift, bufLift;
    689   CFList* bufAeval2= new CFList [A.level() - 2];
    690   CFList* Aeval2= new CFList [A.level() - 2];
     698  int lift, bufLift, lengthAeval2= A.level()-2;
     699  CFList* bufAeval2= new CFList [lengthAeval2];
     700  CFList* Aeval2= new CFList [lengthAeval2];
    691701  int counter;
    692702  int differentSecondVar= 0;
     
    707717    evaluationWRTDifferentSecondVars (bufAeval2, bufEvaluation, A);
    708718
    709     for (int j= 0; j < A.level() - 1; j++)
     719    for (int j= 0; j < lengthAeval2; j++)
    710720    {
    711721      if (!bufAeval2[j].isEmpty())
     
    738748      biFactors= bufBiFactors;
    739749      lift= bufLift;
    740       for (int j= 0; j < A.level() - 2; j++)
     750      for (int j= 0; j < lengthAeval2; j++)
    741751        Aeval2 [j]= bufAeval2 [j];
    742752      differentSecondVar= counter;
     
    752762        biFactors= bufBiFactors;
    753763        lift= bufLift;
    754         for (int j= 0; j < A.level() - 2; j++)
     764        for (int j= 0; j < lengthAeval2; j++)
    755765          Aeval2 [j]= bufAeval2 [j];
    756766        differentSecondVar= counter;
     
    786796    refineBiFactors (A, biFactors, Aeval2, evaluation, minFactorsLength);
    787797
    788   if (differentSecondVar == A.level() - 2)
     798  if (differentSecondVar == lengthAeval2)
    789799  {
    790800    bool zeroOccured= false;
     
    799809    if (!zeroOccured)
    800810    {
    801       factors= sparseHeuristic (A, biFactors, Aeval2, evaluation, minFactorsLength);
     811      factors= sparseHeuristic (A, biFactors, Aeval2, evaluation,
     812                                minFactorsLength);
    802813      if (factors.length() == biFactors.length())
    803814      {
     
    815826  CFList uniFactors= buildUniFactors (biFactors, evaluation.getLast(), y);
    816827
    817   CFList * oldAeval= new CFList [A.level() - 2];
    818   for (int i= 0; i < A.level() - 2; i++)
     828  sortByUniFactors (Aeval2, lengthAeval2, uniFactors, evaluation);
     829
     830  CFList * oldAeval= new CFList [lengthAeval2];
     831  for (int i= 0; i < lengthAeval2; i++)
    819832    oldAeval[i]= Aeval2[i];
    820833
     
    827840  Variable w;
    828841  CFList leadingCoeffs= precomputeLeadingCoeff (LC (A, 1), biFactorsLCs,
    829                                           evaluation, Aeval2, A.level() - 2, w);
     842                                          evaluation, Aeval2, lengthAeval2, w);
    830843
    831844  if (w.level() != 1)
    832845  {
    833846    A= swapvar (A, y, w);
    834     for (int i= 0; i < A.level() - 2; i++)
    835     {
    836       if (oldAeval[i].isEmpty())
    837         continue;
    838       if (oldAeval[i].getFirst().level() == w.level())
    839       {
    840         biFactors= CFList();
    841         for (CFListIterator iter= oldAeval [i]; iter.hasItem(); iter++)
    842           biFactors.append (swapvar (iter.getItem(), w, y));
    843       }
    844     }
    845847    int i= A.level();
    846848    CanonicalForm evalPoint;
     
    856858      }
    857859    }
     860    for (i= 0; i < lengthAeval2; i++)
     861    {
     862      if (oldAeval[i].isEmpty())
     863        continue;
     864      if (oldAeval[i].getFirst().level() == w.level())
     865      {
     866        CFArray tmp= copy (oldAeval[i]);
     867        oldAeval[i]= biFactors;
     868        for (CFListIterator iter= oldAeval[i]; iter.hasItem(); iter++)
     869          iter.getItem()= swapvar (iter.getItem(), w, y);
     870        for (int ii= 0; ii < tmp.size(); ii++)
     871          tmp[ii]= swapvar (tmp[ii], w, y);
     872        CFArray tmp2= CFArray (tmp.size());
     873        CanonicalForm buf;
     874        for (int ii= 0; ii < tmp.size(); ii++)
     875        {
     876          buf= tmp[ii] (evaluation.getLast(),y);
     877          buf /= Lc (buf);
     878          tmp2[findItem (uniFactors, buf)-1]=tmp[ii];
     879        }
     880        biFactors= CFList();
     881        for (int j= 0; j < tmp2.size(); j++)
     882          biFactors.append (tmp2[j]);
     883      }
     884    }
    858885  }
    859886
     
    865892    CanonicalForm tmp= power (leadingCoeffs.getFirst(), biFactors.length() - 1);
    866893    A *= tmp;
    867     Aeval= evaluateAtZero (A);
    868894    tmp= leadingCoeffs.getFirst();
    869895    iter= evaluation;
     
    880906  }
    881907
     908  CanonicalForm LCmultiplier= leadingCoeffs.getFirst();
     909  bool LCmultiplierIsConst= LCmultiplier.inCoeffDomain();
    882910  leadingCoeffs.removeFirst();
    883911
    884912  //prepare leading coefficients
    885   CFList* leadingCoeffs2= new CFList [A.level() - 2];
     913  CFList* leadingCoeffs2= new CFList [lengthAeval2];
    886914  prepareLeadingCoeffs (leadingCoeffs2, A.level(), leadingCoeffs, biFactors,
    887915                        evaluation);
     
    890918  Aeval= evaluateAtEval (A, evaluation, 2);
    891919
    892   CanonicalForm hh= Lc (Aeval.getFirst());
    893 
    894   for (CFListIterator i= Aeval; i.hasItem(); i++)
    895     i.getItem() /= hh;
    896 
    897   A /= hh;
    898 
    899   if (size (A)/getNumVars (A) < 500 &&
    900       LucksWangSparseHeuristic (A, biFactors, 2, leadingCoeffs2 [A.level() - 3],
     920  CanonicalForm hh= 1/Lc (Aeval.getFirst());
     921
     922  for (iter= Aeval; iter.hasItem(); iter++)
     923    iter.getItem() *= hh;
     924
     925  A *= hh;
     926
     927  CFListIterator iter2;
     928  CFList bufLeadingCoeffs2= leadingCoeffs2[lengthAeval2-1];
     929  bufBiFactors= biFactors;
     930  bufA= A;
     931  CanonicalForm bufLCmultiplier= LCmultiplier;
     932  CanonicalForm testVars;
     933  if (!LCmultiplierIsConst)
     934  {
     935    testVars= Variable (2);
     936    for (int i= 0; i < lengthAeval2; i++)
     937    {
     938      if (!oldAeval[i].isEmpty())
     939        testVars *= oldAeval[i].getFirst().mvar();
     940    }
     941  }
     942  CFList bufFactors= CFList();
     943  bool LCheuristic= false;
     944  if (LucksWangSparseHeuristic (A, biFactors, 2, leadingCoeffs2[lengthAeval2-1],
    901945                                factors))
    902946  {
    903     int check= factors.length();
    904     factors= recoverFactors (A, factors);
     947    int check= biFactors.length();
     948    int * index= new int [factors.length()];
     949    CFList oldFactors= factors;
     950    factors= recoverFactors (A, factors, index);
    905951
    906952    if (check == factors.length())
    907953    {
     954      if (w.level() != 1)
     955      {
     956        for (iter= factors; iter.hasItem(); iter++)
     957          iter.getItem()= swapvar (iter.getItem(), w, y);
     958      }
     959
    908960      appendSwapDecompress (factors, contentAFactors, N, 0, 0, x);
    909961      normalize (factors);
     962      delete [] index;
    910963      delete [] Aeval2;
    911964      return factors;
    912965    }
     966    else if (factors.length() > 0)
     967    {
     968      int oneCount= 0;
     969      CFList l;
     970      for (int i= 0; i < check; i++)
     971      {
     972        if (index[i] == 1)
     973        {
     974          iter=biFactors;
     975          for (int j=1; j <= i-oneCount; j++)
     976            iter++;
     977          iter.remove (1);
     978          for (int j= 0; j < lengthAeval2; j++)
     979          {
     980            l= leadingCoeffs2[j];
     981            iter= l;
     982            for (int k=1; k <= i-oneCount; k++)
     983              iter++;
     984            iter.remove (1);
     985            leadingCoeffs2[j]=l;
     986          }
     987          oneCount++;
     988        }
     989      }
     990      bufFactors= factors;
     991      factors= CFList();
     992    }
     993    else if (!LCmultiplierIsConst && factors.length() == 0)
     994    {
     995      LCheuristic= true;
     996      factors= oldFactors;
     997      CanonicalForm cont;
     998      CFList contents, LCs;
     999      int index=1;
     1000      bool foundTrueMultiplier= false;
     1001      for (iter= factors; iter.hasItem(); iter++, index++)
     1002      {
     1003        cont= content (iter.getItem(), 1);
     1004        cont= gcd (cont , LCmultiplier);
     1005        contents.append (cont);
     1006        if (cont.inCoeffDomain()) // trivial content->LCmultiplier needs to go there
     1007        {
     1008          foundTrueMultiplier= true;
     1009          int index2= 1;
     1010          for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem(); iter2++,
     1011                                                                    index2++)
     1012          {
     1013            if (index2 == index)
     1014              continue;
     1015            iter2.getItem() /= LCmultiplier;
     1016          }
     1017          A= oldA;
     1018          leadingCoeffs= leadingCoeffs2[lengthAeval2-1];
     1019          for (int i= lengthAeval2-1; i > -1; i--)
     1020            leadingCoeffs2[i]= CFList();
     1021          prepareLeadingCoeffs (leadingCoeffs2, A.level(), leadingCoeffs,
     1022                                biFactors, evaluation );
     1023          Aeval= evaluateAtEval (A, evaluation, 2);
     1024
     1025          hh= 1/Lc (Aeval.getFirst());
     1026
     1027          for (iter2= Aeval; iter2.hasItem(); iter2++)
     1028            iter2.getItem() *= hh;
     1029
     1030          A *= hh;
     1031          break;
     1032        }
     1033        else
     1034          LCs.append (LC (iter.getItem()/cont, 1));
     1035      }
     1036      if (!foundTrueMultiplier)
     1037      {
     1038        index= 1;
     1039        iter2= factors;
     1040        bool foundMultiplier= false;
     1041        for (iter= contents; iter.hasItem(); iter++, iter2++, index++)
     1042        {
     1043          if (fdivides (iter.getItem(), LCmultiplier))
     1044          {
     1045            if ((LCmultiplier/iter.getItem()).inCoeffDomain() &&
     1046                !isOnlyLeadingCoeff(iter2.getItem())) //content divides LCmultiplier completely and factor consists of more terms than just the leading coeff
     1047            {
     1048              int index2= 1;
     1049              for (CFListIterator iter3= leadingCoeffs2[lengthAeval2-1];
     1050                   iter3.hasItem(); iter3++, index2++)
     1051              {
     1052                if (index2 == index)
     1053                {
     1054                  iter3.getItem() /= LCmultiplier;
     1055                  break;
     1056                }
     1057              }
     1058              A /= LCmultiplier;
     1059              foundMultiplier= true;
     1060              iter.getItem()= 1;
     1061            }
     1062          }
     1063        }
     1064        // coming from above: divide out more LCmultiplier if possible
     1065        if (foundMultiplier)
     1066        {
     1067          foundMultiplier= false;
     1068          index=1;
     1069          iter2= factors;
     1070          for (iter= contents; iter.hasItem(); iter++, iter2++, index++)
     1071          {
     1072            if (!iter.getItem().isOne() &&
     1073                fdivides (iter.getItem(), LCmultiplier))
     1074            {
     1075              if (!isOnlyLeadingCoeff (iter2.getItem())) // factor is more than just leading coeff
     1076              {
     1077                int index2= 1;
     1078                for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem();
     1079                     iter2++, index2++)
     1080                {
     1081                  if (index2 == index)
     1082                  {
     1083                    iter2.getItem() /= iter.getItem();
     1084                    foundMultiplier= true;
     1085                    break;
     1086                  }
     1087                }
     1088                A /= iter.getItem();
     1089                LCmultiplier /= iter.getItem();
     1090                iter.getItem()= 1;
     1091              }
     1092              else if (fdivides (getVars (LCmultiplier), testVars))//factor consists of just leading coeff
     1093              {
     1094                Variable xx= Variable (2);
     1095                CanonicalForm vars;
     1096                vars= power (xx, degree (LC (getItem(oldBiFactors, index),1),
     1097                                          xx));
     1098                for (int i= 0; i < lengthAeval2; i++)
     1099                {
     1100                  if (oldAeval[i].isEmpty())
     1101                    continue;
     1102                  xx= oldAeval[i].getFirst().mvar();
     1103                  vars *= power (xx, degree (LC (getItem(oldAeval[i], index),1),
     1104                                             xx));
     1105                }
     1106                if (myGetVars(content(getItem(leadingCoeffs2[lengthAeval2-1],index),1))
     1107                    /myGetVars (LCmultiplier) == vars)
     1108                {
     1109                  int index2= 1;
     1110                  for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem();
     1111                       iter2++, index2++)
     1112                  {
     1113                    if (index2 == index)
     1114                    {
     1115                      iter2.getItem() /= LCmultiplier;
     1116                      foundMultiplier= true;
     1117                      break;
     1118                    }
     1119                  }
     1120                  A /= LCmultiplier;
     1121                  iter.getItem()= 1;
     1122                }
     1123              }
     1124            }
     1125          }
     1126        }
     1127        else
     1128        {
     1129          CanonicalForm pLCs= prod (LCs);
     1130          if (fdivides (pLCs, LC (oldA,1)) && (LC(oldA,1)/pLCs).inCoeffDomain()) // check if the product of the lead coeffs of the primitive factors equals the lead coeff of the old A
     1131          {
     1132            A= oldA;
     1133            iter2= leadingCoeffs2[lengthAeval2-1];
     1134            for (iter= contents; iter.hasItem(); iter++, iter2++)
     1135              iter2.getItem() /= iter.getItem();
     1136            foundMultiplier= true;
     1137          }
     1138          if (!foundMultiplier && fdivides (getVars (LCmultiplier), testVars))
     1139          {
     1140            Variable xx;
     1141            CFList vars1;
     1142            CFFList sqrfMultiplier= sqrFree (LCmultiplier);
     1143            if (sqrfMultiplier.getFirst().factor().inCoeffDomain())
     1144              sqrfMultiplier.removeFirst();
     1145            sqrfMultiplier= sortCFFListByNumOfVars (sqrfMultiplier);
     1146            xx= Variable (2);
     1147            for (iter= oldBiFactors; iter.hasItem(); iter++)
     1148              vars1.append (power (xx, degree (LC (iter.getItem(),1), xx)));
     1149            for (int i= 0; i < lengthAeval2; i++)
     1150            {
     1151              if (oldAeval[i].isEmpty())
     1152                continue;
     1153              xx= oldAeval[i].getFirst().mvar();
     1154              iter2= vars1;
     1155              for (iter= oldAeval[i]; iter.hasItem(); iter++, iter2++)
     1156                iter2.getItem() *= power(xx,degree (LC (iter.getItem(),1), xx));
     1157            }
     1158            CanonicalForm tmp;
     1159            iter2= vars1;
     1160            for (iter= leadingCoeffs2[lengthAeval2-1]; iter.hasItem(); iter++,
     1161                                                                    iter2++)
     1162            {
     1163              tmp= iter.getItem()/LCmultiplier;
     1164              for (int i=1; i <= tmp.level(); i++)
     1165              {
     1166                if (degree(tmp,i) > 0 &&
     1167                    (degree(iter2.getItem(),i) > degree (tmp,i)))
     1168                  iter2.getItem() /= power (Variable (i), degree (tmp,i));
     1169              }
     1170            }
     1171            int multi;
     1172            for (CFFListIterator ii= sqrfMultiplier; ii.hasItem(); ii++)
     1173            {
     1174              multi= 0;
     1175              for (iter= vars1; iter.hasItem(); iter++)
     1176              {
     1177                tmp= iter.getItem();
     1178                while (fdivides (myGetVars (ii.getItem().factor()), tmp))
     1179                {
     1180                  multi++;
     1181                  tmp /= myGetVars (ii.getItem().factor());
     1182                }
     1183              }
     1184              if (multi == ii.getItem().exp())
     1185              {
     1186                index= 1;
     1187                for (iter= vars1; iter.hasItem(); iter++, index++)
     1188                {
     1189                  while (fdivides (myGetVars(ii.getItem().factor()),
     1190                                   iter.getItem()
     1191                                  )
     1192                        )
     1193                  {
     1194                    int index2= 1;
     1195                    for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem();
     1196                         iter2++, index2++)
     1197                    {
     1198                      if (index2 == index)
     1199                        continue;
     1200                      else
     1201                      {
     1202                        tmp= ii.getItem().factor();
     1203                        iter2.getItem() /= tmp;
     1204                        CFListIterator iter3= evaluation;
     1205                        for (int jj= A.level(); jj > 2; jj--, iter3++)
     1206                          tmp= tmp (iter3.getItem(), jj);
     1207                        if (!tmp.inCoeffDomain())
     1208                        {
     1209                          int index3= 1;
     1210                          for (iter3= biFactors; iter3.hasItem(); iter3++,
     1211                                                                  index3++)
     1212                          {
     1213                            if (index3 == index2)
     1214                            {
     1215                              iter3.getItem() /= tmp;
     1216                              iter3.getItem() /= Lc (iter3.getItem());
     1217                              break;
     1218                            }
     1219                          }
     1220                        }
     1221                        A /= ii.getItem().factor();
     1222                      }
     1223                    }
     1224                    iter.getItem() /= getVars (ii.getItem().factor());
     1225                  }
     1226                }
     1227              }
     1228              else
     1229              {
     1230                index= 1;
     1231                for (iter= vars1; iter.hasItem(); iter++, index++)
     1232                {
     1233                  if (!fdivides (myGetVars (ii.getItem().factor()),
     1234                                 iter.getItem()
     1235                                )
     1236                     )
     1237                  {
     1238                    int index2= 1;
     1239                    for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem();
     1240                         iter2++, index2++)
     1241                    {
     1242                      if (index2 == index)
     1243                      {
     1244                        tmp= power (ii.getItem().factor(), ii.getItem().exp());
     1245                        iter2.getItem() /= tmp;
     1246                        A /= tmp;
     1247                        CFListIterator iter3= evaluation;
     1248                        for (int jj= A.level(); jj > 2; jj--, iter3++)
     1249                          tmp= tmp (iter3.getItem(), jj);
     1250                        if (!tmp.inCoeffDomain())
     1251                        {
     1252                          int index3= 1;
     1253                          for (iter3= biFactors; iter3.hasItem(); iter3++,
     1254                                                                  index3++)
     1255                          {
     1256                            if (index3 == index2)
     1257                            {
     1258                              iter3.getItem() /= tmp;
     1259                              iter3.getItem() /= Lc (iter3.getItem());
     1260                              break;
     1261                            }
     1262                          }
     1263                        }
     1264                      }
     1265                    }
     1266                  }
     1267                }
     1268              }
     1269            }
     1270          }
     1271        }
     1272
     1273        // patch everything together again
     1274        leadingCoeffs= leadingCoeffs2[lengthAeval2-1];
     1275        for (int i= lengthAeval2-1; i > -1; i--)
     1276          leadingCoeffs2[i]= CFList();
     1277        prepareLeadingCoeffs (leadingCoeffs2,A.level(),leadingCoeffs, biFactors,
     1278                              evaluation);
     1279        Aeval= evaluateAtEval (A, evaluation, 2);
     1280
     1281        hh= 1/Lc (Aeval.getFirst());
     1282
     1283        for (CFListIterator i= Aeval; i.hasItem(); i++)
     1284          i.getItem() *= hh;
     1285
     1286        A *= hh;
     1287      }
     1288      factors= CFList();
     1289      if (!fdivides (LC (oldA,1),prod (leadingCoeffs2[lengthAeval2-1])))
     1290      {
     1291        LCheuristic= false;
     1292        A= bufA;
     1293        biFactors= bufBiFactors;
     1294        leadingCoeffs2[lengthAeval2-1]= bufLeadingCoeffs2;
     1295        LCmultiplier= bufLCmultiplier;
     1296      }
     1297    }
    9131298    else
    9141299      factors= CFList();
    915   }
    916 
    917 
     1300    delete [] index;
     1301  }
     1302  if (!LCheuristic && !LCmultiplierIsConst && bufFactors.isEmpty()
     1303      && fdivides (getVars (LCmultiplier), testVars))
     1304  {
     1305    LCheuristic= true;
     1306    int index;
     1307    Variable xx;
     1308    CFList vars1;
     1309    CFFList sqrfMultiplier= sqrFree (LCmultiplier);
     1310    if (sqrfMultiplier.getFirst().factor().inCoeffDomain())
     1311      sqrfMultiplier.removeFirst();
     1312    sqrfMultiplier= sortCFFListByNumOfVars (sqrfMultiplier);
     1313    xx= Variable (2);
     1314    for (iter= oldBiFactors; iter.hasItem(); iter++)
     1315      vars1.append (power (xx, degree (LC (iter.getItem(),1), xx)));
     1316    for (int i= 0; i < lengthAeval2; i++)
     1317    {
     1318      if (oldAeval[i].isEmpty())
     1319        continue;
     1320      xx= oldAeval[i].getFirst().mvar();
     1321      iter2= vars1;
     1322      for (iter= oldAeval[i]; iter.hasItem(); iter++, iter2++)
     1323        iter2.getItem() *= power (xx, degree (LC (iter.getItem(),1), xx));
     1324    }
     1325    CanonicalForm tmp;
     1326    iter2= vars1;
     1327    for (iter= leadingCoeffs2[lengthAeval2-1]; iter.hasItem(); iter++, iter2++)
     1328    {
     1329      tmp= iter.getItem()/LCmultiplier;
     1330      for (int i=1; i <= tmp.level(); i++)
     1331      {
     1332        if (degree(tmp,i) > 0 && (degree(iter2.getItem(),i) > degree (tmp,i)))
     1333          iter2.getItem() /= power (Variable (i), degree (tmp,i));
     1334      }
     1335    }
     1336    int multi;
     1337    for (CFFListIterator ii= sqrfMultiplier; ii.hasItem(); ii++)
     1338    {
     1339      multi= 0;
     1340      for (iter= vars1; iter.hasItem(); iter++)
     1341      {
     1342        tmp= iter.getItem();
     1343        while (fdivides (myGetVars (ii.getItem().factor()), tmp))
     1344        {
     1345          multi++;
     1346          tmp /= myGetVars (ii.getItem().factor());
     1347        }
     1348      }
     1349      if (multi == ii.getItem().exp())
     1350      {
     1351        index= 1;
     1352        for (iter= vars1; iter.hasItem(); iter++, index++)
     1353        {
     1354          while (fdivides (myGetVars (ii.getItem().factor()), iter.getItem()))
     1355          {
     1356            int index2= 1;
     1357            for (iter2= leadingCoeffs2[lengthAeval2-1];iter2.hasItem();iter2++,
     1358                                                                      index2++)
     1359            {
     1360              if (index2 == index)
     1361                continue;
     1362              else
     1363              {
     1364                tmp= ii.getItem().factor();
     1365                iter2.getItem() /= tmp;
     1366                CFListIterator iter3= evaluation;
     1367                for (int jj= A.level(); jj > 2; jj--, iter3++)
     1368                  tmp= tmp (iter3.getItem(), jj);
     1369                if (!tmp.inCoeffDomain())
     1370                {
     1371                  int index3= 1;
     1372                  for (iter3= biFactors; iter3.hasItem(); iter3++, index3++)
     1373                  {
     1374                    if (index3 == index2)
     1375                    {
     1376                      iter3.getItem() /= tmp;
     1377                      iter3.getItem() /= Lc (iter3.getItem());
     1378                      break;
     1379                    }
     1380                  }
     1381                }
     1382                A /= ii.getItem().factor();
     1383              }
     1384            }
     1385            iter.getItem() /= getVars (ii.getItem().factor());
     1386          }
     1387        }
     1388      }
     1389      else
     1390      {
     1391        index= 1;
     1392        for (iter= vars1; iter.hasItem(); iter++, index++)
     1393        {
     1394          if (!fdivides (myGetVars (ii.getItem().factor()), iter.getItem()))
     1395          {
     1396            int index2= 1;
     1397            for (iter2= leadingCoeffs2[lengthAeval2-1];iter2.hasItem();iter2++,
     1398                                                                      index2++)
     1399            {
     1400              if (index2 == index)
     1401              {
     1402                tmp= power (ii.getItem().factor(), ii.getItem().exp());
     1403                iter2.getItem() /= tmp;
     1404                A /= tmp;
     1405                CFListIterator iter3= evaluation;
     1406                for (int jj= A.level(); jj > 2; jj--, iter3++)
     1407                  tmp= tmp (iter3.getItem(), jj);
     1408                if (!tmp.inCoeffDomain())
     1409                {
     1410                  int index3= 1;
     1411                  for (iter3= biFactors; iter3.hasItem(); iter3++, index3++)
     1412                  {
     1413                    if (index3 == index2)
     1414                    {
     1415                      iter3.getItem() /= tmp;
     1416                      iter3.getItem() /= Lc (iter3.getItem());
     1417                      break;
     1418                    }
     1419                  }
     1420                }
     1421              }
     1422            }
     1423          }
     1424        }
     1425      }
     1426    }
     1427
     1428    leadingCoeffs= leadingCoeffs2[lengthAeval2-1];
     1429    for (int i= lengthAeval2-1; i > -1; i--)
     1430      leadingCoeffs2[i]= CFList();
     1431    prepareLeadingCoeffs (leadingCoeffs2,A.level(),leadingCoeffs, biFactors,
     1432                          evaluation);
     1433    Aeval= evaluateAtEval (A, evaluation, 2);
     1434
     1435    hh= 1/Lc (Aeval.getFirst());
     1436
     1437    for (CFListIterator i= Aeval; i.hasItem(); i++)
     1438      i.getItem() *= hh;
     1439
     1440    A *= hh;
     1441
     1442    if (!fdivides (LC (oldA,1),prod (leadingCoeffs2[lengthAeval2-1])))
     1443    {
     1444      LCheuristic= false;
     1445      A= bufA;
     1446      biFactors= bufBiFactors;
     1447      leadingCoeffs2[lengthAeval2-1]= bufLeadingCoeffs2;
     1448      LCmultiplier= bufLCmultiplier;
     1449    }
     1450  }
     1451
     1452tryAgainWithoutHeu:
    9181453  //shifting to zero
    9191454  A= shift2Zero (A, Aeval, evaluation);
     
    9221457    iter.getItem()= iter.getItem () (y + evaluation.getLast(), y);
    9231458
    924   for (int i= 0; i < A.level() - 2; i++)
    925   {
    926     if (i != A.level() - 3)
    927       leadingCoeffs2[i]= CFList();
    928   }
    929   for (iter= leadingCoeffs2[A.level() - 3]; iter.hasItem(); iter++)
     1459  for (int i= 0; i < lengthAeval2-1; i++)
     1460    leadingCoeffs2[i]= CFList();
     1461  for (iter= leadingCoeffs2[lengthAeval2-1]; iter.hasItem(); iter++)
    9301462  {
    9311463    iter.getItem()= shift2Zero (iter.getItem(), list, evaluation);
    9321464    for (int i= A.level() - 4; i > -1; i--)
    9331465    {
    934       if (i + 1 == A.level() - 3)
     1466      if (i + 1 == lengthAeval2-1)
    9351467        leadingCoeffs2[i].append (iter.getItem() (0, i + 4));
    9361468      else
     
    9491481  bool noOneToOne= false;
    9501482
     1483  CFList commonDenominators;
     1484  for (iter=biFactors; iter.hasItem(); iter++)
     1485    commonDenominators.append (bCommonDen (iter.getItem()));
     1486  CanonicalForm tmp1, tmp2, tmp3=1;
     1487  for (int i= 0; i < lengthAeval2; i++)
     1488  {
     1489    iter2= commonDenominators;
     1490    for (iter= leadingCoeffs2[i]; iter.hasItem(); iter++, iter2++)
     1491    {
     1492      tmp1= bCommonDen (iter.getItem());
     1493      Off (SW_RATIONAL);
     1494      iter2.getItem()= lcm (iter2.getItem(), tmp1);
     1495      On (SW_RATIONAL);
     1496    }
     1497  }
     1498  tmp1= prod (commonDenominators);
     1499  for (iter= Aeval; iter.hasItem(); iter++)
     1500  {
     1501    tmp2= bCommonDen (iter.getItem());
     1502    Off (SW_RATIONAL);
     1503    tmp3= lcm (tmp2,tmp3);
     1504    On (SW_RATIONAL);
     1505  }
     1506  CanonicalForm multiplier;
     1507  multiplier= tmp3/tmp1;
     1508  iter2= commonDenominators;
     1509  for (iter=biFactors; iter.hasItem(); iter++, iter2++)
     1510    iter.getItem() *= iter2.getItem()*multiplier;
     1511
     1512  for (iter= Aeval; iter.hasItem(); iter++)
     1513    iter.getItem() *= tmp3*power (multiplier, biFactors.length() - 1);
     1514
     1515  for (int i= 0; i < lengthAeval2; i++)
     1516  {
     1517    iter2= commonDenominators;
     1518    for (iter= leadingCoeffs2[i]; iter.hasItem(); iter++, iter2++)
     1519      iter.getItem() *= iter2.getItem()*multiplier;
     1520  }
     1521
     1522
    9511523  factors= nonMonicHenselLift (Aeval, biFactors, leadingCoeffs2, diophant,
    9521524                               Pi, liftBounds, liftBoundsLength, noOneToOne);
     
    9591531    if (check != factors.length())
    9601532      noOneToOne= true;
     1533    else
     1534      factors= Union (factors, bufFactors);
    9611535  }
    9621536  if (noOneToOne)
    9631537  {
     1538    if (!LCmultiplierIsConst && LCheuristic)
     1539    {
     1540      A= bufA;
     1541      biFactors= bufBiFactors;
     1542      leadingCoeffs2[lengthAeval2-1]= bufLeadingCoeffs2;
     1543      delete [] liftBounds;
     1544      LCheuristic= false;
     1545      goto tryAgainWithoutHeu;
     1546      //something probably went wrong in the heuristic
     1547    }
     1548
    9641549    A= shift2Zero (oldA, Aeval, evaluation);
    9651550    biFactors= oldBiFactors;
  • factory/facFqBivar.cc

    r24a77fb r001cc15  
    269269    return CFList();
    270270  }
     271  if (F.inCoeffDomain())
     272    return CFList();
    271273
    272274  Variable alpha= info.getAlpha();
     
    478480    return CFList ();
    479481  }
     482  if (F.inCoeffDomain())
     483    return CFList();
    480484  if (degs.getLength() <= 1 || factors.length() == 1)
    481485  {
     
    492496              (mod (b(LC (F, 1)*prodMod (factors, N)),N)/Lc (mod (b(LC (F, 1)*prodMod (factors, N)),N)) == F/Lc(F)));
    493497#endif
     498
    494499  CFList T, S;
    495500
     
    513518  bool recombination= false;
    514519  CanonicalForm test;
    515   bool isRat= (isOn (SW_RATIONAL) && getCharacteristic() == 0) || getCharacteristic() > 0;
     520  bool isRat= (isOn (SW_RATIONAL) && getCharacteristic() == 0) ||
     521               getCharacteristic() > 0;
    516522  if (!isRat)
    517523    On (SW_RATIONAL);
     
    519525  if (!isRat)
    520526    Off (SW_RATIONAL);
    521   buf0= buf(0,x)*LCBuf;
    522527  while (T.length() >= 2*s && s <= thres)
    523528  {
     
    584589            recombination= true;
    585590            result.append (g);
    586             buf= quot;
     591            if (b.getp() != 0)
     592              buf= quot*bCommonDen (quot);
     593            else
     594              buf= quot;
    587595            LCBuf= LC (buf, x);
    588596            T= Difference (T, S);
     
    703711  CanonicalForm buf= F;
    704712  Variable x= Variable (1);
    705   CanonicalForm LCBuf= LC (buf, x);
    706713  CanonicalForm g, quot;
    707714  CanonicalForm M= power (F.mvar(), deg);
     
    711718  if (!isRat)
    712719    On (SW_RATIONAL);
     720  if (b.getp() != 0)
     721    buf *= bCommonDen (buf);
     722  CanonicalForm LCBuf= LC (buf, x);
    713723  CanonicalForm buf0= mulNTL (buf (0,x), LCBuf);
    714724  CanonicalForm buf1= mulNTL (buf (1,x), LCBuf);
     
    746756            reconstructedFactors.append (g);
    747757            factorsFoundIndex[l]= 1;
    748             buf= quot;
     758            if (b.getp() != 0)
     759              buf= quot*bCommonDen(quot);
     760            else
     761              buf= quot;
    749762            d -= degree (g);
    750763            LCBuf= LC (buf, x);
     
    762775            if (bufDegs1.getLength() <= 1)
    763776            {
    764               reconstructedFactors.append (buf);
     777              if (!buf.inCoeffDomain())
     778              {
     779                reconstructedFactors.append (buf);
     780                F= 1;
     781              }
    765782              break;
    766783            }
     
    858875          if (bufDegs1.getLength() <= 1)
    859876          {
    860             buf= buf (y - eval, y);
    861             buf /= Lc (buf);
    862             appendMapDown (reconstructedFactors, buf, info, source, dest);
     877            if (!buf.inCoeffDomain())
     878            {
     879              buf= buf (y - eval, y);
     880              buf /= Lc (buf);
     881              appendMapDown (reconstructedFactors, buf, info, source, dest);
     882              F= 1;
     883            }
    863884            break;
    864885          }
     
    51305151    else
    51315152    {
    5132       int * zeroOne= extractZeroOneVecs (NTLN);
     5153      int * zeroOne;
     5154      long numCols, numRows;
     5155      if (alpha.level() == 1 || (alpha.level() != 1 && reduceFq2Fp))
     5156      {
     5157        numCols= NTLN.NumCols();
     5158        numRows= NTLN.NumRows();
     5159        zeroOne= extractZeroOneVecs (NTLN);
     5160      }
     5161      else
     5162      {
     5163        numCols= NTLNe.NumCols();
     5164        numRows= NTLNe.NumRows();
     5165        zeroOne= extractZeroOneVecs (NTLNe);
     5166      }
    51335167      CFList bufBufUniFactors= bufUniFactors;
    51345168      CFListIterator iter, iter2;
     
    51365170      CFList factorsConsidered;
    51375171      CanonicalForm tmp;
    5138       for (int i= 0; i < NTLN.NumCols(); i++)
     5172      for (int i= 0; i < numCols; i++)
    51395173      {
    51405174        if (zeroOne [i] == 0)
     
    51435177        buf= 1;
    51445178        factorsConsidered= CFList();
    5145         for (int j= 0; j < NTLN.NumRows(); j++, iter++)
    5146         {
    5147           if (!IsZero (NTLN (j + 1,i + 1)))
     5179        for (int j= 0; j < numRows; j++, iter++)
     5180        {
     5181          if (alpha.level() == 1 || (alpha.level() != 1 && reduceFq2Fp))
    51485182          {
    5149             factorsConsidered.append (iter.getItem());
    5150             buf *= mod (iter.getItem(), y);
     5183            if (!IsZero (NTLN (j + 1,i + 1)))
     5184            {
     5185              factorsConsidered.append (iter.getItem());
     5186              buf *= mod (iter.getItem(), y);
     5187            }
     5188          }
     5189          else
     5190          {
     5191            if (!IsZero (NTLNe (j + 1,i + 1)))
     5192            {
     5193              factorsConsidered.append (iter.getItem());
     5194              buf *= mod (iter.getItem(), y);
     5195            }
    51515196          }
    51525197        }
     
    59365981                          false, false, N);
    59375982
    5938     normalize (factors);
     5983    if (!extension)
     5984      normalize (factors);
    59395985    return factors;
    59405986  }
     
    59576003      append (factorsG, contentAyFactors);
    59586004      decompress (factorsG, N);
    5959       normalize (factors);
     6005      if (!extension)
     6006        normalize (factorsG);
    59606007      return factorsG;
    59616008    }
     
    59776024      append (factorsG, contentAyFactors);
    59786025      decompress (factorsG, N);
    5979       normalize (factors);
     6026      if (!extension)
     6027        normalize (factorsG);
    59806028      return factorsG;
    59816029    }
     
    60066054                          swap, false, N);
    60076055
    6008     normalize (factors);
     6056    if (!extension)
     6057      normalize (factors);
    60096058    return factors;
    60106059  }
     
    61116160                            swap, swap2, N);
    61126161
    6113       normalize (factors);
     6162      if (!extension)
     6163        normalize (factors);
    61146164      return factors;
    61156165    }
     
    61296179          appendSwapDecompress (factors, contentAxFactors, contentAyFactors,
    61306180                                swap, swap2, N);
    6131           normalize (factors);
     6181          if (!extension)
     6182            normalize (factors);
    61326183          return factors;
    61336184        }
     
    61466197          appendSwapDecompress (factors, contentAxFactors, contentAyFactors,
    61476198                                swap, swap2, N);
    6148           normalize (factors);
     6199          if (!extension)
     6200            normalize (factors);
    61496201          return factors;
    61506202        }
     
    62226274    appendSwapDecompress (factors, contentAxFactors, contentAyFactors,
    62236275                            swap, swap2, N);
    6224     normalize (factors);
     6276    if (!extension)
     6277      normalize (factors);
    62256278    return factors;
    62266279  }
     
    64246477  appendSwapDecompress (factors, contentAxFactors, contentAyFactors,
    64256478                        swap, swap2, N);
    6426   normalize (factors);
     6479  if (!extension)
     6480    normalize (factors);
    64276481
    64286482  return factors;
  • factory/facFqBivarUtil.cc

    r24a77fb r001cc15  
    269269void normalize (CFList& factors)
    270270{
     271  CanonicalForm lcinv;
    271272  for (CFListIterator i= factors; i.hasItem(); i++)
    272     i.getItem() /= Lc(i.getItem());
     273  {
     274    lcinv= 1/Lc (i.getItem());
     275    i.getItem() *= lcinv;
     276  }
    273277  return;
    274278}
     
    276280void normalize (CFFList& factors)
    277281{
     282  CanonicalForm lcinv;
    278283  for (CFFListIterator i= factors; i.hasItem(); i++)
    279     i.getItem()= CFFactor (i.getItem().factor()/Lc(i.getItem().factor()),
     284  {
     285    lcinv= 1/ Lc (i.getItem().factor());
     286    i.getItem()= CFFactor (i.getItem().factor()*lcinv,
    280287                           i.getItem().exp());
     288  }
    281289  return;
    282290}
  • factory/facFqFactorize.cc

    r24a77fb r001cc15  
    6363listGCD (const CFList& L)
    6464{
     65  if (L.length() == 0)
     66    return 0;
    6567  if (L.length() == 1)
    6668    return L.getFirst();
     
    140142    while( degsf[i] == 0 ) i++;
    141143    swap[n][0]= i;
    142     swap[n][1]= degsf[i];
     144    swap[n][1]= size (LC (F,i));
    143145    if (i != n)
    144146      result= swapvar (result, Variable (n), Variable(i));
     
    153155    for (int j= 1; j < n - i + 1; j++)
    154156    {
    155       if (swap[j][1] < swap[j + 1][1])
     157      if (swap[j][1] > swap[j + 1][1])
    156158      {
    157159        buf1= swap [j + 1] [0];
     
    703705}
    704706
     707#define CHAR_THRESHOLD 8
    705708CFList
    706709evalPoints (const CanonicalForm& F, CFList & eval, const Variable& alpha,
     
    713716  GFRandom genGF;
    714717  int p= getCharacteristic ();
     718  if (p < CHAR_THRESHOLD)
     719  {
     720    if (!GF && alpha.level() == 1)
     721    {
     722      fail= true;
     723      return CFList();
     724    }
     725    else if (!GF && alpha.level() != 1)
     726    {
     727      if ((p == 2 && degree (getMipo (alpha)) < 6) ||
     728          (p == 3 && degree (getMipo (alpha)) < 4) ||
     729          (p == 5 && degree (getMipo (alpha)) < 3))
     730      {
     731        fail= true;
     732        return CFList();
     733      }
     734    }
     735  }
    715736  double bound;
    716737  if (alpha != x)
    717738  {
    718739    bound= pow ((double) p, (double) degree (getMipo(alpha)));
    719     bound= pow ((double) bound, (double) k);
     740    bound *= (double) k;
    720741  }
    721742  else if (GF)
    722743  {
    723744    bound= pow ((double) p, (double) getGFDegree());
    724     bound= pow ((double) bound, (double) k);
     745    bound *= (double) k;
    725746  }
    726747  else
     
    11821203    {
    11831204      g= gcd (i.getItem().factor(), j.getItem().factor());
    1184       if (degree (g) > 0)
     1205      if (degree (g,1) > 0)
    11851206      {
    11861207        j.getItem()= CFFactor (j.getItem().factor()/g, j.getItem().exp());
     
    12201241      {
    12211242        CFListIterator iter1= result;
    1222         for (CFListIterator iter2= differentSecondVarFactors[i]; iter2.hasItem();
     1243        for (CFListIterator iter2= differentSecondVarFactors[i];iter2.hasItem();
    12231244             iter2++, iter1++)
    12241245        {
     
    12331254
    12341255  Variable v;
    1235   CFListIterator iter1;
     1256  CFListIterator iter1, iter2;
    12361257  CanonicalForm tmp, g;
     1258  CFList multiplier;
    12371259  for (int i= 0; i < length; i++)
    12381260  {
     
    12421264    iter1++;
    12431265
    1244     v= Variable (i + 3);
    1245     for (CFListIterator iter2= differentSecondVarFactors[i]; iter2.hasItem();
     1266    tmp= 1;
     1267    for (iter2= differentSecondVarFactors[i]; iter2.hasItem();
    12461268         iter2++, iter1++)
    12471269    {
    1248       if (degree (iter2.getItem(),v) == degree (iter1.getItem(),v))
     1270      if (iter2.getItem().inCoeffDomain())
     1271      {
     1272        multiplier.append (1);
    12491273        continue;
    1250       tmp= iter1.getItem();
    1251       for (int j= tmp.level(); j > 1; j--)
    1252       {
    1253         if (j == i + 3)
    1254           continue;
    1255         tmp= tmp (0, j);
     1274      }
     1275      v= iter2.getItem().mvar();
     1276      if (degree (iter2.getItem()) == degree (iter1.getItem(),v))
     1277      {
     1278        multiplier.append (1);
     1279        continue;
    12561280      }
    12571281      g= gcd (iter2.getItem(), content);
    1258       if (degree (g) > 0)
    1259       {
    1260         if (!tmp.isZero())
    1261           iter2.getItem() /= tmp;
    1262         content /= g;
    1263         iter1.getItem() *= g;
    1264       }
    1265     }
     1282      if (!g.inCoeffDomain())
     1283      {
     1284        tmp *= g;
     1285        multiplier.append (g);
     1286      }
     1287      else
     1288        multiplier.append (1);
     1289    }
     1290    if (!tmp.isOne() && fdivides (tmp, content))
     1291    {
     1292      iter1= l;
     1293      iter1++;
     1294      content /= tmp;
     1295      for (iter2= multiplier; iter2.hasItem(); iter1++, iter2++)
     1296        iter1.getItem() *= iter2.getItem();
     1297    }
     1298    multiplier= CFList();
    12661299  }
    12671300
     
    12691302  l.insert (content);
    12701303  return l;
    1271 }
    1272 
    1273 CFList evaluateAtZero (const CanonicalForm& F)
    1274 {
    1275   CFList result;
    1276   CanonicalForm buf= F;
    1277   result.insert (buf);
    1278   for (int i= F.level(); i > 2; i--)
    1279   {
    1280     buf= buf (0, i);
    1281     result.insert (buf);
    1282   }
    1283   return result;
    1284 }
    1285 
    1286 CFList evaluateAtEval (const CanonicalForm& F, const CFArray& eval)
    1287 {
    1288   CFList result;
    1289   CanonicalForm buf= F;
    1290   result.insert (buf);
    1291   int k= eval.size();
    1292   for (int i= 1; i < k; i++)
    1293   {
    1294     buf= buf (eval[i], i + 2);
    1295     result.insert (buf);
    1296   }
    1297   return result;
    1298 }
    1299 
    1300 CFList evaluateAtEval (const CanonicalForm& F, const CFList& evaluation, int l)
    1301 {
    1302   CFList result;
    1303   CanonicalForm buf= F;
    1304   result.insert (buf);
    1305   int k= evaluation.length() + l - 1;
    1306   CFListIterator j= evaluation;
    1307   for (int i= k; j.hasItem() && i > l; i--, j++)
    1308   {
    1309     if (F.level() < i)
    1310       continue;
    1311     buf= buf (j.getItem(), i);
    1312     result.insert (buf);
    1313   }
    1314   return result;
    13151304}
    13161305
     
    13481337  CanonicalForm test= evalSqrfPartF.getFirst() (evalPoint[0], 2);
    13491338
    1350   if (degree (test) != degree (sqrfPartF, 1))
     1339  if (degree (test) != degree (sqrfPartF, 1) || test.inCoeffDomain())
    13511340    return 0;
    13521341
     
    14321421  }
    14331422
    1434   CFMap N;
    1435   CanonicalForm F= compress (LCF, N);
     1423  CFMap N, M;
     1424  CFArray dummy= CFArray (2);
     1425  dummy [0]= LCF;
     1426  dummy [1]= Variable (2);
     1427  compress (dummy, M, N);
     1428  CanonicalForm F= M (LCF);
    14361429  if (LCF.isUnivariate())
    14371430  {
     
    14701463      result.insert (Lc (LCF));
    14711464    else
    1472       result.append (LCF);
     1465    {
     1466      for (CFListIterator i= result; i.hasItem(); i++)
     1467        i.getItem() *= LCF;
     1468      result.insert (LCF);
     1469    }
    14731470    return result;
    14741471  }
     
    14761473  CFList factors= LCFFactors;
    14771474
    1478   CFMap dummy;
    14791475  for (CFListIterator i= factors; i.hasItem(); i++)
    1480     i.getItem()= compress (i.getItem(), dummy);
     1476    i.getItem()= M (i.getItem());
    14811477
    14821478  CanonicalForm sqrfPartF;
     
    14841480  CFList evalSqrfPartF, bufFactors;
    14851481  CFArray evalPoint= CFArray (evaluation.length() - 1);
     1482  CFArray buf= CFArray (evaluation.length());
     1483  CFArray swap= CFArray (evaluation.length());
    14861484  CFListIterator iter= evaluation;
    1487   for (int i= evaluation.length() - 2; i > -1; i--, iter++)
    1488     evalPoint[i]= iter.getItem();
     1485  CanonicalForm vars=getVars (LCF)*Variable (2);
     1486  for (int i= evaluation.length() +1; i > 1; i--, iter++)
     1487  {
     1488    buf[i-2]=iter.getItem();
     1489    if (degree (vars, i) > 0)
     1490      swap[M(Variable (i)).level()-1]=buf[i-2];
     1491  }
     1492  buf= swap;
     1493  for (int i= 0; i < evaluation.length() - 1; i++)
     1494    evalPoint[i]= buf[i+1];
    14891495
    14901496  int pass= testFactors (F, factors, alpha, sqrfPartF,
     
    14981504    int lev= 0;
    14991505    // LCF is non-constant here
    1500     for (int i= 1; i <= LCF.level(); i++)
    1501     {
    1502       if(degree (LCF, i) > 0)
    1503       {
    1504         lev= i - 1;
    1505         break;
    1506       }
    1507     }
    15081506    CFList bufBufFactors;
    1509     CanonicalForm bufF, swap;
    1510     CFArray buf;
     1507    CanonicalForm bufF;
    15111508    for (int i= 0; i < lSecondVarLCs; i++)
    15121509    {
     
    15201517            allConstant= false;
    15211518            y= Variable (iter.getItem().level());
     1519            lev= M(y).level();
    15221520          }
    15231521        }
     
    15291527          iter.getItem()= swapvar (iter.getItem(), x, y);
    15301528        bufF= F;
    1531         z= Variable (y.level() - lev);
     1529        z= Variable (lev);
    15321530        bufF= swapvar (bufF, x, z);
    15331531        bufBufFactors= bufFactors;
    15341532        evalPoint= CFArray (evaluation.length() - 1);
    1535         buf= CFArray (evaluation.length());
    1536         iter= evaluation;
    1537         int k= evaluation.length() - 1;
    1538         for (; iter.hasItem(); iter++, k--)
    1539           buf[k]= iter.getItem();
    1540         swap= buf[z.level() - 1];
    1541         buf[z.level() - 1]= buf[0];
    1542         buf[0]= 0;
    1543         int l= 0;
    1544         for (k= 0; k < evaluation.length(); k++)
    1545         {
    1546           if (buf[k].isZero())
    1547             continue;
    1548           evalPoint[l]= buf[k];
    1549           l++;
     1533        for (int k= 0; k < evaluation.length()-1; k++)
     1534        {
     1535          if (N (Variable (k+1)).level() != y.level())
     1536            evalPoint[k]= buf[k+1];
     1537          else
     1538            evalPoint[k]= buf[0];
    15501539        }
    15511540        pass= testFactors (bufF, bufBufFactors, alpha, sqrfPartF, bufFactors,
     
    15891578
    15901579  bufFactors= factors;
     1580
     1581  CFMap MM, NN;
     1582  dummy [0]= sqrfPartF;
     1583  dummy [1]= 1;
     1584  compress (dummy, MM, NN);
     1585  sqrfPartF= MM (sqrfPartF);
     1586  CanonicalForm varsSqrfPartF= getVars (sqrfPartF);
     1587  for (CFListIterator iter= factors; iter.hasItem(); iter++)
     1588    iter.getItem()= MM (iter.getItem());
     1589
    15911590  CFList evaluation2;
    1592   if (y == x)
    1593     evaluation2= evaluation;
    1594   else
    1595   {
    1596     CanonicalForm tmp;
    1597     evaluation2= evaluation;
    1598     int i= evaluation.length() + 1;
    1599     for (CFListIterator iter= evaluation2; iter.hasItem(); iter++, i--)
    1600     {
    1601       if (i == y.level())
    1602       {
    1603         tmp= iter.getItem();
    1604         iter.getItem()= evaluation2.getLast();
    1605         evaluation2.removeLast();
    1606         evaluation2.append (tmp);
    1607         break;
    1608       }
    1609     }
    1610   }
     1591  for (int i= 2; i <= varsSqrfPartF.level(); i++)
     1592    evaluation2.insert (evalPoint[NN (Variable (i)).level()-2]);
    16111593
    16121594  CFList interMedResult;
    16131595  CanonicalForm oldSqrfPartF= sqrfPartF;
    1614   sqrfPartF= shift2Zero (sqrfPartF, evalSqrfPartF, evaluation2, 1);
     1596  sqrfPartF= shift2Zero (sqrfPartF, evalSqrfPartF, evaluation2);
    16151597  if (factors.length() > 1)
    16161598  {
     
    16201602      leadingCoeffs.append (LC1);
    16211603
    1622     CFList LC1eval= evaluateAtEval (LC1, evaluation2, 1);
     1604    CFList LC1eval= evaluateAtEval (LC1, evaluation2, 2);
    16231605    CFList oldFactors= factors;
    16241606    for (CFListIterator i= oldFactors; i.hasItem(); i++)
     
    16271609    bool success= false;
    16281610    CanonicalForm oldSqrfPartFPowLC= oldSqrfPartF*power(LC1,factors.length()-1);
     1611    CFList heuResult;
    16291612    if (size (oldSqrfPartFPowLC)/getNumVars (oldSqrfPartFPowLC) < 500 &&
    16301613        LucksWangSparseHeuristic (oldSqrfPartFPowLC,
    1631                                   oldFactors, 1, leadingCoeffs, factors))
    1632     {
    1633       interMedResult= recoverFactors (oldSqrfPartF, factors);
     1614                                  oldFactors, 2, leadingCoeffs, heuResult))
     1615    {
     1616      interMedResult= recoverFactors (oldSqrfPartF, heuResult);
    16341617      if (oldFactors.length() == interMedResult.length())
    16351618        success= true;
     
    16441627
    16451628      for (CFListIterator i= factors; i.hasItem(); i++)
    1646       {
    1647         i.getItem()= i.getItem() (x + evaluation2.getLast(), x);
    16481629        i.getItem() *= LC1 (0,2)/Lc (i.getItem());
    1649       }
    16501630      factors.insert (1);
    16511631
     
    16911671      }
    16921672      for (CFListIterator iter= factors; iter.hasItem(); iter++)
    1693         iter.getItem()= reverseShift (iter.getItem(), evaluation2, 1);
     1673        iter.getItem()= reverseShift (iter.getItem(), evaluation2);
    16941674
    16951675      interMedResult=
    1696       recoverFactors (reverseShift(evalSqrfPartF.getLast(),evaluation2,1),
     1676      recoverFactors (reverseShift(evalSqrfPartF.getLast(),evaluation2),
    16971677                      factors);
    16981678    }
     
    17001680  else
    17011681  {
    1702     factors= CFList (oldSqrfPartF);
     1682    CanonicalForm contF=content (oldSqrfPartF,1);
     1683    factors= CFList (oldSqrfPartF/contF);
    17031684    interMedResult= recoverFactors (oldSqrfPartF, factors);
    17041685  }
     1686
     1687  for (CFListIterator iter= interMedResult; iter.hasItem(); iter++)
     1688    iter.getItem()= NN (iter.getItem());
    17051689
    17061690  CFList result;
     
    17721756  CFList tmp2;
    17731757  CFListIterator iter;
     1758  bool preserveDegree= true;
     1759  Variable x= Variable (1);
     1760  int j, degAi, degA1= degree (A,1);
    17741761  for (int i= A.level(); i > 2; i--)
    17751762  {
     
    17771764    tmp2= CFList();
    17781765    iter= evaluation;
    1779     bool preserveDegree= true;
    1780     for (int j= A.level(); j > 1; j--, iter++)
     1766    preserveDegree= true;
     1767    degAi= degree (A,i);
     1768    for (j= A.level(); j > 1; j--, iter++)
    17811769    {
    17821770      if (j == i)
     
    17861774        tmp= tmp (iter.getItem(), j);
    17871775        tmp2.insert (tmp);
    1788         if ((degree (tmp, i) != degree (A, i)) ||
    1789             (degree (tmp, 1) != degree (A, 1)))
     1776        if ((degree (tmp, i) != degAi) ||
     1777            (degree (tmp, 1) != degA1))
    17901778        {
    17911779          preserveDegree= false;
    17921780          break;
    17931781        }
    1794         if (!content(tmp).inCoeffDomain() || !content(tmp,1).inCoeffDomain())
    1795         {
    1796           preserveDegree= false;
    1797           break;
    1798         }
    1799       }
    1800     }
     1782      }
     1783    }
     1784    if (!content(tmp,1).inCoeffDomain())
     1785      preserveDegree= false;
     1786    if (!(gcd (deriv (tmp,x), tmp)).inCoeffDomain())
     1787      preserveDegree= false;
    18011788    if (preserveDegree)
    18021789      Aeval [i - 3]= tmp2;
     
    18371824  while (T.length() >= 2*s && s <= thres)
    18381825  {
    1839     while (nosubset == false) 
    1840     {
    1841       if (T.length() == s) 
     1826    while (nosubset == false)
     1827    {
     1828      if (T.length() == s)
    18421829      {
    18431830        delete [] v;
     
    19201907}
    19211908
     1909CFList conv (const CFArray & A)
     1910{
     1911  CFList result;
     1912  for (int i= A.max(); i >= A.min(); i--)
     1913    result.insert (A[i]);
     1914  return result;
     1915}
     1916
     1917
    19221918void getLeadingCoeffs (const CanonicalForm& A, CFList*& Aeval,
     1919                       const CFList& uniFactors, const CFList& evaluation
     1920                      )
     1921{
     1922  CFListIterator iter;
     1923  CFList LCs;
     1924  for (int j= 0; j < A.level() - 2; j++)
     1925  {
     1926    if (!Aeval[j].isEmpty())
     1927    {
     1928      LCs= CFList();
     1929      for (iter= Aeval[j]; iter.hasItem(); iter++)
     1930        LCs.append (LC (iter.getItem(), 1));
     1931      //normalize (LCs);
     1932      Aeval[j]= LCs;
     1933    }
     1934  }
     1935}
     1936
     1937void sortByUniFactors (CFList*& Aeval, int AevalLength,
    19231938                       const CFList& uniFactors, const CFList& evaluation
    19241939                      )
     
    19281943  CFListIterator iter, iter2;
    19291944  Variable v;
    1930   CFList l, LCs, buf;
    1931   int pos;
    1932   for (int j= 0; j < A.level() - 2; j++)
     1945  CFList LCs, buf;
     1946  CFArray l;
     1947  int pos, index;
     1948  for (int j= 0; j < AevalLength; j++)
    19331949  {
    19341950    if (!Aeval[j].isEmpty())
    19351951    {
    1936       i= A.level();
     1952      i= evaluation.length() + 1;
    19371953      for (iter= evaluation; iter.hasItem(); iter++, i--)
    19381954      {
     
    19501966                                 evalPoint, v);
    19511967
    1952       l= CFList();
    19531968      buf= buildUniFactors (Aeval[j], evalPoint, v);
    1954       for (iter= uniFactors; iter.hasItem(); iter++)
    1955       {
    1956         pos= findItem (buf, iter.getItem());
     1969      l= CFArray (uniFactors.length());
     1970      index= 1;
     1971      for (iter= buf; iter.hasItem(); iter++, index++)
     1972      {
     1973        pos= findItem (uniFactors, iter.getItem());
    19571974        if (pos)
    1958           l.append (getItem (Aeval[j], pos));
    1959       }
    1960       Aeval [j]= l;
    1961 
    1962       LCs= CFList();
    1963       for (iter= Aeval[j]; iter.hasItem(); iter++)
    1964         LCs.append (LC (iter.getItem(), 1));
    1965       normalize (LCs);
    1966       Aeval[j]= LCs;
     1975          l[pos-1]= getItem (Aeval[j], index);
     1976      }
     1977      buf= conv (l);
     1978      Aeval [j]= buf;
     1979
     1980      buf= buildUniFactors (Aeval[j], evalPoint, v);
    19671981    }
    19681982  }
     
    20462060      j.getItem() *= ii.getItem();
    20472061  }
    2048 }
    2049 
    2050 CFList recoverFactors (const CanonicalForm& F, const CFList& factors)
    2051 {
    2052   CFList result;
    2053   CanonicalForm tmp, tmp2;
    2054   CanonicalForm G= F;
    2055   for (CFListIterator i= factors; i.hasItem(); i++)
    2056   {
    2057     tmp= i.getItem()/content (i.getItem(), 1);
    2058     if (fdivides (tmp, G, tmp2))
    2059     {
    2060       G= tmp2;
    2061       result.append (tmp);
    2062     }
    2063   }
    2064   return result;
    2065 }
    2066 
    2067 CFList recoverFactors (const CanonicalForm& F, const CFList& factors,
    2068                        const CFList& evaluation)
    2069 {
    2070   CFList result;
    2071   CanonicalForm tmp, tmp2;
    2072   CanonicalForm G= F;
    2073   for (CFListIterator i= factors; i.hasItem(); i++)
    2074   {
    2075     tmp= reverseShift (i.getItem(), evaluation);
    2076     tmp /= content (tmp, 1);
    2077     if (fdivides (tmp, G, tmp2))
    2078     {
    2079       G= tmp2;
    2080       result.append (tmp);
    2081     }
    2082   }
    2083   return result;
    20842062}
    20852063
     
    22692247    }
    22702248    decompress (contentAFactors, N);
    2271     normalize (contentAFactors);
     2249    if (!extension)
     2250      normalize (contentAFactors);
    22722251    return contentAFactors;
    22732252  }
     
    23182297               multiFactorize (gcdDerivZ, info));
    23192298        appendSwapDecompress (factorsG, contentAFactors, N, swapLevel, x);
    2320         normalize (factorsG);
     2299        if (!extension)
     2300          normalize (factorsG);
    23212301        return factorsG;
    23222302      }
     
    23382318  CFList biFactors, bufBiFactors;
    23392319  CanonicalForm evalPoly;
    2340   int lift, bufLift;
     2320  int lift, bufLift, lengthAeval2= A.level()-2;
    23412321  double logarithm= (double) ilog2 (totaldegree (A));
    23422322  logarithm /= log2exp;
     
    23442324  if (factorNums < (int) logarithm)
    23452325    factorNums= (int) logarithm;
    2346   CFList* bufAeval2= new CFList [A.level() - 2];
    2347   CFList* Aeval2= new CFList [A.level() - 2];
     2326  CFList* bufAeval2= new CFList [lengthAeval2];
     2327  CFList* Aeval2= new CFList [lengthAeval2];
    23482328  int counter;
    23492329  int differentSecondVar= 0;
     
    23842364                 multiFactorize (A/g, info));
    23852365          appendSwapDecompress (factorsG, contentAFactors, N, swapLevel, x);
    2386           normalize (factorsG);
     2366          if (!extension)
     2367            normalize (factorsG);
    23872368          delete [] bufAeval2;
    23882369          delete [] Aeval2;
     
    24022383    evaluationWRTDifferentSecondVars (bufAeval2, bufEvaluation, A);
    24032384
    2404     for (int j= 0; j < A.level() - 2; j++)
     2385    for (int j= 0; j < lengthAeval2; j++)
    24052386    {
    24062387      if (!bufAeval2[j].isEmpty())
     
    24312412      appendSwapDecompress (factors, contentAFactors, N, swapLevel,
    24322413                            swapLevel2, x);
    2433       normalize (factors);
     2414      if (!extension)
     2415        normalize (factors);
    24342416      delete [] bufAeval2;
    24352417      delete [] Aeval2;
     
    24432425      biFactors= bufBiFactors;
    24442426      lift= bufLift;
    2445       for (int j= 0; j < A.level() - 2; j++)
     2427      for (int j= 0; j < lengthAeval2; j++)
    24462428        Aeval2 [j]= bufAeval2 [j];
    24472429      differentSecondVar= counter;
     
    24572439        biFactors= bufBiFactors;
    24582440        lift= bufLift;
    2459         for (int j= 0; j < A.level() - 2; j++)
     2441        for (int j= 0; j < lengthAeval2; j++)
    24602442          Aeval2 [j]= bufAeval2 [j];
    24612443        differentSecondVar= counter;
     
    24742456  int minFactorsLength;
    24752457  bool irred= false;
    2476   factorizationWRTDifferentSecondVars (A, Aeval2, info, minFactorsLength, irred);
     2458  factorizationWRTDifferentSecondVars (A, Aeval2, info, minFactorsLength,irred);
    24772459
    24782460  if (irred)
     
    24862468    appendSwapDecompress (factors, contentAFactors, N, swapLevel,
    24872469                          swapLevel2, x);
    2488     normalize (factors);
     2470    if (!extension)
     2471      normalize (factors);
    24892472    delete [] Aeval2;
    24902473    return factors;
     
    24972480  minFactorsLength= tmin (minFactorsLength, biFactors.length());
    24982481
    2499   if (differentSecondVar == A.level() - 2)
     2482  if (differentSecondVar == lengthAeval2)
    25002483  {
    25012484    bool zeroOccured= false;
     
    25102493    if (!zeroOccured)
    25112494    {
    2512       factors= sparseHeuristic (A, biFactors, Aeval2, evaluation, minFactorsLength);
     2495      factors= sparseHeuristic (A, biFactors, Aeval2, evaluation,
     2496                                minFactorsLength);
    25132497      if (factors.length() == biFactors.length())
    25142498      {
     
    25182502        appendSwapDecompress (factors, contentAFactors, N, swapLevel,
    25192503                              swapLevel2, x);
    2520         normalize (factors);
     2504        if (!extension)
     2505          normalize (factors);
    25212506        delete [] Aeval2;
    25222507        return factors;
     
    25302515  CFList uniFactors= buildUniFactors (biFactors, evaluation.getLast(), y);
    25312516
    2532   CFList * oldAeval= new CFList [A.level() - 2]; //TODO use bufAeval2 for this
    2533   for (int i= 0; i < A.level() - 2; i++)
     2517  sortByUniFactors (Aeval2, lengthAeval2, uniFactors, evaluation);
     2518
     2519  CFList * oldAeval= new CFList [lengthAeval2]; //TODO use bufAeval2 for this
     2520  for (int i= 0; i < lengthAeval2; i++)
    25342521    oldAeval[i]= Aeval2[i];
    25352522
     
    25422529  Variable v;
    25432530  CFList leadingCoeffs= precomputeLeadingCoeff (LC (A, 1), biFactorsLCs, alpha,
    2544                                           evaluation, Aeval2, A.level() - 2, v);
     2531                                          evaluation, Aeval2, lengthAeval2, v);
    25452532
    25462533  if (v.level() != 1)
    25472534  {
    25482535    A= swapvar (A, y, v);
    2549     for (int i= 0; i < A.level() - 2; i++)
    2550     {
    2551       if (oldAeval[i].isEmpty())
    2552         continue;
    2553       if (oldAeval[i].getFirst().level() == v.level())
    2554       {
    2555         biFactors= CFList();
    2556         for (CFListIterator iter= oldAeval [i]; iter.hasItem(); iter++)
    2557           biFactors.append (swapvar (iter.getItem(), v, y));
    2558       }
    2559     }
    25602536    int i= A.level();
    25612537    CanonicalForm evalPoint;
     
    25692545        evaluation.append (evalPoint);
    25702546        break;
     2547      }
     2548    }
     2549    for (i= 0; i < lengthAeval2; i++)
     2550    {
     2551      if (oldAeval[i].isEmpty())
     2552        continue;
     2553      if (oldAeval[i].getFirst().level() == v.level())
     2554      {
     2555        CFArray tmp= copy (oldAeval[i]);
     2556        oldAeval[i]= biFactors;
     2557        for (CFListIterator iter= oldAeval[i]; iter.hasItem(); iter++)
     2558          iter.getItem()= swapvar (iter.getItem(), v, y);
     2559        for (int ii= 0; ii < tmp.size(); ii++)
     2560          tmp[ii]= swapvar (tmp[ii], v, y);
     2561        CFArray tmp2= CFArray (tmp.size());
     2562        CanonicalForm buf;
     2563        for (int ii= 0; ii < tmp.size(); ii++)
     2564        {
     2565          buf= tmp[ii] (evaluation.getLast(),y);
     2566          buf /= Lc (buf);
     2567          tmp2[findItem (uniFactors, buf)-1]=tmp[ii];
     2568        }
     2569        biFactors= CFList();
     2570        for (int j= 0; j < tmp2.size(); j++)
     2571          biFactors.append (tmp2[j]);
    25712572      }
    25722573    }
     
    25942595  }
    25952596
     2597  CanonicalForm LCmultiplier= leadingCoeffs.getFirst();
     2598  bool LCmultiplierIsConst= LCmultiplier.inCoeffDomain();
    25962599  leadingCoeffs.removeFirst();
    25972600
    25982601  //prepare leading coefficients
    2599   CFList* leadingCoeffs2= new CFList [A.level() - 2];
     2602  CFList* leadingCoeffs2= new CFList [lengthAeval2];
    26002603  prepareLeadingCoeffs (leadingCoeffs2, A.level(), leadingCoeffs, biFactors,
    26012604                        evaluation);
    26022605
    26032606  Aeval= evaluateAtEval (A, evaluation, 2);
    2604   CanonicalForm hh= Lc (Aeval.getFirst());
     2607  CanonicalForm hh= 1/Lc (Aeval.getFirst());
    26052608  for (iter= Aeval; iter.hasItem(); iter++)
    2606     iter.getItem() /= hh;
    2607 
    2608   A /= hh;
    2609 
    2610   if (size (A)/getNumVars (A) < 500 &&
    2611       LucksWangSparseHeuristic (A, biFactors, 2, leadingCoeffs2 [A.level() - 3],
    2612                                 factors))
    2613   {
    2614     int check= factors.length();
    2615     factors= recoverFactors (A, factors);
     2609    iter.getItem() *= hh;
     2610
     2611  A *= hh;
     2612
     2613
     2614  CFListIterator iter2;
     2615  CFList bufLeadingCoeffs2= leadingCoeffs2[lengthAeval2-1];
     2616  bufBiFactors= biFactors;
     2617  bufA= A;
     2618  CanonicalForm bufLCmultiplier= LCmultiplier;
     2619  CanonicalForm testVars;
     2620  if (!LCmultiplierIsConst)
     2621  {
     2622    testVars= Variable (2);
     2623    for (int i= 0; i < lengthAeval2; i++)
     2624    {
     2625      if (!oldAeval[i].isEmpty())
     2626        testVars *= oldAeval[i].getFirst().mvar();
     2627    }
     2628  }
     2629  CFList bufFactors= CFList();
     2630  bool LCheuristic= false;
     2631  if (LucksWangSparseHeuristic (A, biFactors, 2, leadingCoeffs2[lengthAeval2-1],
     2632                                 factors))
     2633  {
     2634    int check= biFactors.length();
     2635    int * index= new int [factors.length()];
     2636    CFList oldFactors= factors;
     2637    factors= recoverFactors (A, factors, index);
    26162638
    26172639    if (check == factors.length())
    26182640    {
    26192641      if (extension)
    2620         factors= extNonMonicFactorRecombination (factors, A, info);
     2642        factors= extNonMonicFactorRecombination (factors, bufA, info);
    26212643
    26222644      if (v.level() != 1)
    26232645      {
    2624         for (CFListIterator iter= factors; iter.hasItem(); iter++)
     2646        for (iter= factors; iter.hasItem(); iter++)
    26252647          iter.getItem()= swapvar (iter.getItem(), v, y);
    26262648      }
     2649
    26272650      appendSwapDecompress (factors, contentAFactors, N, swapLevel,
    26282651                            swapLevel2, x);
    2629       normalize (factors);
     2652      if (!extension)
     2653        normalize (factors);
     2654      delete [] index;
    26302655      delete [] Aeval2;
    26312656      return factors;
    26322657    }
     2658    else if (factors.length() > 0)
     2659    {
     2660      int oneCount= 0;
     2661      CFList l;
     2662      for (int i= 0; i < check; i++)
     2663      {
     2664        if (index[i] == 1)
     2665        {
     2666          iter=biFactors;
     2667          for (int j=1; j <= i-oneCount; j++)
     2668            iter++;
     2669          iter.remove (1);
     2670          for (int j= 0; j < lengthAeval2; j++)
     2671          {
     2672            l= leadingCoeffs2[j];
     2673            iter= l;
     2674            for (int k=1; k <= i-oneCount; k++)
     2675              iter++;
     2676            iter.remove (1);
     2677            leadingCoeffs2[j]=l;
     2678          }
     2679          oneCount++;
     2680        }
     2681      }
     2682      bufFactors= factors;
     2683      factors= CFList();
     2684    }
     2685    else if (!LCmultiplierIsConst && factors.length() == 0)
     2686    {
     2687      LCheuristic= true;
     2688      factors= oldFactors;
     2689      CanonicalForm cont;
     2690      CFList contents, LCs;
     2691      int index=1;
     2692      bool foundTrueMultiplier= false;
     2693      for (iter= factors; iter.hasItem(); iter++, index++)
     2694      {
     2695        cont= content (iter.getItem(), 1);
     2696        cont= gcd (cont , LCmultiplier);
     2697        contents.append (cont);
     2698        if (cont.inCoeffDomain()) // trivial content->LCmultiplier needs to go there
     2699        {
     2700          foundTrueMultiplier= true;
     2701          int index2= 1;
     2702          for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem(); iter2++,
     2703                                                                    index2++)
     2704          {
     2705            if (index2 == index)
     2706              continue;
     2707            iter2.getItem() /= LCmultiplier;
     2708          }
     2709          A= oldA;
     2710          leadingCoeffs= leadingCoeffs2[lengthAeval2-1];
     2711          for (int i= lengthAeval2-1; i > -1; i--)
     2712            leadingCoeffs2[i]= CFList();
     2713          prepareLeadingCoeffs (leadingCoeffs2, A.level(), leadingCoeffs,
     2714                                biFactors, evaluation );
     2715          Aeval= evaluateAtEval (A, evaluation, 2);
     2716
     2717          hh= 1/Lc (Aeval.getFirst());
     2718
     2719          for (iter2= Aeval; iter2.hasItem(); iter2++)
     2720            iter2.getItem() *= hh;
     2721
     2722          A *= hh;
     2723          break;
     2724        }
     2725        else
     2726          LCs.append (LC (iter.getItem()/cont, 1));
     2727      }
     2728      if (!foundTrueMultiplier)
     2729      {
     2730        index= 1;
     2731        iter2= factors;
     2732        bool foundMultiplier= false;
     2733        for (iter= contents; iter.hasItem(); iter++, iter2++, index++)
     2734        {
     2735          if (fdivides (iter.getItem(), LCmultiplier))
     2736          {
     2737            if ((LCmultiplier/iter.getItem()).inCoeffDomain() &&
     2738                !isOnlyLeadingCoeff(iter2.getItem())) //content divides LCmultiplier completely and factor consists of more terms than just the leading coeff
     2739            {
     2740              int index2= 1;
     2741              for (CFListIterator iter3= leadingCoeffs2[lengthAeval2-1];
     2742                   iter3.hasItem(); iter3++, index2++)
     2743              {
     2744                if (index2 == index)
     2745                {
     2746                  iter3.getItem() /= LCmultiplier;
     2747                  break;
     2748                }
     2749              }
     2750              A /= LCmultiplier;
     2751              foundMultiplier= true;
     2752              iter.getItem()= 1;
     2753            }
     2754          }
     2755        }
     2756        // coming from above: divide out more LCmultiplier if possible
     2757        if (foundMultiplier)
     2758        {
     2759          foundMultiplier= false;
     2760          index=1;
     2761          iter2= factors;
     2762          for (iter= contents; iter.hasItem(); iter++, iter2++, index++)
     2763          {
     2764            if (!iter.getItem().isOne() &&
     2765                fdivides (iter.getItem(), LCmultiplier))
     2766            {
     2767              if (!isOnlyLeadingCoeff (iter2.getItem())) // factor is more than just leading coeff
     2768              {
     2769                int index2= 1;
     2770                for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem();
     2771                     iter2++, index2++)
     2772                {
     2773                  if (index2 == index)
     2774                  {
     2775                    iter2.getItem() /= iter.getItem();
     2776                    foundMultiplier= true;
     2777                    break;
     2778                  }
     2779                }
     2780                A /= iter.getItem();
     2781                LCmultiplier /= iter.getItem();
     2782                iter.getItem()= 1;
     2783              }
     2784              else if (fdivides (getVars (LCmultiplier), testVars))//factor consists of just leading coeff
     2785              {
     2786                //TODO maybe use a sqrffree decomposition of LCmultiplier as below
     2787                Variable xx= Variable (2);
     2788                CanonicalForm vars;
     2789                vars= power (xx, degree (LC (getItem(oldBiFactors, index),1),
     2790                                          xx));
     2791                for (int i= 0; i < lengthAeval2; i++)
     2792                {
     2793                  if (oldAeval[i].isEmpty())
     2794                    continue;
     2795                  xx= oldAeval[i].getFirst().mvar();
     2796                  vars *= power (xx, degree (LC (getItem(oldAeval[i], index),1),
     2797                                             xx));
     2798                }
     2799                if (myGetVars(content(getItem(leadingCoeffs2[lengthAeval2-1],index),1))
     2800                    /myGetVars (LCmultiplier) == vars)
     2801                {
     2802                  int index2= 1;
     2803                  for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem();
     2804                       iter2++, index2++)
     2805                  {
     2806                    if (index2 == index)
     2807                    {
     2808                      iter2.getItem() /= LCmultiplier;
     2809                      foundMultiplier= true;
     2810                      break;
     2811                    }
     2812                  }
     2813                  A /= LCmultiplier;
     2814                  iter.getItem()= 1;
     2815                }
     2816              }
     2817            }
     2818          }
     2819        }
     2820        else
     2821        {
     2822          CanonicalForm pLCs= prod (LCs);
     2823          if (fdivides (pLCs, LC (oldA,1)) && (LC(oldA,1)/pLCs).inCoeffDomain()) // check if the product of the lead coeffs of the primitive factors equals the lead coeff of the old A
     2824          {
     2825            A= oldA;
     2826            iter2= leadingCoeffs2[lengthAeval2-1];
     2827            for (iter= contents; iter.hasItem(); iter++, iter2++)
     2828              iter2.getItem() /= iter.getItem();
     2829            foundMultiplier= true;
     2830          }
     2831          if (!foundMultiplier && fdivides (getVars (LCmultiplier), testVars))
     2832          {
     2833            Variable xx;
     2834            CFList vars1;
     2835            CFFList sqrfMultiplier= sqrFree (LCmultiplier);
     2836            if (sqrfMultiplier.getFirst().factor().inCoeffDomain())
     2837              sqrfMultiplier.removeFirst();
     2838            sqrfMultiplier= sortCFFListByNumOfVars (sqrfMultiplier);
     2839            xx= Variable (2);
     2840            for (iter= oldBiFactors; iter.hasItem(); iter++)
     2841              vars1.append (power (xx, degree (LC (iter.getItem(),1), xx)));
     2842            for (int i= 0; i < lengthAeval2; i++)
     2843            {
     2844              if (oldAeval[i].isEmpty())
     2845                continue;
     2846              xx= oldAeval[i].getFirst().mvar();
     2847              iter2= vars1;
     2848              for (iter= oldAeval[i]; iter.hasItem(); iter++, iter2++)
     2849                iter2.getItem() *= power(xx,degree (LC (iter.getItem(),1), xx));
     2850            }
     2851            CanonicalForm tmp;
     2852            iter2= vars1;
     2853            for (iter= leadingCoeffs2[lengthAeval2-1]; iter.hasItem(); iter++,
     2854                                                                    iter2++)
     2855            {
     2856              tmp= iter.getItem()/LCmultiplier;
     2857              for (int i=1; i <= tmp.level(); i++)
     2858              {
     2859                if (degree(tmp,i) > 0 &&
     2860                    (degree(iter2.getItem(),i) > degree (tmp,i)))
     2861                  iter2.getItem() /= power (Variable (i), degree (tmp,i));
     2862              }
     2863            }
     2864            int multi;
     2865            for (CFFListIterator ii= sqrfMultiplier; ii.hasItem(); ii++)
     2866            {
     2867              multi= 0;
     2868              for (iter= vars1; iter.hasItem(); iter++)
     2869              {
     2870                tmp= iter.getItem();
     2871                while (fdivides (myGetVars (ii.getItem().factor()), tmp))
     2872                {
     2873                  multi++;
     2874                  tmp /= myGetVars (ii.getItem().factor());
     2875                }
     2876              }
     2877              if (multi == ii.getItem().exp())
     2878              {
     2879                index= 1;
     2880                for (iter= vars1; iter.hasItem(); iter++, index++)
     2881                {
     2882                  while (fdivides (myGetVars(ii.getItem().factor()),
     2883                                   iter.getItem()
     2884                                  )
     2885                        )
     2886                  {
     2887                    int index2= 1;
     2888                    for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem();
     2889                         iter2++, index2++)
     2890                    {
     2891                      if (index2 == index)
     2892                        continue;
     2893                      else
     2894                      {
     2895                        tmp= ii.getItem().factor();
     2896                        iter2.getItem() /= tmp;
     2897                        CFListIterator iter3= evaluation;
     2898                        for (int jj= A.level(); jj > 2; jj--, iter3++)
     2899                          tmp= tmp (iter3.getItem(), jj);
     2900                        if (!tmp.inCoeffDomain())
     2901                        {
     2902                          int index3= 1;
     2903                          for (iter3= biFactors; iter3.hasItem(); iter3++,
     2904                                                                  index3++)
     2905                          {
     2906                            if (index3 == index2)
     2907                            {
     2908                              iter3.getItem() /= tmp;
     2909                              iter3.getItem() /= Lc (iter3.getItem());
     2910                              break;
     2911                            }
     2912                          }
     2913                        }
     2914                        A /= ii.getItem().factor();
     2915                      }
     2916                    }
     2917                    iter.getItem() /= getVars (ii.getItem().factor());
     2918                  }
     2919                }
     2920              }
     2921              else
     2922              {
     2923                index= 1;
     2924                for (iter= vars1; iter.hasItem(); iter++, index++)
     2925                {
     2926                  if (!fdivides (myGetVars (ii.getItem().factor()),
     2927                                 iter.getItem()
     2928                                )
     2929                     )
     2930                  {
     2931                    int index2= 1;
     2932                    for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem();
     2933                         iter2++, index2++)
     2934                    {
     2935                      if (index2 == index)
     2936                      {
     2937                        tmp= power (ii.getItem().factor(), ii.getItem().exp());
     2938                        iter2.getItem() /= tmp;
     2939                        A /= tmp;
     2940                        CFListIterator iter3= evaluation;
     2941                        for (int jj= A.level(); jj > 2; jj--, iter3++)
     2942                          tmp= tmp (iter3.getItem(), jj);
     2943                        if (!tmp.inCoeffDomain())
     2944                        {
     2945                          int index3= 1;
     2946                          for (iter3= biFactors; iter3.hasItem(); iter3++,
     2947                                                                  index3++)
     2948                          {
     2949                            if (index3 == index2)
     2950                            {
     2951                              iter3.getItem() /= tmp;
     2952                              iter3.getItem() /= Lc (iter3.getItem());
     2953                              break;
     2954                            }
     2955                          }
     2956                        }
     2957                      }
     2958                    }
     2959                  }
     2960                }
     2961              }
     2962            }
     2963          }
     2964        }
     2965
     2966        // patch everything together again
     2967        leadingCoeffs= leadingCoeffs2[lengthAeval2-1];
     2968        for (int i= lengthAeval2-1; i > -1; i--)
     2969          leadingCoeffs2[i]= CFList();
     2970        prepareLeadingCoeffs (leadingCoeffs2,A.level(),leadingCoeffs, biFactors,
     2971                              evaluation);
     2972        Aeval= evaluateAtEval (A, evaluation, 2);
     2973
     2974        hh= 1/Lc (Aeval.getFirst());
     2975
     2976        for (CFListIterator i= Aeval; i.hasItem(); i++)
     2977          i.getItem() *= hh;
     2978
     2979        A *= hh;
     2980      }
     2981      factors= CFList();
     2982      if (!fdivides (LC (oldA,1),prod (leadingCoeffs2[lengthAeval2-1])))
     2983      {
     2984        LCheuristic= false;
     2985        A= bufA;
     2986        biFactors= bufBiFactors;
     2987        leadingCoeffs2[lengthAeval2-1]= bufLeadingCoeffs2;
     2988        LCmultiplier= bufLCmultiplier;
     2989      }
     2990    }
    26332991    else
    26342992      factors= CFList();
    2635     //TODO handle this case
    2636   }
    2637 
     2993    delete [] index;
     2994  }
     2995
     2996  if (!LCheuristic && !LCmultiplierIsConst && bufFactors.isEmpty()
     2997      && fdivides (getVars (LCmultiplier), testVars))
     2998  {
     2999    LCheuristic= true;
     3000    int index;
     3001    Variable xx;
     3002    CFList vars1;
     3003    CFFList sqrfMultiplier= sqrFree (LCmultiplier);
     3004    if (sqrfMultiplier.getFirst().factor().inCoeffDomain())
     3005      sqrfMultiplier.removeFirst();
     3006    sqrfMultiplier= sortCFFListByNumOfVars (sqrfMultiplier);
     3007    xx= Variable (2);
     3008    for (iter= oldBiFactors; iter.hasItem(); iter++)
     3009      vars1.append (power (xx, degree (LC (iter.getItem(),1), xx)));
     3010    for (int i= 0; i < lengthAeval2; i++)
     3011    {
     3012      if (oldAeval[i].isEmpty())
     3013        continue;
     3014      xx= oldAeval[i].getFirst().mvar();
     3015      iter2= vars1;
     3016      for (iter= oldAeval[i]; iter.hasItem(); iter++, iter2++)
     3017        iter2.getItem() *= power (xx, degree (LC (iter.getItem(),1), xx));
     3018    }
     3019    CanonicalForm tmp;
     3020    iter2= vars1;
     3021    for (iter= leadingCoeffs2[lengthAeval2-1]; iter.hasItem(); iter++, iter2++)
     3022    {
     3023      tmp= iter.getItem()/LCmultiplier;
     3024      for (int i=1; i <= tmp.level(); i++)
     3025      {
     3026        if (degree (tmp,i) > 0 && (degree (iter2.getItem(),i) > degree (tmp,i)))
     3027          iter2.getItem() /= power (Variable (i), degree (tmp,i));
     3028      }
     3029    }
     3030    int multi;
     3031    for (CFFListIterator ii= sqrfMultiplier; ii.hasItem(); ii++)
     3032    {
     3033      multi= 0;
     3034      for (iter= vars1; iter.hasItem(); iter++)
     3035      {
     3036        tmp= iter.getItem();
     3037        while (fdivides (myGetVars (ii.getItem().factor()), tmp))
     3038        {
     3039          multi++;
     3040          tmp /= myGetVars (ii.getItem().factor());
     3041        }
     3042      }
     3043      if (multi == ii.getItem().exp())
     3044      {
     3045        index= 1;
     3046        for (iter= vars1; iter.hasItem(); iter++, index++)
     3047        {
     3048          while (fdivides (myGetVars (ii.getItem().factor()), iter.getItem()))
     3049          {
     3050            int index2= 1;
     3051            for (iter2= leadingCoeffs2[lengthAeval2-1]; iter2.hasItem();iter2++,
     3052                                                                      index2++)
     3053            {
     3054              if (index2 == index)
     3055                continue;
     3056              else
     3057              {
     3058                tmp= ii.getItem().factor();
     3059                iter2.getItem() /= tmp;
     3060                CFListIterator iter3= evaluation;
     3061                for (int jj= A.level(); jj > 2; jj--, iter3++)
     3062                  tmp= tmp (iter3.getItem(), jj);
     3063                if (!tmp.inCoeffDomain())
     3064                {
     3065                  int index3= 1;
     3066                  for (iter3= biFactors; iter3.hasItem(); iter3++, index3++)
     3067                  {
     3068                    if (index3 == index2)
     3069                    {
     3070                      iter3.getItem() /= tmp;
     3071                      iter3.getItem() /= Lc (iter3.getItem());
     3072                      break;
     3073                    }
     3074                  }
     3075                }
     3076                A /= ii.getItem().factor();
     3077              }
     3078            }
     3079            iter.getItem() /= getVars (ii.getItem().factor());
     3080          }
     3081        }
     3082      }
     3083      else
     3084      {
     3085        index= 1;
     3086        for (iter= vars1; iter.hasItem(); iter++, index++)
     3087        {
     3088          if (!fdivides (myGetVars (ii.getItem().factor()), iter.getItem()))
     3089          {
     3090            int index2= 1;
     3091            for (iter2= leadingCoeffs2[lengthAeval2-1];iter2.hasItem();iter2++,
     3092                                                                      index2++)
     3093            {
     3094              if (index2 == index)
     3095              {
     3096                tmp= power (ii.getItem().factor(), ii.getItem().exp());
     3097                iter2.getItem() /= tmp;
     3098                A /= tmp;
     3099                CFListIterator iter3= evaluation;
     3100                for (int jj= A.level(); jj > 2; jj--, iter3++)
     3101                  tmp= tmp (iter3.getItem(), jj);
     3102                if (!tmp.inCoeffDomain())
     3103                {
     3104                  int index3= 1;
     3105                  for (iter3= biFactors; iter3.hasItem(); iter3++, index3++)
     3106                  {
     3107                    if (index3 == index2)
     3108                    {
     3109                      iter3.getItem() /= tmp;
     3110                      iter3.getItem() /= Lc (iter3.getItem());
     3111                      break;
     3112                    }
     3113                  }
     3114                }
     3115              }
     3116            }
     3117          }
     3118        }
     3119      }
     3120    }
     3121
     3122    leadingCoeffs= leadingCoeffs2[lengthAeval2-1];
     3123    for (int i= lengthAeval2-1; i > -1; i--)
     3124      leadingCoeffs2[i]= CFList();
     3125    prepareLeadingCoeffs (leadingCoeffs2,A.level(),leadingCoeffs, biFactors,
     3126                          evaluation);
     3127    Aeval= evaluateAtEval (A, evaluation, 2);
     3128
     3129    hh= 1/Lc (Aeval.getFirst());
     3130
     3131    for (CFListIterator i= Aeval; i.hasItem(); i++)
     3132      i.getItem() *= hh;
     3133
     3134    A *= hh;
     3135
     3136    if (!fdivides (LC (oldA,1),prod (leadingCoeffs2[lengthAeval2-1])))
     3137    {
     3138      LCheuristic= false;
     3139      A= bufA;
     3140      biFactors= bufBiFactors;
     3141      leadingCoeffs2[lengthAeval2-1]= bufLeadingCoeffs2;
     3142      LCmultiplier= bufLCmultiplier;
     3143    }
     3144  }
     3145
     3146tryAgainWithoutHeu:
    26383147  A= shift2Zero (A, Aeval, evaluation);
    26393148
     
    26413150    iter.getItem()= iter.getItem () (y + evaluation.getLast(), y);
    26423151
    2643   for (int i= 0; i < A.level() - 2; i++)
    2644   {
    2645     if (i != A.level() - 3)
    2646       leadingCoeffs2[i]= CFList();
    2647   }
    2648   for (iter= leadingCoeffs2[A.level() - 3]; iter.hasItem(); iter++)
     3152  for (int i= 0; i < lengthAeval2-1; i++)
     3153    leadingCoeffs2[i]= CFList();
     3154  for (iter= leadingCoeffs2[lengthAeval2-1]; iter.hasItem(); iter++)
    26493155  {
    26503156    iter.getItem()= shift2Zero (iter.getItem(), list, evaluation);
    26513157    for (int i= A.level() - 4; i > -1; i--)
    26523158    {
    2653       if (i + 1 == A.level() - 3)
     3159      if (i + 1 == lengthAeval2-1)
    26543160        leadingCoeffs2[i].append (iter.getItem() (0, i + 4));
    26553161      else
     
    26773183    if (check != factors.length())
    26783184      noOneToOne= true;
     3185    else
     3186      factors= Union (factors, bufFactors);
    26793187
    26803188    if (extension && !noOneToOne)
     
    26833191  if (noOneToOne)
    26843192  {
     3193
     3194    if (!LCmultiplierIsConst && LCheuristic)
     3195    {
     3196      A= bufA;
     3197      biFactors= bufBiFactors;
     3198      leadingCoeffs2[lengthAeval2-1]= bufLeadingCoeffs2;
     3199      delete [] liftBounds;
     3200      LCheuristic= false;
     3201      goto tryAgainWithoutHeu;
     3202      //something probably went wrong in the heuristic
     3203    }
     3204
    26853205    A= shift2Zero (oldA, Aeval, evaluation);
    26863206    biFactors= oldBiFactors;
     
    26943214
    26953215    for (; i.hasItem(); i++)
    2696       lift= tmax (lift, degree (i.getItem(), 2) + degree (LC (i.getItem(), 1)) + 1);
     3216      lift= tmax (lift,
     3217                  degree (i.getItem(), 2) + degree (LC (i.getItem(), 1)) + 1);
    26973218
    26983219    lift= tmax (degree (Aeval.getFirst() , 2) + 1, lift);
     
    27613282  append (factors, contentAFactors);
    27623283  decompress (factors, N);
    2763   normalize (factors);
     3284  if (!extension)
     3285    normalize (factors);
    27643286
    27653287  delete[] liftBounds;
     
    27883310    bool extension= true;
    27893311    int p= getCharacteristic();
    2790     if (p*p < (1<<16)) // pass to GF if possible
     3312    if (p < 7)
     3313    {
     3314      if (p == 2)
     3315        setCharacteristic (getCharacteristic(), 6, 'Z');
     3316      else if (p == 3)
     3317        setCharacteristic (getCharacteristic(), 4, 'Z');
     3318      else if (p == 5)
     3319        setCharacteristic (getCharacteristic(), 3, 'Z');
     3320      ExtensionInfo info= ExtensionInfo (extension);
     3321      A= A.mapinto();
     3322      factors= multiFactorize (A, info);
     3323
     3324      CanonicalForm mipo= gf_mipo;
     3325      setCharacteristic (getCharacteristic());
     3326      Variable vBuf= rootOf (mipo.mapinto());
     3327      for (CFListIterator j= factors; j.hasItem(); j++)
     3328        j.getItem()= GF2FalphaRep (j.getItem(), vBuf);
     3329    }
     3330    else if (p >= 7 && p*p < (1<<16)) // pass to GF if possible
    27913331    {
    27923332      setCharacteristic (getCharacteristic(), 2, 'Z');
  • factory/facFqFactorize.h

    r24a77fb r001cc15  
    547547                                 );
    548548
    549 /// evaluate F successively n-2 at 0
    550 ///
    551 /// @return returns a list of successive evaluations of F, ending with F
    552 CFList evaluateAtZero (const CanonicalForm& F ///< [in] some poly
    553                       );
    554 
    555 /// divides factors by their content wrt. Variable(1) and checks if these polys
    556 /// divide F
    557 ///
    558 /// @return returns factors of F
    559 CFList recoverFactors (const CanonicalForm& F, ///< [in] some poly F
    560                        const CFList& factors   ///< [in] some list of
    561                                                ///< factor candidates
    562                       );
    563 
    564 /// divides factors shifted by evaluation by their content wrt. Variable(1) and
    565 /// checks if these polys divide F
    566 ///
    567 /// @return returns factors of F
    568 CFList recoverFactors (const CanonicalForm& F,  ///< [in] some poly F
    569                        const CFList& factors,   ///< [in] some list of
    570                                                 ///< factor candidates
    571                        const CFList& evaluation
    572                       );
    573 
    574549/// refine a bivariate factorization of A with l factors to one with
    575550/// minFactorsLength
     
    595570                );
    596571
     572
     573/// sort bivariate factors in Aeval such that their corresponding univariate
     574/// factors coincide with uniFactors
     575void sortByUniFactors (CFList*& Aeval,          ///< [in,out] array of bivariate
     576                                                ///< factors
     577                       int AevalLength,         ///< [in] length of Aeval
     578                       const CFList& uniFactors,///< [in] univariate factors
     579                       const CFList& evaluation ///< [in] evaluation point
     580                      );
     581
    597582/// extract leading coefficients wrt Variable(1) from bivariate factors obtained
    598583/// from factorizations of A wrt different second variables
     
    655640             );
    656641
    657 /// evaluate @a F at @a evaluation
    658 ///
    659 /// @return @a evaluateAtEval returns a list containing the successive
    660 /// evaluations of @a F, last entry is @a F again
    661 CFList
    662 evaluateAtEval (const CanonicalForm& F,   ///<[in] some poly
    663                 const CFArray& evaluation ///<[in] some evaluation point
    664                );
    665 
    666 /// evaluate @a F at @a evaluation
    667 ///
    668 /// @return @a evaluateAtEval returns a list containing the successive
    669 /// evaluations of @a F starting at level @a l, last entry is @a F again
    670 CFList
    671 evaluateAtEval (const CanonicalForm& F,  ///<[in] some poly
    672                 const CFList& evaluation,///<[in] some evaluation point
    673                 int l                    ///<[in] level to start at
    674                );
    675 
    676642#endif
    677643/* FAC_FQ_FACTORIZE_H */
  • factory/facFqFactorizeUtil.cc

    r24a77fb r001cc15  
    1515#include "canonicalform.h"
    1616#include "cf_map.h"
     17#include "cf_algorithm.h"
    1718
    1819static inline
     
    157158}
    158159
    159 
     160bool isOnlyLeadingCoeff (const CanonicalForm& F)
     161{
     162  return (F-LC (F,1)*power (Variable(1),degree (F,1))).isZero();
     163}
     164
     165/// like getVars but including multiplicities
     166CanonicalForm myGetVars (const CanonicalForm& F)
     167{
     168  CanonicalForm result= 1;
     169  int deg;
     170  for (int i= 1; i <= F.level(); i++)
     171  {
     172    if ((deg= degree (F, i)) > 0)
     173      result *= power (Variable (i), deg);
     174  }
     175  return result;
     176}
     177
     178int compareByNumberOfVars (const CFFactor& F, const CFFactor& G)
     179{
     180  return getNumVars (F.factor()) < getNumVars (G.factor());
     181}
     182
     183CFFList
     184sortCFFListByNumOfVars (CFFList& F)
     185{
     186    F.sort (compareByNumberOfVars);
     187    CFFList result= F;
     188    return result;
     189}
     190
     191CFList evaluateAtZero (const CanonicalForm& F)
     192{
     193  CFList result;
     194  CanonicalForm buf= F;
     195  result.insert (buf);
     196  for (int i= F.level(); i > 2; i--)
     197  {
     198    buf= buf (0, i);
     199    result.insert (buf);
     200  }
     201  return result;
     202}
     203
     204CFList evaluateAtEval (const CanonicalForm& F, const CFArray& eval)
     205{
     206  CFList result;
     207  CanonicalForm buf= F;
     208  result.insert (buf);
     209  int k= eval.size();
     210  for (int i= 1; i < k; i++)
     211  {
     212    buf= buf (eval[i], i + 2);
     213    result.insert (buf);
     214  }
     215  return result;
     216}
     217
     218CFList evaluateAtEval (const CanonicalForm& F, const CFList& evaluation, int l)
     219{
     220  CFList result;
     221  CanonicalForm buf= F;
     222  result.insert (buf);
     223  int k= evaluation.length() + l - 1;
     224  CFListIterator j= evaluation;
     225  for (int i= k; j.hasItem() && i > l; i--, j++)
     226  {
     227    if (F.level() < i)
     228      continue;
     229    buf= buf (j.getItem(), i);
     230    result.insert (buf);
     231  }
     232  return result;
     233}
     234
     235
     236CFList recoverFactors (const CanonicalForm& F, const CFList& factors)
     237{
     238  CFList result;
     239  CanonicalForm tmp, tmp2;
     240  CanonicalForm G= F;
     241  for (CFListIterator i= factors; i.hasItem(); i++)
     242  {
     243    tmp= i.getItem()/content (i.getItem(), 1);
     244    if (fdivides (tmp, G, tmp2))
     245    {
     246      G= tmp2;
     247      result.append (tmp);
     248    }
     249  }
     250  if (result.length() + 1 == factors.length())
     251    result.append (G/content (G,1));
     252  return result;
     253}
     254
     255CFList recoverFactors (const CanonicalForm& F, const CFList& factors,
     256                       const CFList& evaluation)
     257{
     258  CFList result;
     259  CanonicalForm tmp, tmp2;
     260  CanonicalForm G= F;
     261  for (CFListIterator i= factors; i.hasItem(); i++)
     262  {
     263    tmp= reverseShift (i.getItem(), evaluation, 2);
     264    tmp /= content (tmp, 1);
     265    if (fdivides (tmp, G, tmp2))
     266    {
     267      G= tmp2;
     268      result.append (tmp);
     269    }
     270  }
     271  if (result.length() + 1 == factors.length())
     272    result.append (G/content (G,1));
     273  return result;
     274}
     275
     276CFList recoverFactors (CanonicalForm& F, const CFList& factors, int* index)
     277{
     278  CFList result;
     279  CanonicalForm tmp, tmp2;
     280  CanonicalForm G= F;
     281  int j= 0;
     282  for (CFListIterator i= factors; i.hasItem(); i++, j++)
     283  {
     284    if (i.getItem().isZero())
     285    {
     286      index[j]= 0;
     287      continue;
     288    }
     289    tmp= i.getItem();
     290    if (fdivides (tmp, G, tmp2))
     291    {
     292      G= tmp2;
     293      tmp /=content (tmp, 1);
     294      result.append (tmp);
     295      index[j]= 1;
     296    }
     297    else
     298      index[j]= 0;
     299  }
     300  if (result.length() + 1 == factors.length())
     301  {
     302    result.append (G/content (G,1));
     303    F= G/content (G,1);
     304  }
     305  else
     306    F= G;
     307  return result;
     308}
  • factory/facFqFactorizeUtil.h

    r24a77fb r001cc15  
    121121                           );
    122122
     123/// check if @F consists of more than just the leading coeff wrt. Variable (1)
     124///
     125/// @return as described above
     126bool isOnlyLeadingCoeff (const CanonicalForm& F ///< [in] some poly
     127                        );
     128
     129/// sort CFFList by the number variables in a factor
     130CFFList sortCFFListByNumOfVars (CFFList & F ///< [in,out] a list of factors
     131                               );
     132
     133/// like getVars but each variable x occuring in @F is raised to x^degree (F,x)
     134CanonicalForm myGetVars (const CanonicalForm& F ///< [in] a polynomial
     135                        );
     136
     137/// evaluate @a F at @a evaluation
     138///
     139/// @return @a evaluateAtEval returns a list containing the successive
     140/// evaluations of @a F, last entry is @a F again
     141CFList
     142evaluateAtEval (const CanonicalForm& F,   ///<[in] some poly
     143                const CFArray& evaluation ///<[in] some evaluation point
     144               );
     145
     146/// evaluate @a F at @a evaluation
     147///
     148/// @return @a evaluateAtEval returns a list containing the successive
     149/// evaluations of @a F starting at level @a l, last entry is @a F again
     150CFList
     151evaluateAtEval (const CanonicalForm& F,  ///<[in] some poly
     152                const CFList& evaluation,///<[in] some evaluation point
     153                int l                    ///<[in] level to start at
     154               );
     155
     156/// evaluate F successively n-2 at 0
     157///
     158/// @return returns a list of successive evaluations of F, ending with F
     159CFList evaluateAtZero (const CanonicalForm& F ///< [in] some poly
     160                      );
     161
     162/// divides factors by their content wrt. Variable(1) and checks if these polys
     163/// divide F
     164///
     165/// @return returns factors of F
     166CFList recoverFactors (const CanonicalForm& F, ///< [in] some poly F
     167                       const CFList& factors   ///< [in] some list of
     168                                               ///< factor candidates
     169                      );
     170
     171/// divides factors shifted by evaluation by their content wrt. Variable(1) and
     172/// checks if these polys divide F
     173///
     174/// @return returns factors of F
     175CFList recoverFactors (const CanonicalForm& F,  ///< [in] some poly F
     176                       const CFList& factors,   ///< [in] some list of
     177                                                ///< factor candidates
     178                       const CFList& evaluation ///< [in] evaluation point
     179                      );
     180
     181/// checks if factors divide F, if so F is divided by this factor and the factor
     182/// is divided by its content wrt. Variable(1) and the entry in index at the
     183/// position of the factor is set to 1, otherwise the entry in index is set to 0
     184///
     185/// @return returns factors of F
     186CFList recoverFactors (CanonicalForm& F,     ///< [in,out] some poly F
     187                       const CFList& factors,///< [in] some list of
     188                                             ///< factor candidates
     189                       int* index            ///< [in] position of real factors
     190                      );
     191
    123192#endif
    124193/* FAC_FQ_FACTORIZE_UTIL_H */
  • factory/facIrredTest.cc

    • Property mode changed from 100755 to 100644
  • factory/facIrredTest.h

    • Property mode changed from 100755 to 100644
  • factory/facMul.cc

    r24a77fb r001cc15  
    21952195  if (F.inCoeffDomain() || G.inCoeffDomain())
    21962196    return F*G;
     2197
     2198  if (size (F) / MOD.length() < 100 || size (G) / MOD.length() < 100)
     2199    return mod (F*G, MOD);
     2200
    21972201  Variable y= M.mvar();
    21982202  int degF= degree (F, y);
  • factory/facSparseHensel.cc

    r24a77fb r001cc15  
    2121#include "facFqFactorize.h"
    2222
    23 bool
     23int
    2424LucksWangSparseHeuristic (const CanonicalForm& F, const CFList& factors,
    2525                          int level, const CFList& leadingCoeffs, CFList& result)
     
    6666  delete [] monomsLead;
    6767
    68   CFArray termsF= getTerms (F);
    69   sort (termsF);
     68  CFArray termsF= getBiTerms (F);
     69  if (termsF.size() > 450)
     70  {
     71    delete [] monoms;
     72    return 0;
     73  }
     74  sort (termsF, level);
    7075
    7176  CFList tmp;
     
    8085  CanonicalForm H= prod (tmp);
    8186  CFArray monomsH= getMonoms (H);
    82   sort (monomsH);
    83 
    84   groupTogether (termsF, level);
     87  sort (monomsH,F.level());
     88
    8589  groupTogether (monomsH, F.level());
    8690
     
    8892  {
    8993    delete [] stripped2;
    90     return false;
     94    return 0;
    9195  }
    9296
     
    99103  {
    100104    delete [] stripped2;
    101     return false;
     105    return 0;
    102106  }
    103107
    104108  CFArray A= getEquations (monomsH, termsF);
     109  CFArray startingSolution= solution;
    105110  CFArray newSolution= CFArray (solution.size());
     111  result= CFList();
    106112  do
    107113  {
     
    112118    {
    113119      delete [] stripped2;
    114       return false;
     120      return 0;
    115121    }
    116122    if (isZero (newSolution))
    117     {
    118       delete [] stripped2;
    119       return false;
    120     }
     123      break;
    121124    if (!merge (solution, newSolution))
    122     {
    123       delete [] stripped2;
    124       return false;
    125     }
     125      break;
    126126  } while (1);
    127127
    128 
    129   result= CFList();
     128  if (isEqual (startingSolution, solution))
     129  {
     130    delete [] stripped2;
     131    return 0;
     132  }
    130133  CanonicalForm factor;
    131134  num= 0;
     
    135138    factor= 0;
    136139    for (j= 0; j < k; j++, num++)
     140    {
     141      if (solution [num].isZero())
     142        continue;
    137143      factor += solution [num]*stripped2[i][j];
     144    }
    138145    result.append (factor);
    139146  }
    140147
    141148  delete [] stripped2;
    142   return true;
     149  if (result.length() > 0)
     150    return 1;
     151  return 0;
    143152}
    144153
  • factory/facSparseHensel.h

    r24a77fb r001cc15  
    1818#include "cf_iter.h"
    1919#include "templates/ftmpl_functions.h"
     20#include "cf_algorithm.h"
     21#include "cf_map.h"
    2022
    2123/// compare polynomials
     
    8183/// quick sort helper function
    8284inline
    83 void quickSort (int lo, int hi, CFArray& A)
     85void quickSort (int lo, int hi, CFArray& A, int l)
    8486{
    8587  int i= lo, j= hi;
     
    8789  while (i <= j)
    8890  {
    89     while (comp (A [i], tmp) < 0 && i < hi) i++;
    90     while (comp (tmp, A[j]) < 0 && j > lo) j--;
     91    if (l > 0)
     92    {
     93      while (comp (A [i], tmp, l) < 0 && i < hi) i++;
     94      while (comp (tmp, A[j], l) < 0 && j > lo) j--;
     95    }
     96    else
     97    {
     98      while (comp (A [i], tmp) < 0 && i < hi) i++;
     99      while (comp (tmp, A[j]) < 0 && j > lo) j--;
     100    }
    91101    if (i <= j)
    92102    {
     
    96106    }
    97107  }
    98   if (lo < j) quickSort (lo, j, A);
    99   if (i < hi) quickSort (i, hi, A);
     108  if (lo < j) quickSort (lo, j, A, l);
     109  if (i < hi) quickSort (i, hi, A, l);
    100110}
    101111
    102112/// quick sort @a A
    103113inline
    104 void sort (CFArray& A)
    105 {
    106   quickSort (0, A.size() - 1, A);
    107 }
     114void sort (CFArray& A, int l= 0)
     115{
     116  quickSort (0, A.size() - 1, A, l);
     117}
     118
    108119
    109120/// find normalizing factors for @a biFactors and build monic univariate factors
     
    187198}
    188199
     200/// helper function for getBiTerms
     201inline CFArray
     202getBiTerms_helper (const CanonicalForm& F, const CFMap& M)
     203{
     204  CFArray buf= CFArray (size (F));
     205  int k= 0, level= F.level() - 1;
     206  Variable x= F.mvar();
     207  Variable y= Variable (F.level() - 1);
     208  Variable one= Variable (1);
     209  Variable two= Variable (2);
     210  CFIterator j;
     211  for (CFIterator i= F; i.hasTerms(); i++)
     212  {
     213    if (i.coeff().level() < level)
     214    {
     215      buf[k]= M (i.coeff())*power (one,i.exp());
     216      k++;
     217      continue;
     218    }
     219    j= i.coeff();
     220    for (;j.hasTerms(); j++, k++)
     221      buf[k]= power (one,i.exp())*power (two,j.exp())*M (j.coeff());
     222  }
     223  CFArray result= CFArray (k);
     224  for (int i= 0; i < k; i++)
     225    result[i]= buf[i];
     226  return result;
     227}
     228
     229/// get terms of @a F where F is considered a bivariate poly in Variable(1),
     230/// Variable (2)
     231inline CFArray
     232getBiTerms (const CanonicalForm& F)
     233{
     234  if (F.inCoeffDomain())
     235  {
     236    CFArray result= CFArray (1);
     237    result [0]= F;
     238    return result;
     239  }
     240  if (F.isUnivariate())
     241  {
     242    CFArray result= CFArray (size(F));
     243    int j= 0;
     244    for (CFIterator i= F; i.hasTerms(); i++, j++)
     245      result[j]= i.coeff()*power (F.mvar(), i.exp());
     246    return result;
     247  }
     248
     249  CanonicalForm G= F;
     250
     251  CFMap M;
     252  M.newpair (Variable (1), F.mvar());
     253  M.newpair (Variable (2), Variable (F.level() - 1));
     254  G= swapvar (F, Variable (1), F.mvar());
     255  G= swapvar (G, Variable (2), Variable (F.level() - 1));
     256
     257  CFArray result= getBiTerms_helper (G, M);
     258  return result;
     259}
     260
    189261/// build a poly from entries in @a A
    190262inline CanonicalForm
     
    197269}
    198270
    199 /// group together elements in @a A, where entries in @a A are put put together
     271/// group together elements in @a A, where entries in @a A are put together
    200272/// if they coincide up to level @a level
    201273inline void
     
    213285    }
    214286  }
     287  if (A[n].isZero())
     288    k--;
    215289  CFArray B= CFArray (k);
    216290  n++;
     
    509583///
    510584/// @return @a LucksWangSparseHeuristic returns true if it was successful
    511 bool
     585int
    512586LucksWangSparseHeuristic (const CanonicalForm& F,     ///<[in] polynomial to be
    513587                                                      ///< factored
  • factory/fac_ezgcd.cc

    r24a77fb r001cc15  
    559559        Db = Dbt; Fb = Fbt; Gb = Gbt;
    560560      }
    561     }
    562     DEBOUTLN( cerr, "now after A4, delta = " << delta );
    563     /// ---> A5
    564     if (delta == degF)
    565     {
    566       if (degF <= degG  && fdivides (F, G))
    567       {
    568         DEBDECLEVEL( cerr, "ezgcd" );
    569         if (!isRat)
    570           Off (SW_RATIONAL);
    571         return N (d*F);
    572       }
    573       else
    574         delta--;
    575     }
    576     else if (delta == degG)
    577     {
    578       if (degG <= degF && fdivides( G, F ))
    579       {
    580         DEBDECLEVEL( cerr, "ezgcd" );
    581         if (!isRat)
    582           Off (SW_RATIONAL);
    583         return N (d*G);
    584       }
    585       else
    586         delta--;
     561      DEBOUTLN( cerr, "now after A4, delta = " << delta );
     562      /// ---> A5
     563      if (delta == degF)
     564      {
     565        if (degF <= degG  && fdivides (F, G))
     566        {
     567          DEBDECLEVEL( cerr, "ezgcd" );
     568          if (!isRat)
     569            Off (SW_RATIONAL);
     570          return N (d*F);
     571        }
     572        else
     573          delta--;
     574      }
     575      else if (delta == degG)
     576      {
     577        if (degG <= degF && fdivides( G, F ))
     578        {
     579          DEBDECLEVEL( cerr, "ezgcd" );
     580          if (!isRat)
     581            Off (SW_RATIONAL);
     582          return N (d*G);
     583        }
     584        else
     585          delta--;
     586      }
    587587    }
    588588    if ( delta != degF && delta != degG )
  • factory/fac_sqrfree.cc

    r24a77fb r001cc15  
    160160    CFFList F;
    161161    Variable v = aa.mvar();
     162    CanonicalForm lcinv;
    162163    while ( ! c.degree(v) == 0 )
    163164    {
     
    167168          if (isOn (SW_RATIONAL))
    168169          {
    169             z /= Lc (z);
     170            lcinv= 1/Lc (z);
     171            z *= lcinv;
    170172            z *= bCommonDen (z);
    171173          }
     
    181183      if (isOn (SW_RATIONAL))
    182184      {
    183         w /= Lc (w);
     185        lcinv= 1/Lc (w);
     186        w *= lcinv;
    184187        w *= bCommonDen (w);
    185188      }
  • factory/int_poly.cc

    r24a77fb r001cc15  
    22272227InternalPoly::reduceTermList ( termList first, termList redterms, termList & last )
    22282228{
    2229     CanonicalForm coeff = redterms->coeff;
     2229    CanonicalForm coeff = CanonicalForm (1)/redterms->coeff;
    22302230    CanonicalForm newcoeff;
    22312231    int newexp;
     
    22342234    while ( first && ( first->exp >= exp ) )
    22352235    {
    2236         newcoeff = first->coeff / coeff;
     2236        newcoeff = first->coeff * coeff;
    22372237        newexp = first->exp - exp;
    22382238        dummy = first;
Note: See TracChangeset for help on using the changeset viewer.