Hier werde ich die SchreibweiseSuche nach der Fortsetzung Anteil von 2^(1/3) bis sehr hohe Präzision
Es ist möglich, die Verwendung fortgesetzt Anteil einer Zahl zu finden, indem sie dann die Berechnung Anwenden der Definition, aber das erfordert mindestens O (n) Bits des Gedächtnisses, um eine , eine n zu finden, in der Praxis ist es ein viel schlechteres. Unter Verwendung der doppelten Gleitkommapräzision kann nur ein , ein ... ein gefunden werden. Eine Alternative besteht darin, die Tatsache zu verwenden, dass, wenn a, b, c rationale Zahlen sind, eindeutige Rationalitäten p, q, r existieren, so dass 1/(a + b * 2 1/3 + c * 2 2/3) = x + y * 2 1/3 + z * 2 2/3, nämlich
wenn ich also repräsentieren x, y und z auf absolute Präzision mit dem Boost rationale Lib kann ich Stock bekommen (x + y * 2 1/3 + z * 2 2/3) genau nur mit doppelter Genauigkeit für 2 1/3 und 2 2/3 weil ich brauche es nur innerhalb 1/2 des wahren Wertes zu sein. Leider wachsen die Zähler und Nenner von x, y und z erheblich schneller, und wenn Sie stattdessen normale Gleitkommazahlen verwenden, häufen sich die Fehler schnell an.
Auf diese Weise konnte ich eine , ein berechnen ... ein in weniger als einer Stunde, aber irgendwie kann Mathematica tun, dass in 2 Sekunden. Hier ist mein Code als Referenz
#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;
}
Was ist Ihre Frage? –
@RoryDaulton Ich möchte einen effizienten Algorithmus. – Sophie