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