A SUPPRIMER

Cacophrene Messages postés 251 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 4 mars 2008 - 29 mai 2005 à 14:13
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010 - 21 nov. 2005 à 23:03
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/31685-a-supprimer

Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
21 nov. 2005 à 23:03
BOURRIN
:)
Vb Lover Messages postés 221 Date d'inscription vendredi 30 novembre 2001 Statut Membre Dernière intervention 13 février 2010 5
21 nov. 2005 à 22:10
Pour ma part, je ne suis peut-être pas aussi soucieux de la précision du résultat que vous, mais s'il faut calculer la factorielle d'un grand nombre, j'utilise l'approximation de Stirling:

Fact(x) = Sqrt(2*PI*x)*Exp(-x)*x^x

où PI 3.14159... 4*Atn(1)

Pour x = 200, on obtient une approximation de la factorielle correcte à 0.0417% près... et ce en temps de calculs négligeable. Et en plus on peut mettre des nombres non entiers. Bref, moi ça me suffit :)
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
3 juil. 2005 à 00:07
Merçi, à toi Saros ! pour ton soutien...

Bon, et pis maintenant, je vais me lancer dans la division des Grands Nombres...

Anicalement,
Us.
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
2 juil. 2005 à 23:56
CETTE fois une avancé... (en math)

J'ai étudié de nouveau l'équation n!=A²-B². Suite aux observations des solutions (comme déjà un peu expliqué avant), j'ai étudié l'équation suivante :

P = A² - B²

mis sous la forme :
P = (n!/x + i)² - (n!/x - j)²

x, i , j entiers qlconques.
tel que n!/x soit entier et >=1.
On voit que grâce à i et j, on peut avoir n'importe quel nombre.

En développant, on a :
P = (2n!/x)(i+j) +i²-j²

Si on pose : P = n! , et en isolant x (un dans chaque côté) , on a :
x = 2(i+j) + x(i²-j²)/n!

Pour que x soit entier, il faut que les deux menbres soient entiers, ce qui implique que le deuxième menbre soit nul (à cause des consitions sur x), et donc SSI i=j.

IL reste alors x=4i.

Remis dans l'équation, elle se transforme en :
n! = (n!/x + x/4)² - (n!/x - x/4)²

Cette équation permet de former toutes les solutions entières tel que n!=A²-B².

Exemple : 6! = 720 (sous forme de tableau)

x (n!/x + x/4) (n!/x - x/4)

4 181 179
8 92 88
12 63 57
16 49 41
20 41 31
24 36 24
28 32,71428571 18,71428571
32 30,5 14,5
36 29 11
40 28 8
44 27,36363636 5,363636364
48 27 3

et 27²-3²=720 , 181²-179²=720 , etc...

On voit que certaines solutions ne sont pas entière, car ici on a généré x sans savoir si n!/x était entier. Pour avoir seulement les solutions entières, il suffit de former tous les produits des nb premiers décomposant n! , pour connaître les valeurs x compatibles.
Prendre x au delà de 48, donne les solutions symétriques avec B négatif.


Si i=1 alors x=4, ce qui amène à la solution la plus élevée, n!=(n!/4+1)²-(n!/4-1)² . La solution la plus petite étant obtenue avec la racine carré. Cela permet de tirer les informations suivantes sur les bornes A et B, dans la relation :

n!=A²-B²

[Vn!] < A <= n!/4+1
1 <= B <= n!/4-1


Cette relation donne presque toutes les réponses que je cherchais, mais dans l'absolu, on ne peut pas l'appliquer pour un algorithme informatique, car elle demande de justement connaître la factorielle... C'est donc une conséquence qui rends la simplification du calcul factorielle caduc. Néanmoins, elle pourait rendre service associée avec d'autres idées...

Voilà ... J'arrêt là, cette recherche... mais pas l'amélioration des algos...

Mais si, vous trouvez une nouvelle façon plus rapide pour le calcul factorielle, n'hésitez pas !



