Articulo de referencia

Algoritmo de Tonelli-Shanks

El algoritmo de Tonelli-Shanks (conocido por Shanks como el algoritmo RESSOL) se utiliza en aritmética modular para resolver r en una congruencia de la forma r 2 ≡ n (mod p ), d...

El algoritmo de Tonelli-Shanks (conocido por Shanks como el algoritmo RESSOL) se utiliza en aritmética modular para resolver r en una congruencia de la forma r 2n (mod p ), donde p es un primo : es decir, para encontrar una raíz cuadrada de n módulo p .

El algoritmo de Tonelli-Shanks no se puede utilizar para módulos compuestos: encontrar raíces cuadradas módulo números compuestos es un problema computacional equivalente a la factorización de enteros . [ 1 ]

Alberto Tonelli [ 2 ] [ 3 ] desarrolló en 1891 una versión equivalente, aunque ligeramente más redundante, de este algoritmo. La versión que se analiza aquí fue desarrollada independientemente por Daniel Shanks en 1973, quien explicó:

Mi tardanza en conocer estas referencias históricas se debió a que le presté el Volumen 1 de la Historia de Dickson a un amigo y nunca me lo devolvió. [ 4 ]

Según Dickson, [ 3 ] el algoritmo de Tonelli puede tomar raíces cuadradas de x módulo potencias primas p λ aparte de los números primos.

Ideas principales

Dado un valor distinto de ceronorte{\displaystyle n}y un primopag>2{\displaystyle p>2}(que siempre será impar), el criterio de Euler nos dice quenorte{\displaystyle n}tiene raíz cuadrada (es decir,norte{\displaystyle n}es un residuo cuadrático ) si y solo si :

nortepag121(modpag){\displaystyle n^{\frac {p-1}{2}}\equiv 1{\pmod {p}}}.

Por el contrario, si un númeroz{\displaystyle z}Si no tiene raíz cuadrada (es un no residuo), el criterio de Euler nos dice que:

zpag121(modpag){\displaystyle z^{\frac {p-1}{2}}\equiv -1{\pmod {p}}}.

No es difícil encontrar tal cosaz{\displaystyle z}, porque la mitad de los enteros entre 1 ypag1{\displaystyle p-1}poseen esta propiedad. Por lo tanto, asumimos que tenemos acceso a dicho no residuo.

Al dividir (normalmente) repetidamente por 2, podemos escribirpag1{\displaystyle p-1}comoQ2S{\displaystyle Q2^{S}}, dóndeQ{\displaystyle Q}es extraño. Tenga en cuenta que si lo intentamos

RnorteQ+12(modpag){\displaystyle R\equiv n^{\frac {Q+1}{2}}{\pmod {p}}},

entoncesR2norteQ+1=(norte)(norteQ)(modpag){\displaystyle R^{2}\equiv n^{Q+1}=(n)(n^{Q}){\pmod {p}}}. SitnorteQ1(modpag){\displaystyle t\equiv n^{Q}\equiv 1{\pmod {p}}}, entoncesR{\displaystyle R}es una raíz cuadrada denorte{\displaystyle n}. De lo contrario, paraMETRO=S{\displaystyle M=S}, tenemosR{\displaystyle R}yt{\displaystyle t}satisfactorio:

  • R2nortet(modpag){\displaystyle R^{2}\equiv nt{\pmod {p}}}; y
  • t{\displaystyle t}es un2METRO1{\displaystyle 2^{M-1}}raíz -ésima de 1 (porquet2METRO1=t2S1norteQ2S1=nortepag12{\displaystyle t^{2^{M-1}}=t^{2^{S-1}}\equiv n^{Q2^{S-1}}=n^{\frac {p-1}{2}}}).

Si, dada la elección deR{\displaystyle R}yt{\displaystyle t}para un caso particularMETRO{\displaystyle M}satisfaciendo lo anterior (dondeR{\displaystyle R}no es una raíz cuadrada denorte{\displaystyle n}), podemos calcular fácilmente otroR{\displaystyle R}yt{\displaystyle t}paraMETRO1{\displaystyle M-1}De modo que se cumplan las relaciones anteriores, podemos repetir esto hastat{\displaystyle t}se convierte en un20{\displaystyle 2^{0}}raíz -ésima de 1, es decir,t=1{\displaystyle t=1}En ese momentoR{\displaystyle R}es una raíz cuadrada denorte{\displaystyle n}.

