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

Mathématiques Discussion :

Algorithmes pour calculer la factorielle


Sujet :

Mathématiques

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 56
    Points : 36
    Points
    36
    Par défaut Algorithmes pour calculer la factorielle
    Bonsoir,
    Après mon post sur la racine carrée, je m'intéresse à la factorielle.
    J'ai trouvé plusieurs algo qui les calculent mais je ne les comprends pas très bien et j'ai donc besoin de votre aide.
    L'algo le plus rapide (d'après mes recherches) parle de factorisation des nombres premiers, ce que fait apparemment la lib GMP en C : http://gmplib.org/manual/Factorial-A...rial-Algorithm mais je comprends pas exactement comment le mettre en place, surtout au niveau de la récursivité, quelles sont les conditions d'arrêt ?
    La deuxième 'famille' d'algos dont j'ai entendu parler sont ceux du type : 'SplitRecursive', mais je ne trouve pas de liens qui explique réellement comment fonction ces algos ...
    Merci à tous ceux qui ont des pistes et qui pourront m'aider sur ce sujet

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 945
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 945
    Points : 5 659
    Points
    5 659
    Par défaut
    Nao,

    Compte tenu du sujet à propos des racines carrées, tu veux manipuler des nombres de l'ordre de grandeur de 1000 chiffres.

    As-tu fait une évaluation du nombre de chiffres de la factorielle de tels nombres ?
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    Je sais bien que la factorielle de tels nombres est énorme, je ne veux pas calculer la factorielle de nombres si grands, je sais bien que c'est "impossible", mais la factorielle de nombres plus petits ! Et je veux essayer d'implémenter les 'meilleurs' algo, pour pouvoir calculer la factorielle du plus de nombres possible !

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 945
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 945
    Points : 5 659
    Points
    5 659
    Par défaut
    Voa,
    Citation Envoyé par TrexXx Voir le message
    Je sais bien que la factorielle de tels nombres est énorme, je ne veux pas calculer la factorielle de nombres si grands, je sais bien que c'est "impossible", mais la factorielle de nombres plus petits ! Et je veux essayer d'implémenter les 'meilleurs' algo, pour pouvoir calculer la factorielle du plus de nombres possible !
    Ouf, ça me rassure, car je te voyais mal barré.
    Si les cons volaient, il ferait nuit à midi.

  5. #5
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    Il y a une implémentation diviser pour régner dans mon article sur les grands nombres, avec utilisation de la multiplication Karatsuba.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    Ton article ? Celui que tu m'as donné dans le post sur la racine carrée ?

  7. #7
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    Une méthode peut-être un peu plus lente, mais beaucoup plus simple serait de partir de la fonction gamma, qui est disponible sur le site www.netlib.org, dans la bibliothèque slatec.
    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  8. #8
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    J'ai lu la partie de ton article sur la factorielle, et j'ai une petite question à propos de l'algo de permutation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    let permutation_big n p =
      assert(0 <= p && p <= n);
      let rec product a b =
        if a = b then
          big_of_int a
        else if a + 1 = b then
          big_of_int (a * b)
        else 
          let ab2 = (a + b) / 2 in
          mult_big (product a ab2) (product (ab2+1) b)
      in
        if p = 0 then unit_big else product (n - p + 1) n;;
    Je comprends pas la dernière ligne ? Quand est-ce qu'elle est exécutée en fait ?

    Et cette méthode calculer la factorielle est-elle rapide (relativement aux autres bien sur !).

  9. #9
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    Code Objective-Caml : Sélectionner tout - Visualiser dans une fenêtre à part
    if p = 0 then unit_big else product (n - p + 1) n;;
    • le nombre d'arrangements de p parmi n vaut 1 si p=0
    • sinon il vaut le produit des entiers de n-p+1 à n


    Quant à l'algorithme cette page détaille le calcul de sa complexité :

    http://numbers.computation.free.fr/C...splitting.html

    Il est d'autant plus rapide que tu as une multiplication rapide, avec une multiplication Karatsuba c'est surtout la mémoire qui va te limiter
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    Ok mais pourquoi ce test précis est-il mis après tout les autres ? Est ce un test qu'il faut faire après ou est-ce qu'il faut le faire en même temps ? C'est ca que je comprends pas très bien.
    Merci pour ton aide.

  11. #11
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    C'est la même chose que ceci:
    Code Objective-Caml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    let rec product a b =
      if a = b then
        big_of_int a
      else if a + 1 = b then
        big_of_int (a * b)
      else 
        let ab2 = (a + b) / 2 in
        mult_big (product a ab2) (product (ab2+1) b)
     
    let permutation_big n p =
      assert(0 <= p && p <= n);
      if p = 0 then unit_big else product (n - p + 1) n
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    Ok je te remercie pour tout

    En fait une dernière petite question, après je te dérange plus, je comprends pas bien le but de la fonction product ?

  13. #13
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    product a b c'est le produit de tous les entiers dans l'intervalle [a,b].
    Je n'en dirai pas plus, il faut lire le lien que j'ai donné ci-dessus.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  14. #14
    Nouveau membre du Club
    Inscrit en
    Décembre 2008
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    Ok d'accord, je le lis de suite alors, je te remercie encore une fois pour ton temps

  15. #15
    Membre éclairé
    Avatar de Wachter
    Homme Profil pro
    Développeur
    Inscrit en
    Octobre 2008
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 404
    Points : 734
    Points
    734
    Par défaut
    Bonsoir,

    Citation Envoyé par TrexXx Voir le message
    La deuxième 'famille' d'algos dont j'ai entendu parler sont ceux du type : 'SplitRecursive', mais je ne trouve pas de liens qui explique réellement comment fonction ces algos ...
    Merci à tous ceux qui ont des pistes et qui pourront m'aider sur ce sujet
    Regarde ces codes source en Java et C# implémentant plusieurs fonctions de calcul rapide de la factorielle.
    Cependant, si n est grand et tu désires calculer appoximativement sa factorielle, la formule de Stirling fera l'affaire.
    Code Formule de Stirling : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    n! = (2 * Pi * n)^½ * (n / e)^n

    --
    Wachter
    Code parrain certification Voltaire : NTMPH759

Discussions similaires

  1. Algorithmes pour calculer la racine carrée
    Par TrexXx dans le forum Mathématiques
    Réponses: 17
    Dernier message: 20/01/2009, 16h28
  2. algorithme pour calculer les fonctions trigo ?
    Par thomas0302 dans le forum Mathématiques
    Réponses: 3
    Dernier message: 24/12/2007, 22h44
  3. Prog pour calculer la factorielle d'un nombre
    Par Lenezir dans le forum Langage
    Réponses: 2
    Dernier message: 11/05/2007, 09h42
  4. Recherche d'un algorithme pour calculer un Checksum
    Par noune40 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 23/11/2006, 10h46
  5. algorithme pour calcul de probabilité
    Par filsdugrand dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 14/12/2005, 14h11

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