Con enteros dentro sensible límites en comparación con lo que su CPU puede calcular de forma nativa, puede ser bastante fácil para restringir el rango de números binarios de búsqueda para encontrar la raíz cuadrada de x.
(0. quitar los dos bloques de final 0 a partir de su número binario. Cada bloque de quitar es un factor de 2 a se multiplica el resultado del paso siguiente. Esto se puede hacer en tiempo constante, si no me equivoco: Observar la estructura de "Restar 1 y XOR con la entrada" para los números con t trailing 0s. A continuación, utilice el POPCNT (Hamming de peso) la instrucción de los más graves de la Cpu. Después de la eliminación de estos 0s, es decir, dividiendo por 4n, usted terminará para arriba con un número impar; si usted termina con un número después de la eliminación de un número de 0s, su número no es un cuadrado perfecto.)
- Encontrar k=⌊log2x⌋, ver https://graphics.stanford.edu/~seander/bithacks.html
- a=k2
- Por lo tanto, 2a se convierte en un límite inferior para el √x 2a+1 superior. Ambos valores se pueden encontrar a través del desplazamiento de bits a 1.
- Desde aquí, hacer un binario search1.
Dudo que sería mucho más rápido de conversión de punto flotante y dejar que la FPU hacerlo en hardware, dándole un valor aproximado, comvertable de vuelta a entero, de los que sólo se necesita buscar pequeños intervalos (es decir, la pérdida de precisión) para el entero de la raíz cuadrada.
Tenga en cuenta que a tales problemas como el tuyo, algorítmica elegancia a menudo desempeña un papel de menor importancia - que necesita para ser rápido en hardware real, de modo que la ejecución de evitar una gran cantidad de memoria de la interacción es una buena cosa, y: con instrucciones SIMD, haciendo cuatro a 16 operaciones del mismo tipo tome el tiempo de hacer uno, así que si usted simplemente necesita para probar un par de enteros para su plaza, la modificación de su algoritmo para poder probar cuatro en paralelo es la forma más eficiente de ahorro de la mitad de las operaciones necesarias.
Usted tiene un problema tecnológico, no tanto numéricos.
1 búsqueda binaria se supone que puede hacer un cuadrado y una comparación de una vez; como se indicó antes, podría muy bien ser capaz de dividir el intervalo en cinco trozos de búsqueda mediante el cálculo de los cuatro productos a la vez y comparar los cuatro números a la vez el uso de SIMD. Esto además, indicios de que incluso si no debe haber ningún constante de tiempo del algoritmo (y estoy bastante seguro de que no hay ninguno), usted puede ser mejor de O(n2·log2x); comparar Fürer del algoritmo.