【发布时间】:2015-12-29 05:13:03
【问题描述】:
我是 Haskell 的新手。我试图解决丢番图方程 |x^y-y^x|是素数,使用 Haskell,对于给定的上限 x, y 。
所以,我写了这个 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,未注释)在 GHCi 中挂起 n > 3。 Ctrl-C 甚至不起作用。我必须从活动监视器中杀死 ghc(我在 Mac 上)。
知道我在xy_yx_p 中做错了什么吗?其他两个功能似乎工作正常。
提前致谢。
【问题讨论】:
-
旁注:您可以轻松简化为
[(x,y) | x <- [2..n], y <- [(x+1)..n], is_prime (abs (x^y - y^x))]。看看说== True从来没有用处? -
请注意,
length [x | x <- xs, p x] == 0可以写得更好,更懒惰,如all (not . p) xs -
@Cactus:效率更高,因为它会在第一个元素上中断,而
length xs将不得不等待整个计算(除非这是自定义的length :: Foldable t => t -> Peano或类似的)。 -
是的,我说的懒惰就是这个意思。但你强调它是短路是对的。
-
@dfeuer:是的,我试过了。我把这个表达式写得如此无聊的原因是因为我想确保我的语义是正确的。但是,在最初的形式中,它看起来像你建议的那样。谢谢。
标签: haskell