Formule des factorielles

Discussion générale entre passionnés et amateurs de mathématiques sur des sujets mathématiques variés
Akrotrili
Messages: 7
Enregistré le: 17 Aoû 2013, 22:50

Formule des factorielles

par Akrotrili » 02 Déc 2013, 22:44

Hey,

Il y a quelques temps j'ai trouvé une formule pour les factorielles (et il ne me semble pas l'avoir vu ailleurs). Du coup je me dis que je pourrais un peu l'expliquer ici, peut-être que ça vous intéressera. :3

La formule en question est celle-ci :


Pour arriver à ça il faut d'abord suivre un méthode analogue à celle de Gauss pour calculer la somme d'une suite arithmétique. Mais au lieu d'additionner dans les deux sens, il faut multiplier. Et comme je ne suis pas très clair ici, je préfère mettre un exemple :



D'où :

On peut ainsi organiser les résultats ( (n!)² ) sous forme de triangle :
Image
(d'ailleurs ce triangle correspond à ça)

Il faut donc maintenant trouver une formule pour exprimer la produit des termes de la nième ligne du triangle (c'est à tâtons que j'ai fini par trouvé ce qu'il fallait... ^^), on se retrouve donc avec . Et la factorielle de n sera la racine carrée du résultat de cette formule appliquée à n.

Bien sûr, elle peut être vérifiée avec une petite récurrence :
Soit P(n) la propriété définie pour tout entier naturel n non nul, par

Initialisation :
Pour n = 1, on a
Or 1! = 1
Ainsi P(1) est vraie.

Hérédité :
On suppose que P(n) est vraie pour un entier naturel n non nul.
Et on démontre que P(n+1) est vraie, c’est-à-dire
D'après l'hypothèse de récurrence :
Donc



Ainsi P(n+1) est vraie.

Conclusion :



Alors, bien sûr, cette formule n'est pas très utile si on souhaite trouver les factorielles à la main, mais il me semble qu'elle permet d'avoir un algorithme un peu moins gourmand en temps pour les calculer (je ne m'y connais pas plus que ça en complexité temporelle).
Bref, voilà ce que ça donne en C++ avec GMP (pour gérer les grands nombres) : http://akrotrili.tk/Stuff/factorial.txt

Avec ça j'ai pu calculer 255209! en moins de 10s. Mais pas plus, parce qu'il me semble que je manque de mémoire.

Voilà, ce sera tout. \o



Ramanujan71
Membre Naturel
Messages: 39
Enregistré le: 22 Mar 2012, 17:01

par Ramanujan71 » 02 Déc 2013, 23:26

En gros, pour calculer un nombre très grand,on prend la racine carrée d'un nombre encore plus grand,pas pratique pour l'ordi...

Skullkid
Habitué(e)
Messages: 3075
Enregistré le: 08 Aoû 2007, 19:08

par Skullkid » 02 Déc 2013, 23:36

Bonsoir, en fait ta formule est une réécriture un peu compliquée de la définition de la factorielle :

(la dernière égalité est un changement d'indice)

Note que ce genre de réécriture n'est pas nécessairement une mauvaise idée. Paradoxalement, écrire les choses de façon compliquée peut parfois faire apparaître des simplifications qui sont "cachées" dans l'écriture simple. Mais malheureusement, tel quel, ton algorithme n'est pas plus efficace que ceux utilisés traditionnellement. L'algorithme naïf pour calculer n! requiert n-1 multiplications (1*2*3*...*n), ta formule comprend 2n-1 multiplications et une extraction de racine carrée, donc est au moins 2 fois plus coûteuse en terme de multiplications d'entiers. Pire encore, tu multiplies des entiers encore plus grands (donc qui sont plus longs à multiplier) que ceux qui interviennent dans l'algorithme naïf.

Après si tu as en effet observé que ton algorithme était plus rapide d'exécution qu'un autre, ce serait intéressant de comprendre pourquoi !

Tu peux essayer de te renseigner ce que font les algorithmes les plus performants pour calculer la factorielle, ça te donnera peut-être des idées pour améliorer ton algorithme. Celui que je connais utilise le fait qu'on sait facilement factoriser n! en produit de facteurs premiers.

Akrotrili
Messages: 7
Enregistré le: 17 Aoû 2013, 22:50

par Akrotrili » 03 Déc 2013, 17:45

En fait non, mon algorithme effectue grosso modo n/2 instructions.
Car la formule peut être "simplifier" dans un algorithme.

Reprenons l'exemple de 5!, on avait
Comme il y a une symétrie dans le triangle on peut n'utiliser la formule que jusqu'à n/2, et sans utiliser de racine carrée du coup.
Et si le nombre est impair, comme c'est le cas avec 5, il suffit de multiplier une dernière fois par 2/n+1.

Skullkid
Habitué(e)
Messages: 3075
Enregistré le: 08 Aoû 2007, 19:08

par Skullkid » 03 Déc 2013, 18:19

Ok donc tu n'utilises pas ta formule telle quelle, mais une autre version, du genre (celle-là ne marche que si n est pair mais normalement c'est l'idée).

Autrement dit pour calculer 5!, au lieu de faire 1*2*3*4*5 tu fais 1*5*2*4*3. À moins de pouvoir te ramener à 5*8*3 sans faire aucune multiplication (il faut alors que tu nous expliques comment tu calcules le 8 du milieu), ton algorithme a la même complexité que l'algorithme naïf en nombre de multiplications. Pour la complexité temporelle c'est plus dur à évaluer parce qu'il faut regarder le nombre de multiplications bit à bit, mais à vue de nez ça m'a aussi l'air équivalent... à voir...

Avatar de l’utilisateur
Ben314
Le Ben
Messages: 21709
Enregistré le: 11 Nov 2009, 21:53

par Ben314 » 03 Déc 2013, 18:32

A la limite, ça peut avoir un (tout petit) gain de temps : si on pose alors et ce qui évite de faire un produit (un peu) compliqué pour trouver (juste une multiplication par 2 qui est trés rapide avec un ordi)
Mais, bon, ça va pas être de la "kolosssssâle" amélioration...
Qui n'entend qu'un son n'entend qu'une sonnerie. Signé : Sonfucius

Akrotrili
Messages: 7
Enregistré le: 17 Aoû 2013, 22:50

par Akrotrili » 03 Déc 2013, 19:25

Hum, je comprends, en effet.
J'aurais dü comparer avec un algorithme classique. :P

 

Retourner vers ⚜ Salon Mathématique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 5 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite