Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/14: Рейтинг темы: голосов - 14, средняя оценка - 4.86
17 / 7 / 0
Регистрация: 20.08.2012
Сообщений: 51
1

Решето Эратосфена выполняется слишком долго

26.10.2012, 23:17. Показов 2534. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Следующий код...

Haskell
1
2
3
4
5
6
eratosPrimes :: Int -> [Int]
eratosPrimes n = getEratosPrimes n [] [2..]
    where
        getEratosPrimes :: Int -> [Int] -> [Int] -> [Int]
        getEratosPrimes n result (first:rest) | (length result) >= n = result
                | otherwise = getEratosPrimes n (result ++ [first]) $ [p | p <- rest, not (p `elem` [first * 2, first * 3..])]
...уже при n = 2 выполняется слишком долго (но все же выполняется). Что тут можно или нужно изменить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.10.2012, 23:17
Ответы с готовыми решениями:

Решето Эратосфена
Написал программу, которая выводит список простых чисел: primes = 2: sieve where sieve...

Решето Эратосфена
Добрый день! Помогите пожалуйста написать программу. Заранее всем спасибо) Решето Эратосфена....

Решето Эратосфена
День добрый! При решении задачи на поиск простых чисел задался вопросом, а можно ли реализовать...

Поиск простых чисел выполняется слишком долго
Добрый день, На Лурке в статье Python (http://lurkmore.to/Python) Приводится код скрипта -...

7
Эксперт функциональных языков программированияЭксперт по математике/физике
4300 / 2091 / 431
Регистрация: 19.07.2009
Сообщений: 3,162
Записей в блоге: 24
26.10.2012, 23:54 2
Цитата Сообщение от flammberg Посмотреть сообщение
Haskell
1
not (p `elem` [first * 2, first * 3..])
Я бы побоялся использовать такую конструкцию. А что если p и вправду не будет элементом этого списка, то есть (p `rem` first) == 0? Эта проверка вообще не остановится. Пробовал запустить для n=3 и выше?
Замени её на явную проверку.
Haskell
1
2
3
4
5
6
7
8
eratosPrimes :: Int -> [Int]
eratosPrimes n = getEratosPrimes n [] [2..]
 
getEratosPrimes :: Int -> [Int] -> [Int] -> [Int]
getEratosPrimes n result (first:rest)
    | (length result) >= n  = result
    | otherwise             = getEratosPrimes n (result ++ [first]) $ 
        [p | p <- rest, (p `rem` first) /= 0 ]
А ещё лучше использовать функцию filter, ИМХО, будет понятнее.
0
78 / 64 / 5
Регистрация: 25.03.2012
Сообщений: 71
27.10.2012, 00:05 3
Цитата Сообщение от flammberg Посмотреть сообщение
...уже при n = 2 выполняется слишком долго (но все же выполняется). Что тут можно или нужно изменить?
length result и вставка в конец result ++ [first], но это мелочи.
Тормоз тут not (p `elem` [first * 2, first * 3..]) - проход по всему списку, который теоретически бесконечен (для Integer например), но для Int нет. Переписать можно так:
Haskell
1
2
3
primes' n = take n $ sieve [2 .. ] 
  where
    sieve (x:xs) = x : [k | k <- xs, k `mod` x /= 0]
0
17 / 7 / 0
Регистрация: 20.08.2012
Сообщений: 51
27.10.2012, 00:29  [ТС] 4
Mysterious Light, да, вот так работает хорошо.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36606 / 20334 / 4221
Регистрация: 12.02.2012
Сообщений: 33,654
Записей в блоге: 13
27.10.2012, 20:56 5
Простенькое решето Эратосфена:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-- Удаление из списка заданного числа и всех его кратных
 
delK :: [Integer] -> Integer -> [Integer]
delK [] _ = []
delK (x:xs) y  | ((x `mod` y == 0) && (x > y)) = delK xs y
               | otherwise =   x:(delK xs y)
 
-- Решето Эратосфена (с накапливающими параметрами)
 
sieve' :: [Integer] -> Integer -> Integer -> [Integer]
sieve' x n k = if (k >= (floor . sqrt . fromInteger) n) then x
               else sieve' (delK x k) n (k+1)
 
-- "Парадная" функция
 
sieve :: Integer -> [Integer]
sieve m = sieve' [1..m] m 2
 
 
Main> sieve 100
[1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]
0
17 / 7 / 0
Регистрация: 20.08.2012
Сообщений: 51
27.10.2012, 21:05  [ТС] 6
Catstail, вы написали функцию для вычисления всех простых чисел, меньших заданного. Я же - для вычисления первых n простых чисел.

Кроме того, мне кажется, что вот это неравенство...

Haskell
1
k >= (floor . sqrt . fromInteger) n
...должно быть строгим. То есть, к должно быть строго больше корня из n.
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
36606 / 20334 / 4221
Регистрация: 12.02.2012
Сообщений: 33,654
Записей в блоге: 13
27.10.2012, 22:13 7
Так поиск простых чисел, меньших n и есть по определению решето Эратосфена. Ваша задача сложнее...

Добавлено через 33 минуты
А вот "детское" решение задачи о списке простых чисел:

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
isPrime' :: Int -> Int -> Bool
isPrime' x m | (m > (floor . sqrt . fromInt) x) = True 
             | otherwise = ((x `mod` m) /= 0) && (isPrime' x (m+1))  
 
isPrime :: Int -> Bool
isPrime x = isPrime' x 2
             
primeList' :: Int -> Int -> [Int] -> [Int]
primeList' n m x | length x == n = x
                 | otherwise = if (isPrime m) then primeList' n (m+1) (m:x)
                                 else primeList' n (m+1) x 
                                 
primeList :: Int -> [Int]
primeList n = primeList' n 2 []
 
Main> primeList 100
[541,523,521,509,503,499,491,487,479,467,463,461,457,449,443,439,433,431,421,419
,409,401,397,389,383,379,373,367,359,353,349,347,337,331,317,313,311,307,293,283
,281,277,271,269,263,257,251,241,239,233,229,227,223,211,199,197,193,191,181,179
,173,167,163,157,151,149,139,137,131,127,113,109,107,103,101,97,89,83,79,73,71,6
7,61,59,53,47,43,41,37,31,29,23,19,17,13,11,7,5,3,2]
Добавлено через 5 минут
Цитата Сообщение от calabi-yau Посмотреть сообщение
primes' n = take n $ sieve [2 .. ] where sieve (x:xs) = x : [k | k <- xs, k `mod` x /= 0]
- или я чего-то не понял, но попадаются и составные числа:

Haskell
1
2
3
4
5
6
primes' n = take n $ sieve [2 .. ] 
  where
    sieve (x:xs) = x : [k | k <- xs, k `mod` x /= 0]
 
Main> primes' 10
[2,3,5,7,9,11,13,15,17,19]
0
78 / 64 / 5
Регистрация: 25.03.2012
Сообщений: 71
27.10.2012, 22:54 8
Цитата Сообщение от Catstail Посмотреть сообщение
или я чего-то не понял, но попадаются и составные числа:
да, ошибка
Haskell
1
sieve [k | k <- xs, k `mod` x /= 0]
конечно.
0
27.10.2012, 22:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2012, 22:54
Помогаю со студенческими работами здесь

Сохранение страниц выполняется слишком долго, и текст обрезается
Здравствуйте! Помогите пожалуйста решить следующую проблему. Сайт на wp. Сервер apache 2.2...

Интегрирование заданной функции тремя способами - код выполняется слишком долго
Добрый вечер! Надо сделать лабораторную работу по численным методам. Результат верный, но программа...

Решето Эратосфена
Добрый день, товарищи! Столкнулся с надобностью, отделить с массива простые числа. Хочу сделать...

Решето Эратосфена
**Предисловие** *Для нахождения всех простых чисел не больше заданного числа n, следуя методу...

Решето Эратосфена
В общем задание посчитать количество простых чисел до заданного числа N. Написал такой алгоритм,...

Решето Эратосфена
Добрый день!помогите пожалуйста найти ошибку.код состоит из трех файлов.в первом из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru