@Markiv07

Как сделать проверку гипотезы Гольдбаха на Haskell?

Вот учу хаскель есть код который проверяет гипотезу гольдбаха(Что все чётные числа после 4 можно задать сумой 2х простых)
Вот код
func1 :: [a] -> a
func1 (x:xs) = x

hipo :: Int -> (Int, Int)
hipo a = func1 $
                    filter (\(x,y) -> isPr x && isPr y) $
                    map (\c -> (c, a - c)) [3,5..a `div` 2]
  where
  factors a = filter (isFactor a) [2..a-1]
  isFactor a b = a `mod` b == 0
  isPr 1 = False
  isPr a = null $ factors a

mainFunc :: [Int] -> [(Int, Int)]
mainFunc [] = []
mainFunc (x:xs) = hipo x : mainFunc xs

main :: IO ()
main =  do
print(mainFunc [6,10..17])


Не понимаю как работает вот этот участок кода
hipo :: Int -> (Int, Int)
hipo a = func1 $
                    filter (\(x,y) -> isPr x && isPr y) $
                    map (\c -> (c, a - c)) [3,5..a `div` 2]
  where
  factors a = filter (isFactor a) [2..a-1]
  isFactor a b = a `mod` b == 0
  isPr 1 = False
  isPr a = null $ factors a


Если кто-то разбирается, можете пожалуйста объяснить что там происходит?
  • Вопрос задан
  • 77 просмотров
Решения вопроса 2
@AlexSku
Программист по автоматике
Повтор от предыдущего вопроса:

Тут всё понятно:
Гипотеза: любое чётное (>2) представимо как сумма двух простых.
Берём список нечётных (простые всегда нечётные, кроме 2): [ 3, 5 ..]. Это будет первым слагаемым. Если искомое число a, то второе слагаемое a-c (c - первое слагаемое). Ясно, что список первого слагаемого можно ограничить a `div` 2, т.е. получаем [3,5..a `div` 2].
Дальше фунция map, получая каждый элемент списка (c) формирует пару слагаемых: с - первое, a-c - второе.
Это мы описали map (\c -> (c, a - c)) [3,5..a `div` 2]
Напр., для 10 получим список [(3,7), (5,5)].

Из этого списка надо выкинуть пары, где есть непростые (составные) числа. Напр., для 12 список [(3,9), (5,7)] первая пара выкинется (фильтром), т.к. 9 - составное (делится на 3).
Если в результирующем списке несколько пар, то func1 просто берёт первую (напр., для 10 будет пара (3,7)). func1 это стандартная функция head.
Ну и вспомогательные функции: isPr - проверка на простое число, isFactor - на составное.
Ответ написан
Комментировать
@mikeyuriev
После where идут промежуточные выражения.
В обратных апострофах - инфиксная запись вызова функций (a `div` b - тоже самое, что div a b).
[3, 5..a `div` 2] - генерирует список [3, 5, 7, 9...] и т. д. до a `div` 2
(\c -> (c, a - c)) - это лямбда, возвращает кортеж.

В общем, практичнее для вас будет, наверное, запустить ghci и поиграться со всеми этими штуками по отдельности.

UPD. Вот очень прикольная простая книжка - если с английским дружите: learnyouahaskell.com/chapters . И лекции Москвина на Степике очень хорошие.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы