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