rational_tests.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. // (C) Copyright John Maddock 2007.
  2. // Use, modification and distribution are subject to the
  3. // Boost Software License, Version 1.0. (See accompanying file
  4. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #include <boost/random.hpp>
  6. #include <boost/math/tools/rational.hpp>
  7. #include <iostream>
  8. #include <fstream>
  9. #include "mp_t.hpp"
  10. int main()
  11. {
  12. using namespace boost::math;
  13. using namespace boost::math::tools;
  14. std::cout << std::scientific << std::setprecision(40);
  15. boost::mt19937 rnd;
  16. boost::variate_generator<
  17. boost::mt19937,
  18. boost::uniform_int<> > gen(rnd, boost::uniform_int<>(1, 12));
  19. for(unsigned i = 1; i < 12; ++i)
  20. {
  21. std::vector<int> coef;
  22. for(unsigned j = 0; j < i; ++j)
  23. {
  24. coef.push_back(gen());
  25. }
  26. std::cout <<
  27. " //\n"
  28. " // Polynomials of order " << i-1 << "\n"
  29. " //\n"
  30. " static const U n" << i << "c[" << i << "] = { ";
  31. for(unsigned j = 0; j < i; ++j)
  32. {
  33. if(j)
  34. std::cout << ", ";
  35. std::cout << coef[j];
  36. }
  37. std::cout << " };\n";
  38. std::cout <<
  39. " static const boost::array<U, " << i << "> n" << i << "a = { ";
  40. for(unsigned j = 0; j < i; ++j)
  41. {
  42. if(j)
  43. std::cout << ", ";
  44. std::cout << coef[j];
  45. }
  46. std::cout << " };\n";
  47. mp_t r1 = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(0.125), i);
  48. mp_t r2 = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(0.25), i);
  49. mp_t r3 = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(0.75), i);
  50. mp_t r4 = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(1) - mp_t(1) / 64, i);
  51. std::cout <<
  52. " BOOST_CHECK_CLOSE(\n"
  53. " boost::math::tools::evaluate_polynomial(n" << i << "c, static_cast<T>(0.125), " << i << "),\n"
  54. " static_cast<T>(" << r1 << "L),\n"
  55. " tolerance);\n";
  56. std::cout <<
  57. " BOOST_CHECK_CLOSE(\n"
  58. " boost::math::tools::evaluate_polynomial(n" << i << "c, static_cast<T>(0.25), " << i << "),\n"
  59. " static_cast<T>(" << r2 << "L),\n"
  60. " tolerance);\n";
  61. std::cout <<
  62. " BOOST_CHECK_CLOSE(\n"
  63. " boost::math::tools::evaluate_polynomial(n" << i << "c, static_cast<T>(0.75), " << i << "),\n"
  64. " static_cast<T>(" << r3 << "L),\n"
  65. " tolerance);\n";
  66. std::cout <<
  67. " BOOST_CHECK_CLOSE(\n"
  68. " boost::math::tools::evaluate_polynomial(n" << i << "c, static_cast<T>(1.0f - 1.0f/64.0f), " << i << "),\n"
  69. " static_cast<T>(" << r4 << "L),\n"
  70. " tolerance);\n\n";
  71. std::cout <<
  72. " BOOST_CHECK_CLOSE(\n"
  73. " boost::math::tools::evaluate_polynomial(n" << i << "c, static_cast<T>(0.125)),\n"
  74. " static_cast<T>(" << r1 << "L),\n"
  75. " tolerance);\n";
  76. std::cout <<
  77. " BOOST_CHECK_CLOSE(\n"
  78. " boost::math::tools::evaluate_polynomial(n" << i << "c, static_cast<T>(0.25)),\n"
  79. " static_cast<T>(" << r2 << "L),\n"
  80. " tolerance);\n";
  81. std::cout <<
  82. " BOOST_CHECK_CLOSE(\n"
  83. " boost::math::tools::evaluate_polynomial(n" << i << "c, static_cast<T>(0.75)),\n"
  84. " static_cast<T>(" << r3 << "L),\n"
  85. " tolerance);\n";
  86. std::cout <<
  87. " BOOST_CHECK_CLOSE(\n"
  88. " boost::math::tools::evaluate_polynomial(n" << i << "c, static_cast<T>(1.0f - 1.0f/64.0f)),\n"
  89. " static_cast<T>(" << r4 << "L),\n"
  90. " tolerance);\n\n";
  91. std::cout <<
  92. " BOOST_CHECK_CLOSE(\n"
  93. " boost::math::tools::evaluate_polynomial(n" << i << "a, static_cast<T>(0.125)),\n"
  94. " static_cast<T>(" << r1 << "L),\n"
  95. " tolerance);\n";
  96. std::cout <<
  97. " BOOST_CHECK_CLOSE(\n"
  98. " boost::math::tools::evaluate_polynomial(n" << i << "a, static_cast<T>(0.25)),\n"
  99. " static_cast<T>(" << r2 << "L),\n"
  100. " tolerance);\n";
  101. std::cout <<
  102. " BOOST_CHECK_CLOSE(\n"
  103. " boost::math::tools::evaluate_polynomial(n" << i << "a, static_cast<T>(0.75)),\n"
  104. " static_cast<T>(" << r3 << "L),\n"
  105. " tolerance);\n";
  106. std::cout <<
  107. " BOOST_CHECK_CLOSE(\n"
  108. " boost::math::tools::evaluate_polynomial(n" << i << "a, static_cast<T>(1.0f - 1.0f/64.0f)),\n"
  109. " static_cast<T>(" << r4 << "L),\n"
  110. " tolerance);\n\n";
  111. r1 = boost::math::tools::evaluate_even_polynomial(&coef[0], mp_t(0.125), i);
  112. r2 = boost::math::tools::evaluate_even_polynomial(&coef[0], mp_t(0.25), i);
  113. r3 = boost::math::tools::evaluate_even_polynomial(&coef[0], mp_t(0.75), i);
  114. r4 = boost::math::tools::evaluate_even_polynomial(&coef[0], mp_t(1) - mp_t(1) / 64, i);
  115. std::cout <<
  116. " BOOST_CHECK_CLOSE(\n"
  117. " boost::math::tools::evaluate_even_polynomial(n" << i << "c, static_cast<T>(0.125), " << i << "),\n"
  118. " static_cast<T>(" << r1 << "L),\n"
  119. " tolerance);\n";
  120. std::cout <<
  121. " BOOST_CHECK_CLOSE(\n"
  122. " boost::math::tools::evaluate_even_polynomial(n" << i << "c, static_cast<T>(0.25), " << i << "),\n"
  123. " static_cast<T>(" << r2 << "L),\n"
  124. " tolerance);\n";
  125. std::cout <<
  126. " BOOST_CHECK_CLOSE(\n"
  127. " boost::math::tools::evaluate_even_polynomial(n" << i << "c, static_cast<T>(0.75), " << i << "),\n"
  128. " static_cast<T>(" << r3 << "L),\n"
  129. " tolerance);\n";
  130. std::cout <<
  131. " BOOST_CHECK_CLOSE(\n"
  132. " boost::math::tools::evaluate_even_polynomial(n" << i << "c, static_cast<T>(1.0f - 1.0f/64.0f), " << i << "),\n"
  133. " static_cast<T>(" << r4 << "L),\n"
  134. " tolerance);\n\n";
  135. std::cout <<
  136. " BOOST_CHECK_CLOSE(\n"
  137. " boost::math::tools::evaluate_even_polynomial(n" << i << "c, static_cast<T>(0.125)),\n"
  138. " static_cast<T>(" << r1 << "L),\n"
  139. " tolerance);\n";
  140. std::cout <<
  141. " BOOST_CHECK_CLOSE(\n"
  142. " boost::math::tools::evaluate_even_polynomial(n" << i << "c, static_cast<T>(0.25)),\n"
  143. " static_cast<T>(" << r2 << "L),\n"
  144. " tolerance);\n";
  145. std::cout <<
  146. " BOOST_CHECK_CLOSE(\n"
  147. " boost::math::tools::evaluate_even_polynomial(n" << i << "c, static_cast<T>(0.75)),\n"
  148. " static_cast<T>(" << r3 << "L),\n"
  149. " tolerance);\n";
  150. std::cout <<
  151. " BOOST_CHECK_CLOSE(\n"
  152. " boost::math::tools::evaluate_even_polynomial(n" << i << "c, static_cast<T>(1.0f - 1.0f/64.0f)),\n"
  153. " static_cast<T>(" << r4 << "L),\n"
  154. " tolerance);\n\n";
  155. std::cout <<
  156. " BOOST_CHECK_CLOSE(\n"
  157. " boost::math::tools::evaluate_even_polynomial(n" << i << "a, static_cast<T>(0.125)),\n"
  158. " static_cast<T>(" << r1 << "L),\n"
  159. " tolerance);\n";
  160. std::cout <<
  161. " BOOST_CHECK_CLOSE(\n"
  162. " boost::math::tools::evaluate_even_polynomial(n" << i << "a, static_cast<T>(0.25)),\n"
  163. " static_cast<T>(" << r2 << "L),\n"
  164. " tolerance);\n";
  165. std::cout <<
  166. " BOOST_CHECK_CLOSE(\n"
  167. " boost::math::tools::evaluate_even_polynomial(n" << i << "a, static_cast<T>(0.75)),\n"
  168. " static_cast<T>(" << r3 << "L),\n"
  169. " tolerance);\n";
  170. std::cout <<
  171. " BOOST_CHECK_CLOSE(\n"
  172. " boost::math::tools::evaluate_even_polynomial(n" << i << "a, static_cast<T>(1.0f - 1.0f/64.0f)),\n"
  173. " static_cast<T>(" << r4 << "L),\n"
  174. " tolerance);\n\n";
  175. if(i > 1)
  176. {
  177. r1 = boost::math::tools::evaluate_odd_polynomial(&coef[0], mp_t(0.125), i);
  178. r2 = boost::math::tools::evaluate_odd_polynomial(&coef[0], mp_t(0.25), i);
  179. r3 = boost::math::tools::evaluate_odd_polynomial(&coef[0], mp_t(0.75), i);
  180. r4 = boost::math::tools::evaluate_odd_polynomial(&coef[0], mp_t(1) - mp_t(1) / 64, i);
  181. std::cout <<
  182. " BOOST_CHECK_CLOSE(\n"
  183. " boost::math::tools::evaluate_odd_polynomial(n" << i << "c, static_cast<T>(0.125), " << i << "),\n"
  184. " static_cast<T>(" << r1 << "L),\n"
  185. " tolerance);\n";
  186. std::cout <<
  187. " BOOST_CHECK_CLOSE(\n"
  188. " boost::math::tools::evaluate_odd_polynomial(n" << i << "c, static_cast<T>(0.25), " << i << "),\n"
  189. " static_cast<T>(" << r2 << "L),\n"
  190. " tolerance);\n";
  191. std::cout <<
  192. " BOOST_CHECK_CLOSE(\n"
  193. " boost::math::tools::evaluate_odd_polynomial(n" << i << "c, static_cast<T>(0.75), " << i << "),\n"
  194. " static_cast<T>(" << r3 << "L),\n"
  195. " tolerance);\n";
  196. std::cout <<
  197. " BOOST_CHECK_CLOSE(\n"
  198. " boost::math::tools::evaluate_odd_polynomial(n" << i << "c, static_cast<T>(1.0f - 1.0f/64.0f), " << i << "),\n"
  199. " static_cast<T>(" << r4 << "L),\n"
  200. " tolerance);\n\n";
  201. std::cout <<
  202. " BOOST_CHECK_CLOSE(\n"
  203. " boost::math::tools::evaluate_odd_polynomial(n" << i << "c, static_cast<T>(0.125)),\n"
  204. " static_cast<T>(" << r1 << "L),\n"
  205. " tolerance);\n";
  206. std::cout <<
  207. " BOOST_CHECK_CLOSE(\n"
  208. " boost::math::tools::evaluate_odd_polynomial(n" << i << "c, static_cast<T>(0.25)),\n"
  209. " static_cast<T>(" << r2 << "L),\n"
  210. " tolerance);\n";
  211. std::cout <<
  212. " BOOST_CHECK_CLOSE(\n"
  213. " boost::math::tools::evaluate_odd_polynomial(n" << i << "c, static_cast<T>(0.75)),\n"
  214. " static_cast<T>(" << r3 << "L),\n"
  215. " tolerance);\n";
  216. std::cout <<
  217. " BOOST_CHECK_CLOSE(\n"
  218. " boost::math::tools::evaluate_odd_polynomial(n" << i << "c, static_cast<T>(1.0f - 1.0f/64.0f)),\n"
  219. " static_cast<T>(" << r4 << "L),\n"
  220. " tolerance);\n\n";
  221. std::cout <<
  222. " BOOST_CHECK_CLOSE(\n"
  223. " boost::math::tools::evaluate_odd_polynomial(n" << i << "a, static_cast<T>(0.125)),\n"
  224. " static_cast<T>(" << r1 << "L),\n"
  225. " tolerance);\n";
  226. std::cout <<
  227. " BOOST_CHECK_CLOSE(\n"
  228. " boost::math::tools::evaluate_odd_polynomial(n" << i << "a, static_cast<T>(0.25)),\n"
  229. " static_cast<T>(" << r2 << "L),\n"
  230. " tolerance);\n";
  231. std::cout <<
  232. " BOOST_CHECK_CLOSE(\n"
  233. " boost::math::tools::evaluate_odd_polynomial(n" << i << "a, static_cast<T>(0.75)),\n"
  234. " static_cast<T>(" << r3 << "L),\n"
  235. " tolerance);\n";
  236. std::cout <<
  237. " BOOST_CHECK_CLOSE(\n"
  238. " boost::math::tools::evaluate_odd_polynomial(n" << i << "a, static_cast<T>(1.0f - 1.0f/64.0f)),\n"
  239. " static_cast<T>(" << r4 << "L),\n"
  240. " tolerance);\n\n";
  241. }
  242. r1 = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(0.125), i);
  243. r2 = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(0.25), i);
  244. r3 = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(0.75), i);
  245. r4 = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(1) - mp_t(1) / 64, i);
  246. coef.clear();
  247. for(unsigned j = 0; j < i; ++j)
  248. {
  249. coef.push_back(gen());
  250. }
  251. std::cout <<
  252. " //\n"
  253. " // Rational functions of order " << i-1 << "\n"
  254. " //\n"
  255. " static const U d" << i << "c[" << i << "] = { ";
  256. for(unsigned j = 0; j < i; ++j)
  257. {
  258. if(j)
  259. std::cout << ", ";
  260. std::cout << coef[j];
  261. }
  262. std::cout << " };\n";
  263. std::cout <<
  264. " static const boost::array<U, " << i << "> d" << i << "a = { ";
  265. for(unsigned j = 0; j < i; ++j)
  266. {
  267. if(j)
  268. std::cout << ", ";
  269. std::cout << coef[j];
  270. }
  271. std::cout << " };\n";
  272. mp_t r1d = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(0.125), i);
  273. mp_t r2d = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(0.25), i);
  274. mp_t r3d = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(0.75), i);
  275. mp_t r4d = boost::math::tools::evaluate_polynomial(&coef[0], mp_t(1) - mp_t(1) / 64, i);
  276. std::cout <<
  277. " BOOST_CHECK_CLOSE(\n"
  278. " boost::math::tools::evaluate_rational(n" << i << "c, d" << i << "c, static_cast<T>(0.125), " << i << "),\n"
  279. " static_cast<T>(" << r1/r1d << "L),\n"
  280. " tolerance);\n";
  281. std::cout <<
  282. " BOOST_CHECK_CLOSE(\n"
  283. " boost::math::tools::evaluate_rational(n" << i << "c, d" << i << "c, static_cast<T>(0.25), " << i << "),\n"
  284. " static_cast<T>(" << r2/r2d << "L),\n"
  285. " tolerance);\n";
  286. std::cout <<
  287. " BOOST_CHECK_CLOSE(\n"
  288. " boost::math::tools::evaluate_rational(n" << i << "c, d" << i << "c, static_cast<T>(0.75), " << i << "),\n"
  289. " static_cast<T>(" << r3/r3d << "L),\n"
  290. " tolerance);\n";
  291. std::cout <<
  292. " BOOST_CHECK_CLOSE(\n"
  293. " boost::math::tools::evaluate_rational(n" << i << "c, d" << i << "c, static_cast<T>(1.0f - 1.0f/64.0f), " << i << "),\n"
  294. " static_cast<T>(" << r4/r4d << "L),\n"
  295. " tolerance);\n\n";
  296. std::cout <<
  297. " BOOST_CHECK_CLOSE(\n"
  298. " boost::math::tools::evaluate_rational(n" << i << "c, d" << i << "c, static_cast<T>(0.125)),\n"
  299. " static_cast<T>(" << r1/r1d << "L),\n"
  300. " tolerance);\n";
  301. std::cout <<
  302. " BOOST_CHECK_CLOSE(\n"
  303. " boost::math::tools::evaluate_rational(n" << i << "c, d" << i << "c, static_cast<T>(0.25)),\n"
  304. " static_cast<T>(" << r2/r2d << "L),\n"
  305. " tolerance);\n";
  306. std::cout <<
  307. " BOOST_CHECK_CLOSE(\n"
  308. " boost::math::tools::evaluate_rational(n" << i << "c, d" << i << "c, static_cast<T>(0.75)),\n"
  309. " static_cast<T>(" << r3/r3d << "L),\n"
  310. " tolerance);\n";
  311. std::cout <<
  312. " BOOST_CHECK_CLOSE(\n"
  313. " boost::math::tools::evaluate_rational(n" << i << "c, d" << i << "c, static_cast<T>(1.0f - 1.0f/64.0f)),\n"
  314. " static_cast<T>(" << r4/r4d << "L),\n"
  315. " tolerance);\n\n";
  316. std::cout <<
  317. " BOOST_CHECK_CLOSE(\n"
  318. " boost::math::tools::evaluate_rational(n" << i << "a, d" << i << "a, static_cast<T>(0.125)),\n"
  319. " static_cast<T>(" << r1/r1d << "L),\n"
  320. " tolerance);\n";
  321. std::cout <<
  322. " BOOST_CHECK_CLOSE(\n"
  323. " boost::math::tools::evaluate_rational(n" << i << "a, d" << i << "a, static_cast<T>(0.25)),\n"
  324. " static_cast<T>(" << r2/r2d << "L),\n"
  325. " tolerance);\n";
  326. std::cout <<
  327. " BOOST_CHECK_CLOSE(\n"
  328. " boost::math::tools::evaluate_rational(n" << i << "a, d" << i << "a, static_cast<T>(0.75)),\n"
  329. " static_cast<T>(" << r3/r3d << "L),\n"
  330. " tolerance);\n";
  331. std::cout <<
  332. " BOOST_CHECK_CLOSE(\n"
  333. " boost::math::tools::evaluate_rational(n" << i << "a, d" << i << "a, static_cast<T>(1.0f - 1.0f/64.0f)),\n"
  334. " static_cast<T>(" << r4/r4d << "L),\n"
  335. " tolerance);\n\n";
  336. }
  337. return 0;
  338. }