Podemos comprobar sit{\displaystyle t}es un2METRO2{\displaystyle 2^{M-2}}raíz -ésima de 1 elevándolo al cuadradoMETRO2{\displaystyle M-2}veces y comprobar si es 1. Si lo es, entonces no necesitamos hacer nada, ya que la misma elección deR{\displaystyle R}yt{\displaystyle t}funciona. Pero si no funciona,t2METRO2{\displaystyle t^{2^{M-2}}}debe ser -1 (porque al elevarlo al cuadrado da 1, y solo puede haber dos raíces cuadradas 1 y -1 de 1 módulopag{\displaystyle p}).

Para encontrar un nuevo par deR{\displaystyle R}yt{\displaystyle t}podemos multiplicarR{\displaystyle R}por un factorb{\displaystyle b}, por determinar. Entoncest{\displaystyle t}debe multiplicarse por un factorb2{\displaystyle b^{2}}para mantenerR2nortet(modpag){\displaystyle R^{2}\equiv nt{\pmod {p}}}Entonces, cuandot2METRO2{\displaystyle t^{2^{M-2}}}es -1, necesitamos encontrar un factorb2{\displaystyle b^{2}}de modo quetb2{\displaystyle tb^{2}}es un2METRO2{\displaystyle 2^{M-2}}raíz -ésima de 1, o equivalentementeb2{\displaystyle b^{2}}es un2METRO2{\displaystyle 2^{M-2}}-ésima raíz de -1.

El truco aquí es hacer uso dez{\displaystyle z}, el no residuo conocido. El criterio de Euler aplicado az{\displaystyle z}Lo que se muestra arriba dice quezQ{\displaystyle z^{Q}}es un2S1{\displaystyle 2^{S-1}}-ésima raíz de -1. Entonces, al elevar al cuadradozQ{\displaystyle z^{Q}}repetidamente, tenemos acceso a una secuencia de2i{\displaystyle 2^{i}}raíces -ésimas de -1. Podemos seleccionar la correcta para que sirva comob{\displaystyle b}Con un poco de mantenimiento de variables y una compresión de casos trivial, el siguiente algoritmo surge de forma natural.

El algoritmo

Operaciones y comparaciones sobre elementos del grupo multiplicativo de enteros módulo pZ/pagZ{\displaystyle \mathbb {Z} /p\mathbb {Z} }son implícitamente módulo p .

Entradas :

  • p , un primo
  • n , un elemento deZ/pagZ{\displaystyle \mathbb {Z} /p\mathbb {Z} }de tal manera que existan soluciones a la congruencia r 2 = n ; cuando esto es así, decimos que n es un residuo cuadrático módulo p .

Resultados :

  • r enZ/pagZ{\displaystyle \mathbb {Z} /p\mathbb {Z} }tal que r 2 = n

Algoritmo :

  1. Al factorizar potencias de 2, encuentre Q y S tales quepag1=Q2S{\displaystyle p-1=Q2^{S}}con Q impar
  2. Buscar una z enZ/pagZ{\displaystyle \mathbb {Z} /p\mathbb {Z} }que es un no residuo cuadrático
  3. Dejar
    METROSdozQtnorteQRnorteQ+12{\displaystyle {\begin{aligned}M&\leftarrow S\\c&\leftarrow z^{Q}\\t&\leftarrow n^{Q}\\R&\leftarrow n^{\frac {Q+1}{2}}\end{aligned}}}
  4. Bucle:
    • Si t = 0, devuelve r = 0.
    • Si t = 1, devuelve r = R
    • De lo contrario, utilice la elevación al cuadrado repetida para encontrar el menor i , 0 < i < M , tal quet2i=1{\displaystyle t^{2^{i}}=1}
    • Dejarbdo2METROi1{\displaystyle b\leftarrow c^{2^{M-i-1}}}y establecer
      METROidob2ttb2RRb{\displaystyle {\begin{aligned}M&\leftarrow i\\c&\leftarrow b^{2}\\t&\leftarrow tb^{2}\\R&\leftarrow Rb\end{aligned}}}

Una vez que hayas resuelto la congruencia con r, la segunda solución esr(modpag){\displaystyle -r{\pmod {p}}}. Si el menor i tal quet2i=1{\displaystyle t^{2^{i}}=1}Si M es , entonces no existe solución a la congruencia, es decir, n no es un residuo cuadrático.

Esto es más útil cuando p ≡ 1 (mod 4).

Para números primos tales que p ≡ 3 (mod 4), este problema tiene posibles soluciones.r=±nortepag+14(modpag){\displaystyle r=\pm n^{\frac {p+1}{4}}{\pmod {p}}}. Si estos se cumplenr2norte(modpag){\displaystyle r^{2}\equiv n{\pmod {p}}}, son las únicas soluciones. Si no,r2norte(modpag){\displaystyle r^{2}\equiv -n{\pmod {p}}}, n es un no residuo cuadrático y no hay soluciones.

Prueba

Podemos demostrar que al inicio de cada iteración del bucle se cumplen las siguientes invariantes :

  • do2METRO1=1{\displaystyle c^{2^{M-1}}=-1}
  • t2METRO1=1{\displaystyle t^{2^{M-1}}=1}
  • R2=tnorte{\displaystyle R^{2}=tn}

Inicialmente:

  • do2METRO1=zQ2S1=zpag12=1{\displaystyle c^{2^{M-1}}=z^{Q2^{S-1}}=z^{\frac {p-1}{2}}=-1}(ya que z es un no residuo cuadrático, según el criterio de Euler)
  • t2METRO1=norteQ2S1=nortepag12=1{\displaystyle t^{2^{M-1}}=n^{Q2^{S-1}}=n^{\frac {p-1}{2}}=1}(ya que n es un residuo cuadrático)
  • R2=norteQ+1=tnorte{\displaystyle R^{2}=n^{Q+1}=tn}

En cada iteración, con M' , c' , t' , R' los nuevos valores reemplazando a M , c , t , R :

  • do2METRO1=(b2)2i1=do2METROi2i1=do2METRO1=1{\displaystyle c'^{2^{M'-1}}=(b^{2})^{2^{i-1}}=c^{2^{M-i}2^{i-1}}=c^{2^{M-1}}=-1}
  • t2METRO1=(tb2)2i1=t2i1b2i=11=1{\displaystyle t'^{2^{M'-1}}=(tb^{2})^{2^{i-1}}=t^{2^{i-1}}b^{2^{i}}=-1\cdot -1=1}
    • t2i1=1{\displaystyle t^{2^{i-1}}=-1}ya que tenemos esot2i=1{\displaystyle t^{2^{i}}=1}perot2i11{\displaystyle t^{2^{i-1}}\neq 1}( i es el valor más pequeño tal quet2i=1{\displaystyle t^{2^{i}}=1})
    • b2i=do2METROi12i=do2METRO1=1{\displaystyle b^{2^{i}}=c^{2^{M-i-1}2^{i}}=c^{2^{M-1}}=-1}
  • R2=R2b2=tnorteb2=tnorte{\displaystyle R'^{2}=R^{2}b^{2}=tnb^{2}=t'n}

Det2METRO1=1{\displaystyle t^{2^{M-1}}=1}y la prueba contra t = 1 al comienzo del bucle, vemos que siempre encontraremos un i en 0 < i < M tal quet2i=1{\displaystyle t^{2^{i}}=1}. M es estrictamente menor en cada iteración, y por lo tanto el algoritmo tiene garantizado detenerse. Cuando alcanzamos la condición t = 1 y nos detenemos, el último invariante del bucle implica que R 2 = n .

Orden de t

Alternativamente, podemos expresar los invariantes del bucle utilizando el orden de los elementos:

  • orden(do)=2METRO{\displaystyle \operatorname {ord} (c)=2^{M}}
  • orden(t)|2METRO1{\displaystyle \operatorname {ord} (t)|2^{M-1}}
  • R2=tnorte{\displaystyle R^{2}=tn}como antes

Cada paso del algoritmo mueve t a un subgrupo más pequeño midiendo el orden exacto de t y multiplicándolo por un elemento del mismo orden.

Ejemplo

