O(logn)O(1)nO(1)
a1,…,anb1,…,bn1/n
∏i=1n(x−ai)=∏i=1n(x−bi).
px0∏i=1n(x0−ai)≡∏i=1n(x0−bi)(modp).
Si las matrices son iguales, la prueba siempre pasará, así que concentrémonos en los casos en que las matrices son diferentes. En particular, algún coeficiente de no es cero. Como tienen una magnitud , este coeficiente tiene una magnitud , por lo que tiene como máximo primo factores de tamaño . Esto significa que si elegimos un conjunto de al menos primos de tamaño al menos (digamos), entonces para un primo aleatorio de este conjunto se mantendrá con una probabilidad de al menos que
∏ni=1(x−ai)−∏ni=1(x−bi)ai,binO(1)2nnO(n)=nO(n)O(n)Ω(n)n2pn2p1−1/n∏i=1n(x−ai)−∏i=1n(x−bi)≢0(modp).
Un módulo aleatorio será testigo de esto con probabilidad (ya que un polinomio de grado como máximo tiene como máximo raíces).
px0p1−n/p≥1−1/nnn
En conclusión, si elegimos una aleatoria de tamaño aproximadamente entre un conjunto de al menos primos diferentes, y un módulo aleatorio , entonces cuando las matrices no contienen los mismos elementos, nuestra prueba fallará con probabilidad . Ejecutar la prueba lleva tiempo ya que ajusta a un número constante de palabras de máquina.pn2n2x0p1−O(1/n)O(n)p
Usando pruebas de primalidad de tiempo polinomial y dado que la densidad de primos de tamaño aproximadamente es , podemos elegir un primo aleatorio en el tiempo . La elección de un módulo aleatorio puede implementarse de varias maneras, y se hace más fácil ya que en nuestro caso no necesitamos un aleatorio completamente uniforme .n2Ω(1/logn)p(logn)O(1)x0px0
En conclusión, nuestro algoritmo se ejecuta en el tiempo , siempre genera SÍ si las matrices contienen los mismos elementos, y genera NO con probabilidad si las matrices no contienen los mismos elementos. Podemos mejorar la probabilidad de error de para cualquier constante .O(n)1−O(1/n)1−O(1/nC)C