L'INFORMATIQUE AU SECOURS DES MATHS

Signaler
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
-
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
-
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/23548-l-informatique-au-secours-des-maths

Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
bon et finalement voici la puissance des mathématiques ...

voici comment calculer de maniere explicite des valeurs de L qui marchent, elle dépendent juste d'un indice n que l'on peut prendre quelconque.

Ln = 1/sqrt(2) . [ (3+2sqrt(2))^n - (3-2sqrt(2))^n ] + 3/4. [ (3+2sqrt(2))^n + (3-2sqrt(2))^n ] - 1/2

(sqrt(2) est la racine carré de 2)

exemples:
L0 1 (1*2/2 1²)
L1 8 (8*9/2 6²)
L2 49 (49*50/2 35²)
L3 288 (288*289/2 204²)
L4 1681 (1681*1682/2 1189²)
L5 9800 (9800*9801/2 6930²)
L6 57121 (57121*57122/2 40391)
etc...

c'est qd meme plus puissant qu'un programme qui teste toutes les valeurs !!
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
bon en attendant, voici une maniere de construire une infinité de solutions a ce probleme, ce que l'informatique n'aurait pas pu faire.
on considère la suite double définie par:
x0=1, y0=3
x(n+1) = 3.xn+yn
y(n+1) = 8.xn+3.yn

je prétends que L = (yn-1)/2 vérifie L(L+1)/2 qui est un carré (pour tout n !!)
(y2 donne la valeur que ce programme trouve, cad le L tel que
L*(L+1)/2 vaut 1225)
en augmentant la valeur du L dans la boucle (limité a 285 ici), on aurait pu trouver L 1681 qui marche aussi. mais bon avec ce que j'ai dit, on peut en déduire une infinité... (celui d'encore apres est L 9800, puis L = 57121 etc..)
par contre, a la question : est ce que toutes les solutions (a part pour L = 0 et 1) apparaissent dans la suite, j'en sais rien. je pense cependant que oui.
Messages postés
43
Date d'inscription
mardi 30 mars 2004
Statut
Membre
Dernière intervention
7 octobre 2006

et c'est la qu'un mathémticien ingénieux se dit que de taper ces fameuses 4 lignes de codes puis les compiler et enfin les exécuter (sachant qu'il fallai avoir pensé a prendre son pc) est bien plus long et fastidieux que d'utiliser ce fabuleux instrument qu'est son cerveaux (nb:pas besoin de penser à le prendre en principé il est tjs avec vous ;) )

c marrant comme probleme ca me rapelle un peu la spé math de term ;)
c juste un petit probleme d'arithmétique :

cas evident d'un point de vue mathématiques mais qui ne repondent pas aux probleme : 0 et 1
ensuite il faut plus au moins tester les cas possible en enlevant un maximum de cas impossible ;)

on sait que le nombre de figurants est de la forme L(L+1)/2 et de la forme N*N donc carré d'un entier
c la que le mathématicien se rend compte qu'il est difficile de supprimer les cas car le forme N*N nous permet juste de dérouler les N, et la forme L*(L+1)/2 ne nous permet meme pas de distinguer le cas pair d'impair puisque L*(L+1) est forcement pair...

la flemmardise le pousserai à demander à son voisin informaticien de faire un petit programme pour tester tous les cas (dans un interval fermé bien sur) mais il a sa TI!!! (encore de la flemmardise)
donc il va tester les premier cas rapidement a la main
tres rapidement en déroulant les N, au bout du 5e cas on voit quee N=6 fonctionne puisque N*N carré (évident) et L*(L+1)/2=36 pour L=8...
mais c la qu'il remarque que les figurants sont des centaines !!!
donc il faut N >= 10 !!!
apres de laborieux tests il parvient à la solution qu'est 1225 pour n=35... (L=49)
il existe surement une méthodes pour éliminer plus de cas mais la j'ai po trouvé (chu seulement informaticien :p )

mais bon comme je suis informaticien :p je vais écrire le code que j'aurai posté (ecrit en bon c++ sans faire de caca avec des double(alors qu'on veu travailler qu'avec des entier))

#include
#include <math.h>

int main()
{
for (int n = 2; n < 200; n++)
{
int l = sqrt(n*n*2);
if (l*(l+1)/2 == n*n) std::cout << n*n << std::endl;
}
return 0;
}
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
ben en tout cas les mathématiques permettent de dire que dans ce cas, il y a une infinité de solutions.
la résolution de ce probleme se ramene (facilement) a l'equation de pell-fermat avec n = 8 (cad a la résolution de 1+8b²=c²). j'ai essayé de la résoudre, mais visiblement c'est compliqué, et des mathématiciens comme euler l'on trouvé dur, ce qui explique qu'il y avait peu de chances que je trouve tout seul ;) la réponse est finalement qu'il y a une infinité de solutions. si j'ai le temps, je vais essayer de comprendre comment on trouve toutes les solutions de pell fermat, et donc on peut explicitement (ou au moins récursivement) donner toutes les solutions de ce probleme.

pour ceux que ca interessent, pour passer de a²+a-2b²=0 à l'equation dont j'ai parlé c'est simple:
il suffit d'exprimer a en fonction de b; et ici a = (-1+sqrt(1+8b²))/2
on voit qu'ill est nécessaire et suffisant (pour que a soit entier) que 1+8b² soit un carré, c'est a dire que b soit solution de l'équation 1+8b²=c².

voila.
Afficher les 14 commentaires