giovedì 13 ottobre 2016

Post 3 - Congettura di Goldbach e linguaggio C/C++

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