A+
Us.
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
29 juin 2005 à 19:58
Bon là je reviens de vacances (pour la petite histoire) et j'ai pas eu le temps de tout lire
Pour ton histoire de rapports d'exposants de facteurs premiers... Rajouter un terme correcteur serait assez difficile, plus le facteur est grand, plus on a des irrégularités, sur la fin on aura toute une série d'exposants 2, puis toute une série d'exposants 1. Ton rapport vaudra 1 pendant longtemps, puis 2, puis encore une fois 1.

994/498 = 1,99 et quelques, pas exactement 2 :p

Voilà... je vais continuer ma lecture donc...
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
29 juin 2005 à 10:10
BON... je vois que mon problème n'intéresse plus grand monde... Snniiifff...

Enfin, voici toute de même la deuxième programmation de la factorielle à partir des idées ci-dessus :


=================================


Function Factgn2(A As Integer) As String
'CALCUL DE LA FACTORIELLE : VERSION N°2
'temps = Timer

'validité
If A <= 1 Then Exit Function

'==
'PARTIE 1 : Crible d'Eratosthène
'==
'Déclarations variables
Dim A1 As Long, A2 As Long
'Génère la liste des nombres premiers impair
A1 = (A ^ 0.5 - 3) / 2
A2 = (A - 3) / 2
ReDim NB(A2) As Byte '1 octet par nombre
Dim tt As Long, t As Long, saut As Long
For tt = 0 To A1
If NB(tt) = 0 Then
saut = (2 * tt) + 3
For t = (saut ^ 2 - 3) / 2 To A2 Step saut
NB(t) = 1
Next t
End If
Next tt
'Récupère les nb premiers mis dans Pre()
Dim B As Long
ReDim Pre(1.7 * A * Log(A)) As Long '1.7*A*Log(A)=nb maxi de nb premier Evite une nouvelle déclaration
For t = 0 To B
If A2 0 And Expo(t) < 4 Then A2 t
pr(t) = PuissanceGN(Str$(Pre(t)), Expo(t))
Next t

'+++ JUSQU'ICI = TRES RAPIDE +++
'MsgBox "factgn news =" & Timer - temps
'temps = Timer

'+++ DUREE A OPTIMISER ENCORE A PARTIR D'ICI +++

'Déclarations variables
Dim result As String, result2 As String

'+++ ON COUPE EN DEUX BLOCS POUR OPTIMISER L'APPEL PGN +++

'Groupe 1
result = "1"
For t = B To A2 Step -1 'boucle inversée pour optimiser PGN
result = PGN(result, pr(t))
Next t

'Groupe 2
result2 = "1"
For t = A2 - 1 To 0 Step -1
result2 = PGN(result2, pr(t))
Next t

Factgn2 = PGN(result2, result)

'MsgBox "factgn news =" & Timer - temps & " L=" & Len(Factgn2)
End Function


======================


(pour le copier, metter-le en surbrilance et jouer avec CTRL+C et CTRL+V)


Quelques remarques :
- LA vitesse est quasiment identique à la première version présentée. Cette dernière version est très légérement inférieure, mais on l'observe bien au-delà de 3000!, avec à peine 1 seconde de différence pour 7000! Donc, c'est vraiment pas mal du tout...
- Le temps principal de cette version n°2, correspond aux calculs des multiplications des différents termes, et non aux calculs des puissances. Ce dernier est surement optimisable. C'est d'ailleurs ce que j'ai un peu fait en coupant le calcul en deux groupes. Comment cela se fait ? Tout simplement, le calcul multiplicatif PGN est plus rapide si les deux nombres sont de taille assez semblable. En gros, j'évite de multiplier un trés grand nombre par un petit... On peut surement faire mieux sur ce point...
- Le code fait des appels avec PGN. Or, on sait que les appels aux fonctions extérieures sont souvent long. De plus, PGN traite tous les types de nombres, or, ici on a affaire qu'à des entiers positifs... donc il y a des tests inutiles ici qui rallonge la durée... C'est donc encore un point optimisable...
- Comme on utilise PGN, toute amélioration de celui-ci, sera profitable...

