haskell - 用 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)?
- 如何计算该数组中的 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.
解决方案
如果满足过滤器,您可以使用过滤器并产生一个(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)
以获取解决方案的数量。
推荐阅读
- performance - NumPy 中从 int16 到 [-1.0, 1.0] float32 范围的融合快速转换
- docker - 如何在生产中处理更新基于 docker-compose 的应用程序
- javascript - 将 onclick 事件传递给没有全局函数的模板文字
- swift - 在真实设备 iOS Swift 上进行单元测试时尝试生成随机密钥对时出错
- karate - 使用 Gradle 的不同空手道报告
- java - 未转换为系统属性的环境变量
- java - 如何使用 Material Design 更改操作栏文本颜色?
- windows - 如何在 Windows CMD 中重命名文件(命令提示符)
- php - 如何以原始函数树枝的形式在我的 var 中取消转义字符串 html?
- java - RecyclerView 在活动中总是空白