Como esto está en el foro de matemáticas y no en uno de los muchos foros de programación, voy a dar una respuesta puramente matemática. Si quieres mi respuesta a una versión de programación de esta pregunta, en Python, ver el sitio de stackoverflow y/o visite los comentarios más abajo.
Una cosa que podrías hacer para ahorrar tiempo y esfuerzo es eliminar el número de la consideración de cuadrado perfecto verificando rápidamente que no lo es. Lo que quiero decir es que no voy a extraer la raíz, ni voy a verificar si un número es un cuadrado perfecto, sino que voy a verificar que un número NO es un cuadrado perfecto. Algunas de estas pistas son casi sin esfuerzo, puede ejecutar estos como un precursor de cualquier algoritmo más complicado. Al fin y al cabo, no tiene sentido perder tiempo y esfuerzo en un algoritmo complicado cuando puedes demostrar que un número no es un cuadrado perfecto con uno más sencillo.
Por lo tanto, debes conocer algunas de las interesantes propiedades de los cuadrados perfectos, si es que aún no las conoces.
En primer lugar, cualquier cuadrado perfecto que termine en 0, o un conjunto de ceros, debe contener un número par de ceros finales. Por lo tanto, si el número de ceros que siguen a las cifras menos significativas de un número entero están en cantidad impar, no es un cuadrado perfecto. 57, 000 no es un cuadrado perfecto. Si hay un número par de ceros, puedes ignorarlos por completo y reducir tu número de prueba a los dígitos que preceden a la cadena de ceros: podemos probar la cuadratura perfecta de 640.000 y 820.000 probando sólo el 64 y el 82.
Algo similar se puede hacer en binario. Si se trata de programación, se puede probar fácilmente los factores de $4=2^2$ y reducir la escala mediante operaciones a nivel de bits. En Python prefiero la prueba condicional n&3 == 0, y la operación n >> 2. Esto es efectivamente lo mismo que la prueba anterior, excepto en la lógica digital/binaria donde la base es 2 en lugar de 10.
En segundo lugar, todos los cuadrados perfectos terminan en los números 0, 1, 4, 5, 6 o 9. Puedes ignorar el 0 si observas primero la regla número 1. Esta es una condición necesaria. Reconozca que esta es una operación mod 10. Por lo tanto, si su número de prueba termina (el dígito de las unidades) en un 2, 3, 7 u 8, esto es suficiente para decir que el número no es un cuadrado perfecto. Por ejemplo, el número 934,52 3 obviamente no es un cuadrado perfecto. ¿Lo ves? Con esta regla ya hemos eliminado dos quintas partes de todos los números posibles.
Los dos últimos dígitos de un número de prueba no pueden ser ambos impar. 34,833,8 79 no es un cuadrado perfecto porque tanto 7 como 9 son Impares.
Si el número de la prueba termina en un 1 o un 9, el número de dos dígitos que lo precede TIENE que ser un múltiplo de 4. Los ejemplos incluyen 81 y el número 57, 121 (porque 5,7 12 es un múltiplo de 4). Números como 24 62 1 no son cuadrados perfectos porque 62 no es un múltiplo de 4.
Si el número de la prueba termina en 4, la cifra que lo precede tiene que ser par. Si no es par, no es un cuadrado perfecto. 23,0 7 4 no es un cuadrado perfecto.
Si el número de la prueba termina en 6, la cifra que lo precede debe ser impar. Si no es impar entonces no es un cuadrado perfecto. 56,8 4 El 6 no es un cuadrado perfecto.
Si el número de prueba termina en 5, la cifra que lo precede debe ser un 2. Además, la(s) cifra(s) que precede(n) a ese 2 debe(n) ser un 0, otro 2, o las cifras 06 o 56. El número 33 1,62 5 no es un cuadrado perfecto.
Ahora un poco de aritmética de módulos. Se puede hacer en papel o en la cabeza, por lo que no se necesitan ordenadores.
Un cuadrado perfecto debe ser equivalente a 0, 1 o 4 en mod 8. Si no es así, sabes que no tienes un cuadrado perfecto. Pero si tienes un cuadrado perfecto, el 0, 1 o 4 te proporciona información útil sobre la raíz cuadrada. Si obtienes un 1 en mod 8 entonces tu raíz es impar, si 0 en mod 8 la raíz es un múltiplo de 4, si 4 en mod 8 entonces la raíz es justa pero no un múltiplo de 4.
Hablando de pruebas mod 8, en la lógica binaria podemos emplear operaciones bit a bit. Si se expresa en binario, los tres dígitos más pequeños de un cuadrado perfecto siempre terminan en 001, es decir, n&7 == 1. Esto es cierto después de haber restado todas las potencias de 4 (prueba 1 de la variación binaria), de lo contrario n&3 == 0 también podría ser cierto.
Existe la prueba del mod 9. Los resultados tienen que ser 0, 1, 4 o 7 en mod 9. Si no (2,3,5,6,8) entonces no tienes un cuadrado perfecto. El número 56,430,143 no es un cuadrado perfecto; lo sé porque el 56,430,143 % 9 = 8. Alternativamente, busque la "raíz digital" (suma de los dígitos, repetidos, a un valor singular), esencialmente lo mismo que la prueba mod 9. Si su valor es 2, 3, 5, 6 u 8 entonces no es un cuadrado perfecto, pero podría serlo si tiene 1,4,7,9.
En mod 13, todos los cuadrados perfectos son equivalentes a 0,1,3,4,9,10,12; y en mod 7 deben ser equivalentes a 1,2,4. PARA QUE LO SEPAS.
Además, observe que $(n+1)^2 = n^2 + 2n + 1$ . Claramente si su número de prueba $N\in (n^2,n^2+2n+1)$ entonces se encuentra entre dos cuadrados perfectos consecutivos. Si $n,n^2$ se conocen, para algunos más grandes $n^2<N$ sería bastante fácil rechazar cualquier valor en este intervalo.
En este punto, si su número de prueba no ha fallado ninguna de las pruebas, entonces y sólo entonces pondría los recursos en la extracción de raíces u otros algoritmos complicados. Estas pruebas anteriores utilizan poco más que comparaciones, condicionales, conteo y sumas de un solo dígito, algunas incluso pueden hacerse con lógica de bits.
Espero que esta información te ayude a ti y a otras personas que quieran orientarse al respecto.
También me gustaría señalar que cualquier factor primo de su número de prueba que se encuentre en una multiplicidad impar tampoco es un cuadrado perfecto. Sin embargo, este enfoque requiere más tiempo. Sólo tienes que comprobar los primos entre 2 y sqrt(n). Si encuentras un primo que se divide en n, pero lo hace sólo un número impar de veces, no tienes un número cuadrado. Tomemos el cuadrado perfecto 99,225. Su primo se divide en [3,3,3,3,5,5,7,7], con un número par de cada uno. Mientras que el no cuadrado 55,125 es primo factorizado en [3,3,5,5,7,7], con un número impar de 5's.
Además, puede ser razonable reducir la escala de tu número factorizando cualquier factor cuadrado que encuentres. Puedes tener una lista precalculada de primos y(?) sus cuadrados esperando. Hacer esto podría reducir el tamaño de su número de prueba, mejorar la velocidad, etc. Cada vez que reduzcas con éxito un número, llegarás a algo más pequeño para probar. Tomemos los mencionados 99.225 y 55.125. Si sabes que 3 entra en cada uno, intenta dividir por 9. Obtendrás 11.025 y 6.125. Vuelve a intentar reducir por un factor 9 y obtendrás 1.225 y 6.125, respectivamente, y el 9 ya no entrará en ninguno de los dos. A continuación, prueba con 5. Intenta reducir por 25 y obtienes 49 y 245, respectivamente. Y así sucesivamente. Sólo tenemos que comprobar si 49 y 245 son cuadrados. El primero claramente lo es; el segundo no, porque se puede dividir por 5 una vez pero no dos.
Como nota al margen, una vez que se ha calculado un valor, puede valer la pena volver a revisar algunas de las reglas y trucos anteriores, ya que algunos de los patrones pueden surgir y revelar información.
Otro dato es que todos los enteros pueden ser factorizados en sus factores enteros, incluyendo el 1 y a sí mismo. Si esta lista se compone sólo de factores únicos, entonces se aplica esta regla. Los cuadrados no perfectos tienen un número par de factores porque vienen en pares, uno a cada lado de la raíz cuadrada. Pero los cuadrados perfectos tienen un número impar de factores únicos, ya que su raíz cuadrada se cuenta una vez. Por desgracia, esta prueba es un poco inútil, ya que implica encontrar una lista de factores que incluya la propia raíz cuadrada. Tomemos como ejemplo el cuadrado perfecto 9. Sus factores enteros son [1,3,9]. El 3 es la raíz cuadrada, pero hay un número impar de términos en la lista. El no cuadrado 10, sin embargo, tiene factores enteros [1,2,5,10].
2 votos
Anexo : Mientras investigaba esto, encontré este interesante documento relacionado, Derivación de un algoritmo rápido de raíz cuadrada de número entero que deriva un algoritmo rápido y sencillo a partir de una prueba de existencia constructiva mediante el inusual principio de inducción $\left[P(0)\wedge (\forall n.P(\lfloor{n\over 4}\rfloor)\Rightarrow P(n))\right] \Rightarrow \forall n.P(n)$ .
1 votos
Relacionados: stackoverflow.com/questions/295579/ johndcook.com/blog/2008/11/17/
0 votos
@leonbloy Muchas gracias por estos interesantes enlaces. Soy consciente de la táctica de decidir rápidamente si $n$ es un cuadrado mirando su último dígito y comprobando si es un residuo cuadrático apropiado. Pero no creo que esto pueda cambiar la $O()$ del algoritmo, sólo su constante multiplicativa. Esperaba saber si hay alguna generalización de esta técnica que puede reducir el orden asintótico del algoritmo.
0 votos
@MarkDominus Yo también sospecho fuertemente que no, y creo que hay una sutileza en tu comentario inicial que encierra gran parte de la razón. Para pequeño constantes $k$ tienes razón en que hay un $O(\log n)$ algoritmo para decidir la divisibilidad (por cierto, esto suele escribirse $O(n)$ que refleja el tamaño real de la entrada). Pero para dividir $n$ -números de dígitos por $k$ -números de un dígito donde $k$ es proporcional a $n$ en lugar de constante, la divisibilidad toma algo más parecido a $O(n^2)$ tiempo (técnicamente, tarda lo mismo que la multiplicación, si se utiliza un algoritmo de multiplicación rápido).
0 votos
Relacionados: math.stackexchange.com/questions/41337/
0 votos
@rosie ¡muchas gracias!
0 votos
@MJD De hecho, la respuesta es que sí existe tal método que puede decidir si $n$ es un cuadrado perfecto sin usar la raíz cuadrada. ver abajo. math.stackexchange.com/questions/4226869/