J'ai été amené à réaliser un petit programme qui cherche (et normalement devrait trouver) tous les triplets pythagoriciens contenant un entier choisi au départ. Rappel a²+b²=c² avec a, b et c trois entiers naturels > 0.
Après un essai en langage python, puis en langage C, j'ai pu remarquer (sur ma machine) que :
1) Le calcul en C est 20 fois plus rapide (en gros) qu'en python.
2) Le python comme le C finissent par donner des résultats faux quand les entiers deviennent très grands.
En C j'ai typé les entiers en %llu, c'est à dire long long unsigned, mais cette méthode a des limites.
Donc j'ai refait le même programme dans Xcas en me disant qu'il devait être capable de gérer des entiers sans limite de taille préalablement fixée. Il a l'air de bien fonctionner, comme les autres, pour des entiers assez petits, mais pour des plus grands, il semble mouliner sérieusement.
Mes questions un peu en vrac :
- Est-ce normal ou y a-t-il une configuration particulière du CAS pour accélérer ça ?
- Est-ce que comme je le suppose xcas donne les triplets sans erreur ?
- Puis-je utiliser giac dans un programme en C ?
- (aucun rapport) Comment afficher plusieurs choses sur une ligne ? -> voir la fin de mon prg
- (aucun rapport ou presque) Puis-je afficher le temps de calcul ?
Je vous joins le prg xcas (sans doute optimisable):
Code : Tout sélectionner
afficher("Ce programme permet de trouver, si possible, le(s) triplet(s) pythagoricien(s) qui contiennent un nombre choisi au départ.\n");
saisir("Entrez votre nombre : ",n);
compte:=0;
//recherche d'une hypoténuse
deb_j:=ceil(n*sqrt(2)/2);
pour j de deb_j jusque n-1 faire
k:=sqrt((n-j)*(n+j));
si k==floor(k) alors
afficher(n,j,k);
compte:=compte+1;
fsi;
fpour;
//recherche d'un "moyen côté"
deb_i:=n+1;
fin_i:=ceil(n*sqrt(2));
pour i de deb_i jusque fin_i-1 faire
k:=sqrt((i-n)*(i+n));
si k==floor(k) alors
afficher(i,n,k);
compte:=compte+1;
fsi;
fpour;
//recherche d'un petit côté
deb_i:=ceil(n*sqrt(2));
fin_i:=ceil((n*n+1)/2);
pour i de deb_i jusque fin_i faire
j:=sqrt((i-n)*(i+n));
si j==floor(j) alors
afficher(i,j,n);
compte:=compte+1;
fsi;
fpour;
afficher("Il y a ",compte," possibilités.")

JP