Generer un nombre premier [Résolu]

Signaler
Messages postés
230
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
16 juillet 2005
-
Messages postés
230
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
16 juillet 2005
-

var

  i: Integer;

  Temp: Integer;

begin

  Randomize;

  Temp:= Random(10)+Random(10)*10+Random(10)*100+Random(10)*1000+Random(10)*10000;

  for i:= 2 to Round(Power(Temp,0.5)) do

  begin

    if Temp mod i<>0

    then ButtonGenererClick(Sender); // <============== ici

  end;

  EditClePublique.Text:=IntToStr(Temp);





salut, jessaie de generer un nombre premier, seulement ca plante
apparement une erreur de stackoverflow ou quelque chose comme ca...

peut etre que ca vient de l appel a elle meme (la procedure) si le nombre n est pas premier...

10 réponses

Messages postés
442
Date d'inscription
jeudi 4 avril 2002
Statut
Membre
Dernière intervention
11 août 2008

Faut que tu trouve un nombre premier au hasard c ça ?

Sinon je croit voir d'ou viend ton probleme :
Je suppose que ce code est dans la procedure ButtonGenererClick et que si ton nombre n'est pas premier tu la relance ?
Si c'est le cas ya deux gros problemes :
- Deja tu teste si i divise ton nombre. Si NON ok on passe au suivant. Si OUI on relance une procedure ButtonGenererClick : mais la tu devrai deja faire un break pour pas tester les si les nombre après i divisent temp puiske t'en a trouvé un.
- Ensuite ce qui fait planté c'est le fait que tu fait un appel a ButtonGenererClick. Dans cette méthode si tu trouve pas de nombre premier, tu réapelle ButtonGenereClick, alors que la procedure n'est meme pas achevé, ce qui force le pc a mémoriser le fait que y'a une procedure ButtonGenererClick qui est démarrée et qu'il faudra la finir... On appele ça une fonction récursive puisque qu'elle sappelle elle-meme... Le prob c'est que a force de pas trouver de nombre premier il continu d'appeler cette procedure sans la finir, donc le pc doit memoriser de plus en plus pour savoir ou il en est, et au bou d'un moment ça sature...

Les info sur ou en est le programme dans les procedure on appelle ça la pile (stack), et la tu en demande trop donc dépassement (overflow).

Je sais pas si tu va comprendre ce que je te dit mais c dur a expliquer lol...

Ce qu'il faudrai plutot que tu fasse c'est un truc du genre :

TANT QUE on a pas trouvé de nombre premier FAIRE
BEGIN
Generer un nombre premier;
tester les diviseur et si on en trouve pas on dit que on a trouvé un nombre premier
END

neodelphi
Messages postés
230
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
16 juillet 2005
1
voila, j ai reussi !!

[code]
var
i, Temp, Reste: Integer;
begin
Randomize;
repeat
Temp:= Random(10)*100+Random(10)*10+Random(10);
for i:=2 to Floor(Sqrt(Temp)) do
begin
Reste:= Temp mod i;
if Reste=0 then Break;
if i= Floor(Sqrt(Temp)) then EditClePublique.Text:= IntToStr(Temp);
end;
until EditClePublique.Text<>'';
[\code]

j ai donc evite la recursivite... (cest plus facile)

merci a tous pour vos conseils
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
10
boucle qui peut se traduire par :
repeat
[...]
until ...


@+
Bonne Prog'
Nico



<HR>
N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !
Messages postés
47
Date d'inscription
mardi 18 mai 2004
Statut
Membre
Dernière intervention
24 juillet 2006

Plusieurs remarques :

1) Pourquoi ne pas écrire Temp := random(100000) ?

2) Il existe une fonction sqrt plus rapide que power(x, 0.5)

3) Tu peux gagner un peu en utilisant Floor plutôt que round

4) Ton test est très lent et devient rédhibitoire pour les grands
nombres. Tu pourrais au moins utiliser le crible d'Erasthotène. Si tu
veux passer à de très grands nombre il faudra envisager des méthodes
telles que Miller-Rabin.



Le reste des problèmes a été soulevé par neodelphi, mais tu n'en donnes
pas assez pour que l'on comprenne exactement d'où vient ton plantage.
Messages postés
230
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
16 juillet 2005
1
merci pour toutes vos reponses, j ai bien compris ce que vous m avez dit. par contre, j en ai donne suffisament je pense pour que vous voyez d ou vient le bug puisque cest tout ce qu il y a dans mon code pour l instant.

et le bug vient bien du probleme de saturation de la pile...

merci encore pour les fonctions sqrt et floor.
tandis que le temp:= random(.... cest parce que j ai recuperer un truc que j avais deja fait mais dans un autre but.... j ai meme pas penser a corriger ca.
Messages postés
230
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
16 juillet 2005
1
apres reflexion si j ai pas change le random, cest parce que je veux que mon nombre ait un certain nombre de caracteres !! sinon je peux me retrouver avec un nombre a deux chiffres !
Messages postés
442
Date d'inscription
jeudi 4 avril 2002
Statut
Membre
Dernière intervention
11 août 2008

"Tu pourrais au moins utiliser le crible d'Erasthotène"
Mais je croit que ce qu'il veut c'est générer un nombre premier aléatoire... dans ce cas faudrait faire le crible des nombre premiers jusqu'à 10000 et les stocker mais yen a ptete un peu trop... ou alors se fixer un nombre au hasard n := Random(10000) puis d'appliquer un crible d'eratostene et de prendre le premier nombre premier supérieur à n.

neodelphi
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
28
Ne vous laissez pas abuser par le titre de ce topic : "generer un nombre premier".
Le problème de MoveX provient en réalité d'une non maîtrise de l'utilisation de la récursivité comme l'a expliqué (et compris tout de suite ) NeoDelphi.
MoveX doit revoir son code d'après les recommandations de NeoDelphi et valider sa réponse, rien de plus.
Les problèmes de débordement de pile sont le risque premier de la récursivité .

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
http://www.croix-rouge.fr/index/partner_campagne.html
Messages postés
230
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
16 juillet 2005
1
ok, j ai deja fait un premier test mais je ne suis pas parvenu a grand chose, je vais encore m acharner un peu.

merci a tous pour votre participation
Messages postés
230
Date d'inscription
vendredi 9 mai 2003
Statut
Membre
Dernière intervention
16 juillet 2005
1
j'ai oublie, le coup du random, il faudrait plutot faire :

Temp := (Random(9)+1)*100 + Random(100);

afin davoir toujours un nombre a trois chiffres parce que la ca le fait pas toujours....