Resolviendo la congruencia r 2 ≡ 5 (mod 41). 41 es primo como se requiere y 41 ≡ 1 (mod 4). 5 es un residuo cuadrático según el criterio de Euler:54112=520=1{\displaystyle 5^{\frac {41-1}{2}}=5^{20}=1}(como antes, operaciones en(Z/41Z)×{\displaystyle (\mathbb {Z} /41\mathbb {Z} )^{\times }}son implícitamente módulo 41).

  1. pag1=40=523{\displaystyle p-1=40=5\cdot 2^{3}}entoncesQ5{\displaystyle Q\leftarrow 5},S3{\displaystyle S\leftarrow 3}
  2. Encuentra un valor para z:
    • 24112=1{\displaystyle 2^{\frac {41-1}{2}}=1}, por lo tanto, 2 es un residuo cuadrático según el criterio de Euler.
    • 34112=40=1{\displaystyle 3^{\frac {41-1}{2}}=40=-1}, por lo tanto, 3 es un no residuo cuadrático: conjuntoz3{\displaystyle z\leftarrow 3}
  3. Colocar
    • METROS=3{\displaystyle M\leftarrow S=3}
    • dozQ=35=38{\displaystyle c\leftarrow z^{Q}=3^{5}=38}
    • tnorteQ=55=9{\displaystyle t\leftarrow n^{Q}=5^{5}=9}
    • RnorteQ+12=55+12=2{\displaystyle R\leftarrow n^{\frac {Q+1}{2}}=5^{\frac {5+1}{2}}=2}
  4. Bucle:
    • Primera iteración:
      • t1{\displaystyle t\neq 1}, así que no hemos terminado
      • t21=40{\displaystyle t^{2^{1}}=40},t22=1{\displaystyle t^{2^{2}}=1}entoncesi2{\displaystyle i\leftarrow 2}
      • bdo2METROi1=382321=38{\displaystyle b\leftarrow c^{2^{M-i-1}}=38^{2^{3-2-1}}=38}
      • METROi=2{\displaystyle M\leftarrow i=2}
      • dob2=382=9{\displaystyle c\leftarrow b^{2}=38^{2}=9}
      • ttb2=99=40{\displaystyle t\leftarrow tb^{2}=9\cdot 9=40}
      • RRb=238=35{\displaystyle R\leftarrow Rb=2\cdot 38=35}
    • Segunda iteración:
      • t1{\displaystyle t\neq 1}, así que todavía no hemos terminado
      • t21=1{\displaystyle t^{2^{1}}=1}entoncesi1{\displaystyle i\leftarrow 1}
      • bdo2METROi1=92211=9{\displaystyle b\leftarrow c^{2^{M-i-1}}=9^{2^{2-1-1}}=9}
      • METROi=1{\displaystyle M\leftarrow i=1}
      • dob2=92=40{\displaystyle c\leftarrow b^{2}=9^{2}=40}
      • ttb2=4040=1{\displaystyle t\leftarrow tb^{2}=40\cdot 40=1}
      • RRb=359=28{\displaystyle R\leftarrow Rb=35\cdot 9=28}
    • Tercera iteración:
      • t=1{\displaystyle t=1}y hemos terminado; regresarr=R=28{\displaystyle r=R=28}

En efecto, 28² ≡ 5 (mod 41) y (−28) ²13² ≡ 5 (mod 41). Por lo tanto, el algoritmo produce las dos soluciones a nuestra congruencia.

Velocidad del algoritmo

El algoritmo de Tonelli-Shanks requiere (en promedio sobre todas las entradas posibles (residuos cuadráticos y no residuos cuadráticos))

2metro+2k+S(S1)4+12S19{\displaystyle 2m+2k+{\frac {S(S-1)}{4}}+{\frac {1}{2^{S-1}}}-9}

multiplicaciones modulares, dondemetro{\displaystyle m}es el número de dígitos en la representación binaria depag{\displaystyle p}yk{\displaystyle k}es el número de unos en la representación binaria depag{\displaystyle p}. Si el no residuo cuadrático requeridoz{\displaystyle z}se puede encontrar comprobando si un número tomado al azary{\displaystyle y}es un no residuo cuadrático, requiere (en promedio)2{\displaystyle 2}cálculos del símbolo de Legendre . [ 5 ] El promedio de dos cálculos del símbolo de Legendre se explica de la siguiente manera:y{\displaystyle y}es un residuo cuadrático con probabilidadpag+12pag=1+1pag2{\displaystyle {\tfrac {\tfrac {p+1}{2}}{p}}={\tfrac {1+{\tfrac {1}{p}}}{2}}}, que es más pequeño que1{\displaystyle 1}pero12{\displaystyle \geq {\tfrac {1}{2}}}, por lo que en promedio necesitaremos comprobar si uny{\displaystyle y}es un residuo cuadrático dos veces.

Esto demuestra esencialmente que el algoritmo de Tonelli-Shanks funciona muy bien si el módulopag{\displaystyle p}es aleatorio, es decir, siS{\displaystyle S} is not particularly large with respect to the number of digits in the binary representation of p{\displaystyle p}. As written above, Cipolla's algorithm works better than Tonelli–Shanks if (and only if) S(S1)>8m+20{\displaystyle S(S-1)>8m+20}. However, if one instead uses Sutherland's algorithm to perform the discrete logarithm computation in the 2-Sylow subgroup of Fp{\displaystyle \mathbb {F} _{p}^{\ast }}, one may replace S(S1){\displaystyle S(S-1)} with an expression that is asymptotically bounded by O(SlogS/loglogS){\displaystyle O(S\log S/\log \log S)}.[6] Explicitly, one computes e{\displaystyle e} such that cenQ{\displaystyle c^{e}\equiv n^{Q}} and then Rce/2n(Q+1)/2{\displaystyle R\equiv c^{-e/2}n^{(Q+1)/2}} satisfies R2n{\displaystyle R^{2}\equiv n} (note that e{\displaystyle e} is a multiple of 2 because n{\displaystyle n} is a quadratic residue).

The algorithm requires us to find a quadratic nonresidue z{\displaystyle z}. There is no known deterministic algorithm that runs in polynomial time for finding such a z{\displaystyle z}. However, if the generalized Riemann hypothesis is true, there exists a quadratic nonresidue z<2ln2p{\displaystyle z<2\ln ^{2}{p}},[7] making it possible to check every z{\displaystyle z} up to that limit and find a suitable z{\displaystyle z} within polynomial time. Keep in mind, however, that this is a worst-case scenario; in general, z{\displaystyle z} is found in on average 2 trials as stated above.

Uses

The Tonelli–Shanks algorithm can (naturally) be used for any process in which square roots modulo a prime are necessary. For example, it can be used for finding points on elliptic curves. It is also useful for the computations in the Rabin signature algorithm and in the sieving step of the quadratic sieve.

Generalizations

Tonelli–Shanks can be generalized to any cyclic group (instead of (Z/pZ)×{\displaystyle (\mathbb {Z} /p\mathbb {Z} )^{\times }}) and to kth roots for arbitrary integer k, in particular to taking the kth root of an element of a finite field.[8]

If many square-roots must be done in the same cyclic group and S is not too large, a table of square-roots of the elements of 2-power order can be prepared in advance and the algorithm simplified and sped up as follows.

  1. Factor out powers of 2 from p − 1, defining Q and S as: p1=Q2S{\displaystyle p-1=Q2^{S}} with Q odd.
  2. Let RnQ+12,tnQR2/n{\displaystyle R\leftarrow n^{\frac {Q+1}{2}},t\leftarrow n^{Q}\equiv R^{2}/n}
  3. Find b{\displaystyle b} from the table such that b2t{\displaystyle b^{2}\equiv t} and set RR/b{\displaystyle R\equiv R/b}
  4. return R.

Tonelli's algorithm will work on mod pλ

According to Dickson's "Theory of Numbers"[3]

A. Tonelli[9] gave an explicit formula for the roots of x2=c(modpλ){\displaystyle x^{2}=c{\pmod {p^{\lambda }}}}[3]

The Dickson reference shows the following formula for the square root of x2modpλ{\displaystyle x^{2}{\bmod {p^{\lambda }}}}.

when p=47+1{\displaystyle p=4\cdot 7+1}, or s=2{\displaystyle s=2} (s must be 2 for this equation) and a=7{\displaystyle a=7} such that 29=227+1{\displaystyle 29=2^{2}\cdot 7+1}
for x2modpλc{\displaystyle x^{2}{\bmod {p^{\lambda }}}\equiv c} then
xmodpλ±(ca+3)βc(β+1)/2{\displaystyle x{\bmod {p^{\lambda }}}\equiv \pm (c^{a}+3)^{\beta }\cdot c^{(\beta +1)/2}} where βapλ1{\displaystyle \beta \equiv a\cdot p^{\lambda -1}}

Noting that 232mod293529{\displaystyle 23^{2}{\bmod {29^{3}}}\equiv 529} and noting that β=7292{\displaystyle \beta =7\cdot 29^{2}} then

(5297+3)7292529(7292+1)/2mod2932436623{\displaystyle (529^{7}+3)^{7\cdot 29^{2}}\cdot 529^{(7\cdot 29^{2}+1)/2}{\bmod {29^{3}}}\equiv 24366\equiv -23}

To take another example: 23332mod2934142{\displaystyle 2333^{2}{\bmod {29^{3}}}\equiv 4142} and

(41427+3)72924142(7292+1)/2mod2932333{\displaystyle (4142^{7}+3)^{7\cdot 29^{2}}\cdot 4142^{(7\cdot 29^{2}+1)/2}{\bmod {29^{3}}}\equiv 2333}

Dickson also attributes the following equation to Tonelli:

Xmodpλxpλ1c(pλ2pλ1+1)/2{\displaystyle X{\bmod {p^{\lambda }}}\equiv x^{p^{\lambda -1}}\cdot c^{(p^{\lambda }-2p^{\lambda -1}+1)/2}} where X2modpλc{\displaystyle X^{2}{\bmod {p^{\lambda }}}\equiv c} and x2modpc{\displaystyle x^{2}{\bmod {p}}\equiv c};

Using p=23{\displaystyle p=23} and using the modulus of p3{\displaystyle p^{3}} the math follows:

11152mod233=2191{\displaystyle 1115^{2}{\bmod {23^{3}}}=2191}

First, find the modular square root mod p{\displaystyle p} which can be done by the regular Tonelli algorithm for one or the other roots:

11152mod236{\displaystyle 1115^{2}{\bmod {23}}\equiv 6} and thus 6mod2311{\displaystyle {\sqrt {6}}{\bmod {23}}\equiv 11}

And applying Tonelli's equation (see above):

112322191(2332232+1)/2mod2331115{\displaystyle 11^{23^{2}}\cdot 2191^{(23^{3}-2\cdot 23^{2}+1)/2}{\bmod {23^{3}}}\equiv 1115}

Dickson's reference[3] clearly shows that Tonelli's algorithm works on moduli of pλ{\displaystyle p^{\lambda }}.

Notes

  1. Oded Goldreich, Computational complexity: a conceptual perspective, Cambridge University Press, 2008, p. 588.
  2. Volker Diekert; Manfred Kufleitner; Gerhard Rosenberger; Ulrich Hertrampf (24 May 2016). Discrete Algebraic Methods: Arithmetic, Cryptography, Automata and Groups. De Gruyter. pp. 163–165. ISBN 978-3-11-041632-9.
  3. 12345Leonard Eugene Dickson (1919). History of the Theory of Numbers. Vol. 1. Washington, Carnegie Institution of Washington. pp. 215–216.
  4. Daniel Shanks. Five Number-theoretic Algorithms. Proceedings of the Second Manitoba Conference on Numerical Mathematics. Pp. 51–70. 1973.
  5. Tornaría, Gonzalo (2002). "Square Roots Modulo P". LATIN 2002: Theoretical Informatics. Lecture Notes in Computer Science. Vol. 2286. pp. 430–434. doi:10.1007/3-540-45995-2_38. ISBN 978-3-540-43400-9.
  6. Sutherland, Andrew V. (2011), "Structure computation and discrete logarithms in finite abelian p-groups", Mathematics of Computation, 80 (273): 477–500, arXiv:0809.3413, doi:10.1090/s0025-5718-10-02356-2, S2CID 13940949
  7. Bach, Eric (1990), "Explicit bounds for primality testing and related problems", Mathematics of Computation, 55 (191): 355–380, doi:10.2307/2008811, JSTOR 2008811
  8. Adleman, L. M., K. Manders, and G. Miller: 1977, `On taking roots in finite fields'. In: 18th IEEE Symposium on Foundations of Computer Science. pp. 175-177
  9. "Accademia nazionale dei Lincei, Rome. Rendiconti, (5), 1, 1892, 116-120."

References

  • Ivan Niven ; Herbert S. Zuckerman; Hugh L. Montgomery (1991). Introducción a la teoría de los números (5.ª  ed.). Wiley. págs. 110-115 . ISBN  0-471-62546-9.
  • Daniel Shanks. Cinco algoritmos de teoría de números. Actas de la Segunda Conferencia de Manitoba sobre Matemáticas Numéricas. Págs.  51–70. 1973.
  • Alberto Tonelli, Bemerkung über die Auflösung quadratischer Congruenzen. Nachrichten von der Königlichen Gesellschaft der Wissenschaften und der Georg-Augusts-Universität zu Göttingen . Páginas.  344–346. 1891.
  • Gagan Tara Nanda - Matemáticas 115: El algoritmo RESSOL
  • Gonzalo Tornaria