Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Longuer factorielle [ Algorithme / Maths ] (mJuJu)

dimanche 3 août 2008 à 05:37:50 | Longuer factorielle

mJuJu

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

dimanche 3 août 2008 à 08:03:22 | Re : Longuer factorielle

NairodDorian

La calculatrice Windows faut l'utilisé...
3705! ~= 3,0392399226140578293625872375793e+11615
A peu près : 11616 chiffres.

dimanche 3 août 2008 à 12:36:06 | Re : Longuer factorielle

karn2

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.




dimanche 3 août 2008 à 23:10:03 | Re : Longuer factorielle

us_30

Membre Club
Réponse acceptée !
Bonsoir,

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


Amicalement,
Us.

jeudi 28 août 2008 à 16:59:14 | Re : Longuer factorielle

marinmarais

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


jeudi 28 août 2008 à 20:57:53 | Re : Longuer factorielle

us_30

Membre Club

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.


jeudi 28 août 2008 à 21:20:28 | Re : Longuer factorielle

us_30

Membre Club
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.

vendredi 29 août 2008 à 08:04:07 | Re : Longuer factorielle

marinmarais

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




Cette discussion est classé dans : chiffres, calculer, factorielle, longuer


Répondre à ce message

Sujets en rapport avec ce message

calculer une opération [ par hellooo !!! ] Je souhaiterais savoir comment substituer une valeur à x lorsque l'on a :"x+2+sin(x)"... et ainsi trouver la valeur de cette chaîne avec une valeur de fonction Sub [ par coucou ] J'ai un travail dans lequel je dois calculer le taux de change (je rentre le montant et une devise et je la veux dans une autre devise.Et mon résultat comment calculer le nb de car dans une TextBox [ par falcon ] bonjour, je débute dans la programmation VB et j'aimerai savoir comment je pourrai calculer le nb de caractères entrés dans une TextBox ??Merci d'avan calculer une moyenne [ par philippe ] salut a toicalculer moyenneje voudrais savoir comment calculer la somme de 4 textbox et avoir le resultat dans la cinquemeet faire la moyennes des 4 e convertion chiffres/lettres [ par monfifi ] Comment convertir des chiffres en lettres?21,75 doit apparaitre sous la forme vingt et un francs et soixante quinze centimes.D'avaance merci.@mitiés. Comment augmenter le nombre de chiffres après la virgule? [ par Olisoft ] Je cherche comment je peux augmenter le nombre de chiffres après la virgule dans un "label" ou un "text" après un calcul. J'arrive seulement à avoir addition de 3 chiffres [ par WareG ] dans un formulaire, je doit calculer la valeur de 3 textbox dans une textbox.ce sont des chiffres.lorsque je n'ai que deux valeurs pas de problemes, m formattage d'un single [ par stef ] Je cherche a formatter en String une variable de type Single, avec les contraintes suivantes : - 2 chiffres significatifs maxi après la virgule.- si p Comment calculer un colone dans un dbgrid ? [ par Pierre ] Dans ma feuille j'ai un dbgrid et je veux faire le calcule total de ma colone PrixTotal. Comment?Merci créer une base de donnée vide [ par MsgBox ] je veux créer une base de donnée vide contenant une seule table chiffres ( où je vais mettre à la suite des chiffres )


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,499 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.