1 /*
2     Copyright (C) 2018 Fredrik Johansson
3 
4     This file is part of Arb.
5 
6     Arb is free software: you can redistribute it and/or modify it under
7     the terms of the GNU Lesser General Public License (LGPL) as published
8     by the Free Software Foundation; either version 2.1 of the License, or
9     (at your option) any later version.  See <http://www.gnu.org/licenses/>.
10 */
11 
12 #include "acb.h"
13 
14 void
acb_dot_precise(acb_t res,const acb_t initial,int subtract,acb_srcptr x,slong xstep,acb_srcptr y,slong ystep,slong len,slong prec)15 acb_dot_precise(acb_t res, const acb_t initial, int subtract, acb_srcptr x, slong xstep,
16     acb_srcptr y, slong ystep, slong len, slong prec)
17 {
18     arb_ptr tmp;
19     slong i;
20 
21     tmp = flint_malloc(sizeof(arb_struct) * (4 * len));
22 
23     for (i = 0; i < len; i++)
24     {
25         tmp[0 * len + i] = *acb_realref(x + i * xstep);
26         tmp[1 * len + i] = *acb_imagref(x + i * xstep);
27         tmp[2 * len + i] = *acb_realref(y + i * ystep);
28         arb_init(tmp + 3 * len + i);
29         arb_neg(tmp + 3 * len + i, acb_imagref(y + i * ystep));
30     }
31 
32     arb_dot_precise(acb_realref(res), initial == NULL ? NULL : acb_realref(initial), subtract,
33         tmp, 1, tmp + 2 * len, 1, 2 * len, prec);
34 
35     for (i = 0; i < len; i++)
36         arb_clear(tmp + 3 * len + i);
37 
38     for (i = 0; i < len; i++)
39     {
40         tmp[0 * len + i] = *acb_realref(x + i * xstep);
41         tmp[1 * len + i] = *acb_imagref(x + i * xstep);
42         tmp[2 * len + i] = *acb_imagref(y + i * ystep);
43         tmp[3 * len + i] = *acb_realref(y + i * ystep);
44     }
45 
46     arb_dot_precise(acb_imagref(res), initial == NULL ? NULL : acb_imagref(initial), subtract,
47         tmp, 1, tmp + 2 * len, 1, 2 * len, prec);
48 
49     flint_free(tmp);
50 }
51