1 /*
2     Copyright (C) 2013 Tom Bachmann
3 
4     This file is part of FLINT.
5 
6     FLINT 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 #ifndef FLINT_CXX_STDMATH_H
13 #define FLINT_CXX_STDMATH_H
14 
15 #include "expression.h"
16 #include "expression_traits.h"
17 
18 // This file defines lazy operations which are used by several different flint
19 // classes.
20 
21 namespace flint {
22 FLINT_DEFINE_BINOP(pow)
FLINT_DEFINE_BINOP(pow_binexp)23 FLINT_DEFINE_BINOP(pow_binexp)
24 FLINT_DEFINE_BINOP(root)
25 
26 FLINT_DEFINE_UNOP(abs)
27 FLINT_DEFINE_UNOP(exp)
28 FLINT_DEFINE_UNOP(log)
29 FLINT_DEFINE_UNOP(sqrt)
30 FLINT_DEFINE_UNOP(inv)
31 
32 FLINT_DEFINE_UNOP(sqr)
33 FLINT_DEFINE_UNOP(sqr_classical)
34 FLINT_DEFINE_UNOP(sqr_KS)
35 
36 FLINT_DEFINE_UNOP(height)
37 
38 FLINT_DEFINE_BINOP(divexact)
39 FLINT_DEFINE_BINOP(divrem)
40 FLINT_DEFINE_BINOP(fdiv_2exp)
41 FLINT_DEFINE_BINOP(mul_2exp)
42 FLINT_DEFINE_BINOP(mul_classical)
43 FLINT_DEFINE_BINOP(mul_KS)
44 FLINT_DEFINE_BINOP(tdiv)
45 FLINT_DEFINE_BINOP(tdiv_2exp)
46 
47 FLINT_DEFINE_THREEARY(mulhigh)
48 FLINT_DEFINE_THREEARY(mulhigh_classical)
49 FLINT_DEFINE_THREEARY(mullow)
50 FLINT_DEFINE_THREEARY(mullow_classical)
51 FLINT_DEFINE_THREEARY(mullow_KS)
52 
53 FLINT_DEFINE_BINOP(smod) // "symmetric" %
54 
55 // poly functions
56 FLINT_DEFINE_BINOP(compose)
57 FLINT_DEFINE_BINOP(compose_divconquer)
58 FLINT_DEFINE_BINOP(compose_horner)
59 FLINT_DEFINE_BINOP(div_basecase)
60 FLINT_DEFINE_BINOP(div_divconquer)
61 FLINT_DEFINE_BINOP(divrem_basecase)
62 FLINT_DEFINE_BINOP(divrem_divconquer)
63 FLINT_DEFINE_BINOP(div_root)
64 FLINT_DEFINE_BINOP(evaluate)
65 FLINT_DEFINE_BINOP(bit_pack)
66 FLINT_DEFINE_BINOP(shift_left)
67 FLINT_DEFINE_BINOP(shift_right)
68 FLINT_DEFINE_BINOP(rem_basecase)
69 FLINT_DEFINE_BINOP(resultant)
70 FLINT_DEFINE_BINOP(reverse)
71 FLINT_DEFINE_BINOP(taylor_shift)
72 FLINT_DEFINE_BINOP(taylor_shift_horner)
73 
74 FLINT_DEFINE_UNOP(content)
75 FLINT_DEFINE_UNOP(derivative)
76 FLINT_DEFINE_UNOP(integral)
77 FLINT_DEFINE_UNOP(make_monic)
78 FLINT_DEFINE_UNOP(twonorm)
79 FLINT_DEFINE_UNOP(bound_roots)
80 FLINT_DEFINE_UNOP(primitive_part)
81 
82 FLINT_DEFINE_BINOP(inv_series)
83 FLINT_DEFINE_BINOP(inv_series_newton)
84 FLINT_DEFINE_BINOP(revert_series)
85 FLINT_DEFINE_BINOP(revert_series_lagrange)
86 FLINT_DEFINE_BINOP(revert_series_lagrange_fast)
87 FLINT_DEFINE_BINOP(revert_series_newton)
88 
89 FLINT_DEFINE_BINOP(sqrt_series)
90 FLINT_DEFINE_BINOP(invsqrt_series)
91 FLINT_DEFINE_BINOP(exp_series)
92 FLINT_DEFINE_BINOP(log_series)
93 FLINT_DEFINE_BINOP(atan_series)
94 FLINT_DEFINE_BINOP(atanh_series)
95 FLINT_DEFINE_BINOP(asin_series)
96 FLINT_DEFINE_BINOP(asinh_series)
97 FLINT_DEFINE_BINOP(tan_series)
98 FLINT_DEFINE_BINOP(sin_series)
99 FLINT_DEFINE_BINOP(cos_series)
100 FLINT_DEFINE_BINOP(sinh_series)
101 FLINT_DEFINE_BINOP(cosh_series)
102 FLINT_DEFINE_BINOP(tanh_series)
103 
104 FLINT_DEFINE_THREEARY(compose_series)
105 FLINT_DEFINE_THREEARY(compose_series_brent_kung)
106 FLINT_DEFINE_THREEARY(compose_series_divconquer)
107 FLINT_DEFINE_THREEARY(compose_series_horner)
108 FLINT_DEFINE_THREEARY(div_series)
109 FLINT_DEFINE_THREEARY(pow_trunc)
110 FLINT_DEFINE_THREEARY(pow_trunc_binexp)
111 
112 FLINT_DEFINE_BINOP(compeval)
113 
114 // matrix functions in flintxx/matrix.h
115 
116 // chinese remaindering
117 FLINT_DEFINE_FIVEARY(CRT)
118 FLINT_DEFINE_FOURARY_HERE(CRT) // four argument version
119 FLINT_DEFINE_THREEARY(multi_CRT)
120 FLINT_DEFINE_BINOP_HERE(multi_CRT) // two argument version
121 
122 // implementation of compeval
123 namespace rules {
124 // implementation of compeval
125 // TODO do at level of "struct evaluation" instead?
126 template<class T, class U>
127 struct binary_expression<T, operations::compeval_op, U,
128     typename mp::enable_if<mp::or_<
129         traits::is_implemented<binary_expression<T, operations::compose_op, U> >,
130         traits::is_implemented<binary_expression<T, operations::evaluate_op, U> >
131       > >::type>
132     : mp::if_<
133     traits::is_implemented<binary_expression<T, operations::compose_op, U> >,
134     binary_expression<T, operations::compose_op, U>,
135     binary_expression<T, operations::evaluate_op, U> >::type { };
136 } // rules
137 } // flint
138 
139 #endif
140