用 Haskell 求解方程

Equation solving with Haskell

我想在 Haskell 中找到所有满足方程(费马定理)的 N 以内的数字:

一些解决方案可能是:

所以我在Haskell中尝试这样做:

main :: IO ()
main =  do
    let arr = [ z * z == x * x + y * y | x <- [1..13], y <- [1..13], z <- [1..13]] in print arr

我得到布尔值列表:

[False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,False,...]

该列表中共有 4 个 True 值。我的问题是:

  1. 如何获得满足给定等式的所有元组 (x, y, z)?
  2. 如何计算该数组中的真值?

更新: 还有一个问题。我如何计算有多少数字不属于任何元组?我认为它在逻辑上应该是这样的:

solutions2 = [
    (z)
  | x <- [1..13]
  , y <- [x..13]
  , z <- [y..13]
  , z * z /= x * x + y * y, 
  z * z /= x * x - y * y, 
  z * z /= y * y - x * x
  ]

但是返回的数字太多了。关于如何查找不属于任何三元组的数字有什么想法吗?

更新 2: 我一直在试验和挖掘更多。如何将我从输入中读取的数字 n 传递给先前定义的函数(计算方法)?我希望能够获得解决方案数组,打印它及其长度。

sol n = solution = [
    (x, y, z)
  | x <- [1..n]
  , y <- [x..n]
  , z <- [y..n]
  , z * z == x * x + y * y
  ]

main :: IO ()
main = do 
    putStrLn "Enter n:"
    n <- getLine
    let mySol = sol n
    print (mySol)

但我给了我错误:

error: parse error on input `='

还有:

Failed, no modules loaded.

您可以使用过滤器并生成 (x, y, z) 元组,以防过滤器得到满足:

solutions = [
    <b>(x, y, z)</b>
  | x <- [1..13]
  , y <- [1..13]
  , z <- [1..13]
  , <b>z * z == x * x + y * y</b>
  ]

main :: IO ()
main =  do
    print solutions

这给了我们六个解决方案:

Prelude> solutions 
[(3,4,5),(4,3,5),(5,12,13),(6,8,10),(8,6,10),(12,5,13)]

也可以打印print (length solutions)得到解的个数