Forum dédié aux énigmes et à toutes formes de jeux de logique. | Déconnexion |
Tu n'es pas identifié sur Prise2tete : s'identifier. ![]() ![]() |
![]() |
#1 - 22-08-2017 10:57:04
Fin de factoriielleBonjour @ tous.
#0 Pub#2 - 22-08-2017 15:14:26
Fin de facorielleBonjour, On peut facilement démontrer par récurrence que m2(n!)=2×m2(⌊log2(n)⌋!)+1+m2((n−⌊log2(n)⌋)!) Cela se démontre plutôt facilement par récurrence: si n=2p, m2(n)=n−1 Pour trouver les n valeurs suivantes, il suffit d'ajouter 2^p aux n premières valeurs. Cela ne change pas la multiplicité jusqu'à n-1 car elle est strictement inférieure à p, mais pour 2^p+1 = 2^p + 2^p, la multiplicité augmente de 1. La somme des multiplicité a donc été multipliée par 1. Exemple: Cherchons les multiplicités cumulées de jusqu'à 8 (juste pour les nombres pairs) m2(2!) = 1 m2(4!) = 1 + 2 = 3 m2(6!) = 3+1 = 4 m2(8!) = 4+3 = 7 = 8-1 m2(10) = m2(2 + 8) = m2(2) donc m2(10!) = 7 + 1 = 8 m2(12) = m2(4+8) = m2(4) donc m2(12!) = 8 + 2 = 10 ... m2(14!) = 11 m2(16) = m2(8 + 8) = m2(8) + 1 m2(16:) : 11 + 3 + 1 = 15 On a bien m2(16!) = 2*m2(8!) + 1 Le cas général se trouve alors facilement. On obtient alors m2(n!)=2×m2(⌊log2(n)⌋!)+1+m2((n−⌊log2(n)⌋)!)=2⌊log2(n)⌋−1+m2((n−⌊log2(n)⌋)!) par résolution d'une suite aritmético-géométrique. On reconnait ici une décomposition en base 2 de n, on obtient donc la formule miracle m2(n!)=n−b(n) où b(n) est le nombre de 1 dans la décomposition en binaire. Ce terme apparait à cause du -1 dans la formule. On peut aussi démontrer directement cette formule par récurrence, même si elle n'est pas intuitive à trouver. Maintenant cherchons la multiplicité de 5. Il suffit d'adapter un peu la formule, ce qui se démontre de la même manière. On trouve alors m5(n!)=5×m5(⌊log5(n)⌋!)+1+m5((n−⌊log5(n)⌋)!)=5⌊log5(n)⌋−14+m5((n−⌊log5(n)⌋)!) On en déduit alors la formule miracle: m5(n!)=n−q(n)4 où q(n) est la somme des digits quinternaires. On en déduit donc que pour n = 1 000 000 000 m_5(n) = (1 000 000 000 - 8)/4 = 249999998 car 1 000 000 000 = 4022000000000(5) et que 4 + 2 + 2 = 8 Il y a donc 249999998 zéros à la fin de 1 000 000 000! m2(n) = 1 000 000 000 - 13 = 999999987 car 1000 000 000 = 111011100110101100101000000000(2) Il y a donc 999999987 - 249999998 = 749999989 2 qui ne sont pas impliqués dans la création d'un zéro. deuxième étape : calcul informatique du résultat On va d'abord se débarasser de tout les 2 et de tout les 5, et calculer les deux derniers chiffres modulo 100. Après, il faudra encore réintégrer tout les 2 en trop dans le calcul (toujours modulo 100) (le modulo 100 permet de ne jamais avoir de dépassement de mémoire puisque les nombres de chaque calcul n'auront que deux chiffres chacun, et les calculs des modulos 100 ne sont jamais problématique non plus niveau mémoire.) Après, 1 000 000 000 d'itération est assez long à exécuter, je vais d'abord voir s'il n'y a pas moyen d'améliorer ça en regroupant les nombres par catégories. #3 - 22-08-2017 19:42:39
fin de dactorielle@ Caduk et @ tous : ça se calcule à la main facilement pour tout n ! une fois qu'on a mis au point la méthode et les calculs génériques, qui se font à la main également. #4 - 22-08-2017 22:00:41
Fni de factorielleJ'ai une méthode pour m'en tirer, j'ai lancé un programme, mais il faut encore quelques minutes de calcul pour que j'obtienne le résultat. Comme ça on pourra comparer avec ta méthode manuelle #5 - 22-08-2017 23:22:24#6 - 23-08-2017 09:43:28
fin de facrorielle@ Ebichu : c'est le résultat que j'ai trouvé. #7 - 23-08-2017 17:50:20
Fin de factroielleBonjour Nodgim #8 - 24-08-2017 11:53:37#9 - 28-08-2017 19:22:01
Fin dde factorielleJe serai intéressé par ta solution nodgim... #10 - 29-08-2017 08:47:30
Fin de factorielelSalut Caduk. #11 - 29-08-2017 11:07:34
Fiin de factorielleOn peut limiter les calculs en regardant uniquement modulo 25 car pour les grands nombres le résultat sera très largement congru à 0 modulo 4 . On coupe l'entier en tranches de 25 et on compte combien de fois apparaissent 3,7,11,13,17,19 et 23 ( modulo 25 ) . Après on liste les puissances de ces entiers ( toujours modulo 25 ) et le reste est du calcul élémentaire que je laisse aux amateurs #12 - 29-08-2017 13:16:34#13 - 29-08-2017 15:03:43
Fin de fctorielleBonjour, Code:#!/usr/bin/env python3 ''' Quels sont les 2 derniers chiffres non nuls de 1 000 000 000 ! (factorielle 1 milliard) ? ''' import sys N=int(sys.argv[1]) #--------------------------------------------------- # Exposant de k dans N! def expo_k(k): expo=0; i=k while i<=N: expo+=N//i; i*=k return expo #--------------------------------------------------- # Calcul des 2 derniers chiffres de 2**n def der2(n): n20=n%20 ret=(2**n20)%100 if n>1: if n20==0: ret=76 elif n20==1: ret=52 return ret #--------------------------------------------------- # Multiplication d'entiers en ne gardant que les 2 derniers chiffres def mul2(n1,n2): return (n1*n2)%100 #--------------------------------------------------- expo2=expo_k(2); expo5=expo_k(5) print("%d expo2=%d expo5=%d expo2-expo5=%d"%(N,expo2,expo5,expo2-expo5)) # Calcul de la factorielle en éliminant les puissances 2 et 5 fact=1 for n in range(2,N+1): k=n while (k%2)==0: k//=2 # Elimination des puissances de 2 while (k%5)==0: k//=5 # Elimination des puissances de 5 fact=mul2(fact,k) # Ajout du terme correspondant aux puissances de 2 non appariées à 5 fact=mul2(fact,der2(expo2-expo5)) print("%02d"%fact) À lancer ainsi (du moins sous linux) : Code:./fac.py 1000000000 En voici le résultat : Code:1000000000 expo2=999999987 expo5=249999998 expo2-expo5=749999989 lonzer=249999998 44 Ajouté : Calul effectué chez moi en 16 à 17 minutes #14 - 29-08-2017 17:10:29#15 - 30-08-2017 09:55:53
Fiin de factorielleÉdité : Code:#!/usr/bin/env python3 ''' Quels sont les 2 derniers chiffres non nuls de 1 000 000 000 ! (factorielle 1 milliard) ? ''' import sys N=int(sys.argv[1]) #--------------------------------------------------- # Nb total de puissances de 5 expo5_tot=0; i=5 while i<=N: expo5_tot+=N//i; i*=5 print("N=%d expo5_tot=%d"%(N,expo5_tot)) # Calcul de la factorielle en éliminant les puissances de 5, # et une partie des puissances de 2 fact=1; expo2=0 for n in range(2,N+1): k=n # Elimination des puissances de 2, à concurrence du nb total de puissances de 5 while expo2<expo5_tot and (k%2)==0: expo2+=1 k//=2 # Elimination des puissances de 5 while (k%5)==0: k//=5 fact=(fact*k)%100 print("%02d"%(fact)) #16 - 31-08-2017 09:19:50
Fin de factorieleBon, je donne ma solution, une parmi d'autres. #17 - 31-08-2017 10:29:07#18 - 31-08-2017 23:15:38#19 - 01-09-2017 08:36:36
gin de factorielleBonjour, Code:#include <stdio.h> int main() { // on cherche le 3 derniers chiffres de n ! long n = 1000*1000*1000 ; // 10^9 long p = n; // le nb de départ divisé par 5 à chaque tour int r; // le reste de la division par 5 à chaque tour int res=1; // ce que l'on cherche int k ; // indice de boucle while (p>0) { r = p % 5; p = p / 5; // la contribution des 'paquets de 4' ( périodicité de 100) for (k = 1 ; k<= p % 100; k++) res = (res*12) % 1000 ; // la contribution des facteurs restants for (k = 1 ; k <= r; k++) res = (res*(5*p+k)) % 1000; } printf( "les trois derniers chiffres non nuls de factorielle %ld sont %03d \n",n,res); } #20 - 01-09-2017 08:55:26
fin de factorielme@Vasimolo #18 : Explications très claires Code:#!/usr/bin/env python3 ''' Quels sont les 2 derniers chiffres non nuls de 1 000 000 000 ! (factorielle 1 milliard) ? ''' import sys N=int(sys.argv[1]) puissances_12=(76,12,44,28,36,32,84,8,96,52,24,88,56,72,64,68,16,92,4,48) #--------------------------------------------------- def mul2(n1,n2): return (n1*n2)%100 #--------------------------------------------------- def facto_2chiffres(n): ns5=n//5; fac=1 for k in range(ns5*5+1,n+1): fac=mul2(fac,k) if ns5>0: fac=mul2(fac,puissances_12[ns5%20]) fac=mul2(fac,facto_2chiffres(ns5)) return fac #--------------------------------------------------- print("N=%d factorielle=%s"%(N,facto_2chiffres(N))) #21 - 01-09-2017 08:57:54
in de factorielleOK Vasimolo, tu as travaillé modulo 20 au lieu de modulo 100 comme je l'ai fait, sinon c'est exactement la même démarche. #22 - 02-09-2017 11:04:45#23 - 02-09-2017 18:11:48#24 - 04-09-2017 14:18:13
fin fe factorielleCa me rappelle Réponse rapideSujets similaires
|
![]() | |||||||||||||||||||||||||||||||||
Prise2Tete Forum Statistiques Liste des membres Hall of Fame Contact |