Wow. Esto merece un aparte de respuesta.
Como mencioné en un comentario, motivado por la pregunta, en un comentario anterior, por Igor Rivin si un eficiente primalidad de la prueba puede realizarse si el enunciado de la pregunta es verdad, yo les hice una pregunta por separado acerca de si se podría calcular de manera eficiente $T_n(x)$ modulo $x^r-1,n$. Que pregunta recibió una brillante respuesta por Lucía, que permite realmente demostrar que si el enunciado de la pregunta es verdadera, de hecho, se obtiene una muy eficiente primalidad de la prueba basado en él.
He hecho este rápido y sucio código de Mathematica
polmul[f_, g_, r_, n_] := Mod[f.NestList[RotateRight, g, r - 1], n]
matmul[a_, b_, r_, n_] := Mod[
{{polmul[a[[1, 1]], b[[1, 1]], r, n] + polmul[a[[1, 2]], b[[2, 1]], r, n],
polmul[a[[1, 1]], b[[1, 2]], r, n] + polmul[a[[1, 2]], b[[2, 2]], r, n]},
{polmul[a[[2, 1]], b[[1, 1]], r, n] + polmul[a[[2, 2]], b[[2, 1]], r, n],
polmul[a[[2, 1]], b[[1, 2]], r, n] + polmul[a[[2, 2]], b[[2, 2]], r, n]}}, n]
matsq[a_, r_, n_] := matmul[a, a, r, n]
matpow[a_, k_, r_, n_] := If[k == 1, a,
If[EvenQ[k],
matpow[matsq[a, r, n], k/2, r, n],
matmul[a, matpow[matsq[a, r, n], (k - 1)/2, r, n], r, n]
]
]
xmat[r_, n_] :=
{{PadRight[{0, 2}, r], PadRight[{n - 1}, r]},
{PadRight[{1}, r], ConstantArray[0, r]}}
isprime[n_] := With[{r = smallestr[n]},
If[r == 0, n == 2,
With[{xp = matpow[xmat[r, n], n - 1, r, n]},
Mod[RotateRight[xp[[1, 1]]] + xp[[1, 2]], n]
=== PadRight[Append[ConstantArray[0, Mod[n, r]], 1], r]
]
]
]
donde smallestr
es como en mi otra respuesta.
Ejecutar esto en $n$ hasta 100000 (todas las respuestas correctas) da la siguiente duración:
Parece que es en el peor logarítmica de la orden (como la respuesta de Lucía sugiere) - en realidad la gráfica de $\log(\operatorname{time}(n))/\log\log(n)$ casi parece que va a estar delimitado por encima:
Dado que el algoritmo consiste en un procedimiento recursivo para la matriz de competencias, en principio, que uno también tiene que comprobar el uso de memoria. Aquí debo confesar que los resultados son extraños, tal vez es algo de hardware específico.
$$
\begin{array}{r|l}
\text{amount of memory}&\text{number of cases (out of 100000)}\\
\hline
32&1407\\
64&94408\\
80&1\\
288&1\\
320&42\\
352&3\\
392&8\\
424&2316\\
456&1812\\
3452552&1
\end{array}
$$
Esta última cantidad 3452552 corresponde a $n=65969$, no tengo idea de por qué es necesaria tanta memoria. Como dije esto podría ser algo específico de máquina - tal vez algunos de recolección de basura se produjo en ese momento o algo así. De todos modos, en contraposición a la memoria de la medición de datos de tiempo parece ser muy precisa, he utilizado el Mathematica comando AbsoluteTiming
y la documentación dice que le da real de tiempo de procesador se utiliza para el cálculo con muy alta precisión.