next up previous contents index
suivant: Les nombres heureux monter: Les parallélépipèdes rectangles presque précédent: L'énoncé   Table des matières   Index

La solution

Si 3 entiers (a, b, c) vérifiant a < b < c représentent un parallélépipède rectangle, pour su'il soit presque parfait il faut que :
  1. $ \sqrt{{a^2+b^2}}$ soit un entier,
  2. $ \sqrt{{a^2+c^2}}$ soit un entier,
  3. $ \sqrt{{b^2+c^2}}$ soit un entier
Comment tester qu'un nombre p est un carré parfait ? On peut écrire :
frac(sqrt(p))==0 ou
floor(sqrt(p))^2-p==0
mais cela demande un calcul ! Il est donc préferable d'utiliser la commande type qui renvoie le type de l'argument. Par exemple :
type(sqrt(4))==integer renvoie 1 et type(sqrt(5))==integer renvoie 0.
On tape :
parapparfait(n):={
  local a,b,c,L;
  L:=NULL;
  pour a de 1 jusque n faire
    pour b de a+1 jusque n faire
      si type(sqrt(a^2+b^2))==integer  alors
         pour c de b+1 jusque n faire
           si type(sqrt(a^2+c^2))==integer alors
             si type(sqrt(c^2+b^2))==integer alors 
                L:=L,[a,b,c]; 
             fsi;
           fsi;
        fpour;
      fsi;
    fpour;
  fpour;
  retourne L;
}:;
0n tape : L:=parapparfait(1000)
On obtient (c'est long !):
[44,117,240],[85,132,720],[88,234,480],[132,351,720],
[140,480,693],[160,231,792],[176,468,960],[240,252,275],
[480,504,550],[720,756,825]

On peut modifier le programme pour avoir pour chaque a, une liste provisoire P qui sera la liste a, b1, b2...bp telle que a2 + bj2 soit un carré. Puis dans cette liste on cherchera les bj et les bk tels que bj2 + bk2 soit un carré. Le triplet [a, bj, bk] répond alors à la quesstion.
On tape :

paralparfait(n):={
  local a,b,c,L,P,j,s,k,b2;
  L:=NULL;
  pour a de 1 jusque n faire
    P:=a;
    pour b de a+1 jusque n faire
      si type(sqrt(a^2+b^2))==integer  alors
         P:=P,b;
      fsi;
    fpour;
    s:=size(P)-1; 
    pour j de 1 jusque s-1 faire
      b:=P[j];
      b2:=b^2;
      pour k de j+1 jusque s faire
        c:=P[k];
        si type(sqrt(b2+c^2))==integer alors 
          L:=L,[a,b,c]; 
        fsi;
       fpour;
     fpour;
   fpour;
   retourne L;
}:;
0n tape : L:=paralparfait(1000)
On obtient (c'est 2 fois moins long !):
[44,117,240],[85,132,720],[88,234,480],[132,351,720],
[140,480,693],[160,231,792],[176,468,960],[240,252,275],
[480,504,550],[720,756,825]

Remarque
On peut facilement avoir les couples a, b tel que a2 + b2 soit un carré.
On tape :

sommecarre(n):={
  local a,b,L,P;
  L:=NULL;
  pour a de 1 jusque n faire
    P:=a;
    pour b de a+1 jusque n faire
      si type(sqrt(a^2+b^2))==integer  alors
        P:=P,b;
      fsi;
    fpour;
    si size(P)>1 alors L:=L,[P];fsi;
  fpour;
  retourne L;
}:;
On tape : sommecarre(100)
On obtient :
[3,4],[5,12],[6,8],[7,24],[8,15],[9,12,40],[10,24],
[11,60],[12,16,35],[13,84],[14,48],[15,20,36],
[16,30,63],[18,24,80],[20,21,48,99],[21,28,72],
[24,32,45,70],[25,60],[27,36],[28,45,96],[30,40,72],
[32,60],[33,44,56],[35,84],[36,48,77],[39,52,80],
[40,42,75,96],[42,56],[45,60],[48,55,64,90],[51,68],
[54,72],[56,90],[57,76],[60,63,80,91],[63,84],[65,72],
[66,88],[69,92],[72,96],[75,100],[80,84] Par exemple, on voit que :
202 +152 est un carré : c'est 252,
202 +212 est un carré : c'est 292,
202 +482 est un carré : c'est 522,
202 +992 est un carré : c'est 1012.
ou encore
602 +112 est un carré : c'est 612,
602 +252 est un carré : c'est 652,
602 +322 est un carré : c'est 682,
602 +452 est un carré : c'est 752,
602 +632 est un carré : c'est 872,
602 +802 est un carré : c'est 1002.
602 +912 est un carré : c'est 1092.
On peut aussi en déduire que :
602 +1442 est un carré : c'est 1562 (car 152 +362 = 392).
602 +1752 est un carré : c'est 1852 (car 122 +352 = 372).
602 +2972 est un carré : c'est 3032.(car 202 +992 = 1012).
Mais si on veut tous les nombres b $ \leq$ 300 tels que n2 + b2 soit un carré il est préférable d'écrire le programme :
n2plusb2(n,N):= {
local b,P;
P:=n;
pour b de 1 jusque N faire 
si type(sqrt(n^2+b^2))==integer  alors 
P:=P,b; 
fsi;
fpour ;
P;
}:;
On tape : n2plusb2(20,1000)
On obtient :
20,15,21,48,99
On tape : n2plusb2(60,300)
On obtient :
60,11,25,32,45,63,80,91,144,175,221,297
seul 602 +2212 = 2292 n'avait pas été trouvé précédemment car 229 est un nombre premier !
On tape : n2plusb2(60,1000)
On obtient :
60,11,25,32,45,63,80,91,144,175,221,297,448,899
next up previous contents index
suivant: Les nombres heureux monter: Les parallélépipèdes rectangles presque précédent: L'énoncé   Table des matières   Index
Documentation de giac écrite par Renée De Graeve