我需要运行一个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]
答案 0 :(得分:1)
以下是算法的作用。尝试转换为Haskell,如果卡住了,请编辑您的问题以显示您的位置。
a
a
分解为素数a^2
a^2+b^2=c^2
,我们有a^2=(c-b)(c+b)
a^2
a^2=xy
x<y
的每个因子分解x>1
但不一定是素数或c = (x+y)/2
:
b = (y-x)/2
(a,b,c)
a=50
好的这是50的例子:
50=2*5^2
50^2=2^2*5^4
(x,y)
(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
)await client.delete_message(message)
。