Generatore di numeri primi in Javascript

di Marco Cavicchioli

Inserire un numero intero positivo (N) maggiore di 1 nel seguente campo e cliccare su "Genera":

N =  

Una volta cliccato su "Genera" un codice Javascript estrarrà dalla successione dei numeri interi positivi minori o uguali a N l'elenco dei numeri primi in essa riconosciuti.
Dato che la funzione Javascript che esegue ciò genera (n-1) successioni da (n-1) a (n-1)2 la sua esecuzione risulta molto lenta per N molto alti (per esempio oltre 1000).
Da questo elenco è convenzionalmente escluso il numero 1, perchè tutti i numeri interi positivi sono multipli di 1.
Per vedere il codice Javascript è sufficiente aprire questa pagina html con un editor di testo. Per tenere questo codice il più pulito possibile ho scelto di non includere in questa pagina alcun elemento grafico.
Ovviamente tutto il materiale contenuto in questa pagina (sia testo che codice) è CopyLeft, ovvero disponibile liberamente a chiunque. L'autore tuttavia richiede espressamente che, qualora venisse utilizzato, citato o ripubblicato, in ogni luogo e forma, vengano sempre riportati con chiarezza ed evidenza il nome dell'autore (Marco Cavicchioli) e l'url (http://www.MarcoCavicchioli.it/numeri_primi_generatore.html).
Questa pagina è ottimizzata per Mozilla Firefox.

UPDATE: segnalo che è stato pubblicato un TEOREMA FONDAMENTALE DEI NUMERI PRIMI che merita di essere letto.


Descrizione della funzione

I numeri interi positivi maggiori di 1 sarebbero in realtà tutti numeri multipli (di 1 stesso, che è il primo numero intero positivo, e quello da cui vengono generati per somma tutti gli altri numeri interi positivi). Per "numero primo" invece si intende un numero che non è multiplo (ovvero: un numero intero positivo o è multiplo, o è primo). Faccio notare che, a rigor di logica, a questo punto 1 sarebbe l'unico numero primo, perchè l'unico a non essere multiplo (dato che tutti gli altri numeri interi positivi sono perlomeno multipli di 1). Ma questo non esclude che si possa procedere lo stesso, con un'apposita accortezza...

Estrarre la successione dei numeri primi minori o uguali a N pertanto significa estrarre dalla successione di tutti i numeri interi positivi minori o uguali a N quelli che non siano soltanto multipli di 1. Questo concetto presume che si escluda la possibilità che un numero N possa essere multiplo di sè stesso. Per tentare di convincervi di ciò devo fare un passo indietro.

Se accettiamo il presupposto che tutti i numeri interi positivi siano in realtà funzioni di 1 (ovvero valori risultanti dall'applicazione di una data funzione somma al numero 1, come se in realtà esistessero solo due numeri "primordiali", 0 e 1, con tutti i restanti numeri interi superiori in realtà ricavati da somme di 1, e pertanto "multipli di 1") allora tutti i numeri interi positivi, con l'esclusione di 1, sarebbero somme di "uni" (es. 2=1+1, 3=1+1+1, 7=1+1+1+1+1+1+1, ecc.). A questo punto potremmo definire "multipli" (sempre con l'esclusione di 1 stesso) tutti i numeri interi positivi che si ottengono sommando ripetutamente dei "pattern di uni". Per pattern di uni intendo sequenze identiche ripetute di n uni (ad esempio (1+1+1)+(1+1+1)+(1+1+1)=9 dimostra che 9 è un numero multiplo). Se imponiamo che, in questo caso, n sia superiore a 1 allora otteniamo che i numeri primi sono quei numeri che non si ottengono da somme ripetute di pattern di n uni, con n>1. Il fatto che sia richiesto che tali somme sano ripetute esclude che un numero intero positivo N possa essere multiplo di sè stesso, perchè in questo caso il pattern di uni non potrebbe essere ripetutamente sommato per ottenere N, se n vale N.

Pertanto posso ora elencare alcune considerazioni importanti:

Faccio notare come, a questo punto, non abbia senso cercare direttamente la successione dei numeri primi, perchè questi non sono altro che i numeri interi positivi minori o uguali a N risultanti dall'esclusione dei numeri multipli (seguendo la definizione di "numeri multipli" appena data) dalla successione dei numeri interi positivi interi minori o uguali a N. Tale procedimento, in realtà, è già ampiamente conosciuto con il nome di "crivello di Eratostene"). La funzione Javascript che ho scritto è solamente una versione semplificata (e ridotta al minimo, per quanto ho potuto) del crivello. Ciononostante la ritengo interessante perchè, se fosse riscritta in termini matematici, credo potrebbe essere utilizzata per scrivere una specie di funzione inversa che, a partire dal "crivello semplificato" generi la sequenza dei numeri primi (un po' come ho fatto io con questa funzione, che di fatto funziona proprio in questo modo - ovvero per esclusione).

Il codice Javascript inserito in questa pagina funziona così:

La funzione di stampa pertanto riporta a video la successione dei numeri primi (e quella dei numeri multipli).

La funzione multipli_genera funziona così:

In realtà, oltre a calcolare la successione di numeri multipli da 1 fino ad N, multipli_genera è in grado di calcolare anche la funzione "pi greco di N" (ovvero il numero di numeri primi uguali o inferiori ad N), che non sarà altro che la differenza tra N ed il numero di multipli calcolati (a cui a dire il vero va ancora sottratto 1 per escludere dal conteggio il numero 1).

Per dimostrare che questo sistema pare funzionare ho realizzato un file di Excel che visualizza la successione dei numeri interi positivi fino a N=49, segnando in rosso quelli che sono multipli; accanto ad ogni numero n ho riportato il fattore f=n-1, sotto il quale ho incolonnato una successione di f fino a n2, segnando f in rosso quando genera un multiplo. Lo schema che ne risulta dà gli stessi risultati della funzione multipli_genera per N=49, come potete facilmente verificare inserendo 49 nel campo in alto e cliccando su "Genera": nella tabella dei fattori che comparirà sotto l'elenco dei numeri primi verranno infatti riportati gli stessi dati, seppure in forma diversa.

Ovviamente sono molto graditi domande, segnalazioni, idee, commenti, ecc. (scriveteli a posta@marcocavicchioli.it).

PS: ho scritto questa funzione dopo aver letto il libro "L'ossessione dei numeri primi" di John Derbyshire.