Dovuto alla semplicità del suo asserto la congettura di Goldbach è uno dei problemi riguardanti la teoria dei numeri maggiormente conosciuto dal grande pubblico e tuttavia ancora indimostrato (anche se nel 2013 il matematico peruviano Harald Helfgott ne ha dimostrato la versione "debole" che afferma che ogni numero dispari è somma di 3 numeri primi).
Formulata per la prima volta nel 1742 da Christian Goldbach, la congettura afferma che ogni numero naturale pari superiore a 2 può essere espresso come la somma di due numeri primi.
Ad esempio 6 = 3+3, 8 = 3+5, 10 = 5+5, 12 = 5+7 ecc...
Attualmente la congettura è stata verificata "sperimentalmente" con il calcolatore fino a numeri dell'ordine di grandezza di 10^17.
Il seguente semplice programma C / C++ riceve in ingresso un numero naturale pari n , elenca tutti i numeri primi inferiori di quel numero e visualizza una coppia di primi che verificano la congettura di Goldbach.
La limitazione del programma è data dal parametro dimensione che è impostato a 300 e rappresenta la quantità di primi <n che si possono calcolare, se si vuole verificare per numeri che hanno più di 300 primi "predecessori" bisogna aumentarlo.
--------------------------------------------------------------------------------------------------------------------------
#include <iostream>
// programma di verifica della Congettura Di Goldbach
using namespace std;
const int dimensione = 300;
int vettoreprimi[dimensione];
void inizializzavettore(int *p);
void individuaprimi (int *s, int numero); // trova i numeri primi minori di numero e li inserisce in un vettore
int nprimo (int numero); // restituisce 1 se il numero è primo, 0 in caso contrario
int num;
int a,b,somma,trovato;
int main()
{
cout << "Congettura di Goldbach: inserire il numero pari da verificare ";
cout<<endl<<endl;
cin>>num;
inizializzavettore(vettoreprimi);
cout<<endl<<"Elenco numeri primi minori di "<<num<<endl;
individuaprimi(vettoreprimi, num);
cout<<endl;
trovato = 0;
for (a=0;vettoreprimi[a]!=0;a++) {
if (trovato) break;
for (b=a;vettoreprimi[b]!=0;b++) {
somma = vettoreprimi[a]+ vettoreprimi[b];
if (somma==num) {
trovato = 1;
cout<<endl;
cout<<"I 2 numeri primi che sommati danno "<<num<<" sono: "<<vettoreprimi[a]<<" + "<<vettoreprimi[b];
break;
}
}
}
return 0;
}
int nprimo (int numero) { // restituisce 1 se il numero è primo, 0 in caso contrario
int primo;
int resto;
int h;
int limite;
limite = (numero / 2) + 1;
primo = 1;
for (h=2; h<limite;h++)
{
resto = numero%h;
if (resto==0) {
primo = 0;
}
}
return primo;
};
void inizializzavettore(int *p) {
int i;
for (i=0;i<dimensione;i++) p[i]=0;
};
void individuaprimi (int *s, int numero) {
int m,j,res;
int somma;
m=0;
somma=0;
for (j=3;j<numero;j++) {
res = nprimo(j);
if (res==1) { // vuol dire che j è primo
if (m>dimensione) {
cout<<endl<<m;
cout<<endl<<"Sconfinamento dell'array dei numeri primi ,necessario aumentare il parametro dimensione attualmente impostato a "<<dimensione;
cout<<endl<<"Uscita dal programma";
exit(1);
}
s[m] = j;
m = m+1;
somma = somma + j;
}
}
}
Nessun commento:
Posta un commento