在哈斯克尔的毕达哥拉斯三重奏

时间:2018-01-20 08:27:53

标签: haskell math

我需要运行一个Haskell程序,在其中我输入一个数字,并告诉我毕达哥拉斯三角形(a,b,c),以便'a'是输入的数字。就是这样;

pythagoreanTriple :: Integer -> [(Integer, Integer, Integer)]

pythagoreanTriple 25 == [(25,60,65),(25,312,313)]

pythagoreanTriple 20 == [(20,15,25),(20,21,29),(20,48,52),(20,99,101)]

我已经尝试过这种方式,但效率非常低,因为数量较少可以使用,但是当它们要求较高的数字时,它就不起作用。

 pythagoreanTriple :: Integer -> [(Integer, Integer, Integer)]

 pythagoreanTriple n = [(n,b,c) | c <- [2..n^2], b <- [2..c-1], n^2 + b^2 == c^2]

我需要该函数适用于pythagoreanTriple 14578950150,但我无法理解。

如果你不知道毕达哥拉斯三重奏是什么:https://en.wikipedia.org/wiki/Pythagorean_triple

我已经完成了你告诉我的算法,但它没有给出与示例相同的结果,而且需要很长时间。

pythagoreanTriple :: Integer -> [(Integer, Integer, Integer)]
pythagoreanTriple a = [(a,b,c) | c <- [a+1..(a^2+1) `div` 2]
                               , let b = (round . sqrt . fromIntegral) (c^2 - a^2)
                               , a^2 + b^2 == c^2]

1 个答案:

答案 0 :(得分:1)

以下是算法的作用。尝试转换为Haskell,如果卡住了,请编辑您的问题以显示您的位置。

  1. 输入a
  2. 将因素a分解为素数
  3. 从而给出a^2
  4. 的因子分解
  5. 由于a^2+b^2=c^2,我们有a^2=(c-b)(c+b)
  6. a^2 a^2=xy x<y的每个因子分解x>1但不一定是素数或c = (x+y)/2
    1. 获取b = (y-x)/2
    2. 获取(a,b,c)
    3. 输出a=50
  7. 好的这是50的例子:

    1. 输入50=2*5^2
    2. 50^2=2^2*5^4
    3. (x,y)
    4. 不是真正的一步
    5. 因子(1,2500), (2,1250), (4,625), (5,500), (10,250), (20,125), (25,100)为:x>=y其他因素包含x>=a(相当于none, (50,624,626), none, none, (50,120,130), none, none
    6. 对应的输出(存在整数解):await client.delete_message(message)