Enfin, voilà on voit ici, que ce dernier ouvre plus de pistes pour aller plus vite dans le calcul de la factorielle, contrairement à la première version qui n'est plus rééllement optimisable...

==========================

De retour, à mes rescherches mathématiques sur le calcul factorielle...

J'ai étudié dans la procédure du calcul des puissances, la relation entre les puissances successives. Histoire de voir si on pouvait aller plus vite dans ce calcul pour éviter la boucle avec " int[N/p^k] ".

En clair, sur un exemple...

La décomposition de 1000! vaut pour le début :
1000! = 2^994 * 3^498 * 5^249 * 7^164 * 11^98 * 13^81 * 17^61 * 19^54 * 23^44 * 29^35 * 31^33 * 37^27 * 41^24 * ...etc...

Lorsqu'on forme les rapports successifs des puissances on obtient pour tous les nombres un rapport presque identique... En fait, lorsque le nb factorielle tend vers l'infini, le rapport des puissances tendent vers une limite... Ainsi :

994/498 = 2.
498/249 = 1,518...
etc...

soit en résumé sur cet exemple :
2 ; 1,518... ; 1,673... ; 1,2098... ; 1,327... ; 1,1296... ; 1,227... ; 1,257... ; 1,0606... ; 1,222... ; 1,125. etc...

J'ai trouvé comment former ces rapports limites...

A partir des nb premiers (en prenant en plus 1) que je vais noter P0 ; P1 ; P2 etc ... soit respectivement : 1 ; 2 ; 3 ; 5 ; 7 ; 11 ; 13 ; 17 ; 19 ; 23 ; 29 ; 31 ; 37 ; 41 ...

Je calcul Ri = [ ( Pi - P(i-1) ) + ... + ( P1-P0 ) ] / 2

Ce qui donne à partir de R1=1 , R2=2 , R3=3, R4=5, R5=6, R6=8, R7=9, R8=11 , R9=14, R10=15 etc...

On remarquera pour aller plus vite que Ri = R(i-1) + ( Pi - P(i-1) )/2

Puis, pour trouver les rapports limites, il suffit d'établir le rapport des Ri successifs... soit : Qi = Ri / R(i-1) , qui donne :
Q1 2/1 2
Q2 3/2 1,5
Q3 5/3 1,66666...
etc...

soit en résumé :
2 ; 1,5 ; 1,666... ; 1,2 ; 1,333... ; 1,125 ; 1,222... ; 1,2727... ; 1,0714- ; 1,2 ; 1,111... etc...

Bien sur, pour une décomposition précise, il faudrait appliquer un terme correcteur, mais je n'ai pas trouvé comment former cette correction...



Enfin, voilà...
Us.
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
25 juin 2005 à 17:38
Oupppssss...

Petite erreur d'écriture...

Ne pas lire :
B=(768-472,5)/2=472,5.
-On a bien A²-B² 9! 620,25^2-472,5^2.

mais

B=(768-472,5)/2=147,75.
-On a bien A²-B² 9! 620,25^2-147,75^2.

ET dans le post encore au-dessus...

NE pas lire :
Fixons AB.

IL y a également, qlq erreurs grammaticales, mais je vous laisse corriger tout seul... Excuser moi, mais c'est valable pour tout le monde... c'est l'exercice qui veut ça ! ... comme on dit...


Amicalement,
Us.
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
25 juin 2005 à 17:19
J'ai poursuivis encore un peu l'étude, de plus en plus intéressante...

JE repart de ma question :
"Qu'est ce qu'on peut déduire pour trouver C et D ?"

Et là, au lieu de se formaliser à trouver absolument C et D en nb entier, j'ai regardé les combinaisons qu'on peut former à partir de la décomposition en nb premiers. Ce qui ma permis de trouver certaines relations (pas encore toutes explorées) très intéressantes...

