Здесь я буду использовать обозначениеПоиск непрерывной дроби 2^(1/3) до очень высокой точности
можно найти цепную дробь числа, вычисляя его тогда применяя определение, но для этого требуется, по меньшей мере, O (n) бит памяти, чтобы найти , a ... a n, на практике это намного хуже. Используя двойную точность с плавающей запятой, можно найти только , a ... a .
Альтернатива заключается в том, что если a, b, c - рациональные числа, то существуют единственные рациональные p, q, r такие, что 1/(a + b * 2 1/3 + c * 2 2/3) = х + у * 2 1/3 + Z * 2 2/3, а именно
Так что, если я представляю х, у и г до абсолютной точностью используя boost boost lib, я могу получить пол (x + y * 2 1/3 + z * 2 2/3) точно только с использованием двойной точности для 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