我是Haskell的新手。我试图解决丢番图方程 | x ^ y-y ^ x |对于给定的上限 x,y<使用Haskell,是素数。 Ñ
所以,我写了这个Haskell代码:
-- list of primes
listprimesupto :: Integral a => a -> [a]
listprimesupto 1 = []
listprimesupto 2 = [2]
listprimesupto n = let halflstprimes = (listprimesupto (n `div` 2))
in halflstprimes++[i|i<-[((n `div` 2)+1)..n], (length [x|x<-halflstprimes, (i `mod` x) == 0])==0 ]
-- is prime?
is_prime :: Integral a => a -> Bool
is_prime 1 = False
is_prime n = let halflstprimes = (listprimesupto (n `div` 2))
in (length [x|x<-halflstprimes, (n `mod` x) == 0])==0
-- solve |x^y - y^x| == prime
xy_yx_p :: Integral t => t -> [(t, t)]
--xy_yx_p n = [(x,y)|x<-[2..n], y<-[2..n], x < y, (abs (x^y-y^x)) `elem` (listprimesupto (n^3))] -- version 1, works but upper limit too small
xy_yx_p n = [(x,y)|x<-[2..n], y<-[2..n], x < y, (let t=abs (x^y-y^x) in is_prime t)==True] -- version 2, hangs for n>3 ...
xy_yx_p n
(版本2,未注释)挂起 n &gt; 3,在GHCi中。 Ctrl-C甚至不起作用。我必须从活动监视器中杀死ghc
(我在Mac上)。
知道我在xy_yx_p
做错了什么?其他两个函数似乎工作正常。
提前致谢。
答案 0 :(得分:8)
那么,如果n = 4
挂起,那么这个案子有什么特别之处呢?好吧,它是t
。对于x = 2
和y = 4
,您将获得
t = abs (2 ^ 4 - 4 ^ 2)
= abs (16 - 16 )
= abs 0
= 0
因此,您在0
中使用is_prime
,因此也在listprimesupto
中使用listprimesupto 0 = let halflstprimes = (listprimesupto (0 `div` 2))
in -- .....
。这导致了永无止境的递归:
listprimesupto n | n <= 0 = []
is_prime n | n <= 1 = False
因此,请确保处理非正面输入:
numeric