Home
Reading
Searching
Subscribe
Sponsors
Statistics
Posting
Contact
Spam
Lists
Links
About
Hosting
Filtering
Features Download
Marketing
Archives
FAQ
Blog
 
Gmane
From: R. Bastian <rbastian <at> free.fr>
Subject: Re: partitions d'un entier (maths)
Newsgroups: gmane.comp.python.french
Date: Thursday 14th April 2011 16:26:22 UTC (over 6 years ago)
On Thu, 14 Apr 2011 17:41:10 +0200
Victor Stinner  scribit:
> 
> Fait déjà voir ton code actuel.
> 
> Victor
> 

Voilà:
-------------------------------------
#-*-coding:utf-8-*-
# partitions.py
"""
source du python: 
http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-07/3329.html
From: Nick J Chackowsky (mediocre_person_at_hotmail.com)
Date: 07/24/04

La proposition originale a été amendée par les deux fonctions
ex-commentées - mais je ne les apprécie pas.

Autres infos:
http://www.numericana.com/answer/numbers.htm#partitions
"""

def partitions(n, maximum=None, minimum=1):
    """Create a list of all of n's partitions
    au code de Chakowsky j'ajoute les options maxi et mini """
    coll = []
    if maximum == None:
        xpart = [n]
    elif maximum < n:
        xpart = [maximum, n-maximum]
    coll.append(xpart)
    # p steps through coll, looking for those which are not all 1s
    p = 0
    while p != len(coll):
        xpart = coll[p]
        # check each element of this partition
        i = 0
        while i != len(xpart):
            # if there is a non-1, then create a new partition
            if xpart[i] > minimum:
                hi = xpart[i] - minimum
                lo = minimum
                while hi >= lo:
                    newpartition = xpart[:i] + [hi] + [lo] + xpart[i+1:]
                    # newpartition may be a copy of an existing one!!!
                    newpartition.sort()
                    newpartition.reverse()
                    if not newpartition in coll:
                        coll.append(newpartition)
                    hi -= 1 
                    lo += 1 
            i += 1
        p += 1
    return coll
        
if __name__ == "__main__":
    import time

    def test4():
        """ teste permutepartition() 
        Le partage de 96, minimum 24 est très rapide : 88 cas trouvés
        en moins de 0.002 sec.
        Le partage de 360 prend énormément de temps même si le minimum
        est de 48: 9688 sec pour 176175 ensembles"""
        gn = 360
        t0 = time.time()
        e = partitions(gn, minimum=48)
        t1 = time.time()
        print e
        print len(e), "Durée du calcul", t1 - t0

    def test5():
        " avec maximum (calcul en 0.005 sec)"
        gn = 96
        t0 = time.time()
        e = partitions(gn, maximum=64, minimum=16)
        t1 = time.time()
        print e
        print len(e), "Durée du calcul", t1 - t0
    
    test5()
-----------------------------------

Ce code fonctionne ; je voulais simplement dire que si une telle fonction,
améliorée par l'équipe Python, était ajoutée à 'itertools', ça
pourrait servir.

(ça me sert pour établir des suites de durées différentes, la somme des
durées de chaque suite
devant être finalement égales). 
-- 
René Bastian
www.pythoneon.org
www.musiques-rb.org

-- 
Gerez vos abonnements aux listes de diffusion : http://listes.aful.org
 
CD: 4ms