Longuer factorielle

Résolu
mJuJu Messages postés 56 Date d'inscription jeudi 20 octobre 2005 Statut Membre Dernière intervention 27 mai 2014 - 3 août 2008 à 05:37
marinmarais Messages postés 104 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 16 juillet 2010 - 29 août 2008 à 08:04
Bonjour à tous.

Mon problème est très simple : j'aimerais pouvoir calculer le nombre de chiffres d'une factorielle. Par exemple combien de chiffres composent 3705!.  Ca me permettrais de calculer la taille du tableau de Longs ou Doubles pour la contenir. Evidemment il y a toujours la possibilité de redimensionner les tableaux. Mais enfin, si un moyen peu coûteux me donnais une longueur, même approximative, ça m'arrangerais bien. Voilà.

Si quelqu'un a une idée elle est la bienvenue. Avec mes remerciements anticipés.

Amicalement.
JuJu   

7 réponses

us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
3 août 2008 à 23:10
Bonsoir,

Sub es()
a = 3705
n = Int((0.92 + (a + 0.5) * Log(a) - a) / Log(10)) + 1
MsgBox n
End Sub

Amicalement,
Us.
3
NairodDorian Messages postés 130 Date d'inscription lundi 26 juin 2006 Statut Membre Dernière intervention 18 août 2008
3 août 2008 à 08:03
La calculatrice Windows faut l'utilisé...
3705! ~= 3,0392399226140578293625872375793e+11615
A peu près : 11616 chiffres.
0
karn2 Messages postés 16 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 3 août 2008
3 août 2008 à 12:36
Salut,
la calculatrice de windows c'est bien utile mais j'imagine que JuJu a besoin de créer les tableaux dynamiquements, ne connaissant pas la valeur de la factorielle a l'avance ...
Une solution serait de prendre un tableau de taille n * log(n), sachant qu'on aura toujours n * log(n) > n! (sauf pour 0 et 1 ...)
Pour ton exemple, ça nous donne 13222 au lieu de 11616, il y a donc un perte de place mais au moins cela permet d'avoir un tableau suffisament grand en faisant un calcul beaucoup moins couteux que log(n!).
J'imagine qu'il existe des bornes plus précises pour n!, voir l'approximation de Stirling; l'article anglais wikipedia sur la factorielle a l'air assez complet : http://en.wikipedia.org/wiki/Factorial.
0
marinmarais Messages postés 104 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 16 juillet 2010 1
28 août 2008 à 16:59
Salut !

Alors la, us_30, je suis sur le c**
Par curiosite, pourrais-tu me dire ou tu as trouve cette excellente approximation ?

Merci d'avance,
Tom.

Marin Marais
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
28 août 2008 à 20:57
Bonjour,


Je n'ai trouvé cette formule nulle part, je l'ai déduite simplement de l'expression approximative d'une factorielle... mais pas de celle de stirling...


En effet, il existe d'autres expressions possibles. Celle dont je me suis servis est du à A. R. Forsyth publié en 1884 dans une édition britanique donnant pour s! = (2*pi)^0,5 * ( (s²+s+1/6)^0,5 / exp(1) ) ^ (s+0,5)
J'ai trouvé cette info dans l'encyclopédie des sciences mathématiques pures et appliquées de Jules Molk de 1914, heureusement ré-éditer au édition Jacques Gabay... (librairie à conseiller, au passage...)


Pourquoi cette formule de s! au lieu de Stirling ? En premier lieu, elle est plus précise en l'état que celle de Stirling (sauf si on la complète avec une série de correction. A noter que celle de Foryth peut-être aussi améliorée). Ensuite, en reprendre son logarithme est plus simple (en quelque sorte)...


Donc voici, l'explication détaillée pour obtenir le nb de chiffres de la factorielle :


Tu sais surement que si tu as un nombre, disons 3705, si tu veux connaitre le nb de chiffre, il suffit de prendre son log en base 10... of course ! donc si "a" est un nombre, on fait :
ln(a)/ln(10)... mais il faut aussi tenir compte que ce nb n'est pas entier... IL suffit de prendre alors sa partie entière auquelle on ajoute 1, soit :
[ ln(a) / ln(10) ] +1
[ ] désigne ici la partie entière, qui en informatique devient INT
Ensuite, pour s!, ben on fait la même chose :
[ ln ( (2*pi)^0,5 * ( (s²+s+1/6)^0,5 / exp(1) ) ^ (s+0,5) ) / ln(10) ] +1
Comme ln ( a * b )  = ln a + ln b, on a :
[ ln ( (2*pi)^0,5 ) + ln ( (s²+s+1/6)^0,5 / exp(1) ) ^ (s+0,5) ) / ln(10) ] +1
le calcul de : ln ( (2*pi)^0,5 ) vaut 0,9189... que j'arrondi à 0,92
j'arrange l'expression : (s²+s+1/6)^0,5 / exp(1) ) ^ (s+0,5) en distribuant la puissance, soit : ((s²+s+1/6)^0,5)^ (s+0,5) / exp(1) ) ^ (s+0,5)et comme ln(a/b)ln a - ln b, soit : ln ( ((s²+s+1/6)^0,5)^ (s+0,5) ) - ln( exp(1) ^ (s+0,5) )
(s+0,5) * ln ( (s²+s+1/6)^0,5) ) - (s+0,5)
Ensuite, si s tend vers l'infini, on (s²+s+1/6)^0,5 qui tend vers s
soit (s+0,5) * ln (s) - (s+0,5)
et enfin, en testant avec les factorielles, on peut encore corriger la dernière expression -(s+0,5) par -s d'autant que la simplification précédente est un peu sensible pour des valeurs faibles de s...


soit au final le nb de chiffre :
[0,92 + (s+0,5) * ln (s) - s ] / ln(10) + 1


CQFD

Amicalement,
Us.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
28 août 2008 à 21:20
A la réflexion, il est vrai qu'on pourait garder la valeur originelle de la factorielle, ce qui serait plus précis...

soit :

Sub es()
a = 3705
n = Int((0.92 + 0.5 * (a + 0.5) * Log(a ^ 2 + a + 1 / 6) - (a + 0.5)) / Log(10)) + 1
MsgBox n
End Sub

Amicalement,
Us.
0
marinmarais Messages postés 104 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 16 juillet 2010 1
29 août 2008 à 08:04
Bonjour !


Merci beaucoup pour ces explications et les références, us_30
Je ne connaissais pas cet autre expression de la factorielle, et je ne l'aurais pas devinée tout seul...
Mais pour optimiser des calculs, elle est redoutable... je  suis pas là de l'oublier !

Merci encore !
Bonne journée,
Tom.




Marin Marais
0
Rejoignez-nous