Variables 求解并产生一个给定集合所索引的变量和方程(Haskell)

Variables 求解并产生一个给定集合所索引的变量和方程(Haskell),variables,haskell,indexing,linear-equation,Variables,Haskell,Indexing,Linear Equation,我想在Haskell中解决以下问题: 设n是一个自然数,a=[d_1,…,d_r]是一组正数 我想找到下列方程的所有正解: n=Sum d_i^2 x_i 例如,如果n=12和集合A=[1,2,3]。我想在自然数上解以下方程: x+4y+9z=12. 使用以下代码就足够了: [(x,y,z) | x<-[0..12], y<-[0..12], z<-[0..12], x+4*y+9*z==12] [(x,y,z)| x一些提示: 最终,您希望编写具有此签名的函数: solu

我想在Haskell中解决以下问题:

设n是一个自然数,a=[d_1,…,d_r]是一组正数

我想找到下列方程的所有正解:

n=Sum d_i^2 x_i

例如,如果
n=12
和集合
A=[1,2,3]
。我想在自然数上解以下方程:

x+4y+9z=12.
使用以下代码就足够了:

[(x,y,z) | x<-[0..12], y<-[0..12], z<-[0..12], x+4*y+9*z==12]
[(x,y,z)| x一些提示:

最终,您希望编写具有此签名的函数:

solutions :: Int -> [Int] -> [ [Int] ]
示例:

solutions 4 [1,2]  == [ [4,0], [0,1] ]
  -- two solutions: 4 = 4*1^2 + 0*2^2,  4 = 0*1^2 + 1*2^2

solutions 22 [2,3]  == [ [1,2] ]
  -- just one solution: 22 = 1*2^2 + 2*3^2

solutions 10 [2,3]  == [ ]
  -- no solutions
步骤2.根据列表结构递归定义
解决方案

solutions x [a] = ...
  -- This will either be [] or a single element list

solutions x (a:as) = ...
  -- Hint: you will use `solutions ... as` here
一些提示:

最终,您希望编写具有此签名的函数:

solutions :: Int -> [Int] -> [ [Int] ]
示例:

solutions 4 [1,2]  == [ [4,0], [0,1] ]
  -- two solutions: 4 = 4*1^2 + 0*2^2,  4 = 0*1^2 + 1*2^2

solutions 22 [2,3]  == [ [1,2] ]
  -- just one solution: 22 = 1*2^2 + 2*3^2

solutions 10 [2,3]  == [ ]
  -- no solutions
步骤2.根据列表结构递归定义
解决方案

solutions x [a] = ...
  -- This will either be [] or a single element list

solutions x (a:as) = ...
  -- Hint: you will use `solutions ... as` here

您可以使用带有
do
-符号的递归调用来代替列表理解

这有点棘手,因为您必须正确处理边缘情况,我允许自己进行一些优化:

solve :: Integer -> [Integer] -> [[Integer]]
solve 0 ds = [replicate (length ds) 0]
solve _ [] = []
solve n (d:ds) = do
  let maxN = floor $ fromIntegral n / fromIntegral (d^2)
  x <- [0..maxN]
  xs <- solve (n - x * d^2) ds
  return (x:xs)
评论
当处理负数时,这将失败-如果您需要负数,您将不得不引入更多的情况-我相信您已经解决了它们(在这一点上,它实际上比Haskell更复杂)

而不是列表理解,您可以对列表单子使用带
do
-符号的递归调用

这有点棘手,因为您必须正确处理边缘情况,我允许自己进行一些优化:

solve :: Integer -> [Integer] -> [[Integer]]
solve 0 ds = [replicate (length ds) 0]
solve _ [] = []
solve n (d:ds) = do
  let maxN = floor $ fromIntegral n / fromIntegral (d^2)
  x <- [0..maxN]
  xs <- solve (n - x * d^2) ds
  return (x:xs)
评论
当处理负数时,这将失败-如果你需要负数,你将不得不引入更多的例子-我确信你能解决它们(这一点上比Haskell更复杂)

你在寻找这个
[(x,y,z,n)|我需要更多的变量。变量的数量与集合A的基数相同。如果集合A是A=[1,2,3,4,6],那么方程是A+2b+9c+16d+36e=n。你需要基数走多远?你在寻找这个
[(x,y,z,n)|我需要更多的变量。变量的数量与集合A的基数相同。如果集合A设为A=[1,2,3,4,6]。那么方程是A+2b+9c+16d+36e=n。你还需要多少基数?集合A的基数根本不会改变,甚至“n”都是固定的。@没有人应该读这个问题:“我的问题是,如果n不固定,集合A也不固定。"我的意思是,你的解决方案的集合A和'n'不会改变。对不起,我不知道你在说什么-这两个例子使用不同的
n
和不同的
A
作者需要集合A是一组基本变量,如果我没有弄错的话,可以按平方改变。集合A的基数根本不会改变,even'n'是固定的。@没有人应该读这个问题:“我的问题是如果n不固定,集合A也不固定。”我的意思是你的解决方案的集合A和'n'不会改变。对不起,我不知道你在说什么-这两个例子使用不同的
n
和不同的
A
作者需要集合A是一组基本变量,如果我没有弄错的话,可以按平方改变。