RISOLTO Algoritmo per verificare se un numero è primo

Stato
Discussione chiusa ad ulteriori risposte.

Innominato00

Nuovo Utente
12
5
Salve, ho creato un programma che verifica se un numero naturale inserito da tastiera è primo, sapete come un modo per non fare eseguire la divisione più volte se un numero risulta essere primo? Non so se sono stato chiarissimo, in pratica se inserisco 359, lui esegue 357 calcoli, e sono tanti, sapete come rimediare?

Codice:
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
   float reale;
   int N;

   do
   {
      cout << "Inserire un numero: ";
      cin >> reale;
      N = reale;
   }
   while(!(N == reale && N > 0));

   int divisione = 2;
   bool primo = true;

   while(divisione < N)
   {
         if(N%divisione == 0)
         {
            primo = false;
            break;
         }
      divisione++;
   }

   if(primo)
      cout << endl << N << " e primo " << endl;
   else
      cout << endl << N << " non e primo " << endl;

}
 

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
Salve, ho creato un programma che verifica se un numero naturale inserito da tastiera è primo, sapete come un modo per non fare eseguire la divisione più volte se un numero risulta essere primo? Non so se sono stato chiarissimo, in pratica se inserisco 359, lui esegue 357 calcoli, e sono tanti, sapete come rimediare?

Codice:
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
   float reale;
   int N;

   do
   {
      cout << "Inserire un numero: ";
      cin >> reale;
      N = reale;
   }
   while(!(N == reale && N > 0));

   int divisione = 2;
   bool primo = true;

   while(divisione < N)
   {
         if(N%divisione == 0)
         {
            primo = false;
            break;
         }
      divisione++;
   }

   if(primo)
      cout << endl << N << " e primo " << endl;
   else
      cout << endl << N << " non e primo " << endl;

}

Tralasciando quello che ha scritto BAT00cent che è corretto, un approccio divertente è questo sotto che ho scritto ma purtroppo è errato per via degli pseudoprimi. Divertente perchè devi azzeccarcelo lo pseudoprimo essendo un test probabilistico :)
C:
unsigned long long primo(unsigned long long n){
return ( (pow(2,n) - 2) % n == 0) ? 1 : 0;
}
 
Ultima modifica:

BAT

Moderatore
Staff Forum
Utente Èlite
22,913
11,561
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
un approccio divertente è questo sotto che ho scritto ma purtroppo è errato per via degli pseudoprimi.
Pseudoprimi a parte, il vero problema è che usi l'elevamento a potenza 2^n (2 elevato ad n). La crescita esponenziale incenerisce il tipo unsigned long long in un batter d'occhio: per esempio con n=65537 (che è un numero primo davvero piccolo) ti ritrovi a calcolare 2^65537 che ha 19729 cifre.
Considera che un valore tipico massimo di un unsigned long long a 64 bit è 2^64-1 = 18446744073709551615 (20 cifre)
Questo approccio (teoricamente interessante) finisce col rendere ingestibile anche il controllo su numeri primi piccoli come 65537 che col metodo "classico" (seppur inefficiente) del controllo dei divisori dispari fino alla radice quadrata richiede circa 128 divisioni.
 
Stato
Discussione chiusa ad ulteriori risposte.

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili