Voici un classement alternatif de la même liste (par la suggestion de Hammar):
-- the integer points along the diagonals of slope -1 on the cartesian plane,
-- organized by x-intercept
-- diagonals = [ (0,0), (1,0), (0,1), (2,0), (1,1), (0,2), ...
diagonals = [ (n-i, i) | n <- [0..], i <- [0..n] ]
-- the multiples of three paired with the squares
paar = [ (3*x, y^2) | (x,y) <- diagonals ]
et en action:
ghci> take 10 diagonals
[(0,0),(1,0),(0,1),(2,0),(1,1),(0,2),(3,0),(2,1),(1,2),(0,3)]
ghci> take 10 paar
[(0,0),(3,0),(0,1),(6,0),(3,1),(0,4),(9,0),(6,1),(3,4),(0,9)]
ghci> elem (9, 9801) paar
True
En utilisant un chemin diagonale pour parcourir toutes les valeurs possibles, nous garantir que nous atteignons chaque point fini en temps fini (bien que certains points soient encore en dehors des limites de la mémoire). Comme le souligne Hammar dans son commentaire, ce n'est pas suffisant, car il faudra encore une durée infinie pour obtenir une réponse False
.
Cependant, nous avons un ordre sur les éléments de paar, à savoir (3*a,b^2)
vient avant (3*c,d^2)
lorsque a + b < c + d
. Donc, pour déterminer si une paire donnée (x,y)
est en paar
, nous avons seulement à vérifier paires (p,q)
tandis que p/3 + sqrt q <= x/3 + sqrt y
.Pour éviter d'utiliser les numéros Floating
, nous pouvons utiliser une condition légèrement plus lâche, à savoir p <= x || q <= y
. Certainement p > x && q > y
implique p/3 + sqrt q > x/3 + sqrt y
, donc cela comprendra toujours des solutions possibles, et il est garanti pour se terminer.
On peut donc construire cette vérification dans
-- check only a finite number of elements so we can get a False result as well
isElem (p, q) = elem (p,q) $ takeWhile (\(a,b) -> a <= p || b <= q) paar
et de l'utiliser:
ghci> isElem (9,9801)
True
ghci> isElem (9,9802)
False
ghci> isElem (10,9801)
False
Un conseil: installer Haskell Platform, disponible ici: http://hackage.haskell.org/platform/ – Tener
On ne sait pas très bien ce que signifie «paar». À quoi voulez-vous que cette liste ressemble? La fonction elem fonctionne en effet sur des listes infinies (tant que la réponse est 'True'), mais la façon dont vous générez la liste cause des problèmes. –