Pour me faciliter la tâche, je vais prendre un exemple, et faire les commentaires dessus...

Prenons 9!.

Actuellement je sais trouver la décomposer 9! en ses facteurs premiers sans effort... IL suffit pour cela de connaître les nb premiers inférieur à 9 ; soit 2,3,5,7.

Ensuite pour connaître les puissances respectives, je calcule :
-pour la puissance 2 :
[9/2^1]+[9/2^2]+[9/2^3] = 4+3+1 = 7
-pour la puissance 3 :
[9/3^1]+[9/3^2] = 3+1 = 4
-pour la puissance 5 :
[9/5^1] = 1
-pour la puissance 7 :
[9/7^1] = 1

Soit 9! = 2^7 * 3^4 * 5^1 * 7^1

Ce principe est général...

Maintenant, comme déjà dit, je peux repartir ces produits en deux blocs. JE vais les choisir volontairement très spécials pour faire voir toutes les particularités.

Par exemple, si je choisi C 2^8 * 3^1 , il reste D 2^(-1) * 3^3 * 5 * 7. Donc, CD=9!.
Pour trouver A et B tel qu'on ait A²-B²=9! , il suffit de calculer (comme déjà dit plus haut) , A = (C+D)/2 et B = (C-D)/2.
Sur cet exemple, on a : A=(768+472,5)/2=620,25 et B=(768-472,5)/2=472,5.
-On a bien A²-B² 9! 620,25^2-472,5^2.
-On pourrait avoir B négatif, cela ne changerait rien...
-On remarquera que j'ai choisi 2^8 > 2^7 de la décomposition...

Maintenant, au lieu de choisir au hasard C et D, j'ai tenté de retrouver le facteur proche de la racine carré de X! , comme au début (post du 20/6)... soit 9!=603²-27²... c.a.d. A=603.

ET là, une remarque très intéressante, c'est qu'on peut pas obtenir exactement 603 ! mais seulement A=603,5 avec B=36,5 ... MAIS surtout lorsqu'on regarde toutes les combinaisons qu'on peut former, on observe que la somme A+|B| est minimale pour cet combinaison ! ... Cette propriété est générale, et très singulière... Avec un peu d'intuition, on se doute de la raison de cet propriété, mais je ne sais pas le démontrer...

L'observation systématique de cet propriété donne des propriétés encore plus intéressantes ! ... Voyons cela : (à partir de 7 pour faire plus court ici)

(dans un tableau bien aligné, on voit mieux que sur ce post reformater dans une police non proportionnelle...)

7! C D A² - B² = 71,5^2 - 8,5^2
2^ : 4 0
3^ : 0 1
5^ : 1 0
7^ : 0 1

Se lit :
C 2^4 * 3^0 * 5^1 * 7^0 71,5
D 2^0 * 3^1 * 5^0 * 7^1 8,5


8! C D A² - B² = 201^2 - (-9)^2
2^ : 6 1
3^ : 1 1
5^ : 0 1
7^ : 0 1


9! C D A² - B² = 603,5^2 - 36,5^2
2^ : 7 0
3^ : 0 4
5^ : 1 0
7^ : 0 1


10! C D A² - B² = 1905^2 - 15^2
2^ : 7 1
3^ : 1 3
5^ : 1 1
7^ : 0 1


11! C D A² - B² = 6318,5^2 - 81,5^2
2^ : 8 0
3^ : 0 4
5^ : 2 0
7^ : 0 1
11 : 0 1


12! C D A² - B² = 21888^2 - 288^2
2^ : 5 5
3^ : 2 3
5^ : 0 2
7^ : 1 0
11 : 1 0


LES valeurs de A et B sont à comparer avec ces trouvés avant. On remarque alors que pour les factorielles de nb pair, on retrouve directement les bonnes valeurs. Pour les impairs, on est pas loin. On peut retrouver les valeurs entières par calcul tout simple. Par exemple, pour 9! : on veut que la valeur entière 603. IL reste alors 603,5²-603² 603,25, qu'il faut déduire à 36,5² , soit 1332,25-603,25 729 = 27².

