나는 표기법을 사용합니다 2^(1/3)의 지속적인 부분을 찾기정밀 매우 높은 여기
는 다음을 계산하여 숫자의 지속적인 부분을 찾을 수있다 정의를 적용하지만, 적어도 O (n) 비트의 메모리가 필요하며, , ... a n 실제로는 훨씬 더 나쁩니다. 이중 부동 소수점 정밀도를 사용하면 , ... 을 찾을 수만 있습니다.
a, b, c가 유리수 인 경우 1/(a + b * 2 1/3 + c * 2)와 같은 고유 한 합계 p, q, r이 존재한다는 사실을 사용할 수도 있습니다. 2/3) = X + Y * 2 1/3 + Z * 2 즉 2/3 그래서
I 절대 정밀도로 X, Y 및 Z를 나타내면 부스트 합리적인 lib를 사용하여 바닥을 얻을 수 있습니다 (x + y * 2 1/3 + z * 2 2/3) 정확히 2의 정확도를 사용하는 경우에만 1/3 및 2 2/3입니다. 왜냐하면 저는이 값이 실제 값의 1/2 이내 여야하기 때문입니다. 불행하게도 x, y, z의 분자와 분모는 상당히 빠르게 증가합니다. 보통의 수레를 사용하면 오류가 빨리 쌓입니다.
나는 을 계산 할 수 있었다 이런 식으로하는 ... 시간 아래에서 하지만, 어떻게 든 티카는 것을 할 수 이초한다. 여기에 당신은 높은 정확도로^(1/3) (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