La forma “teórica” más rápida que conozco es el método de Newton, que tiene convergencia cuadrática. Aquí está disponible una descripción de cómo hacer que el método de Newton funcione para raíces cuadradas enteras: raíz cuadrada entera.
Si está trabajando con enteros acotados, probablemente pueda encontrar algo más rápido que use tablas de búsqueda y / o manipulación de bits … tal vez algo como:
typedef unsigned char uint8; typedef unsigned short int uint16; typedef unsigned long int uint32; uint32 isqrt32 (uint32 n) { register uint32 root, remainder, place; root = 0; remainder = n; place = 0x40000000; while (place > remainder) { place = place >> 2; } while (place) { if (remainder >= root + place) { remainder = remainder - root - place; root = root + (place <> 1; place = place >> 2; } return root; }
o:
unsigned int sqrt32(unsigned long n) { unsigned int c = 0x8000; unsigned int g = 0x8000; for (;;) { if (g*g > n) { g ^= c; } c >>= 1; if (c == 0) { return g; } g |= c; } }
(desde Calcular una raíz cuadrada entera)
- Dado un conjunto de números naturales [matemáticos] n [/ matemáticos], encuentre los dos subconjuntos de números ‘k’, cuya suma es [matemática] S_k [/ matemática], que minimizan la diferencia entre estas sumas. ¿Cómo lo resuelves con programación dinámica?
- ¿Existe un algoritmo matemático para crear música agradable?
- ¿Puede haber una función generadora de números primos?
- ¿Qué algoritmo básico podría enseñarle a mi hijo de 12 años?
- Combinatoria: ¿Cuál es un método eficiente y sistemático para organizar 9 letras (A, B, C, D, E, F, G, H, I) en grupos de tres (ABC – AEF – IBD -DAC- …) en tal de manera que ninguna carta en particular comparte un grupo con otra letra en particular más de una vez?