Como se desprende de mi pregunta anterior , he estado jugando con la hipótesis de Riemann como una cuestión de matemática recreativa. En el proceso, he llegado a una recurrencia bastante interesante, y tengo curiosidad por su nombre, sus reducciones y su capacidad de seguimiento hacia la capacidad de solución de la brecha entre los números primos.
Hablando en términos generales, podemos definir la brecha entre cada número primo como una recurrencia de primos candidatos anteriores . Por ejemplo, para nuestra base de , el siguiente primo sería:
O, como vemos al trazar esto : .
Podemos repetir el proceso para primos evaluando cada candidato primario recurrente hacia adelante. Supongamos que queremos obtener el próximo primo, . Nuestra función candidata se convierte en:
Dónde:
, como arriba.
Es fácil ver que cada función de componente solo se convierte en cero en los valores enteros, y es igualmente fácil mostrar cómo esto captura nuestras relaciones en forma de AND y XOR de manera inteligente, explotando las propiedades de suma y multiplicación en el contexto de un sistema trigonométrico ecuaciones
La recurrencia se convierte en:
... donde todo el problema depende de si podemos evaluar el operador sobre esta función en tiempo polinómico. Esto es, en efecto, una generalización del Tamiz de Eratóstenes .
Código de Python de trabajo para demostrar la recurrencia:
from math import cos,pi
def cosProduct(x,p):
""" Handles the cosine product in a handy single function """
ret = 1.0
for k in xrange(2,p+1):
ret *= -cos(2*pi*(x+k-1)/p)+1.0
return ret
def nthPrime(n):
""" Generates the nth prime, where n is a zero-based integer """
# Preconditions: n must be an integer greater than -1
if not isinstance(n,int) or n < 0:
raise ValueError("n must be an integer greater than -1")
# Base case: the 0th prime is 2, 0th function vacuous
if n == 0:
return 2,lambda x: 0
# Get the preceding evaluation
p_nMinusOne,fn_nMinusOne = nthPrime(n-1)
# Define the function for the Nth prime
fn_n = lambda x: fn_nMinusOne(x) + cosProduct(x,p_nMinusOne)
# Evaluate it (I need a solver here if it's tractable!)
for k in xrange(p_nMinusOne+1,int(p_nMinusOne**2.718281828)):
if fn_n(k) == 0:
p_n = k
break
# Return the Nth prime and its function
return p_n,fn_n
Un ejemplo rápido:
>>> [nthPrime(i)[0] for i in range(20)]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71]
El problema es que ahora estoy muy por encima, tanto matemáticamente como informático. Específicamente, no soy competente con el análisis de Fourier , con la definición de cubiertas uniformes , o con el plano complejo en general, y me preocupa que este enfoque sea totalmente incorrecto u oculte el horror al acecho de un problema de 3SAT que lo eleva a NP-completitud.
Por lo tanto, tengo tres preguntas aquí:
- Dada mi breve recurrencia anterior, ¿es posible calcular o estimar determinísticamente la ubicación de los ceros en el tiempo y el espacio polinomiales?
- Si es así o si no, ¿está ocultando otros subproblemas que harían que una solución polytime o polyspace sea intratable?
- Y si por algún milagro (1) y (2) se mantienen, ¿qué mejoras dinámicas de programación harías para satisfacer esta recurrencia, desde un nivel alto? Claramente, la iteración sobre los mismos enteros a través de múltiples funciones es poco elegante y bastante derrochadora.