Como se segue da minha pergunta anterior , tenho brincado com a hipótese de Riemann como uma questão de matemática recreativa. No processo, cheguei a uma recorrência bastante interessante e estou curioso quanto ao nome, suas reduções e sua tratabilidade em direção à resolubilidade da diferença entre os números primos.
Em termos gerais, podemos definir a diferença entre cada número primo como uma recorrência dos primos candidatos anteriores . Por exemplo, para nossa base de , o próximo primo seria:
Ou, como vemos ao traçar isso : .
Podemos repetir o processo para primos avaliando cada candidato a cada candidato recorrente. Suponha que queremos obter o próximo primo, . Nossa função candidata se torna:p 2
Onde:
, como acima.
É fácil ver que cada função de componente se torna zero em valores inteiros e é igualmente fácil mostrar como isso captura inteligentemente nossos relacionamentos em forma de AND e XOR, explorando as propriedades de adição e multiplicação no contexto de um sistema trigonométrico. equações
A recorrência se torna:
... onde todo o problema depende da capacidade de avaliar o operador nessa função em tempo polinomial. Esta é, de fato, uma generalização da Peneira de Eratóstenes .
Trabalhando código Python para demonstrar a recorrência:
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
Um exemplo 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]
O problema é que agora estou passando dos limites, matematicamente e como cientista da computação. Especificamente, não sou competente com a análise de Fourier , com a definição de coberturas uniformes ou com o plano complexo em geral, e estou preocupado que essa abordagem seja totalmente errada ou oculte um horror à espreita de um problema 3SAT que a eleva a NP-completude.
Portanto, tenho três perguntas aqui:
- Dada minha recorrência concisa acima, é possível calcular deterministicamente ou estimar a localização dos zeros no tempo e espaço polinomial?
- Em caso afirmativo ou não, está ocultando outros subproblemas que tornariam intratável uma solução polytime ou polyspace?
- E se, por algum milagre (1) e (2) persistir, que melhorias dinâmicas na programação você faria para satisfazer essa recorrência, de alto nível? Claramente, a iteração sobre os mesmos números inteiros por meio de múltiplas funções é deselegante e bastante dispendiosa.