Rq : le calcul général de (a+0,5)²-a² vaut a+0,25...

Ici, il n'y a rien d'évident de montrer (pour les nb impairs) que l'opération redonne un nb au carré ! J'ai pas encore réussi à le démontrer, et il n'y a rien de trivial...


Ensuite, toute la difficulté c'est de trouver comment on doit choisir les valeurs des puissances pour que la somme A+B soit minimale. On observe que à partir des puissances une espèce de règle de formation, plus ou moins flou... Là, j'ai pas réussi à trouver...

IL y a d'autres remarques que je pourrais faire, mais elles sont trop imprécises, pourtant elles semblent correspondre à des règles précises... De plus, avec d'autres considérations, je pense que cet recherche pourrait donner un certain éclairage sur la factorisation d'un nombre...


Enfin, on voit tout de même, que j'ai pas bessoin de connaître explicitement le calcul de la racine carré de X!, pour trouver la différence de deux carrés égale à X!.


Voilà, j'ai exposé mes connaissances actuelles sur cet recherche... si le sujet vous occupe un moment, et que vous trouvez d'autres résultats, je suis preneurs !


A+
Us.
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
23 juin 2005 à 23:39
Je me suis mal exprimé. J'avais, bien sur, pris la valeur absolue...mais en fait c'est pas trés intelligent ce que j'avais écris... en fin, pas tout... et il reste le truc curieux, c'est que la première solution valide dans X!=A²-B², on a A trés proche de la racine carré de X! ...


J'ai tout de même une piste plus intéresante que je voulais "pofimer" un peu avant de l'écrire, mais je vais me lancer tout de même... Je vais tenter d'être clair, mais je garanti rien...


LE but initial c'est de trouver une méthode rapide de calcul de la factorielle...

et par certaines considérations je recherche A et B tel que X!=A²-B².
Fixons A<B.
On a l'identité remarquable : A²-B²=(A+B)(A-B)=X!
Donc, on cherche à résumer X! par un produit de deux facteurs.

IL y a deux possibilités similaires :

- Soit on considère X! par sa définition, soit 1.2.3.4...X, qu'on regroupe en deux blocs. Ensuite, il faut trouver comment choisir ces blocs pour respecter la relation A²-B². Toutes les combinaisons ne sont manifestement pas compatibles.

- Soit, on simplifie X! par sa décomposition en nombres premiers. C'est ensuite les mêmes considérations que ci-avant.

JE trouve cette dernière considération intéressante, car elle permet de former un algorithme de calcul différent, et faisant intervenir un nombre de nombres plus réduit, bien sur élevés aux puissances...
En clair, on a la forme X!=2^n1.3^n2.5^n3....np^1. np étant le dernier nombre premier inférieur à X.

IL est facile de voir qu'on peut trouver la décomposition trés rapidement. Pour trouver les nombres premiers, il suffit, par exemple, d'utiliser mon algo rapide du crible. Pour trouver les puissances, c'est tout aussi rapide car il suffit de tenir le simple raisonnement suivant sur un exemple :
9! = 9.8.7.6.5.4.3.2
Pour 2 : 2 divise 2.4.6.8 : soit 4
ensuite il reste 1.1.3.2.5.3.7.4.9, et on continue
2 divise encore : 2.4 : soit 2
il reste : 1.1.3.1.5.3.7.2.9, et on continue
2 divise le dernier 2 : soit 1
En tout, on a 2^(4+2+1) = 2^7

Avec un peu d'attention, on va bien plus vite, puisse qu'il suffit de remarquer de combien on saute... Pour le premier passage de 2 en 2. Pour le deuxième passage de 4 en 4. Pour le dernier passage de 8 en 8...
Ce principe se généralise à tous les nombres... On obtient la formule suivante :
[9/2^1]+[9/2^2]+[9/2^3]
=4+2+1
[] signifie qu'on garde que la partie entière...

