Generer un nombre premier

Résolu
MoveX Messages postés 230 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 16 juillet 2005 - 8 mars 2005 à 20:42
MoveX Messages postés 230 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 16 juillet 2005 - 9 mars 2005 à 22:44

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

neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008
8 mars 2005 à 22:48
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
3
MoveX Messages postés 230 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 16 juillet 2005 1
9 mars 2005 à 22:42
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
3
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
8 mars 2005 à 23:29
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 !
0
sovitec Messages postés 47 Date d'inscription mardi 18 mai 2004 Statut Membre Dernière intervention 24 juillet 2006
9 mars 2005 à 09:15
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MoveX Messages postés 230 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 16 juillet 2005 1
9 mars 2005 à 18:50
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.
0
MoveX Messages postés 230 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 16 juillet 2005 1
9 mars 2005 à 19:06
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 !
0
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008
9 mars 2005 à 19:59
"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
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
9 mars 2005 à 22:26
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
0
MoveX Messages postés 230 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 16 juillet 2005 1
9 mars 2005 à 22:29
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
0
MoveX Messages postés 230 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 16 juillet 2005 1
9 mars 2005 à 22:44
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....
0
Rejoignez-nous