Mogelijk heb je hier genoeg aan (= mogelijk is dit voldoende efficient):
Code: Selecteer alles
Lagrange(n)
for(i=floor(sqrt(n)); i>=floor(sqrt(n/4)); i--)
m=n-i^2
for(j=floor(sqrt(m)); j>=floor(sqrt(m/3)); j--)
t=m-j^2
for(k=floor(sqrt(t)); k>=floor(sqrt(t/2)); k--)
if(issquare(t-k^2))
return/print (i, j, k, sqrt(t-k^2))
Het is een combinatie van Math-E-Mad-X en tempelier, met daaraan toegevoegd:
- als i ≥ j ≥ k ≥ l, dan hebben elk ook een ondergrens waar we boven kunnen blijven
- de laatste variabele hoef je alleen te testen op al dan niet kwadraat zijn
- begin het zoeken steeds bij de grootste waarde, dan heb sneller succes
Mocht je aan 1 oplossing per n voldoende hebben, dan kan je vooraf eerst kwadraten uit n delen:
als n = k^2 * m
en m = a^2 + b^2 + c^2 + d^2
dan is
n = k^2 * m = k^2 * (a^2 + b^2 + c^2 + d^2) = (ka)^2 + (kb)^2 + (kc)^2 + (kd)^2