1313#include "acb_poly.h"
1414
1515void
16- _acb_poly_mullow_transpose (acb_ptr res ,
16+ _acb_poly_mulmid_transpose (acb_ptr res ,
1717 acb_srcptr poly1 , slong len1 ,
18- acb_srcptr poly2 , slong len2 , slong n , slong prec )
18+ acb_srcptr poly2 , slong len2 , slong nlo , slong nhi , slong prec )
1919{
2020 arb_ptr a , b , c , d , e , f , w ;
2121 arb_ptr t ;
2222 slong i ;
2323
24- len1 = FLINT_MIN (len1 , n );
25- len2 = FLINT_MIN (len2 , n );
24+ len1 = FLINT_MIN (len1 , nhi );
25+ len2 = FLINT_MIN (len2 , nhi );
26+
27+ slong nlo2 = (len1 + len2 - 1 ) - nlo ;
2628
27- w = flint_malloc (sizeof (arb_struct ) * (2 * (len1 + len2 + n )));
29+ if (len1 > nlo2 )
30+ {
31+ slong trunc = len1 - nlo2 ;
32+ poly1 += trunc ;
33+ len1 -= trunc ;
34+ nlo -= trunc ;
35+ nhi -= trunc ;
36+ }
37+
38+ if (len2 > nlo2 )
39+ {
40+ slong trunc = len2 - nlo2 ;
41+ poly2 += trunc ;
42+ len2 -= trunc ;
43+ nlo -= trunc ;
44+ nhi -= trunc ;
45+ }
46+
47+ w = flint_malloc (sizeof (arb_struct ) * (2 * (len1 + len2 + (nhi - nlo ))));
2848 a = w ;
2949 b = a + len1 ;
3050 c = b + len1 ;
3151 d = c + len2 ;
3252 e = d + len2 ;
33- f = e + n ;
53+ f = e + ( nhi - nlo ) ;
3454
3555 /* (e+fi) = (a+bi)(c+di) = (ac - bd) + (ad + bc)i */
36- t = _arb_vec_init (n );
56+ t = _arb_vec_init (nhi - nlo );
3757
3858 for (i = 0 ; i < len1 ; i ++ )
3959 {
@@ -47,38 +67,84 @@ _acb_poly_mullow_transpose(acb_ptr res,
4767 d [i ] = * acb_imagref (poly2 + i );
4868 }
4969
50- for (i = 0 ; i < n ; i ++ )
70+ for (i = 0 ; i < nhi - nlo ; i ++ )
5171 {
5272 e [i ] = * acb_realref (res + i );
5373 f [i ] = * acb_imagref (res + i );
5474 }
5575
56- _arb_poly_mullow (e , a , len1 , c , len2 , n , prec );
57- _arb_poly_mullow (t , b , len1 , d , len2 , n , prec );
58- _arb_vec_sub (e , e , t , n , prec );
76+ _arb_poly_mulmid (e , a , len1 , c , len2 , nlo , nhi , prec );
77+ _arb_poly_mulmid (t , b , len1 , d , len2 , nlo , nhi , prec );
78+ _arb_vec_sub (e , e , t , nhi - nlo , prec );
5979
60- _arb_poly_mullow (f , a , len1 , d , len2 , n , prec );
80+ _arb_poly_mulmid (f , a , len1 , d , len2 , nlo , nhi , prec );
6181 /* squaring */
6282 if (poly1 == poly2 && len1 == len2 )
6383 {
64- _arb_vec_scalar_mul_2exp_si (f , f , n , 1 );
84+ _arb_vec_scalar_mul_2exp_si (f , f , nhi - nlo , 1 );
6585 }
6686 else
6787 {
68- _arb_poly_mullow (t , b , len1 , c , len2 , n , prec );
69- _arb_vec_add (f , f , t , n , prec );
88+ _arb_poly_mulmid (t , b , len1 , c , len2 , nlo , nhi , prec );
89+ _arb_vec_add (f , f , t , nhi - nlo , prec );
7090 }
7191
72- for (i = 0 ; i < n ; i ++ )
92+ for (i = 0 ; i < nhi - nlo ; i ++ )
7393 {
7494 * acb_realref (res + i ) = e [i ];
7595 * acb_imagref (res + i ) = f [i ];
7696 }
7797
78- _arb_vec_clear (t , n );
98+ _arb_vec_clear (t , nhi - nlo );
7999 flint_free (w );
80100}
81101
102+ void
103+ _acb_poly_mullow_transpose (acb_ptr res ,
104+ acb_srcptr poly1 , slong len1 ,
105+ acb_srcptr poly2 , slong len2 , slong n , slong prec )
106+ {
107+ _acb_poly_mulmid_transpose (res , poly1 , len1 , poly2 , len2 , 0 , n , prec );
108+ }
109+
110+ void
111+ acb_poly_mulmid_transpose (acb_poly_t res , const acb_poly_t poly1 ,
112+ const acb_poly_t poly2 , slong nlo , slong nhi , slong prec )
113+ {
114+ slong xlen , ylen , zlen ;
115+
116+ xlen = poly1 -> length ;
117+ ylen = poly2 -> length ;
118+
119+ if (xlen == 0 || ylen == 0 || nlo >= FLINT_MIN (nhi , xlen + ylen - 1 ))
120+ {
121+ acb_poly_zero (res );
122+ return ;
123+ }
124+
125+ nhi = FLINT_MIN (nhi , xlen + ylen - 1 );
126+ zlen = nhi - nlo ;
127+
128+ if (res == poly1 || res == poly2 )
129+ {
130+ acb_poly_t tmp ;
131+ acb_poly_init2 (tmp , zlen );
132+ _acb_poly_mulmid_transpose (tmp -> coeffs , poly1 -> coeffs , xlen ,
133+ poly2 -> coeffs , ylen , nlo , nhi , prec );
134+ acb_poly_swap (res , tmp );
135+ acb_poly_clear (tmp );
136+ }
137+ else
138+ {
139+ acb_poly_fit_length (res , zlen );
140+ _acb_poly_mulmid_transpose (res -> coeffs , poly1 -> coeffs , xlen ,
141+ poly2 -> coeffs , ylen , nlo , nhi , prec );
142+ }
143+
144+ _acb_poly_set_length (res , zlen );
145+ _acb_poly_normalise (res );
146+ }
147+
82148void
83149acb_poly_mullow_transpose (acb_poly_t res , const acb_poly_t poly1 ,
84150 const acb_poly_t poly2 ,
0 commit comments