【发布时间】:2025-12-23 23:55:15
【问题描述】:
我想在 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 值。我的问题是:
- 如何获得满足给定方程的所有元组 (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, 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.
【问题讨论】:
-
只是几点说明: 1. 您的示例似乎排除了重复项 (3,4,5) / (4,3,5) - 您可以通过
x <- [1..13], y <- [x..13]来做到这一点(您会得到一个也可以订购)# 2. 同样,z必须至少与y(和x)一样大,因此您也可以更改为z <- [y..13]- 这是一个轻微的性能改进,对于 13 来说并不重要但它将为 1300 万;) -
能否请您看一下第二次更新? @Carsten
-
问题出在
sol n = solution = [行,只需将其更改为sol n = [- 请注意,您不应该用更多问题更新一个问题 - 这不是 * 的工作方式 - 您应该提出新问题而是 -
还请注意,
let mySol = sol n(很可能)在getLine读入String时会出现另一个错误,但您需要Int- 试试@987654323 @ 而不是getLine
标签: haskell math functional-programming list-comprehension equation