Matlab Syracuse
Répondre à la discussion
Affichage des résultats 1 à 9 sur 9

Matlab Syracuse



  1. #1
    invite90c5fee5

    Post Matlab Syracuse


    ------

    Bonjour,

    J'aimerai savoir comment programmer la conjecture de Syracuse qui stipule qu’en partant de n’importe quel entier plus grand que zéro, si l’entier est pair et qu’on le divise par 2, ou que si l’entier est impair et qu’on le multiplie par 3 et qu’on ajoute 1, on arrivera toujours à 1. Je désire déterminer le numéro ayant la chaîne la plus longue (sois entre 1 et le chiffre de départ choisi). De plus, savoir la longueur de cette chaîne.

    Comment procéder avec Matlab ?

    Merci,

    -----

  2. #2
    Paraboloide_Hyperbolique

    Re : Matlab Syracuse

    Bonjour,

    Il me semble qu'il s'agit d'un exercice assez simple.
    Qu'avez-vous déjà fait de votre côté pour essayer de résoudre cet exercice ?

  3. #3
    invite90c5fee5

    Re : Matlab Syracuse

    Voici ce que j'ai fait.
    Merci de votre aide.


    Code:
    clear all;
    a=input('Entrez une veleur entière N plus grande ou égale à 100:');
    if a==round(a) & 100<=a;
        if a/2==round(a/2)
            a=a/2; %chiffre pair
        else 
            a=3*a+1;  %chiffre impair
        end
    else
        error('Entrez une veleur entière N plus grande ou égale a 100')
       n=max(a:1);
    end
    disp(n);
    fprintf('L''entier ayant la chaine la plus longue est %d avec %d itérations',a,n);

    Je crois que mon erreur est avec la fonction max
    Dernière modification par JPL ; 09/02/2015 à 22h33. Motif: Ajout de la balise Code (#) pour garder l'indentation

  4. #4
    Paraboloide_Hyperbolique

    Re : Matlab Syracuse

    Bonsoir,

    Je vois qu'une bonne partie de travail a été faite. Il suffit d'ajouter une boucle à l'endroit adéquat de votre code.

    Quelques conseils cependant:
    1) Au lieu d'écrire
    Code:
    if a/2==round(a/2)
    qui peut vous exposer à des erreurs d'arrondis, il vaut mieux calculer le reste de la division par 2 (fonction "rem" sous Matlab).

    2) Pour connaître la longueur de la chaine, ajoutez un compteur.

    3) Je ne vois pas ce que vous voulez faire quand vous écrivez
    Code:
    n=max(a:1)
    , si a > 1, ceci vous renverra une matrice vide (de taille 1x0).

  5. A voir en vidéo sur Futura
  6. #5
    invite90c5fee5

    Re : Matlab Syracuse

    je ne suis pas certain de saisir ce qu'est un compteur

  7. #6
    invite9dc7b526

    Re : Matlab Syracuse

    Citation Envoyé par sciencenature Voir le message
    Je désire déterminer le numéro ayant la chaîne la plus longue (sois entre 1 et le chiffre de départ choisi). De plus, savoir la longueur de cette chaîne.
    malheureusement il n'y en a pas. Ton programme risque de tourner éternellement, ou plutôt de s'arrêter sur une erreur "integer overflow".

  8. #7
    Paraboloide_Hyperbolique

    Re : Matlab Syracuse

    Bonsoir,

    Citation Envoyé par sciencenature Voir le message
    je ne suis pas certain de saisir ce qu'est un compteur
    Un compteur est simplement une variable qui est incrémentée d'une unité à chaque passage dans une boucle. Elle "compte" donc le nombre de fois qu'une boucle est exécutée.

  9. #8
    invite90c5fee5

    Re : Matlab Syracuse

    Voici ma solution, avec un compteur!

    Code:
    clear all
    clc
    
    %ENTRÉE DU NOMBRE D'ENTIERS À ANALYSER
    a=0;
    while a<=100||rem(a,1)~=0
        a=input('Entrer une valeur entière supérieure à 100: ');
    end
    
    %MATRICES CONTENANT LES ENTIERS ET LES COMPTEURS
    A=[1:a];
    count=zeros(1,a);
    
    %APPLICATION DE LA CONJECTURE ET CALCUL DES ÉTAPES
    for i=1:a
        while A(i)~=1
            count(i)=count(i)+1;
           if rem(A(i),2)==0
               A(i)=(A(i))./2;
           else
               A(i)=3.*(A(i))+1;
           end
        end   
    end
    
    %RECHERCHE DU NOMBRE D'ÉTAPES MAXIMAL ET DE SON ENTIER
    MAXit=max(count);
    MAX=find(count==MAXit);
    
    %AFFICHAGE DES RÉSULTATS
    fprintf('L''entier ayant la chaîne la plus longue est %d avec %d itérations',...
        MAX,MAXit);
    fprintf('\n\n');

  10. #9
    Paraboloide_Hyperbolique

    Re : Matlab Syracuse

    Bonsoir,

    Presque plus rien à dire.
    Juste un détail à la ligne 5 de votre code: la condition "rem(a, 1)~=0" sera toujours fausse et ne sert donc à rien (le reste de la division par 1 est toujours 0).

    Un détail insignifiant: peut être ajouter une barre de progression montrant où vous en êtes dans le traitement des nombres (voir la commande "waitbar").

Discussions similaires

  1. Conjecture de Syracuse
    Par inviteda422e85 dans le forum Mathématiques du supérieur
    Réponses: 17
    Dernier message: 09/05/2012, 19h28
  2. Conjecture de Syracuse
    Par invitebe08d051 dans le forum Mathématiques du supérieur
    Réponses: 4
    Dernier message: 30/01/2012, 13h05
  3. Conjecture de syracuse
    Par invite884e6156 dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 29/01/2012, 12h42
  4. Syracuse:
    Par leg dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 03/08/2011, 17h30
  5. conjecture de Syracuse
    Par invite7753e15a dans le forum Mathématiques du supérieur
    Réponses: 24
    Dernier message: 11/11/2007, 11h45