用 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 值。我的问题是:
- 如何获得满足给定等式的所有元组 (x, y, z)?
- 如何计算该数组中的真值?
更新:
还有一个问题。我如何计算有多少数字不属于任何元组?我认为它在逻辑上应该是这样的:
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)
得到解的个数
我想在 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)?
- 如何计算该数组中的真值?
更新: 还有一个问题。我如何计算有多少数字不属于任何元组?我认为它在逻辑上应该是这样的:
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)
得到解的个数