[¯|¯] I primi otto numeri primi mediante gli zeri della funzione zeta di Riemann
Aprile 30th, 2017 | by Marcello Colozzo |
Per scrivere un programma con Mathematica che sia in grado di riprodurre le discontinuità di prima specie della distribuzione π0(x), utilizziamo innanzitutto un'approssimazione del termine G(x) proposta da Riesel-Göhl.

dopodiché definiamo la "componte continua" della π0(x)

dove R(x) è l'approssimazione di Riemann espressa attraverso la serie di Gram troncata a un ordine N (un valore tipico è N=100)

In figura riportiamo i grafici delle restrizioni delle funzioni π0(x) e R0(x) all'intervallo [12,100].

Riprendiamo ora il termine correttivo H(x) iniziando la somma da n=1 giacchè Mathematica enumera con questa modalità gli zeri della zeta di Riemann che sono built-in, onde definiamo dapprima la seguente funzione che restituisce l'n-esimo zero:

H(x) si presenta nella forma:

che è mostruosamente complicata pur troncando le serie alle somme parziali

I parametri liberi della routine sono (N,N0). Per quanto detto, l'intero naturale non nullo N è il numero di zeri della zeta, mentre N0 è già stato esaminato nei numeri precedenti dove avevamo posto N0=154, mentre [SW] utilizza per l'altro parametro il valore N=50 . In parole povere dobbiamo calcolare il contributo proveniente dai primi 50 zeri non banali della zeta di Riemann.
L'esecuzione della sommatoria per il calcolo di Tn(x) ha un elevato costo computazionale a causa delle funzioni non elementarmente esprimibili.

per cui applichiamo il procedimento elaborato in questo handbook. Quindi trasformiamo i vari termini in vettori riga e vettori colonna, dopodiché eseguiamo un prodotto righe per colonne (prodotto scalare). Scriviamo:

dove C è il vettore riga dei coefficienti di Möbius:

mentre

definisce il vettore colonna. Calcoliamo dapprima la lista dei coefficienti di Möbius:

Utilizzando l'istruzione Select ridefiniamo gli indici dei coefficienti in modo da scartare quelli nulli (aumenterebbero solo il carico computazionale):

Di seguito la lista dei coefficienti di Möbius non nulli:

Il vettore colonna Ψn è generato dalla riga di codice:

Quindi

A questo punto, sulla falsariga dell'approccio citato in precedenza, eseguiamo una decomposizione dell'intervallo X0=[2,b] con b>2 espresso come parametro libero, assegnando b+550 punti:

che compongono il seguente sottoinsieme di X0

I valori assunti da Tn in X'0 genera la lista di b+551 elementi:

Dobbiamo adesso comunicare a Mathematica come calcolare questa lista. La decomposizione dell'intervallo X0 si ottiene con l'istruzione Range:

Dal momento che in Mathematica le funzioni definite dall'utente hanno l'attributo Listable (cioè agiscono sulle liste), definiamo una funzione dell'indice n, ove quest'ultimo individua lo zero della zeta di Riemann:
Per un assegnato b>2 tale istruzione restituisce la lista {Tn(xk)}. L'argomento di ListLinePlot è l'insieme delle coppie ordinate (xk,Tn(x)) giacché tale istruzione esegue un tracciamento per punti per poi unirli con una linea continua. Dobbiamo allora trasformare la lista generata da Tlist in una lista di coppie ordinate. Per Mathematica una lista altro non è che un vettore (i.e. matrice riga), per cui definiamo:

Cioè la matrice 2×(b+551):

Passando alla matrice trasposta:

si ottiene la giusta sequenza di coppie ordinate. Nel notebook di Mathematica scriviamo:

Per n=1 otteniamo il grafico riportato nella figura seguente:

Aumentando progressivamente n, otteniamo i grafici:




Tali funzioni hanno in comune l'andamento oscillatorio a causa della presenza di cos(a*ln(x)), dove a>0 è una costante (cfr. post precedenti) nel proprio sviluppo in serie. Si noti l'ampiezza progressivamente decrescente quando si passa da Tnx a Tn'>n(x). Questo comportamento conferma l'analisi fatta in un numero precedente, e cioè che il contributo dominante proviene dai primi zeri della funzione zeta.
Per poter sommare HN(x) (nel procedimento appena visto) a R0(x), dobbiamo dapprima trasformare quest'ultima funzione in una lista in modo da ricostruire in software l'espressione:

Sul notebook di Mathematica battiamo il seguente codice:


ove la seconda riga di codice restituisce la funzione built-in PrimePi applicata all'insieme X0'. Rammentiamo che PrimePi[x] ci dice quanti primi ci sono tra 0 e x. La funzione HN(x) è definita dall'istruzione:

Qui l'intero naturale p svolge il ruolo di N o meglio, è un parametro libero che ci permette di aggiungere progressivamente i vari zeri. Ad esempio, per p=1 otteniamo il grafico di fig. in cui è b=20. Tale valore di b implica che stiamo considerando i primi 8 numeri primi: 2,3,5,7,11,13,17,19.

Confrontando lo stesso valore di b, plottiamo R2(x)=R0(x)+T1(x)+T2(x), da cui vediamo la comparsa di oscillazioni come mostrato in fig.

Nelle rimanenti figure i grafici sono stati ottenuti aggiungendo progressivamente i vari termini correttivi (la correzione contenete il contributo del 50-esimo zero è riportata al top di questa pagina).












Sostienici

Puoi contribuire all’uscita di nuovi articoli ed e-books gratuiti che il nostro staff potrà mettere a disposizione per te e migliaia di altri lettori.
Tags: congettura di riemann, distribuzione dei numeri primi, funzione Zeta di Riemann
Articoli correlati



Congettura di Riemann
Trasformata discreta di Fourier
Trasformata di Fourier nel senso delle distribuzioni
Trasformata di Fourier
Infinitesimi ed infiniti
Limiti notevoli
Punti di discontinuità
Misura di Peano Jordan
Eserciziario sugli integrali
Differenziabilità
Differenziabilità (2)
Esercizi sui limiti
Appunti sulle derivate
Studio della funzione
Esercizi sugli integrali indefiniti
Algebra lineare
Analisi Matematica 2
Analisi funzionale
Entanglement quantistico
Spazio complesso
Biliardo di Novikov
Intro alla Meccanica quantistica
Entanglement Quantistico