首页 > 解决方案 > 用 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. 如何计算该数组中的 True 值?

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

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
  ]

但这返回的数字太多了。关于如何找到不属于任何三元组的数字的任何想法?

UPDATE2:我一直在尝试和挖掘更多。如何将我从输入中读取的数字 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.

标签: haskellmathfunctional-programminglist-comprehensionequation

解决方案


如果满足过滤器,您可以使用过滤器并产生一个(x, y, z)元组:

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

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)以获取解决方案的数量。


推荐阅读