DEFINIZIONE: Un numero intero N è primo se è divisibile solo per 1 e per N

Risorse collegate

 

Se vuoi stampare la copia cartacea di tale argomento, puoi scaricare qui il PDF

DEFINIZIONE: Un numero intero N è primo se è divisibile solo per 1 e per N

Questa definizione, però, non ci aiuta molto. Ci conviene esprimerla In altri termini: Un numero N è primo se non esistono divisori diversi da 1 e da N.

Da bambini ci hanno insegnato alcuni, criteri: divisibilità per 3, divisibilità per 5, 7, 11, 13...ma, a parte le prime due sono abbastanza cervellotiche e soprattutto non risolvono il problema in modo generale. In effetti, ad oggi, l'unico modo conosciuto per decidere se un numero N è primo o meno è quello di utilizzare la forza bruta dei calcolatori: si prova a dividere per 2; se non è divisibile si prova a dividere per 3; se non è divisibile si prova a dividere per 5 e così via... non appena trovo un divisore posso fermare la mia indagine e concludere che il numero N non è primo.

E se il divisore non lo trovo perché il numero è primo, quando mi fermo?

  • La prima risposta, quella impulsiva, ci spinge a dire che bisogna fermarsi quando si arriva a N-1 (se N=10000, dovrei arrivare fino a 9999)
  • Se ci ragioniamo un po', invece, ci accorgiamo che basta arrivare alla metà di N (se N=10000, dovrei arrivare fino a 5000)
  • Se poi siamo appena un po' più esperti, dovremmo sapere che basta arrivare alla √N    (se N=10000, dovrei fare 100... ma in effetti, scartando i numeri pari, ne faccio solo 50! un bel risparmio di cicli rispetto al metodo 1 e 2) Domanda: perchè scarto i numeri pari? Perchè se fosse divisibile per un numero pari, mi sarei già fermato al primo tentativo, quando ho provato a dividere per 2.

Riportiamo qui di seguito la codifica in linguaggio C dell'algoritmo esaminato:

/******************************************************************************
Dato in input un numero N, dire se esso è un numero primo
*******************************************************************************/
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    int n, divisore, ultimo_divisore, resto;
    printf("numero primo\n");
    cout<<"inserire un numero: ";
    cin>>n;
    
    divisore=2;
    resto=n%divisore;
    if(resto!=0){
        ultimo_divisore=sqrt(n);
        divisore=3;
        do{
            resto=n%divisore;
            divisore=divisore+2;
        }while(resto!=0 && divisore<=ultimo_divisore);
    }
    
    if (resto!=0){
        cout<< n<< " e' primo";
    }else{
        cout<< n<< " non e' primo";
    }
    return 0;
 }

COMMENTO:

  • n: numero in input
  • divisore: candidato divisore. Assumerà i valori 2,3,5,7,9...
  • ultimo_divisore: conterrà il valore di  √N
  • resto: contiene il resto della divisione fra n e divisore.

 

linee 12-14 acquisizione del numero n

linee 16-17 si prova a dividere per 2

linea 18 se il resto precedente è zero la codizione è falsa e si salta direttamente alla linea 27

linea 19 si calcola l'ultimo divisore da provare

linea 20 si imposta come prossimo divisore 3

linee  21-24 ciclo in cui si calcola il resto della divisione fra n e divisore e si predispone il divisore per il prossimo ciclo (divisore=divisore+2;) il ciclo termina o quando il resto è zero oppure quando divisore ha superato ultimo_divisore

linee  27-31 viene emesso il risultato, a seconda del valore contenuto in resto