我目前正在尝试在 Haskell 中实施 Atkin 筛
在关于阿特金筛子的维基百科文章的第3 步中,我需要找到多个方程的整数解的数量。
然而,我对这些方程中的第一个方程的解(4x² + y² = n, x > 0, y > 0 其中 n 是正整数列表中的一个条目)在使用任何 n 进行查询时会产生无限循环。
到目前为止,这是我解决这部分问题的代码:
eq1 :: Integer -> Integer
eq1 n = eq1_ n []
eq1_ :: Integer -> [(Integer, Integer)] -> Integer
eq1_ n list | (x > 0) && (y > 0) && (n == 4*(x^2) + (y^2)) && (notElem ((x,y)) list) = eq1_ n ([(x, y)] ++ list)
| otherwise = toInteger (length list)
where
x = floor (sqrt (fromIntegral ((n - y^2) `div` 4)))
y = floor (sqrt (fromIntegral (n - 4*(x^2))))
它被 WinGHCi 加载得很好,但是当我查询时,eq1 0
它只是停留在一个无限循环中,并且在产生答案之前必须被中断。我怀疑它在 和 的两个分配之间x
循环y
。
我怎样才能防止这种情况?这甚至可能吗?
编辑:意识到无限循环必须在哪里。