nota sur l'algo :
on peut faire fi des complications du floor(sqrt(N))
et mettre directement N, soit "au plus simple" :
N=int(input("N="))
for b in range (0,N+1):
for a in range(b,N+1):
if N==a**2+b**2 :
print("a=",a," b=",b)
ça "marchera" tout aussi bien
ce sera juste moins "malin"
comme on se limite à a
b pour ne pas avoir les solutions en double,
on peut mettre la boucle sur a qui varie depuis la valeur
de b jusqu'au maxi
rendant le test "si a
b" inutile, puisque c'est "garanti par construction"
avec N = 241 le programme (avec en plus un comptage des boucles exécutées) donnera
>>>
a= 15 b= 4
29403 boucles>>>
un programme optimisé donnerait :
>>> somcar(241)
241 = 4² + 15²
1 décompositions
11 boucles effectuées, pour a de 0 à 10>>>
pour faciliter l'utilisation , il est écrit en tant que
fonction que l'on appelle autant qu'on veut
from math import *
# décomposition en somme de deux carrés
# par force brute, optimisé, b >= a
def somcar(n) :
xm = floor(sqrt(n/2)) # valeur maximale de a
nc = 0 # nombre de décompositions
nb = 0 # nombre de boucles effectuées
# de a = 0 : on accepte 0² + b² si n est un carré parfait
for a in range(0,xm+1) :
b = sqrt(n-a*a)
if b == floor(b) : # si b est un entier
print(n," = ",a,"² + ",int(b),"²",sep='')
nc = nc+1 # compte les solutions trouvées
nb = nb+1 # compte les boucles effectuées (pour info)
# fin de la boucle
if nc == 0 :
print(n,"n'est pas somme de deux carrés")
else :
print(nc,"décompositions")
print(nb,"boucles effectuées, pour a de ",0,"à",xm)
l'étude de ce programme est formatrice ...
il utilise une seule boucle comme je le disais, la valeur de b étant
calculée à partir de celle de a, avec juste un test si elle est entière ou pas
le nombre de boucles exécutées est largement réduit vu que c'est
au lieu de
N²/2 (241²/2
29000) voire N² si les deux boucles for étaient de 0 à N toutes les deux
si on veut aller au delà (pour de très grands nombres, reduire encore le nombre de boucles effectuées) il faudrait des techniques mathématiquement bien plus élaborées, hors de propos en Terminale