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