мета-данные страницы
  •  
Загрузка не удалась. Возможно, проблемы с правами доступа?

Это старая версия документа!


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

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)

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