Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : generer un nombre premier [ Archives / Maths ] (MoveX)

mardi 8 mars 2005 à 20:42:02 | generer un nombre premier

MoveX

[code]
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);
[/code]

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...

mardi 8 mars 2005 à 22:48:27 | Re : generer un nombre premier

neodelphi

Membre Club
Réponse acceptée !
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

mardi 8 mars 2005 à 23:29:47 | Re : generer un nombre premier

ni69

Membre Club
boucle qui peut se traduire par :
repeat
[...]
until ...

@+
Bonne Prog'
Nico


N'oubliez pas de cliquer sur
Réponse acceptée lorsque la réponse vous convient !

mercredi 9 mars 2005 à 09:15:53 | Re : generer un nombre premier

sovitec

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.

mercredi 9 mars 2005 à 18:50:29 | Re : generer un nombre premier

MoveX

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.

mercredi 9 mars 2005 à 19:06:12 | Re : generer un nombre premier

MoveX

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 !

mercredi 9 mars 2005 à 19:59:49 | Re : generer un nombre premier

neodelphi

Membre Club
"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

mercredi 9 mars 2005 à 22:26:59 | Re : generer un nombre premier

Delphiprog

Administrateur CodeS-SourceS
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.

mercredi 9 mars 2005 à 22:29:05 | Re : generer un nombre premier

MoveX

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

mercredi 9 mars 2005 à 22:42:47 | Re : generer un nombre premier

MoveX

Réponse acceptée !
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


1 2

Cette discussion est classé dans : nombre, temp, premier, random, generer


Répondre à ce message

Sujets en rapport avec ce message

Afficher un nombre aléatoire [ par Dagnir ] Salut, Bon voila mon but :Quand on clic sur mon bouton il y a un nombre (aléatoire) qui s'affiche dans un champ.Dans l'aide j'ai trouvé :function Rand Compter le nombre de labels [ par Dagnir ] Salut, Je voudrais savoir s'il est possible d'attribuer à une variable x le nombre de labels que la fiche comporte. Dans le même esprit, si on peut aj arrondir un nombre [ par 980074 ] bête petite question : comment arrondir, en pascal, un nombre entamé vers l'unité supérieure? TRUNC + 1 n'est pas valable pour les nombres entiers...e Problème de libération mémoire avec un variant / Delphi 6 [ par Schreck ] SchreckPetit problème avec Delphi(6) : Dans le code suivant (épuré au maximum ...), la mémoire utilisée par le variant n'est pa libérée (augmentation random+fichier ini [ par Enkorr ] Bonjour à tous.Voilà, j'ais un problème mais impossible de trouver la solution :(J'ais 32 tedit (dans une form2) que j'enregistre dans un fichier ini. beaucoup de (sendtext) [ par canabice01 ] Voilà je suis debutant dans la programmation et je suis entrain de developper une application client/serveur avec les composants serversocket et clien Probleme sur delphie console! [ par Good_Stuf ] Je voudrais savoir comment faire un tableau multidimensionnel a deux colone qui s'incrémente tout seul avec une boucle FOR et ce biensur en applicatio Pièces attachées d'un mail renommées intempestivement à la reception [ par spocksb ] Une application Delphi6 me permet de récupérer automatiquement des mails avec des pièces jointes. J'utilise le composant TNMPOP3 et la méthode GetMail eMule, eDonkey : Calculer l' IP à partir de l'ID et vise vers ca. [ par AMokers ] Salut à tous !Voila je souhaiterais faire un convertisseur qui converti un ID en Ip ou vise vers ca.Voici la procedure de l'id vers l'ip :Par ex nombre de form dans le projet [ par phoenyx ] Salut à tous,Est-il possible (mais j'en doute) de récupérer le nombre de form qui vont être créée avant même que celles-ci le soient ou à défaut de sa


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,234 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.