在這裏,我將使用符號發現的2 ^(1/3)連分數非常高的精度
有可能通過計算它,然後找到一個數的連分數應用的定義,但至少需要O(n)位的內存找到一個 ...一個 n,實際上它是一個更糟糕的。使用雙浮點精度,只能找到一個,一個 ... a 。
一種替代方案是使用,如果一個,b,c是有理數則存在這樣的事實獨特有理數P,Q,R,使得1 /(A + B * 2 1/3 + C * 2 2/3)= X + Y * 2 1/3 + Z * 2 2/3,即
所以,如果我表示的x,y和z以絕對精度使用升壓理性LIB我可以得到地板(X + Y * 2 1/3 + Z * 2 三分之二)準確地只使用雙精度2 1/3和2 2/3,因爲我只需要它在真值的1/2以內。不幸的是,分子和X,Y和Z的分母大幅增長快,如果你使用普通的浮動,而不是錯誤很快堆積起來。
這樣我就能夠計算,一個 ...在一個小時內一個,但不知何故,Mathematica可以做,在2秒。這是我參考
#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
namespace mp = boost::multiprecision;
int main()
{
const double t_1 = 1.259921049894873164767210607278228350570251;
const double t_2 = 1.587401051968199474751705639272308260391493;
mp::cpp_rational p = 0;
mp::cpp_rational q = 1;
mp::cpp_rational r = 0;
for(unsigned int i = 1; i != 10001; ++i) {
double p_f = static_cast<double>(p);
double q_f = static_cast<double>(q);
double r_f = static_cast<double>(r);
uint64_t floor = p_f + t_1 * q_f + t_2 * r_f;
std::cout << floor << ", ";
p -= floor;
//std::cout << floor << " " << p << " " << q << " " << r << std::endl;
mp::cpp_rational den = (p * p * p + 2 * q * q * q +
4 * r * r * r - 6 * p * q * r);
mp::cpp_rational a = (p * p - 2 * q * r)/den;
mp::cpp_rational b = (2 * r * r - p * q)/den;
mp::cpp_rational c = (q * q - p * r) /den;
p = a;
q = b;
r = c;
}
return 0;
}
剛纔你的問題是什麼? –
@RoryDaulton我想要一個高效的算法。 – Sophie