diff --git a/doc/source/fmprb.rst b/doc/source/fmprb.rst index e396b915..2d81f835 100644 --- a/doc/source/fmprb.rst +++ b/doc/source/fmprb.rst @@ -472,6 +472,14 @@ Elementary functions `|\sin(m \pm r) - \sin(m)| \le r` (this could be tightened to `\min(r,2)`). +.. function:: void fmprb_sin_pi(fmprb_t s, const fmprb_t x, long prec) + +.. function:: void fmprb_cos_pi(fmprb_t c, const fmprb_t x, long prec) + +.. function:: void fmprb_sin_cos_pi(fmprb_t s, fmprb_t c, const fmprb_t x, long prec) + + Sets `s = \sin \pi x`, `c = \cos \pi x`. + .. function:: void fmprb_atan(fmprb_t z, const fmprb_t x, long prec) Sets `z = \tan^{-1} x`. Letting `d = \max(0, |m| - r)`, diff --git a/fmprb.h b/fmprb.h index 5330f120..afbb88e7 100644 --- a/fmprb.h +++ b/fmprb.h @@ -271,6 +271,10 @@ void fmprb_sin(fmprb_t s, const fmprb_t x, long prec); void fmprb_cos(fmprb_t c, const fmprb_t x, long prec); void fmprb_sin_cos(fmprb_t s, fmprb_t c, const fmprb_t x, long prec); +void fmprb_sin_pi(fmprb_t s, const fmprb_t x, long prec); +void fmprb_cos_pi(fmprb_t c, const fmprb_t x, long prec); +void fmprb_sin_cos_pi(fmprb_t s, fmprb_t c, const fmprb_t x, long prec); + void fmprb_sinh(fmprb_t z, const fmprb_t x, long prec); void fmprb_cosh(fmprb_t z, const fmprb_t x, long prec); void fmprb_sinh_cosh(fmprb_t s, fmprb_t c, const fmprb_t x, long prec); diff --git a/fmprb/sin_cos_pi.c b/fmprb/sin_cos_pi.c new file mode 100644 index 00000000..8703c585 --- /dev/null +++ b/fmprb/sin_cos_pi.c @@ -0,0 +1,155 @@ +/*============================================================================= + + This file is part of ARB. + + ARB is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + ARB is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ARB; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +=============================================================================*/ +/****************************************************************************** + + Copyright (C) 2012 Fredrik Johansson + +******************************************************************************/ + +#include "fmprb.h" + +void +fmprb_sin_pi(fmprb_t y, const fmprb_t x, long prec) +{ + fmprb_t t; + fmprb_t u; + fmpz_t v; + + fmprb_init(t); + fmprb_init(u); + fmpz_init(v); + + fmprb_mul_2exp_si(t, x, 1); + fmpr_get_fmpz(v, fmprb_midref(t), FMPR_RND_NEAR); + fmprb_sub_fmpz(t, t, v, prec); + + fmprb_const_pi(u, prec); + fmprb_mul(t, t, u, prec); + fmprb_mul_2exp_si(t, t, -1); + + switch (fmpz_fdiv_ui(v, 4)) + { + case 0: + fmprb_sin(y, t, prec); + break; + case 1: + fmprb_cos(y, t, prec); + break; + case 2: + fmprb_sin(y, t, prec); + fmprb_neg(y, y); + break; + default: + fmprb_cos(y, t, prec); + fmprb_neg(y, y); + break; + } + + fmpz_clear(v); + fmprb_clear(t); + fmprb_clear(u); +} + +void +fmprb_cos_pi(fmprb_t y, const fmprb_t x, long prec) +{ + fmprb_t t; + fmprb_t u; + fmpz_t v; + + fmprb_init(t); + fmprb_init(u); + fmpz_init(v); + + fmprb_mul_2exp_si(t, x, 1); + fmpr_get_fmpz(v, fmprb_midref(t), FMPR_RND_NEAR); + fmprb_sub_fmpz(t, t, v, prec); + + fmprb_const_pi(u, prec); + fmprb_mul(t, t, u, prec); + fmprb_mul_2exp_si(t, t, -1); + + switch (fmpz_fdiv_ui(v, 4)) + { + case 0: + fmprb_cos(y, t, prec); + break; + case 1: + fmprb_sin(y, t, prec); + fmprb_neg(y, y); + break; + case 2: + fmprb_cos(y, t, prec); + fmprb_neg(y, y); + break; + default: + fmprb_sin(y, t, prec); + break; + } + + fmpz_clear(v); + fmprb_clear(t); + fmprb_clear(u); +} + +void +fmprb_sin_cos_pi(fmprb_t s, fmprb_t c, const fmprb_t x, long prec) +{ + fmprb_t t; + fmprb_t u; + fmpz_t v; + + fmprb_init(t); + fmprb_init(u); + fmpz_init(v); + + fmprb_mul_2exp_si(t, x, 1); + fmpr_get_fmpz(v, fmprb_midref(t), FMPR_RND_NEAR); + fmprb_sub_fmpz(t, t, v, prec); + + fmprb_const_pi(u, prec); + fmprb_mul(t, t, u, prec); + fmprb_mul_2exp_si(t, t, -1); + + switch (fmpz_fdiv_ui(v, 4)) + { + case 0: + fmprb_sin_cos(s, c, t, prec); + break; + case 1: + fmprb_sin_cos(c, s, t, prec); + fmprb_neg(c, c); + break; + case 2: + fmprb_sin_cos(s, c, t, prec); + fmprb_neg(s, s); + fmprb_neg(c, c); + break; + default: + fmprb_sin_cos(c, s, t, prec); + fmprb_neg(s, s); + break; + } + + fmpz_clear(v); + fmprb_clear(t); + fmprb_clear(u); +} + diff --git a/fmprb/test/t-cos_pi.c b/fmprb/test/t-cos_pi.c new file mode 100644 index 00000000..d12508b2 --- /dev/null +++ b/fmprb/test/t-cos_pi.c @@ -0,0 +1,76 @@ +/*============================================================================= + + This file is part of ARB. + + ARB is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + ARB is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ARB; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +=============================================================================*/ +/****************************************************************************** + + Copyright (C) 2012, 2013 Fredrik Johansson + +******************************************************************************/ + +#include "fmprb.h" + +int main() +{ + long iter; + flint_rand_t state; + + printf("cos_pi...."); + fflush(stdout); + + flint_randinit(state); + + for (iter = 0; iter < 1000; iter++) + { + fmprb_t a, b, c; + long prec = 2 + n_randint(state, 200); + + fmprb_init(a); + fmprb_init(b); + fmprb_init(c); + + fmprb_randtest(a, state, 1 + n_randint(state, 200), 10); + fmprb_randtest(b, state, 1 + n_randint(state, 200), 10); + fmprb_randtest(c, state, 1 + n_randint(state, 200), 10); + + fmprb_const_pi(b, prec); + fmprb_mul(b, b, a, prec); + fmprb_cos(b, b, prec); + + fmprb_cos_pi(c, a, prec); + + if (!fmprb_overlaps(b, c)) + { + printf("FAIL: overlap\n\n"); + printf("a = "); fmprb_print(a); printf("\n\n"); + printf("b = "); fmprb_print(b); printf("\n\n"); + printf("c = "); fmprb_print(c); printf("\n\n"); + abort(); + } + + fmprb_clear(a); + fmprb_clear(b); + fmprb_clear(c); + } + + flint_randclear(state); + _fmpz_cleanup(); + printf("PASS\n"); + return EXIT_SUCCESS; +} + diff --git a/fmprb/test/t-sin_cos_pi.c b/fmprb/test/t-sin_cos_pi.c new file mode 100644 index 00000000..99042ed6 --- /dev/null +++ b/fmprb/test/t-sin_cos_pi.c @@ -0,0 +1,84 @@ +/*============================================================================= + + This file is part of ARB. + + ARB is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + ARB is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ARB; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +=============================================================================*/ +/****************************************************************************** + + Copyright (C) 2012, 2013 Fredrik Johansson + +******************************************************************************/ + +#include "fmprb.h" + +int main() +{ + long iter; + flint_rand_t state; + + printf("sin_cos_pi...."); + fflush(stdout); + + flint_randinit(state); + + for (iter = 0; iter < 1000; iter++) + { + fmprb_t a, b, c, d, e; + long prec = 2 + n_randint(state, 200); + + fmprb_init(a); + fmprb_init(b); + fmprb_init(c); + fmprb_init(d); + fmprb_init(e); + + fmprb_randtest(a, state, 1 + n_randint(state, 200), 10); + fmprb_randtest(b, state, 1 + n_randint(state, 200), 10); + fmprb_randtest(c, state, 1 + n_randint(state, 200), 10); + fmprb_randtest(d, state, 1 + n_randint(state, 200), 10); + fmprb_randtest(e, state, 1 + n_randint(state, 200), 10); + + fmprb_const_pi(b, prec); + fmprb_mul(b, b, a, prec); + fmprb_sin_cos(b, d, b, prec); + + fmprb_sin_cos_pi(c, e, a, prec); + + if (!fmprb_overlaps(b, c) || !fmprb_overlaps(d, e)) + { + printf("FAIL: overlap\n\n"); + printf("a = "); fmprb_print(a); printf("\n\n"); + printf("b = "); fmprb_print(b); printf("\n\n"); + printf("c = "); fmprb_print(c); printf("\n\n"); + printf("d = "); fmprb_print(d); printf("\n\n"); + printf("e = "); fmprb_print(e); printf("\n\n"); + abort(); + } + + fmprb_clear(a); + fmprb_clear(b); + fmprb_clear(c); + fmprb_clear(d); + fmprb_clear(e); + } + + flint_randclear(state); + _fmpz_cleanup(); + printf("PASS\n"); + return EXIT_SUCCESS; +} + diff --git a/fmprb/test/t-sin_pi.c b/fmprb/test/t-sin_pi.c new file mode 100644 index 00000000..fdbbfb51 --- /dev/null +++ b/fmprb/test/t-sin_pi.c @@ -0,0 +1,76 @@ +/*============================================================================= + + This file is part of ARB. + + ARB is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + ARB is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ARB; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +=============================================================================*/ +/****************************************************************************** + + Copyright (C) 2012, 2013 Fredrik Johansson + +******************************************************************************/ + +#include "fmprb.h" + +int main() +{ + long iter; + flint_rand_t state; + + printf("sin_pi...."); + fflush(stdout); + + flint_randinit(state); + + for (iter = 0; iter < 1000; iter++) + { + fmprb_t a, b, c; + long prec = 2 + n_randint(state, 200); + + fmprb_init(a); + fmprb_init(b); + fmprb_init(c); + + fmprb_randtest(a, state, 1 + n_randint(state, 200), 10); + fmprb_randtest(b, state, 1 + n_randint(state, 200), 10); + fmprb_randtest(c, state, 1 + n_randint(state, 200), 10); + + fmprb_const_pi(b, prec); + fmprb_mul(b, b, a, prec); + fmprb_sin(b, b, prec); + + fmprb_sin_pi(c, a, prec); + + if (!fmprb_overlaps(b, c)) + { + printf("FAIL: overlap\n\n"); + printf("a = "); fmprb_print(a); printf("\n\n"); + printf("b = "); fmprb_print(b); printf("\n\n"); + printf("c = "); fmprb_print(c); printf("\n\n"); + abort(); + } + + fmprb_clear(a); + fmprb_clear(b); + fmprb_clear(c); + } + + flint_randclear(state); + _fmpz_cleanup(); + printf("PASS\n"); + return EXIT_SUCCESS; +} +