Я новичок в Haskell. Я пытался решить диофантовое уравнение | x^y-y^x | является простым, используя Haskell, для заданной верхней границы x, y < n.Почему следующий код 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, раскомментировать) нависает для п> 3, в GHCi. Ctrl-C даже не работает. Я должен убить ghc
из Activity Monitor (я нахожусь на Mac).
Любая идея, что я делаю неправильно в xy_yx_p
? Остальные две функции работают нормально.
Заранее спасибо.
Side Примечание: вы можете легко упростить '[(х, у) | x <- [2..n], y <- [(x + 1) .. n], is_prime (abs (x^y - y^x))]. Посмотрите, как никогда не полезно говорить «== Истина»? – dfeuer
Обратите внимание, что 'length [x | x <- xs, px] == 0' может быть написано гораздо приятнее и лениво, так как 'all (not. p) xs' – Cactus
@Cactus: И это намного эффективнее, так как оно разбивается на первый элемент, тогда как 'length xs' придется ждать всего вычисления (если это не пользовательская' length :: Foldable t => t -> Peano' или аналогичная). – Zeta