On a alors un algo de décomposition rapide de la factorielle. Cet alogo s'articulerait en 3 partie :
- Recherche des nb premiers inférieurs à X.
- Calcul des valeurs des puissances (comme expliqué).
- Calculs de la factorielle par les fonctions PuissanceGN et PGN.

J'ai pas eu le temps de le programmer, mais il a de trés bonne chance d'être plus rapide que celui proposé, surtout dés que X est un peu grand...

... C'est donc bien une autre idée pour le calcul effectif de la factorielle qui fait intervenir que des puissances ... c'était plus ou moins mon but du départ... Mais poursuivons encore un peu...

Regardons le produit : (A+B)(A-B)
Posons :
A+B=C
A-B=D

Il advient que :
B=(C-D)/2
A=(C+D)/2

Gardons en tête que C ou D sont les produits des nb premiers élévés avec certaines puissances... D'aprés ci-dessus, on se pose donc dans le cas de figure où on connait la décomposition du produit CD.

Qu'est ce qu'on peut déduire pour trouver C et D ?

- Puisse que A ou B sont entiers, il faut que C et D soient multiples de 2.
- On peut connaître le nombre de zéro de X!. Grâce aux produits 2.5=10. Le nb de zéro est donc égale aux nb de la puissance de 5. Cette information donne aussi les derniers chiffres de B losqu'on pose A. Par exemple, pour 9! :
9! 2^7 . 3^4 . 5^1 . 7 362880
ON en déduit que la factorielle 9! fini par un seul zéro.
Si on choisi A 603^2 363609 , on en déduit que B finira aussi par 9. Sinon qu'on fait la différence, on aurait plus le nb de zéro attendu... Rq: Plus la factorielle est grand, plus il y a des zéros... C'est une information qui peut servir...
- On observe que une solution pour A c'est quand il est trés proche de la racine carré de X!. Et dans le même temps B est aussi une valeur faible. Les solutions (A,B) semble suivre une marche en "tenaille" autour de la racine carré... assez logique d'ailleurs...


En remarque générale, il faudrait pouvoir connaître la règle de formation de C ou D en fonction de X, pour répondre complètement au problème... C'est un champ d'exploration que j'ai pas encore exploré...


Enfin, sur un site internet, il parlait (je crois) d'une conjecture, qui faisait intervenir exactement l'équation X!=A²-B², où (de mémoire) il était conjecturé, que seul trois solutions existait pour que B soit égale à 1. Avec les remarques déjà formulées, on voit déjà qu'il ne peut pas vraiment en être autrement... Enfin, bref... Ici je m'éloigne... Mais toute cette petite étude si elle aboutit, donnerait surement certains éclairages sur d'autres problèmes....


Amicalement,
Us.
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
22 juin 2005 à 22:42
Je peux me tromper, bien entendu...
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
22 juin 2005 à 22:04
ok
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
22 juin 2005 à 10:37
"si on prend A < V(X!) (avec A entier), alors il est impossible de trouver B (entier) qui vérifie l'équation."
A < V(X!)
=> A² < X!
comme B² est positif, A² - B² < A² < X!
et X! ne peut pas être égal à A² - B²....
En fait je ne vois pas du tout comment exploiter ta factorisation de X! pour le calcul de la factorielle, parce qu'elle nécessite x!, justement. Faudrait trouver la relation entre X et A et/ou B, je suis pas sûr qu'il y en ait une, ou alors elle est bien compliquée, et ça ne faciliterait pas le calcul.
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
21 juin 2005 à 23:46
Oui surement... et je te remercie de t'intéresser à mon problème...

TU prouves que toute factorielle au delà de 4! peut s'écrire sous la forme d'une différence de deux nombres carrés, car forcément divisible par 4... C'est déjà un beau début !

