
|
|
Goldbach conjectura en 1753 que :
Tout entier impair (non premier) peut s'écrire p + 2k2, somme d'un nombre premier et du double d'un carré
Moritz Stern invalida cette assertion un siècle plus tard en apportant deux contre-exemples : 5777 = 53 × 109 et 5993 = 13 × 461. Depuis cette époque, on appelle nombre premier de Stern tout nombre premier qui n'est pas de la forme p + 2k2.
On se propose ici de rechercher la décomposition de Goldbach pour un nombre impair donné, premier ou non, au moyen d'un petit programme en JavaScript.
Un entier n étant donné, il s'agit donc de trouver un entier k et un nombre premier p tel que n = p + 2k2. L'algorithme se base sur la stricte positivité du nombre p = n - 2k2 qui doit s'avérer premier, donc au moins égal à 2. Par suite, 1≤ k2 ≤ n/2 - 1 :
➔ Le programme contrôle l'imparité du nombre entré mais pas les données fantaisistes... Concernant la routine prem(), on trouvera des explications complémentaires sur la page de recherche des nombres premiers.
| Programmation de l'algorithme en JavaScript : |
| <SCRIPT LANGUAGE=JavaScript> var p,t function stern() { n$=25; t=0; ok=0; n$=prompt("Entrez un nombre impair > 1 : ",n$) if (n$= =null || isNaN(n$)) {return} else {n=eval(n$)} // null = bouton annuler, isNaN = n'est pas un nombre if (n%2= =0){alert(n+" n'est pas un nombre impair"); return} t=prem(n); if(t= =1){alert(n+" est un nombre premier."); t=0} k = 1; while (k*k<=n/2-1) // tant que p = n - 2k² peut s'avérer premier { p=n-2*k*k; if(p= =2 || p= =3 || p= =5 || p= =7){t=1} else {t=prem(p)} // prem() retourne 1 si p premier, 0 sinon if (t= =1){if (!confirm(n+" = "+p + " + 2 x "+k+"²")) return; ok=1} k++; } if(ok= =0){alert(n+" n'admet pas la décomposition cherchée.")} } function prem(p) // recherche si p impair > 7 est premier { d=1 ; a=0 ; rst = 1; rst2=1; t=0 if (p%3 != 0 && p%2 !=0) // a%b est le reste de la division de a par b { while (d*d<=p && rst*rst2 >0) { a++ d=6*a-1 ; rst = p % d d = d+2 ; rst2 = p % d } if(rst= =0 || rst2= =0) {t=0} else {t=1} } return t } </SCRIPT> |
Le programme ci-dessous recherche tous les nombres impairs non décomposables dans un intervalle [nd , nf] fourni par l'utilisateur. On a simplement introduit une boucle for(n = nd ; n <= nf ; n = n+2). Dans l'intervalle [3,6000], le programme fournit quasi instantanément les réponses attendues : 3 , 17 , 137 , 227 , 977 , 1187 , 1493 , 5777 , 5993 en signalant le cas des nombres premiers non décomposables, à savoir les 7 premières réponses, nombres premiers de Stern qui, outre 2, sont les seuls aujourd'hui connus.
! Des bornes "très grandes" peuvent bloquer votre système ou dépasser la capacité de calcul en nombres entiers de votre Mac ou PC. On sait qu'il n'y a pas de réponse à partir de 5993 jusqu'à plus de 1 000 000 000... Chrome vous avertit après un certain temps de travail pour vous demander si vous voulez continuer... Au pire, pas de panique. Sur PC : Alt + Ctrl + Suppr (gestionnaire de taches), puis sélectionnez votre navigateur dans la liste d'applications en cours et cliquez Fin de tache.
| function stern2() { n$="";tp=0;tn=0;co=0 n$=prompt("Entrez la borne inférieure : ",n$) if (n$==null || isNaN(n$)) {return} else {nd=eval(n$)} if(nd<3){nd=3} if (nd%2==0){nd=nd+1} n$="";n$=prompt("Entrez la borne supérieure : ",n$) if (n$==null || isNaN(n$)) {return} else {nf=eval(n$)} if (nf%2==0){nf=nf-1} for(n=nd;n<=nf;n=n+2) { tn=prem(n);p$=" est premier et "; if(tn==0){p$=" "} k = 1; while (k*k<=n/2-1) { p=n-2*k*k; if(p==2 || p==3 || p==5 || p==7){tp=1;tn=1} else {tp=prem(p)} if (tp==1){break} k++; } // fin while if(tp==0){co++;if (!confirm(n+p$+"n'admet pas la décomposition cherchée."))return} tp=0; } // fin boucle for alert ("Fin de recherche : "+co+" contre-exemple(s) trouvé(s)") } // fin stern2 |