00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef __MMX_SERIES_ELEMENTARY__HPP
00014 #define __MMX_SERIES_ELEMENTARY__HPP
00015 #include <numerix/floating.hpp>
00016 #include <algebramix/series.hpp>
00017 #include <algebramix/series_vector.hpp>
00018
00019 namespace mmx {
00020 #define TMPL template<typename C, typename V>
00021 #define TMPLW template<typename C, typename V, typename W>
00022 #define Series series<C,V>
00023
00024
00025
00026
00027
00028 TMPL inline Series
00029 sqrt (const Series& f) {
00030 if (is_exact_zero (f)) return Series (CF(f));
00031 return unary_recursive_series<sqrt_op> (f);
00032 }
00033
00034 TMPL inline Series
00035 sqrt_init (const Series& f, const C& c) {
00036 return unary_recursive_series<sqrt_op> (f, c);
00037 }
00038
00039 TMPL inline Series
00040 exp (const Series& f) {
00041 return unary_recursive_series<exp_op> (f);
00042 }
00043
00044 TMPL inline Series
00045 log (const Series& f) {
00046 return unary_recursive_series<log_op> (f);
00047 }
00048
00049 TMPL inline Series
00050 log_init (const Series& f, const C& c) {
00051 return unary_recursive_series<log_op> (f, c);
00052 }
00053
00054 TMPL inline Series
00055 pow (const Series& f, const C& c) {
00056 return exp (c * log (f));
00057 }
00058
00059 TMPL inline Series
00060 pow (const Series& f, const Series& g) {
00061 return exp (g * log (f));
00062 }
00063
00064 TMPL inline Series
00065 acos (const Series& f) {
00066 return unary_recursive_series<acos_op> (f);
00067 }
00068
00069 TMPL inline Series
00070 acos_init (const Series& f, const C& c) {
00071 return unary_recursive_series<acos_op> (f, c);
00072 }
00073
00074 TMPL inline Series
00075 asin (const Series& f) {
00076 return unary_recursive_series<asin_op> (f);
00077 }
00078
00079 TMPL inline Series
00080 asin_init (const Series& f, const C& c) {
00081 return unary_recursive_series<asin_op> (f, c);
00082 }
00083
00084 TMPL inline Series
00085 atan (const Series& f) {
00086 return unary_recursive_series<atan_op> (f);
00087 }
00088
00089 TMPL inline Series
00090 atan_init (const Series& f, const C& c) {
00091 return unary_recursive_series<atan_op> (f, c);
00092 }
00093
00094 INV_TRIGO_SUGAR(TMPL,Series)
00095 HYPER_SUGAR(TMPL,Series)
00096 INV_HYPER_SUGAR(TMPL,Series)
00097 ARG_HYPER_SUGAR(TMPL,Series)
00098
00099
00100
00101
00102
00103 TMPLW inline series<vector<C,W>,V>
00104 trig (const series<vector<C,W>,V>& f) {
00105 return unary_recursive_series<trig_op> (f);
00106 }
00107
00108 template<typename C,typename V> inline vector<Series >
00109 cos_sin (const Series& f) {
00110 return as_vector (trig (as_series (vec (f))));
00111 }
00112
00113 template<typename C,typename V> inline Series
00114 cos (const Series& f) {
00115 return unary_recursive_series<cos_op> (f);
00116 }
00117
00118 template<typename C,typename V> inline Series
00119 sin (const Series& f) {
00120 return unary_recursive_series<sin_op> (f);
00121 }
00122
00123 template<typename C,typename V> inline Series
00124 tan (const Series& f) {
00125 return unary_recursive_series<tan_op> (f);
00126 }
00127
00128 #undef TMPL
00129 #undef TMPLW
00130 #undef Series
00131 }
00132 #endif // __MMX_SERIES_ELEMENTARY__HPP