Maintenant, j'ai cherché d'autres propriétés et toujours expérimentalement, j'ai pu constater que dans la forme générale considérée au-dessus (soit l'équation) X!=A²-B², si on prend A < V(X!) (avec A entier), alors il est impossible de trouver B (entier) qui vérifie l'équation.
[rappel : j'écris V(X!) pour racine carré de la factorielle X]

Par contre, l'inverse posséde des solutions multiples... Par exemple, toujours 9! :
9!=603²-27²
9!=604²-44²
9!=606²-66²
9!=612²-108²
etc...

Mais surtout la première solution valide se situe, pour tous les cas, quasiment toujours juste au-dessus de la racine carré... Donc, la racine carré semble jouer ici, le rôle de point de départ... Comme cette propriété est trop bien vérifiée expérimentalement, il doit exister une explication, qui ne semble pas se déduire, de prime abord, de l'explication précédente...


Bref, si un mathématicien passe par ici... Enfin, plus modestement, si vous avez des idées en la matière... je suis preneur !

=

Amicalement,
Us.
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
21 juin 2005 à 10:45
C'est vrai que c'est bizarre :)
Si ça peut t'aider, on peut démontrer que tout nombre divisible par 4 peut s'écrire comme différence de deux carrés parfaits.
Soit N un de ces nombres
N n'est pas premier car 4|N (4 divise N), donc N = p1*p2
comme 4 divise N, on peut s'arranger pour que p1 contienne un facteur 2 et que p2 aussi ; en somme, on répartit tous les diviseurs de N dans p1 et p2 de sorte que p1 et p2 soient tous deux pairs
On suppose p2 >= p1
On pose delta = (p1 + p2)/2 ; delta est un naturel car p1 + p2 est pair
on pose m = p1 + delta
On a alors : p1 = m - delta
p1 = m - (p1/2 + p2/2)
p1/2 = m - p2/2
p2 = 2m - p1
p2 = m + (m - p1)
p2 = m + delta
Pour résumer :
p1 = m - delta
p2 = m + delta
N p1*p2 (m-delta)*(m+delta) = m² - delta²

Tout les nombres factoriels au delà de 4! (compris) sont divisibles par 4, donc s'écrivent sous cette forme. Ca ne démontre pas que tous les autres (avant 4!) ne s'écrivent pas de cette manière, mais on peut deviner maintenant pourquoi c'est le cas de 3!

Voilà... si ça peut t'aider...
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
20 juin 2005 à 23:55
Salut,

