661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
|
|||||||||||
1 | |||||||||||
Решето Эратосфена до 0xffffffff19.04.2016, 22:40. Показов 1274. Ответов 23
Метки нет (Все метки)
0
|
19.04.2016, 22:40 | |
Ответы с готовыми решениями:
23
Программа завершилась с кодом -1 (0xffffffff) Решето Эратосфена Решето Эратосфена Решето Эратосфена. |
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
20.04.2016, 11:17 | 3 |
alexu_007, вообще-то решето Эратосфена очень хорошо укладывается тридцатками в байт
Вызвано это тем удивительным фактом, что все простые числа, большие 30, при делении на 30 дают один из 8-ми остатков: 1, 7, 11, 13, 17, 19, 23, 29
0
|
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
|
|
20.04.2016, 14:21 [ТС] | 5 |
Я знаю, и у меня даже реализация этого алгоритма есть. Но там много вычислений и он медленный.
Добавлено через 35 минут Не работает.
0
|
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
|
|
20.04.2016, 17:06 [ТС] | 7 |
bitset ещё есть, как правильно объявить такой массив?
0
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
20.04.2016, 18:09 | 8 |
Посмотрите здесь. Может быть найдете интересное...
Быстрая проверка натурального числа на простоту
0
|
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
|
|
20.04.2016, 20:15 [ТС] | 9 |
Да мне собсна не очень нужно, так, спортивный интерес.
К слову, решето эрастофена до максимума (последнее простое число 4 294 967 279) у меня строится за 37 сек. В 32-битное число влезает ещё одно простое 4 294 967 291, но размера QByteArray для него уже не хватает. Простой перебор делителей работает намного быстрее, вот такое число 10 000 000 000 000 061 нашлось за 0,8 сек, но есть разница - перебор делителей находит одно число, тогда как решето эрастофена всю последовательность от 2 до 4,29 млрд (всего 203 278 090 штук) и оставляет их в памяти. Просто теоретически интересно, как быть, если нужна более длинная последовательность?
0
|
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
|
|
20.04.2016, 20:33 | 10 |
массив чаров откушает столько сколько есть памяти.
0
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
20.04.2016, 20:46 | 11 |
Пиши в файл. Скорость резко упадет, но памяти в твоем распоряжении окажется значительно больше. Известная дилемма "Скорость - Память"
Кстати, упаковка решета тридцатками увеличивает максимальное число в 30/8 раз. Правда, его уже интом не представить, придется к длинной арифметике обращаться... Но если интересуют действительно большие числа, причем любые, а не специальные, типа чисел Мерсена, то без длинной арифметики все равно не обойтись... Добавлено через 7 минут Ой, не уверен я. Памяти может быть у много, не обязательно 2 Гб, как у Винда, а хоть 1000 Гб. Но char X[N]... - N - int. Конечно, все зависит от разрядности, как компа, так и транслятора. Если Комп с трансляторам договорятся, что int = int64, то еще много времени пройдет, пока такая память появится, что int-а не хватит, чтобы ее обслужить
0
|
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
|
|
20.04.2016, 22:20 | 12 |
Я не понял ваш последний пост.
Вообще я думаю лучше хранить эти числа в массиве строк чаров. Чары же позволяют закодировать все что угодно. Маленькие числа будем кодировать 1 байтом, далее 2 байта и так далее. В первом элементе массива у нас буду хранится 1 байтовые инты, во втором элементе 2 -х байтовые и так далее. В первом элементе у нас до 256 и так далее. Таким образом будет экономиться память.
0
|
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
|
|
20.04.2016, 23:30 | 13 |
0
|
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
|
|
21.04.2016, 06:41 [ТС] | 14 |
В файл это несерьёзно... жизни не хватит. Массив char интереснее, но там нада как-то c битами работать - нужно подумать. До длинной арифметики ещё далеко, т.к. есть quint64 - быстродействия и на него не хватит.
Всем спасибо. А bitset сдулся всего на 16 млн., код "bitset<17000000> buff;" закончился ошибкой. QbitArraw круче, там 2 млрд. с хвостиком.
0
|
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
|
||||||
21.04.2016, 10:22 | 15 | |||||
Его нужно создавать динамически.
0
|
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
|
|
21.04.2016, 10:43 | 16 |
Так что в итоге надо получить? Если массив бит то:
char a[1000000]; char[0] = 0b00110101 2,3,5,7 Это 0х35 символ '5' char[1] = 0b00010100 11,13 Это 0х14 символ DC4 и т.д. Берете порцию из восьми чисел и записываете их в соответствующий элемент. Было предложено 30 чисел в 1 байт, но долго вроде будет, а вы не делите, помещайте 8 чисел. А вообще можно в два потока считать для скорости. Один пусть считает до определенного числа а другой больше
0
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
21.04.2016, 10:56 | 17 |
Позвольте выразить сомнения... Потенциально тут уже содержится сокращение времени, так как проверять надо меньше чисел и на меньшее количество надо делить... Так что все зависит от вашего алгоритма и радиуса кривизны рук. А вынимать простые (и потенциально простые) числа из упаковки "30 в 8", ну это в самом деле просто и совершенно незатратно по времени.
0
|
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
|
|
21.04.2016, 11:00 | 18 |
Вы пропустили слово вроде, так сказал автор, я не проверял. По памяти намного лучше. Надо еще в несколько потоков для скорости
0
|
661 / 662 / 106
Регистрация: 29.05.2015
Сообщений: 3,967
|
||||||
21.04.2016, 20:27 [ТС] | 19 | |||||
Программа компилируется, запускается - и сразу вылетает с ошибкой: Erastofen.exe завершился с кодом -1073741819. Что я делаю не так?
0
|
21.04.2016, 20:42 | 20 |
try{ bitset<N> *bs = new bitset<N>; bs[2] = true; } catch (std::exception& e) { qDebug() << e.what(); }
0
|
21.04.2016, 20:42 | |
21.04.2016, 20:42 | |
Помогаю со студенческими работами здесь
20
Решето Эратосфена Решето Эратосфена Решето Эратосфена Решето Эратосфена Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |