如何解决用 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,...]
该列表中总共有 4 个 True 值。我的问题是:
- 如何获得满足给定方程的所有元组 (x,y,z)?
- 如何计算该数组中的 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
]
但这返回的数字太多了。关于如何找到不属于任何三元组的数字有什么想法吗?
更新2: 我一直在试验和挖掘更多。如何将我从输入中读取的数字 n 传递给先前定义的函数(计算方法)?我希望能够获得解决方案数组,打印它及其长度。
sol n = solution = [
(x,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 = [
(x,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,12,13),(6,8,10),(8,6,(12,5,13)]
您也可以打印print (length solutions)
来获取解的数量。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。