Je cherchais à optimiser le calcul factorielle, en utilsant la fonction puissance récemment programmée. En effet, en mesurant le temps pour calculer 3000^3000, j'ai obtenu 1 seconde soit 4 fois plus rapide que pour 3000!. J'ai naturellement pensé qu'il est peut-être possible d'améliorer ce dernier. J'ai donc recherché à calculer la factorielle en faisant intervenir le calcul puissance. Mon idée flou du départ, était d'essayer d'approcher le plus prés possible la valeur factorielle par un calcul d'un ou de quelques nombres élevés à une certaine puissance... De fils en aiguille, je suis arrivé à une énigmes mathématiques, dont je sollicite votre aide... (j'ai rien trouvé sur internet)

Voilà... je me suis aperçu qu'en prenant la racine carré entière d'une factorielle plus 1, élevé de nouveau au carré, puis en faisant la différence avec la factorielle, on obtenait un carré... enfin presque à chaque fois... et hormis quelqu'uns, on a qlq autres propriétés... Tout ceci est expérimentale... Voyons en détail ce que je veux dire :

Sur l'exemple 9! :
9! 362880 soit la racine de 362880 (que je vais noter V362880) 602,4. JE prends l'entier plus 1, soit 602+1=603 . J'élève au carré, soit 603². JE forme la différence avec la factorielle, soit 603²-9! = 729. Or la différence obtenu 729 est égale à 27*27 ! En conclusion : 9! = 603²-27² ... et ceci semble assez général... Quelques cas sont particuliers (au début)... Une autre propriété, semble être que les nombres qui forment les carrés soient multiples de 3, hormis 3 cas... Ici, 603/3=201, et 27/3=9.

Voici ce que donne les premières décompositions :

3!=6 , V6=2.4 > 3 , 3!=3²-3
4!=24, V24=4.9 > 5 , 4!=5²-1
5!=120, V120=10.9 > 11 , 5!=11²-1
6!=720, V720=26.8 > 27 , 6!=27²-3²
7!=5040, V5040=70.99 > 71 , 7!=71²-1
8!=40320, V40320=200.8 > 201 , 8!=201²-9²
9!=362880, V362880=602.4 > 603 , 9!=603²-27²
10!=3628800, V3628800=1904.9 > 1905 , 10!=1905²-15²
11!=39916800, V39916800=6317.9 > 6318 , 11!=6318²-18²

Cas particulier :
12!=479001600, V479001600=21886.1 > 21887, OR si 12!=21887²-39169 , et 39169 est non divisible par 3, ni un carré (en fait 39169 est premier). Pour retrouver les mêmes propriétés, il faut prendre 21888, soit
12!=21888²-288²

13!=6227020800, V6227020800=78911.5 > 78912 , 13!=78912²-288²
14!=87178291200, V87178291200=295259,7 > 295260 , 14!=295260²-420²

...etc... je pense...

Tout le problème c'est de savoir si c'est toujours comme ça, puis de retrouver facilement (et rapidement) les valeurs des nombres aux carrés... ?... Vaste problème, mais on voit que disposer de la règle de formation, donnera probablement un algorihme trés performant...

Bref, si vous avez des connaissances là-dessus, et bien... je suis preneur... Ou bien si vous trouvez d'autres propriétés intéressantes...

=

Amicalement,
Us.
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
2 juin 2005 à 20:59
Okay merci
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
2 juin 2005 à 12:49
Salut,

Voilà j'ai dépossé une explication qui devrait faire comprendre le principe... en espérant d'être assez clair...

A+
Us.
Saros Messages postés 921 Date d'inscription vendredi 20 décembre 2002 Statut Membre Dernière intervention 23 septembre 2010
29 mai 2005 à 22:29
En parlant d'amélioration de vitesse, je dirais à vue d'oeil que la fonction ZeroGn que tu viens de coder est plus rapide car mieux adaptée, que celle que tu utilises... :)
Voilà... sinon ça te dirait d'expliquer un brin l'algorithme ? je suis bien interressé
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
29 mai 2005 à 16:59
Salut,

Et bien... Merçi à Urgo... Tu as parfaitement répondu à la question de Cacophrène !

Je complète tout de même... La fonction ZeroGN permet de supprimer tous les zéros inutiles des nombres de grande taille, qu'ils soient entiers ou décimaux... donc, cette fonction en fait plus que nécessaire ici... mais cela m'évite de refaire du code. (c'est plus pratique !)... Néanmoins, pour la factorielle, les zéros éventuellement inutiles se trouvent au début du résultat. On peut donc remplacer la ligne de code :

FactGn = ZeroGN(FactGn)

par :

For I = 1 To Len(FactGn)
If Mid(FactGn, I, 1) <> "0" Then Exit For
Next I
FactGn = Mid(FactGn, I)



A+
Us.
cs_Urgo Messages postés 780 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 16 avril 2009 1
29 mai 2005 à 15:05
Cacophrène, va voir ici (partie code) où la fonction est présente:
http://vbfrance.com/codes/CALCULS-SUR-LES-NOMBRES-DE-TRES-GRANDE-TAILLE-/31544.aspx

Ciao
Urgo
Cacophrene Messages postés 251 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 4 mars 2008 1
29 mai 2005 à 14:13
Salut !

J'ai un souci avec ton code sur VB5 : qu'est-ce que la fonction ZeroGN ?
Merci par avance.

Cacophrène