Jak wynika z mojego poprzedniego pytania , bawiłem się hipotezą Riemanna jako zagadnieniem matematyki rekreacyjnej. W trakcie tego procesu doszłam do dość interesującego nawrotu i jestem ciekawa jego nazwy, jej redukcji i podatności na rozwiązywanie luki między liczbami pierwszymi.
Krótko mówiąc, możemy zdefiniować odstęp między każdą liczbą pierwszą jako powtórzenie poprzednich liczb pierwszych kandydujących . Na przykład dla naszej podstawy następną liczbą pierwszą będzie:
Lub, jak widzimy, wykreślając to : .
Możemy powtórzyć ten proces dla liczb pierwszych, oceniając każdą kandydującą liczbę pierwszą powracającą do przodu. Załóżmy, że chcemy uzyskać następną pierwszą, . Nasza funkcja kandydacka staje się:p 2
Gdzie:
, jak wyżej.
Łatwo zauważyć, że każda funkcja składowa staje się zerowa na wartościach całkowitych, a równie łatwo jest pokazać, jak to sprytnie ujmuje nasze relacje w kształcie AND i XOR, wykorzystując właściwości dodawania i mnożenia w kontekście systemu trygonometrycznego równania.
Nawrót staje się:
... gdzie cały problem zależy od tego, czy możemy ocenić operatora na tej funkcji w czasie wielomianowym. Jest to w rzeczywistości uogólnienie sita Eratostenesa .
Działający kod Python w celu zademonstrowania powtarzalności:
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
Szybki przykład:
>>> [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]
Problem polega na tym, że jestem teraz nad głową, zarówno matematycznie, jak i jako informatyk. W szczególności nie jestem kompetentny w analizie Fouriera , w definiowaniu jednolitych okładek , ani ogólnie w złożonej płaszczyźnie , i martwię się, że to podejście jest całkowicie błędne lub ukrywa przerażający problem 3SAT, który podnosi go do NP-kompletność.
Tak więc mam tutaj trzy pytania:
- Biorąc pod uwagę moją zwięzłość powyżej, czy można deterministycznie obliczyć lub oszacować położenie zer w wielomianowym czasie i przestrzeni?
- Jeśli tak, a jeśli nie, to czy ukrywa on inne podproblemy, które sprawiłyby, że rozwiązanie dla politytime lub polyspace byłoby trudne?
- A jeśli jakimś cudem (1) i (2) utrzyma się, jakie ulepszenia w zakresie programowania dynamicznego wprowadzilibyście, aby zaspokoić ten nawrót, z wysokiego poziomu? Oczywiście, iteracja po tych samych liczbach całkowitych przez wiele funkcji jest nieelegancka i dość marnotrawna.