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

Python Discussion :

Combinaisons avec répétitions inférieur à un nombre [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 3
    Par défaut Combinaisons avec répétitions inférieur à un nombre
    Bonjour à tous.

    J'ai une liste liste1 des 10 premiers nombres premiers et un nombre très grand A (par exemple 15!). J'aimerai obtenir l'ensemble des combinaisons avec répétitions de liste1 tel que le produit des nombres de chacune des combinaisons avec répétitions soit inférieur à A. Avez-vous une idée?

    J'ai essayé en utilisant "from itertools import combinations_with_replacement" et des listes par compréhension mais je dépasse la mémoire, en effet, je ne l'utilise pas de façon optimal, je génère bien trop de combinaisons avec répétitions.

    J'espère avoir été clair.

    Merci pour votre aide.

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour

    Citation Envoyé par Balafraise Voir le message
    J'espère avoir été clair.
    Pas suffisamment.

    Si on cherche la "combinaison", on calcule "une combinaison de n objets pris k à k": combien vaut k ici?

    A moins que ce soit la liste des "parties d'un ensemble" (https://fr.wikipedia.org/wiki/Ensemb...%27un_ensemble)?

    En général; on comprend mieux avec un exemple simplifié (par exemple avec les 4 premiers nombres premiers). Et ce serait bien de donner ici la tentative de code.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 3
    Par défaut
    Tout d'abord, merci de m'avoir répondu.

    Je vous donne un exemple. Prenons liste1 = [2,3,5,7] et A = 26. J'aimerai obtenir les listes suivantes:
    [2] , [2,2] , [2,2,2] , [2,2,2,2] , Mais pas [2,2,2,2,2] car 2x2x2x2x2=32 et 32> A
    On obtient ensuite: [3] , [3,2] , [3,2,2] , [3,2,2,2] Mais pas [3,2,2,2,2] car 3x2x2x2x2=48 et 48> A
    Ensuite: [3,3] , [3,3,2]
    On se rend compte que [3,3,3] ne fonctionne pas car 3x3x3=27 et 27>A
    Donc on poursuit avec [5] , [5,2] , [5,2,2] Puis [5,3] , [5,5] et les derniers [7] , [7,2] , [7,3]

    Malheureusement, je ne parviens pas à faire en sorte que mon programme suive la construction des listes comme dans mon exemple précédent. J'ai simplement généré toutes les listes possibles ayant au maximum E(log2(A)) éléments où E désigne la partie entière. E(log2(A)) correspond aux nombres de 2 nécessaires pour atteindre ma borne. De cette façon, je génère les listes qui m'intéressent, mais en réalité j'en génère vraiement beaucoup plus ce qui rend mon programme inutilisable pour A grand. Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from itertools import combinations_with_replacement
    from math import *
     
    def final(borne):
        liste=[]
        fact_borne=factorial(borne)
        premier = [2,3,5,7,11,13,17,19,29]
        for i in range(int(log2(fact_borne))):
            liste+= combinations_with_replacement(premier, i)
        liste2=[produit(t) for t in liste if produit(t)<=fact_borne]
        return liste2
    La fonction "produit" calcule le produit des éléments d'une liste.

    Je vous remercie.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Citation Envoyé par Balafraise Voir le message
    J'ai une liste liste1 des 10 premiers nombres premiers et un nombre très grand A (par exemple 15!). J'aimerai obtenir l'ensemble des combinaisons avec répétitions de liste1 tel que le produit des nombres de chacune des combinaisons avec répétitions soit inférieur à A.
    Si la liste ne comprend qu'un seul nombre premier z alors il existe un entier n tel que zn <= A < zn+1.

    Si la liste comprend 2 nombres premiers y et z (y < z), il existe (0, n) tel que u0*zn <= A < u0*zn+1. Comme y < z, il existe m tel que (m, n-1) vérifie um*zn-1 <= A < um*zn-1,.... et je recommence avec zn-2.

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

  5. #5
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    avec une fonction récursive un truc comme ça semble fonctionner :

    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
    def combinations(numbers, target):
        def recurse(current, start, output, result):
            if (current <= target) and result:
                output.append(result[:])
     
            for i in range(start, len(numbers)+1):
                temp = current * numbers[i-1]
                if temp <= target:
                    result.append(numbers[i-1])
                    recurse(temp, i, output, result)
                    result.pop()
                else:
                    return
        output = []
        result = []
        recurse(1, 1, output, result)
        return output
    et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> combinations([2,3,5,7], 26)
    [[2], [2, 2], [2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 3], [2, 2, 3], [2, 2, 5], [2, 3], [2, 3, 3], [2, 5], [2, 7], [3], [3, 3], [3, 5], [3, 7], [5], [5, 5], [7]]
    à voir si ça fonctionne avec 15! néanmoins... et ça vaudrait peut-être le coup de le transformer en générateur aussi

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2021
    Messages : 3
    Par défaut
    Merci à tous pour vos réponses!

    En effet, une fonction récursive était une excellente idée. Et cela fonctionne très bien même avec des valeurs comme 15! .

    Merci encore.

    Bonne journée.

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

Discussions similaires

  1. Vérification combinaison avec répétition
    Par mickaeldu45 dans le forum Excel
    Réponses: 7
    Dernier message: 01/07/2018, 20h02
  2. Combinaison avec répétition à multi-ensemble
    Par akrogames dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 25/04/2013, 14h15
  3. Combinaison avec répétition et ordre
    Par maxha dans le forum Général Java
    Réponses: 7
    Dernier message: 20/04/2012, 15h57
  4. Réponses: 0
    Dernier message: 18/08/2011, 11h21
  5. Algorithme de listage de combinaison avec répétition de caractère
    Par Gilles57-H-G dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 17/11/2010, 20h38

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