¿Teoría de la complejidad difícil de verificar el valor de

13

La función de conteo primo , degradada , se define como el número de números primos menores o iguales que .π(x)x

Podemos definir un problema de decisión desde siguiente manera:π(x)

Dados dos números y , escritos en binario, decida si .xnπ(x)=n

Un amigo y yo estábamos hablando sobre este problema hoy temprano. Hay un algoritmo de tiempo pseudopolinomial para este problema: solo cuente hasta , usando la división de prueba en cada paso para ver cuántos números son primos y verifique si es igual a . El problema también está en PSPACE, ya que el algoritmo que acabo de describir se puede implementar para usar solo espacio auxiliar polinómico.nxn

Sin embargo, tengo problemas para encontrar una manera de ubicar este problema en una clase de menor complejidad. No puedo ver cómo construir un verificador de tiempo polinómico para el problema, por lo que no estoy seguro de si está en NP, y no puedo pensar en una forma de llevarlo a la jerarquía polinómica.

¿Cuál es la clase de complejidad más apropiada para este problema?

¡Gracias!

templatetypedef
fuente
por lo general, este tipo de problemas tienden a depender de la conjetura de Riemann ... hay muchas funciones "cercanas" a las suyas que tienen esa conexión ...
vzn

Respuestas:

11

Esto es en gran medida un problema abierto. Dibujaré algunas clases en las que el problema podría encajar "naturalmente".

Es difícil trabajar con su definición, el problema es difícil de encajar en cualquier clase de complejidad existente. El idioma que ha definido es la intersección de los idiomas y { ( x , n ) | K entonces { ( x , n ){(x,n)|π(x)n} . Entonces, por ejemplo, { ( x , n ) | π ( x ) n } estaba en clase{(x,n)|π(x)n}{(x,n)|π(x)n}K estaría en c o K . Esto hace dar una caracterización de la lengua que ha definido difícil porque uno tendría que Estado "la intersección de una lengua en K con un lenguaje de C o K " para dar el más apretado atado.{(x,n)|π(x)n}coKKcoK

El problema "Calcular " es un problema en #π(X) , donde # P F P S P A C E es la clase de problemas de la forma "Calcular el número de rutas de aceptación de un TM polinomial no determinista". Claramente, podemos construir una TM no determinista que adivine un número q x , y luego (con AKS) comprueba si q es primo.#P#PFPSPACEqxq

Una variante de decisión de es P P , que es la clase de lenguajes que tienen la forma: "Dado un TM polinomial no determinista, ¿aceptan al menos la mitad de las rutas de cálculo?". Ambos { ( x , n ) | π ( x ) n } y { ( x , n ) | π ( x ) n } son probablemente reducibles a un problema en P P#PPP{(x,n)|π(x)n}{(x,n)|π(x)n}PP (haciendo un poco de falsificación de la TM antes mencionada para equilibrar el número de caminos de aceptación).

Tom van der Zanden
fuente
3

Tu problema está en C = P= través del algoritmo,

adivinanza no determinista un entero tal que[m y un poco0m<2log2(x+1)]b
si x < mluego rechazar
si b=1entonces:
si m < nluego acepta más rechazar
más:
si m es primo, entonces acepta más rechaza

.


En particular, su problema también está en PP, ya que PP está cerrado bajo reducciones de la tabla de verdad .


fuente
2

En la práctica, puede obtener la respuesta más rápido o más lento :-(

Hay aproximaciones razonablemente buenas para π (x). Entonces calculas tal aproximación, y si está demasiado lejos sabes que π (x) ≠ n. Por ejemplo, si n ≥ x, entonces sé que π (x) ≠ n sin calcular nada.

Hay un algoritmo rápido que determina si π (x) es par o impar, ejecutándose en O (x ^ (1/2)). Puede ejecutar este algoritmo y puede detectar que la paridad de n es incorrecta y ya está. Tiene cincuenta posibilidades si n es un entero aleatorio cercano a π (x).

Aparte de eso, no conozco ningún método que sea más rápido que calcular π (x). Lo cual es muy inconveniente: si escribo un programa que se supone que calcula π (10 ^ 25), y obtengo un resultado que obviamente no es incorrecto, entonces no hay forma de verificar que mi resultado sea correcto, aparte de repetir cálculo. Y no puede simplemente repetir el cálculo usando mi programa, necesita escribir un programa diferente, de lo contrario no detectaría si mi programa tiene algún error que haga que calcule una función ligeramente diferente a π (x).

π (x) se puede calcular razonablemente fácilmente en aproximadamente O (n ^ (2/3)), y más rápido con algunas matemáticas realmente profundas.

gnasher729
fuente
1
Esto es interesante, pero la pregunta es más sobre las clases de complejidad que contienen el problema.
usul