Nombres premiers

Discussion générale entre passionnés et amateurs de mathématiques sur des sujets mathématiques variés
Arth
Membre Naturel
Messages: 16
Enregistré le: 19 Avr 2006, 13:31

Nombres premiers

par Arth » 19 Avr 2006, 14:00

Bonjour,

Voici un de mes premiers messages sur ce forum.

J'aime beaucoup les nombres premiers, je trouves que ces nombres sont facinants. ( chacun fait ce qu'il peut :zen: )

Pour calculé des nombres premiers j'utilise cette algorithme:

je prend un nombre, je le divise par tout les nombres, un a un de ma liste, jusqua la racine du nombre tester. Si aucun resultat des divisions ne sont premier alors le nombre tester et un nombre premier et je passe au suivant.

J'ai programmer cela en C.

au debut je crée un fichier qui contient uniquement un nombre premier : 2, qui servira de premier test pour tout les autre


#include
int main ( void)
{
int deux = 2;
FILE * fichier;
fichier = fopen ("c:/fichier.txt","w");
if (!fichier)
{
printf("pb!");
return 1;
}
fprintf(fichier,"%d\n",deux);
fclose (fichier);
return 0;
}



apres je lance le programme enoncé plus haut.


#include
#include
int main (void)
{
int fin_test = 10000000000;
int i;
int reste;
int nb;
int fin;
int racine;
FILE * fichier;
fichier = fopen("c:/fichier.txt","a+");
if (!fichier)
{
printf("pb!\n");
return 1;
}
fseek(fichier,0,SEEK_END);
fin = ftell(fichier);
for (i=3;i((sqrt(i))+1)))
{
fseek(fichier,0,SEEK_END);
fin = ftell(fichier);
printf("%d\n",i);
fprintf(fichier,"%d\n",i);
break ;
}
}
}
fclose(fichier);
return 0;
}



ce programme n'a rien de parfait... je travail a sont optimisation actuelement.
( c'est juste si ca interesse quelqu'un )

entre temps j'ai découvert un livre au CDI de mon établissement : Merveilleux nombres premiers de Jean-Paul Delahaye.
( c'est mon livre de chevet depuis :D )

il y a un passage que je n'arrive pas a saisir :

Une méthode pour stocker des nombres premiers consiste à écrire les nombres sous la forme 30k + i, avec i compris entre 0 et 29. Dans une telle écriture, seuls les nombres pour lesquels i vaut 1, 7, 11, 13, 17, 19, 23 ou 29 peuvent être premiers: en effet, pour toutes les autres valeurs de i,on peut factoriser l'expression 30k + i, par exemple 30k + 5 = 5 ( 6k + 1 ). Avec un octet de mémoire ( unité de huit > valant 0 ou 1 ), au lieu de coder un seul nombre premier, on code pour ces huit valeurs de i, par un 1 ou un 0, la nature première ou non de huit nombres dans une tranche de 30: on obtient donc une compression d'un facteur 30. En utilisant 210 à la place de 30, on code une tranche de longueur 210 avec 6 octets ( facteur de compression 35).



Je nage ...... merci de m'aider a comprendre.

Ou si quelqu'un a une autre idée pour fair une liste de nombres premiers.

Merci d'avance pour vos réponses.



Arth
Membre Naturel
Messages: 16
Enregistré le: 19 Avr 2006, 13:31

par Arth » 19 Avr 2006, 14:29

Je m'interesse aussi a la cryptologie, pour certain algorithme de cryptage comme RSA, il y as besoin de Grands nombres premiers.

Mais avec ma methode je n'arriverais pas a avoir de grand nombres premiers, je n'en suis qu'à des nombres composés de 9 chiffres.

Donc, quels est l'utilité d'une telle suite de nombre ?

yos
Membre Transcendant
Messages: 4858
Enregistré le: 10 Nov 2005, 20:20

par yos » 19 Avr 2006, 16:47

C'est un début de méthode de crible : en ne prenant que les entiers congrus à 1, 7, 11, 13, 17, 19, 23, ou 29 modulo 30, on écarte d'emblée les multiples de 2, 3, 5. Avec 210, sont également écartés les multiples de 7.

Les nombres premiers de la tranche [90, 120] sont codés par 01111110 (code qui signifie que 90+1 n'est pas premier, 90+7 l'est, ...)

Arth
Membre Naturel
Messages: 16
Enregistré le: 19 Avr 2006, 13:31

par Arth » 19 Avr 2006, 17:37

Merci de ta reponse Yos.

Je n'ai pas tres bien compris le coup des modulo, je ne suis qu'en terminale sti electronique.

mais:

pour k = 0
30 k + 1 = 1
30 k + 7 = 7

tous les deux sont premiers, mais dans ma listes je n'aurais pas le 2, 3 et 5.

pour k = 1
30k + 19 = 49
7 * 7 = 49
49 n'est donc pas premier

pour k = 2
30k + 17 = 77
77 n'est pas premier

pour k = 3
30k + 1 = 91
91 n'est pas premier

Les nombres premiers de la tranche [90, 120] sont codés par 01111110 (code qui signifie que 90+1 n'est pas premier, 90+7 l'est, ...)



Je ne voi vraiment pas le rapport excuse moi.

Patastronch
Membre Irrationnel
Messages: 1345
Enregistré le: 22 Aoû 2005, 23:53

par Patastronch » 20 Avr 2006, 10:29

pourtant yos a ete tres clair.

Par exemple dans ton code tu tests tous les nombres, mais as tu besoin de tester les nombres pairs ? les multiple de 3 ? de 5 ? voila pourquoi on te conseil d'utiliser 30k+i (mais ca peut etre une autre formule si tu veux en élaguer encore plus) avec i appartenant à {1, 7, 11, 13, 17, 19, 23, 29}

reprends l'exemple de Yos :

Les nombres premiers de la tranche [90, 120] (soit k=3) sont codés par 01111110

le premier zéro corespond a ton premier i, soit 90+1=91 n'est pas premier (car =0)
le second chiffre est un un qui correspond a ton second i , soit 90+7=97 qui est premier (car=1)
...

au lieu de parcourir de un en un, tu parcours avec :

Code: Tout sélectionner
for k in Les Entiers
  for i in {1, 7, 11, 13, 17, 19, 23, 29}
    si (30k+i) est premier ecrire le couple (k,i)
  end
end


Bien entendu tu commences à parcourir à 31, donc assure toi bien d'avoir déjà les nombre prémier inférieur a 30 dans ta liste ( correspondants aux couples (0,1) (0,2) (0,3) (0,5) ...(0,i)... (0,29)) , par contre inutile de tester si tes nombres sont divisible par 2, 3 ou 5 quand tu veut déterminer leur primalité, puisqu'on est deja sur qu'ils ne le sont pas (c'est le but du truc).

au final tu auras une suite enorme de couple (k,i) différents qui correspondront a 30k+i. ce qui te fera gagner enormément de place pour les grands nombres.
La méhode de stockag proposé par Yos (suite de 0 et de 1) ne me parait pas performante en niveau gain car dans les grands nombres tu auras beaucoup de 0 stockés qui définissent des nombres non premier et ca on s'en fout.


Par contre sache que l'écriture dans un fichier est une opération tres longue, et ca ne sert a rien de lire puis d'ecrire, puis de relire, puis d'écrire tout le temps et ca gache de beaucoup les performances de ton algo. Les ordinateurs ont de la ram, serts toi en c'est fait pour ca (pour éviter les accés au disque dur inutile).

Bon courage.

 

Retourner vers ⚜ Salon Mathématique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 6 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite