Решение. Разобъем решение на несколько шагов.

1. Введем свой предикат, показывающий, что a делится нацело на b, т.е. a:b (или тоже самое b|a):

de a b = if ((rem a b) == 0) then True else False

Здесь rem – это функция, возвращающая остаток от деления.

Если он равен нулю, то деление нацело есть.

Будем применять данный предикат так: a `de` b.

2. Определим множество делителей числа n:

divs_of n = [t | t <- [2..(n-1)], n `de` t] 

Список порожден значениями t из интервала от 2 до n-1, которые являются делителями числа n.

3. Теперь зададим предикат, указывающий, является ли аргумент простым числом (для этого проверяем список делителей на пустоту):

isprime x = if null (divs_of x) then True else False

4. Все готово. Зададим требуемое множество:

primeset = [n | n <- [2..], isprime n]

Для проверки работоспособности кода его необходимо скопировать в файл с именем, скажем, prime.lhs, затем запустить интерпретатор ghci и в нем загрузить этот файл командой :l prime.lhs.

После чего можно напечатать первые сто простых чисел командой take 100 primeset. Для интереса попробуйте задать divs_of 360, или проверить isprime (10^100000+1).

(можно загрузить готовый файл и отправить его на исполнение командой ghci primesetUTF.lhs)

Задачи для самостоятельного размышления. Написать оптимизированный код. Например, использовать элементы решета Эратосфена для просмотра делителей. Сделать код компактней. Или написать функцию, ищущию простое число больше данного натурального.

haskell/primex.txt · Последние изменения: 16/10/2010 17:03 — vlasov
CC Attribution-Noncommercial 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0