1*61046927SAndroid Build Coastguard Worker /**************************************************************************
2*61046927SAndroid Build Coastguard Worker *
3*61046927SAndroid Build Coastguard Worker * (C) Copyright VMware, Inc 2010.
4*61046927SAndroid Build Coastguard Worker * (C) Copyright John Maddock 2006.
5*61046927SAndroid Build Coastguard Worker * Use, modification and distribution are subject to the
6*61046927SAndroid Build Coastguard Worker * Boost Software License, Version 1.0. (See accompanying file
7*61046927SAndroid Build Coastguard Worker * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8*61046927SAndroid Build Coastguard Worker *
9*61046927SAndroid Build Coastguard Worker **************************************************************************/
10*61046927SAndroid Build Coastguard Worker
11*61046927SAndroid Build Coastguard Worker
12*61046927SAndroid Build Coastguard Worker /*
13*61046927SAndroid Build Coastguard Worker * This file allows to compute the minimax polynomial coefficients we use
14*61046927SAndroid Build Coastguard Worker * for fast exp2/log2.
15*61046927SAndroid Build Coastguard Worker *
16*61046927SAndroid Build Coastguard Worker * How to use this source:
17*61046927SAndroid Build Coastguard Worker *
18*61046927SAndroid Build Coastguard Worker * - Download and build the NTL library from
19*61046927SAndroid Build Coastguard Worker * http://shoup.net/ntl/download.html , or install libntl-dev package if on
20*61046927SAndroid Build Coastguard Worker * Debian.
21*61046927SAndroid Build Coastguard Worker *
22*61046927SAndroid Build Coastguard Worker * - Download boost source code matching to your distro.
23*61046927SAndroid Build Coastguard Worker *
24*61046927SAndroid Build Coastguard Worker * - Goto libs/math/minimax and replace f.cpp with this file.
25*61046927SAndroid Build Coastguard Worker *
26*61046927SAndroid Build Coastguard Worker * - Build as
27*61046927SAndroid Build Coastguard Worker *
28*61046927SAndroid Build Coastguard Worker * g++ -o minimax -I /path/to/ntl/include main.cpp f.cpp /path/to/ntl/src/ntl.a
29*61046927SAndroid Build Coastguard Worker *
30*61046927SAndroid Build Coastguard Worker * - Run as
31*61046927SAndroid Build Coastguard Worker *
32*61046927SAndroid Build Coastguard Worker * ./minimax
33*61046927SAndroid Build Coastguard Worker *
34*61046927SAndroid Build Coastguard Worker * - For example, to compute exp2 5th order polynomial between [0, 1] do:
35*61046927SAndroid Build Coastguard Worker *
36*61046927SAndroid Build Coastguard Worker * variant 0
37*61046927SAndroid Build Coastguard Worker * range 0 1
38*61046927SAndroid Build Coastguard Worker * order 5 0
39*61046927SAndroid Build Coastguard Worker * step 200
40*61046927SAndroid Build Coastguard Worker * info
41*61046927SAndroid Build Coastguard Worker *
42*61046927SAndroid Build Coastguard Worker * and take the coefficients from the P = { ... } array.
43*61046927SAndroid Build Coastguard Worker *
44*61046927SAndroid Build Coastguard Worker * - To compute log2 4th order polynomial between [0, 1/9] do:
45*61046927SAndroid Build Coastguard Worker *
46*61046927SAndroid Build Coastguard Worker * variant 1
47*61046927SAndroid Build Coastguard Worker * range 0 0.111111112
48*61046927SAndroid Build Coastguard Worker * order 4 0
49*61046927SAndroid Build Coastguard Worker * step 200
50*61046927SAndroid Build Coastguard Worker * info
51*61046927SAndroid Build Coastguard Worker *
52*61046927SAndroid Build Coastguard Worker * - For more info see
53*61046927SAndroid Build Coastguard Worker * http://www.boost.org/doc/libs/1_47_0/libs/math/doc/sf_and_dist/html/math_toolkit/toolkit/internals2/minimax.html
54*61046927SAndroid Build Coastguard Worker */
55*61046927SAndroid Build Coastguard Worker
56*61046927SAndroid Build Coastguard Worker #define L22
57*61046927SAndroid Build Coastguard Worker #include <boost/math/bindings/rr.hpp>
58*61046927SAndroid Build Coastguard Worker #include <boost/math/tools/polynomial.hpp>
59*61046927SAndroid Build Coastguard Worker
60*61046927SAndroid Build Coastguard Worker #include <cmath>
61*61046927SAndroid Build Coastguard Worker
exp2(const boost::math::ntl::RR & x)62*61046927SAndroid Build Coastguard Worker boost::math::ntl::RR exp2(const boost::math::ntl::RR& x)
63*61046927SAndroid Build Coastguard Worker {
64*61046927SAndroid Build Coastguard Worker return exp(x*log(2.0));
65*61046927SAndroid Build Coastguard Worker }
66*61046927SAndroid Build Coastguard Worker
log2(const boost::math::ntl::RR & x)67*61046927SAndroid Build Coastguard Worker boost::math::ntl::RR log2(const boost::math::ntl::RR& x)
68*61046927SAndroid Build Coastguard Worker {
69*61046927SAndroid Build Coastguard Worker return log(x)/log(2.0);
70*61046927SAndroid Build Coastguard Worker }
71*61046927SAndroid Build Coastguard Worker
f(const boost::math::ntl::RR & x,int variant)72*61046927SAndroid Build Coastguard Worker boost::math::ntl::RR f(const boost::math::ntl::RR& x, int variant)
73*61046927SAndroid Build Coastguard Worker {
74*61046927SAndroid Build Coastguard Worker switch(variant)
75*61046927SAndroid Build Coastguard Worker {
76*61046927SAndroid Build Coastguard Worker case 0:
77*61046927SAndroid Build Coastguard Worker return exp2(x);
78*61046927SAndroid Build Coastguard Worker
79*61046927SAndroid Build Coastguard Worker case 1:
80*61046927SAndroid Build Coastguard Worker return log2((1.0 + sqrt(x))/(1.0 - sqrt(x)))/sqrt(x);
81*61046927SAndroid Build Coastguard Worker }
82*61046927SAndroid Build Coastguard Worker
83*61046927SAndroid Build Coastguard Worker return 0;
84*61046927SAndroid Build Coastguard Worker }
85*61046927SAndroid Build Coastguard Worker
86*61046927SAndroid Build Coastguard Worker
show_extra(const boost::math::tools::polynomial<boost::math::ntl::RR> & n,const boost::math::tools::polynomial<boost::math::ntl::RR> & d,const boost::math::ntl::RR & x_offset,const boost::math::ntl::RR & y_offset,int variant)87*61046927SAndroid Build Coastguard Worker void show_extra(
88*61046927SAndroid Build Coastguard Worker const boost::math::tools::polynomial<boost::math::ntl::RR>& n,
89*61046927SAndroid Build Coastguard Worker const boost::math::tools::polynomial<boost::math::ntl::RR>& d,
90*61046927SAndroid Build Coastguard Worker const boost::math::ntl::RR& x_offset,
91*61046927SAndroid Build Coastguard Worker const boost::math::ntl::RR& y_offset,
92*61046927SAndroid Build Coastguard Worker int variant)
93*61046927SAndroid Build Coastguard Worker {
94*61046927SAndroid Build Coastguard Worker switch(variant)
95*61046927SAndroid Build Coastguard Worker {
96*61046927SAndroid Build Coastguard Worker default:
97*61046927SAndroid Build Coastguard Worker // do nothing here...
98*61046927SAndroid Build Coastguard Worker ;
99*61046927SAndroid Build Coastguard Worker }
100*61046927SAndroid Build Coastguard Worker }
101*61046927SAndroid Build Coastguard Worker
102