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

Calcul scientifique Python Discussion :

Problème Nombres pentagonaux


Sujet :

Calcul scientifique Python

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Problème Nombres pentagonaux
    Bonjour,

    Je dois résoudre le problème suivant :

    "Les nombres pentagonaux obéissent à la formule Pn=n(3n-1)/2. Les dix premiers nombres pentagonaux sont :

    1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ...

    On peut voir que P4 + P7 = 22 + 70 = 92 = P8. Cependant, leur différence, 70 - 22 = 48, n'est pas pentagonale.

    Trouver les deux nombres pentagonaux Pj et Pk, dont la somme et la différence sont pentagonales, et dont D = |Pk - Pj| est minimisée. Donner la valeur de D."

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    L = [ ]
    def abc():
        for n in range(1, 10000):
            L.append(n * (3*n-1) / 2)
        for i in range(1, 9999):
            for j in range(1, 9999):
                for k in range(1, 9999):
                    if abs(L[i] - L[j]) == L[k]:
                        for l in range(1, 9999):
                            if L[i] + L[j] == L[l]:
                                return L[i] - L[j]
    Or actuellement et après deux jours de réflexion, je ne parviens pas à trouver une solution, je pense que celle ci-dessus, en soit, pourrait fonctionner, mais elle demande beaucoup trop de temps. Pourriez-vous me donner une piste pour un programme plus court et plus rapide s'il-vous-plaît ? Merci !

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Tu es sure de ton coup ? avec ceci je n'obtiens aucun résultat.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    >>> l = [n * (3*n-1) / 2 for n in range(1, 1000)]
    >>> for i in l:
    ...     for j in l:
    ...             if i + j in l and j - i in l:
    ...                     print(" %s et %s donnent %s et %s" % (i, j, i+j, j-i))
    J'ai essayé avec 10000 mais je l'ai interrompu après 12 minutes sans aucun résultat non plus.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Ce code va assez vite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    N = 10000
    L = [ n * (3*n - 1) // 2 for n in range(1, N) ]
    X = set(L)
    for i in range(len(L)):
        for j in range(i + 1, len(L)):
            a = L[i] + L[j]
            if a in X:
                if L[j] - L[i] in X:
                    print ('***', L[i], L[j], L[i] + L[j])
            elif a > L[-1]:
                break
    et sort:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *** 1560090 7042750 8602840
    Après pour aller plus loin, c'est compliqué (et intuitivement, j'ai l'impression qu'il n'y a pas tant de solutions).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Salut,

    Tu es sure de ton coup ? avec ceci je n'obtiens aucun résultat.
    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> l = [n * (3*n-1) / 2 for n in range(1, 1000)]
    >>> for i in l:
    ...     for j in l:
    ...             if i + j in l and j - i in l:
    ...                     print(" %s et %s donnent %s et %s" % (i, j, i+j, j-i))
    J'ai essayé avec 10000 mais je l'ai interrompu après 12 minutes sans aucun résultat non plus.
    Non justement, comme cela ne donne pas de résultat, je pense que mon code est faux, et le nombre de boucles dans des boucles ne doit pas aider non plus


    Citation Envoyé par wiztricks Voir le message
    Salut,

    Ce code va assez vite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    N = 10000
    L = [ n * (3*n - 1) // 2 for n in range(1, N) ]
    X = set(L)
    for i in range(len(L)):
        for j in range(i + 1, len(L)):
            a = L[i] + L[j]
            if a in X:
                if L[j] - L[i] in X:
                    print ('***', L[i], L[j], L[i] + L[j])
            elif a > L[-1]:
                break
    et sort:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *** 1560090 7042750 8602840
    Après pour aller plus loin, c'est compliqué (et intuitivement, j'ai l'impression qu'il n'y a pas tant de solutions).

    - W
    Je pense que c'est déjà largement suffisant, surtout niveau rapidité, merci beaucoup !

  5. #5
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Ce code va assez vite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    N = 10000
    L = [ n * (3*n - 1) // 2 for n in range(1, N) ]
    X = set(L)
    for i in range(len(L)):
        for j in range(i + 1, len(L)):
            a = L[i] + L[j]
            if a in X:
                if L[j] - L[i] in X:
                    print ('***', L[i], L[j], L[i] + L[j])
            elif a > L[-1]:
                break
    et sort:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *** 1560090 7042750 8602840
    Après pour aller plus loin, c'est compliqué (et intuitivement, j'ai l'impression qu'il n'y a pas tant de solutions).

    - W
    Bonjour,
    J'ai fait un code assez ressemblant mais en 2 fois.
    Je n'ai pas utilisé d'ensemble set : par curiosité, quel est l'intérêt ? Est-ce plus rapide car non indexable ?
    Pas d'aide par mp.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Est-ce plus rapide car non indexable ?
    Si on écrit "a in L" avec L liste, en dessous çà fera des itérations genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for k in range(len(L)):
         if a == L[k]:
            break
    ce qui est assez bourrin car on balaie toute la liste du premier au dernier élément (si on ne trouve pas rapidement).
    Une recherche par dichotomie serait meilleure mais le hashage est encore meilleur et, en plus, il n'y a pas grand chose à coder.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Ok, merci.
    Pas d'aide par mp.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème : nombre de fois une lettre
    Par talcharas dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 05/03/2008, 21h34
  2. Problème ! Nombre de curseurs ouverts dépassé
    Par hbellahc dans le forum JDBC
    Réponses: 10
    Dernier message: 30/08/2007, 12h33
  3. Problème Nombre Dossiers
    Par Nabou- dans le forum VBScript
    Réponses: 1
    Dernier message: 01/07/2007, 20h47
  4. [Problème]Nombre et nom des champs dynamiques dans un form
    Par julienOriano dans le forum Struts 1
    Réponses: 17
    Dernier message: 10/04/2007, 15h32
  5. Problème nombre décimaux
    Par salut12345 dans le forum C++
    Réponses: 3
    Dernier message: 29/10/2005, 12h57

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