Come segue dalla mia domanda precedente , ho giocato con l' ipotesi di Riemann come una questione di matematica ricreativa. Nel processo, sono arrivato a una ricorrenza piuttosto interessante e sono curioso di sapere il suo nome, le sue riduzioni e la sua trattabilità verso la solvibilità del divario tra i numeri primi.
In parole povere, possiamo definire il divario tra ciascun numero primo come una ricorrenza di numeri primi candidati precedenti . Ad esempio, per la nostra base di , il primo primo sarebbe:
Oppure, come vediamo tracciando questo : .
Possiamo ripetere il processo per numeri primi valutando ogni candidato primo ricorrente in avanti. Supponiamo di voler ottenere il prossimo numero primo, . La nostra funzione candidata diventa:
Dove:
, come sopra.
È facile vedere che ogni funzione di componente diventa zero solo su valori interi, ed è altrettanto facile mostrare come questo cattura abilmente le nostre relazioni a forma di AND e XOR, sfruttando le proprietà di addizione e moltiplicazione nel contesto di un sistema di trigonometria equazioni.
La ricorrenza diventa:
... dove l'intero problema dipende dal fatto che possiamo valutare l' operatore su questa funzione in tempo polinomiale. Questa è, in effetti, una generalizzazione del setaccio di Eratostene .
Codice Python funzionante per dimostrare la ricorrenza:
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 rapido esempio:
>>> [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]
Il guaio è che ora sono completamente sopra la mia testa, sia matematicamente che come informatico. In particolare, non sono competente con l'analisi di Fourier , con la definizione di coperture uniformi o con il piano complesso in generale, e sono preoccupato che questo approccio sia completamente sbagliato o nasconda un inorridito orrore di un problema 3SAT che lo eleva a NP-completezza.
Pertanto, ho tre domande qui:
- Data la mia concisa ricorrenza sopra, è possibile calcolare o stimare in modo deterministico la posizione degli zeri nel tempo e nello spazio polinomiale?
- Se è così o no, sta nascondendo altri sottoproblemi che renderebbero intrattabile una soluzione polytime o polyspace?
- E se per qualche miracolo (1) e (2) reggessero, quali miglioramenti di programmazione dinamica faresti per soddisfare questa ricorrenza, da un livello elevato? Chiaramente, l'iterazione sugli stessi numeri interi attraverso più funzioni è inelegante e piuttosto dispendiosa.