IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Pascal Discussion :

Les nombres super-premiers


Sujet :

Pascal

  1. #1
    Nouveau membre du Club

    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2014
    Messages : 11
    Points : 34
    Points
    34
    Par défaut Les nombres super-premiers
    Un nombre est dit super premier s'il est premier et quand on supprime n'importe quel chiffre il reste premier. Exemple 113.
    Voici un code source d'un programme qui permet d'afficher tous les super-premiers de 1 à n donné. J'attends vos avis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    program premier;
    uses crt;
    var n,i:longint;
     function prm(n:longint):boolean;
    var i:longint;
    begin
    if n=1 then prm:=false else
       begin
       i:=2;
       while (n mod i <> 0) and (i<n) do i:=i+1;
       if i=n then prm:=true else prm:=false;
       end;
    end;
     
    function supprm(n:longint):boolean;
    var ch,aux:string;
          m:longint;
          s,i:byte;
          e:integer;
    begin
    str(n,ch);
    aux:=ch;
    if prm(n)=false then supprm:=false else
       begin
       s:=0;
       for i:=1 to length(aux) do
          begin
          delete(ch,i,1);
          val(ch,m,e);
          ch:=aux;
          if prm(m)=true then s:=s+1;
          end;
       if s=length(aux) then supprm:=true else supprm:=false;
       end;
    end;
     
    begin
    readln(n);
    for i:=1 to n do
       begin
       if supprm(i)=true then writeln(i);
       end;
    end.

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 069
    Points : 15 451
    Points
    15 451
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Le programme me paraît correct. J'ai juste une petite remarque, à propos de if prm(m)=true, qui pourrait s'écrire if prm(m). De même, if prm(n)=false pourrait s'écrire if not prm(n). En effet, le type boolean est fait pour représenter une proposition vraie ou fausse.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Lae,

    Sans avoir testé, ça paraît correct.

    Toutefois, la fonction prm est largement optimisable.
    Si les cons volaient, il ferait nuit à midi.

  4. #4
    Membre éclairé

    Homme Profil pro
    Rédacteur technique (retraité)
    Inscrit en
    Octobre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rédacteur technique (retraité)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 168
    Points : 807
    Points
    807
    Par défaut
    Dans le prolongement des remarques précédentes on peut aussi remplacer (ligne 11):
    if i=n then prm:=true else prm:=false;
    par
    prm := (i=n);

    et encore les parenthèses ne sont utile ici que pour une meilleure lisibilité.

  5. #5
    Nouveau membre du Club

    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2014
    Messages : 11
    Points : 34
    Points
    34
    Par défaut
    Merci beaucoup pour tous vos remarques. Ca fait vraiment plaisir

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 416
    Points : 5 814
    Points
    5 814
    Par défaut
    Salut

    Pour la recherche du nombre premier tu peux déjà limiter la recherche à la valeur entière de la racine carrée du nombre recherché.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
      Function NombreFacteur(N:Integer):Integer;
      Var
        Count,I,Racine:Integer;
      Begin
        Count:=2;
        Racine:=Trunc(Sqrt(N));
        For I := 2 to Racine do
        Begin
          If N mod I = 0 Then
            Inc(Count);
        End;
        Result:=Count;
      End;
     
      Function Premier(N:Integer):Boolean;
      Begin
        Premier:=NombreFacteur(N) = 2;
      End;
    Un autre un peu plus fin :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    function prim ( n : integer ) : boolean ;
    var
       i , lim : integer ;
       TestInt : boolean ;
    begin
       if n<2 then
          TestInt:=false
       else 
       if n=2 then
          TestInt:=true
       else 
       if n mod 2 = 0 then
              TestInt:=false
       else
       begin
          i := 3;
          TestInt:=true ;
           lim:= trunc ( sqrt ( n ) ) ;
          while ( i<=lim ) and TestInt do
            if n mod i = 0 then 
              TestInt:=false
            else 
               i:=i+2
       end ;
       Result:=TestInt
    end ;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  7. #7
    Nouveau membre du Club

    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2014
    Messages : 11
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par anapurna Voir le message
    Pour la recherche du nombre premier tu peux déjà limiter la recherche à la valeur entière de la racine carrée du nombre recherché.
    Une bonne idée de votre part, merci.
    Je voudrais savoir si votre méthode va diminuer le temps de recherche des nombres premiers.

  8. #8
    Membre averti Avatar de pascalCH
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Juillet 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 187
    Points : 369
    Points
    369
    Par défaut
    Citation Envoyé par mo5bzn Voir le message
    Une bonne idée de votre part, merci.
    Je voudrais savoir si votre méthode va diminuer le temps de recherche des nombres premiers.
    oui, limiter la recherche de diviseurs potentiels à la racine carrée du nombre réduit le nombre de boucles.
    autre(s) technique(s) :

    - tester "à la main" la parité (division par deux) et démarrer la boucle à partir de 3, faire des sauts de 2 en 2 (3,5,7....)

    - un tout petit plus compliqué, appliquer une caractéristiques méconnue des nombres premiers, ils sont tous de la forme N = (6x +-1), avec 6x variant de 6 à racine de X + 1


    @anapurna, la même avec une interruption de la boucle et étendue plus large :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    function IsPrimeFactor(N: UInt64): Boolean;
    var
      Racine: UInt64;
      Loop:   UInt64;
    begin
      if (N mod 2 = 0) or (N = 1) or (N = 2) then
        Result := False
      else
      begin
        Racine := Trunc(Sqrt(N)) + 1;
        Result := True;
        Loop := 3;
        while Loop < Racine do
        begin
          if N mod Loop = 0 then
          begin
            Result := False;
            break;
          end else
            Inc( Loop,2 );
        end;
      end;
    end;
    La nature fait des choses extraordinaires, observons la et restons humble, on ne nous demande pas de refaire le monde mais juste de reproduire virtuellement des choses existantes ....

    et n'oubliez pas si vous aimez et quand vous avez la réponse

  9. #9
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Kai,
    Citation Envoyé par pascalCH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function IsPrimeFactor(N: UInt64): Boolean;
    var
      Racine: UInt64;
      Loop:   UInt64;
    begin
      if (N mod 2 = 0) or (N = 1) or (N = 2) then
        Result := False
      else
    ...
    Là, c'est carrément faux !

    À force vouloir "simplifier", tu arrives à ce qui se produit souvent : erreur.
    Si les cons volaient, il ferait nuit à midi.

  10. #10
    Membre averti Avatar de pascalCH
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Juillet 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 187
    Points : 369
    Points
    369
    Par défaut
    Citation Envoyé par droggo Voir le message
    Kai,

    Là, c'est carrément faux !

    À force vouloir "simplifier", tu arrives à ce qui se produit souvent : erreur.
    Oups !! effectivement, comme quoi, une ligne de plus ne fera pas de mal ...
    La nature fait des choses extraordinaires, observons la et restons humble, on ne nous demande pas de refaire le monde mais juste de reproduire virtuellement des choses existantes ....

    et n'oubliez pas si vous aimez et quand vous avez la réponse

Discussions similaires

  1. [MIPS] Les nombres premiers
    Par dilyar1984 dans le forum Autres architectures
    Réponses: 0
    Dernier message: 20/05/2009, 16h50
  2. les nombres premiers
    Par chouuc dans le forum Mathématiques
    Réponses: 36
    Dernier message: 17/01/2009, 13h14
  3. Programme détectant les nombres premiers
    Par frankthechamp dans le forum Windows Forms
    Réponses: 8
    Dernier message: 04/12/2008, 22h41
  4. script qui donne les nombres premiers
    Par islah dans le forum Langage
    Réponses: 2
    Dernier message: 28/08/2008, 21h06
  5. Réponses: 24
    Dernier message: 27/09/2005, 21h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo