Numeri Primi
Iniziamo col dire che cos’è un numero primo, un numero primo è un numero naturale maggiore di 1 divisibile solo per 1 e per se stesso.
Da questa definizione si evince che tutti i numeri primi siano dispari, ad eccezione del numero 2 perché tutti gli altri numeri pari, saranno divisibili per 2.
Sono dunque primi i numeri 2, 3, 5, 7, 11, e via dicendo, mentre non sono primi i numeri 4, 6, 8, 9, 10 ecc.
Per scovare i numeri primi esistono diversi metodi, l’intento è quello di trovare un modo per semplificare o diminuire il più possibile i vari passaggi da effettuare.
La radice quadrata viene spesso utilizzata nella ricerca di numeri primi perché ci permette di ridurre il numero di test da effettuare per determinare se un numero è primo o meno.
In particolare, se vogliamo verificare se un numero intero positivo N è primo, dobbiamo testare se è divisibile per tutti i numeri interi positivi compresi tra 2 e la radice quadrata di N.
Per esempio, se vogliamo verificare se il numero 29 è primo, dobbiamo testare se è divisibile per tutti i numeri interi positivi compresi tra 2 e la radice quadrata di 29, che è circa 5,39. Pertanto, dobbiamo testare solo i numeri 2, 3, 4 e 5, e possiamo concludere che 29 è primo perché non è divisibile per nessuno di questi numeri.
Per scrivere la macro, portiamoci nella scheda Sviluppo, premiamo su Visual Basic ed inseriamo un nuovo modulo.
Iniziamo dando il nome alla macro:
Sub TrovaNumeriPrimi()
Nel passaggio successivo andremo a definire le 4 variabili che ci serviranno
“numero” rappresenta il numero che andremo a verificare, “divisore” rappresenta il divisore con cui testeremo se il numero è primo, “riga” indica la riga corrente del foglio di lavoro in cui inseriremo i numeri primi
Queste prime 3 variabili saranno di tipo integer
Dim numero, divisore, riga As Integer
“primo” ci indicherà se abbiamo trovato un numero primo e sarà di tipo Boolean perchè potrà essere solamente vero oppure falso.
Dim primo As Boolean
Nella cella A1 metteremo l’intestazione della colonna
Cells(1, 1) = “Numeri primi”
Nella cella A2 mettiamo il valore 2 perché sappiamo essere l’unico numero primo pari, più avanti capirete il perché di questo passaggio.
Cells(2, 1) = 2
di conseguenza assegniamo alla variabile riga il valore pari a 3, che non è altro che la prima riga libera.
riga = 3
Ora inseriamo la variabile numero all’interno del ciclo For.
For numero = 3 To 1000 Step 2
Mettiamo la dicitura step 2, per il semplice motivo che controlleremo solo ed esclusivamente i numeri dispari partendo dal numero 3, questa procedura renderà più rapida l’esecuzione della macro perché in un sol colpo eliminerà il 50% dei numeri da controllare.
Per la variabile primo assegneremo il valore vero
primo = True
Con le prossime righe di codice verificheremo se il numero è primo.
Iniziamo un ciclo For che verifica tutti i divisori da 3 fino alla radice quadrata del numero corrente.
Prima vi ho detto che se vogliamo verificare se un numero è primo, dobbiamo testare se è divisibile per tutti i numeri interi positivi compresi tra 2 e la radice quadrata di N, mentre ora partiamo dal numero 3 come mai?
Anche in questo caso la risposta è abbastanza semplice, l’unico numero primo pari è il 2, che abbiamo già inserito nella cella A2, quindi non avrebbe senso usarlo nuovamente come divisore.
Questo si traduce in un minor numero di passaggi da effettuare.
For Divisore = 3 To Sqr(Numero)
Verifichiamo se il numero corrente è divisibile per il divisore corrente. Se è divisibile, significa che il numero non è primo
If Numero Mod Divisore = 0 Then
e impostiamo la variabile primo a “False“.
primo = False
ed usciamo dal ciclo For, perché abbiamo già trovato un divisore per il numero corrente e non abbiamo bisogno di testare ulteriormente i divisori.
Exit For
Terminiamo il comando IF
End If
Passiamo al successivo divisore per il numero corrente.
Next divisore
Con le prossime righe di codice inseriremo il numero primo nella colonna A, nella prima riga disponibile.
Se la variabile primo ha assunto il valore vero significa che non abbiamo trovato alcun divisore per il numero corrente, in tal caso si tratta di un numero primo.
If primo = True Then
inseriamo la variabile numero nella colonna A nella riga corrente del foglio di lavoro.
Cells(riga, 1) = numero
Poi passiamo alla riga successiva per inserire eventuali numeri primi che troveremo in seguito.
riga = riga + 1
Terminiamo il comando IF
End If
Passiamo al successivo numero da testare, questo ci permetterà di ripetere il ciclo For fino a testare tutti i numeri da 3 a 1000.
Next numero
La macro è terminata, non ci resta che provarla prendo il tasto F8, in questo modo vedremo il funzionamento riga per riga, per essere certi di non aver commesso errori.
Se tutto funziona correttamente, possiamo abbinare un pulsante alla macro corrente.
Da Inserisci, nei Controlli modulo scegliamo Pulsante
Abbiniamo il pulsante alla macro e rinominiamolo in Trova numeri primi
in un attimo avremo i numeri primi contenuti nei primi 1000 numeri.
Inutile dire che se volessimo trovare i numeri primi per i primi 10000 numeri, basterà variare di conseguenza il valore massimo per il ciclo For.
Qui trovate il link per scaricare il file
Nel video qui sotto trovate tutti i passaggi appena illustrati, buona visione.
https://youtu.be/8K6y3GTCfWw