¿Hay una biblioteca C++ que pueda tomar enésimas raíces de números grandes (números que no caben en un unsigned long long
)?¿Cómo obtener la enésima raíz de grandes números en C++?
Respuesta
Puede usar GMP, una popular biblioteca matemática de código arbitrario de código abierto. Tiene C++ bindings.
Si desea codificar esto por sí mismo, echa un vistazo a la página de Wikipedia sobre las raíces n-ésimas:
http://en.wikipedia.org/wiki/Nth_root
El algoritmo iterativo es bastante simple:
La raíz enésima de un número A puede ser computada por el enésimo algoritmo de raíz, un caso especial del método de Newton. Comenzar con un valor inicial x (0) y luego iterar utilizando la relación de recurrencia
x(k+1) = [(n - 1) * x(k) + A/x(k)^(n - 1)]/n
Detener una vez que haya convergido con la exactitud deseada.
Depende de cuánto más grande que 2^64 que desea ir, supongo. Solo usar dobles es bueno para aproximadamente 1 parte en 10^9. Escribí un programa de prueba en C:
#include <stdio.h>
#include <math.h>
int main(int argc, char **argv)
{
unsigned long long x;
double dx;
int i;
//make x the max possible value
x = ~0ULL;
dx = (double)x;
printf("Starting with dx = %f\n", dx);
//print the 2th to 20th roots
for (i = 2; i < 21; i++)
{
printf("%dth root %.15f\n", i, pow(dx, 1.0/i));
}
return 0;
}
que produjo el siguiente resultado:
Starting with dx = 18446744073709551616.000000
2th root 4294967296.000000000000000
3th root 2642245.949629130773246
4th root 65536.000000000000000
5th root 7131.550214521852467
6th root 1625.498677215435691
7th root 565.293831000991759
8th root 256.000000000000000
9th root 138.247646578215154
10th root 84.448506289465257
11th root 56.421840319745364
12th root 40.317473596635935
13th root 30.338480458853493
14th root 23.775908626191171
15th root 19.248400577313866
16th root 16.000000000000000
17th root 13.592188707483222
18th root 11.757875938204789
19th root 10.327513583579238
20th root 9.189586839976281
Luego comparé con Wolfram Alpha para cada raíz para obtener el error que he citado anteriormente.
Dependiendo de su aplicación, quizás esto sea suficiente.
El método de división larga es el mejor método para calcular la enésima raíz de cualquier número real positivo. Da la mejor precisión de cada dígito calculado. No se requiere una estimación inicial ni una aproximación iterativa.
un ejemplo vale más que mil palabras ... –
Si bien esta podría ser una pista valiosa para resolver el problema, una buena respuesta también demuestra la solución. Por favor [edite] para proporcionar un código de ejemplo para mostrar lo que quiere decir. Alternativamente, considere escribir esto como un comentario en su lugar. –
- 1. enésima raíz de un número
- 2. ¿Manejar números grandes en C++?
- 3. JavaScript: Calcula la enésima raíz de un número
- 4. Cómo generar números aleatorios grandes C
- 5. La enésima raíz del número pequeño devuelve un resultado inesperado en C#
- 6. Obtener la fila enésima en PostgreSQL
- 7. Calcular enésima raíz con la aritmética de enteros
- 8. C: Impresión de grandes números de
- 9. Factorización de números grandes
- 10. División de números grandes
- 11. ¿Cómo pronuncias números hexadecimales grandes?
- 12. Tipos para números grandes
- 13. ¿Cómo obtener texto de la enésima línea de UILabel?
- 14. Clojure - Calcular con números grandes
- 15. ¿Cómo trabajar con números grandes en PHP?
- 16. ¿Cómo obtener la ruta raíz en JavaScript?
- 17. Preservar números grandes
- 18. Almacene y trabaje con números grandes en C
- 19. sscanf: obtener la enésima palabra en una oración
- 20. Formateo de números grandes con .NET
- 21. trabajando con números increíblemente grandes en .NET
- 22. .NET: números de revisión grandes en AssemblyVersionAttribute
- 23. Cálculo de números enteros muy grandes
- 24. ¿Cómo obtener la ruta raíz de la aplicación en play2?
- 25. Manejo de números grandes en el código
- 26. Obtener la enésima línea de un archivo de texto en C++
- 27. Generando REALMENTE grandes números primos
- 28. enteros grandes en C#
- 29. Potencia de módulo de números grandes
- 30. Cómo obtener el Root raíz
Sí, en particular la función mpz_root. –