Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Тут 17438916 по быстрому накидал простой генератор простых чисел. Генерит первые 100 млн. за секунду, дальше начинается тормоз. Там же узнал про решето Эратосфена и Аткина. Решил потестить. Чего бы где не писали, но у меня получилось что Эратосфен быстрее Аткина в 3 раза на первых 800 млн. (дальше Аткин не может, похоже разрядности unsigned int не хватает). Победитель, использует 62 Мб для рачета до 10^9 (запостите в википедию кто может, вектор prime выкинуть, printf() разремить): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. Решето Аткина Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. Обоих с википедии взял. Допилил сколько смог. Добавил биткарту. Правда в Эратосфене она в два раза меньше, т.к. четные пропустил. В Аткине так не получилось, т.к. второй цикл (по 5-кам попадает на четные). Но и с биткартой без четных он все равно медленнее (в 2,5 раза), поэтому не стал дальше разбираться. Если кто будет ускорять Аткина - постите сюда что получилось. Мое ИМХУ в Аткине слишком много получения остатка от деления, а память нынче достаточно быстрая, поэтому Эратосфен быстрее, т.к. там только битовые операции. И потом Эратосфена проше досчитывать. Асинхронный Эратосфен. Получение следующего простого после X Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. Действительно ли числа простые : сравнивал результаты разных алгоритмов между собой, до 100 млн. с 17438916 , до 800 млн. с Аткиным, до 2 млрд. синхронного и асинхронного Эратосфенов, дальше они считают, но памяти в x32 не хватает чтобы результаты обоих хранить, а так асинхронный до 3 млрд. за 15 сек считает. ИМХУ можно под x64 переточить, но это уже лишнее, надо больше - есть мат.либы. Модератор: По просьбе автора ссылки изменены next_prime32.h next_prime64.h Тесты и примеры использования ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2015, 20:30 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Сразу скажу что я еще нечитал эти сорцы. Но поверхностно... не вижу в них новой идеи. Поэтомо воспроизведу свои старые мысли по сабж. Поиск и исследование простых чисел это увлекательнейшая часть математики. Если ее копнуть глубоко то ты зацепишь краем практически ВСЕ разделы математических наук. По поводу "решета". Я считаю его неэффективным на больших числах. Потому-что плотность простых чисел падает от величины. Чем больше ваше искомое prime-число тем больше "холостых вычёркиваний" в биткарте вам нужно сделать. В конце-концов поиск упирается в эффективность использования памяти. Для современной рабочей станции (адресующей 16Гб) можно адресовать примерно. 16Гб = 17,179,869,184 байт = 137,438,953,472 бит = bitcartCap Тоесть 137 млрд Количество простых чисел на этом интервале (ЕМНИП) равно n/ln(n). Посчитаем приблизительно. 137,438,953,472 / ln (137,438,953,472) ~ 5 358 986 394 Тоесть 5 млрд простых чисел в биткарте. А какова эффективность? Примерно на 26 бит приходится 1 простое число. И с ростом числа эта самая эффективность хранения будет падать. Надеюсь я не ошибся. Если что - прошу поправить. Как считать дальше? - Неизвестно. Возможно по биткарте можно построить итератор и извлекать из него биты но эффективность этого метода у меня под вопросом. Так что после генерации биткарту следовало-бы уничтожить и данные сохранить в обычный вектор. И положить в текстовый файл. Можно мечтать и расчитывать что старик Мур еще подкинет нам сюрпризы типа удвоения объёма памяти за ту-же цену. Но.... я-бы не особо на это надеялся. Primes - коварны. И как-только мы выйдем из одной трудности - тут-же вступим в другую. Хотя-бы рассмотреть неэффективность "арифметического деления по модулю" для целых чисел длинной 64, 128, 256 бит. Интересно также рассмотреть различные варианты сжатия биткарт. Использования деревьев для хранения таких "разрежённых" объемов. И прочих нестандартных структур. P.S. Жаль Базист сбежал. Он вобщем-то был неплохой оппонент и собеседник по структурам данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2015, 21:26 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonне вижу в них новой идеи. Ее не было. Я же написал тестил старые. Все пишут что что Аткин быстрее Эратосфена. У меня обратное получилось. maytonДля современной рабочей станции (адресующей 16Гб) можно адресовать примерно. 16Гб = 17,179,869,184 байт = 137,438,953,472 бит = bitcartCap Тоесть 137 млрд еще на 2 умножь, четные выкинул, 1 байт = 16 чисел. maytonТак что после генерации биткарту следовало-бы уничтожить и данные сохранить в обычный вектор. И положить в текстовый файл. Мой асинхронный вариант так и делает. Кэширует результаты и досчитывает небольшой биткаротой сверх предыдущего расчета. Цели считать далеко не ставил. Эратосфеном можно посчитать простое X зная все простые до sqrt(X), т.е. с 16 Гб памяти можно рассчитать простое порядка 5*10^22. В принципе алгоритм параллелится. Изначально цель была простая: не вставлять в код статические таблицы, заменить быстрым генератором. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2015, 21:50 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TЕе не было. Я же написал тестил старые. Все пишут что что Аткин быстрее Эратосфена. У меня обратное получилось. Да это странно. Интересно профилировать метод Аткина чтобы понять что можно улучшить. еще на 2 умножь, четные выкинул, 1 байт = 16 чисел. Это плюс. А если-б ты еще и "тройки" виртуально выкинул? А? Мой асинхронный вариант так и делает. Кэширует результаты и досчитывает небольшой биткаротой сверх предыдущего расчета. Цели считать далеко не ставил. Эратосфеном можно посчитать простое X зная все простые до sqrt(X), т.е. с 16 Гб памяти можно рассчитать простое порядка 5*10^22. В принципе алгоритм параллелится. Изначально цель была простая: не вставлять в код статические таблицы, заменить быстрым генератором. Кстати MOD(x,12) по Уоррену заменяется на одно умножение на магическое число и на один shift магическое число раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2015, 22:22 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Дмитрий, если не ошибаюсь очень слабо растёт. Потому сложности алгоритмов должны быть сравнимы с константой, и разница должна быть заметна на очень больших объёмах, хоты бы 10^50 элементов. Может быть я путаю конечно, но по-моему так. Мы сейчас уехжаем, потому сегодня не смогу сам написать код и проверить (( Завтра займусь :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2015, 02:10 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonПримерно на 26 бит приходится 1 простое число. Хорошая мысль, в векторе хранить невыгодно. Посчитал статистику. В диапазоне х32 в моей биткарте получается в среднем 11 бит на число. В векторе 32, т.е. биткарта в 3 раза меньше памяти расходует. Биткарта 256 Мб на все числа до 2^32. Чисел ~190 млн., т.е. массив будет 760 Мб. Я поэтому от int64 отказался. Статистика расчета 4 млрд. по 100 млн.Расчет доКол-во простыхСреднее распределениеВремя расчета мс1000000005761456182602000000005317482192803000000005173388202414000000005084001203505000000005019541203316000000004968836211907000000004928228214418000000004893248213109000000004863036213101000000000483831921381110000000048149362130120000000047922352153113000000004773628215511400000000475714022301500000000474105522661160000000047253052278117000000004711186223018000000004699403221001190000000046855062230200000000046743592220210000000046642392210722200000000465359622202300000000464481822124224000000004633507223025000000004624924222026000000004618796221642270000000046080252230280000000046000662220290000000045937532216633000000000458552622303100000000457910422203200000000457216422303300000000456502422191234000000004559367223035000000004554137222036000000004547803223137000000004542381232183380000000045366772330390000000045304312330400000000045251872320 Время неравномерно, т.к. дорасчет идет порциями +12,5% (max_prime/8*9, в изначальном варианте было +20%, поправил чтоб за разрядность х32 не вылезти) maytonКоличество простых чисел на этом интервале (ЕМНИП) равно n/ln(n) Если так, то в биткарте всегда плотность хранения будет выше чем в массиве, т.к. ln(2^N) < N maytonДа это странно. Интересно профилировать метод Аткина чтобы понять что можно улучшить. ... Кстати MOD(x,12) по Уоррену заменяется на одно умножение на магическое число и на один shift магическое число раз. Надо поискать чудоформулу, это должно заметно ускорить Аткина. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2015, 07:49 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
SashaMercuryДмитрий, если не ошибаюсь очень слабо растёт. Потому сложности алгоритмов должны быть сравнимы с константой, и разница должна быть заметна на очень больших объёмах, хоты бы 10^50 элементов. Может быть я путаю конечно, но по-моему так. Судя по моим замерам похоже что так: 1 млрд ~5 сек, 3 млрд ~15 сек. Тут проблема в другом, для больших чисел памяти надо много под биткарты. Хотя тоже решаемо: для поиска следующего простого после любого X можно сгенерить кусок биткарты в 5 Мб (70 млн. чисел если тут не ошибаются ) и последовательно инициализировать ее всеми простыми до sqrt(X + 70 млн). В общем чем больше диапазон покрывает биткарта, тем больше чисел находится за раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2015, 08:13 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TmaytonКоличество простых чисел на этом интервале (ЕМНИП) равно n/ln(n) Если так, то в биткарте всегда плотность хранения будет выше чем в массиве, т.к. ln(2^N) < N maytonДа это странно. Интересно профилировать метод Аткина чтобы понять что можно улучшить. ... Кстати MOD(x,12) по Уоррену заменяется на одно умножение на магическое число и на один shift магическое число раз. Надо поискать чудоформулу, это должно заметно ускорить Аткина. Я не очень понял твою формулу ln(2^n) < N. Откуда она? По поводу Уоррена я немного ошибся. Старик писал про оптимизацию целочисленного деления. Вот из моих сорцов. К сожалению делители только до 10. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Но для расчёта остатков нетрудно дописать еще разность и умножение. Код: plaintext 1. По поводу Аткина. Я обращаю внимание наwikiНиже представлена реализация упрощённой версии на языке программирования C++, иллюстрирующая основную идею алгоритма — использование квадратичных форм: Что означает упрощённая ? Грубая? Без оптимизаций? Краткая? Ну и ... стоить покурить ассемблер. Недавно с Сашиком обсуждали тему получение и частного и остатка одним махом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2015, 08:26 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonЯ не очень понял твою формулу ln(2^n) < N. Откуда она? Из твоей вывел: maytonКоличество простых чисел на этом интервале (ЕМНИП) равно n/ln(n) Для обычного хранения числа размера 2^N надо N бит хранение массивом N * 2^N / ln(2^N) бит биткартой 2^N бит делим, получаем 1 биткарта = N / ln(2^N) = 1/ln(2) = 1,4427 массива т.е. плотность хранения в биткарте всегда будет выше в 1,4427. Т.к. я четные выкинул, то моя биткарта всегда будет занимать меньше места в 2,885 раза по сравнению с массивом. maytonПо поводу Уоррена я немного ошибся. Старик писал про оптимизацию целочисленного деления. Вот из моих сорцов. К сожалению делители только до 10. Направление понял. Можно попробовать подбором поискать. Может есть. Остаток от деления на 5 тоже пригодится. Тут только минус - запас разрядности надо. Если не путаю, на x32 сдвиги 32 битами ограничены. Надо на x64 тестить. maytonПо поводу Аткина. Я обращаю внимание наwikiНиже представлена реализация упрощённой версии на языке программирования C++, иллюстрирующая основную идею алгоритма — использование квадратичных форм: Что означает упрощённая ? Грубая? Без оптимизаций? Краткая? Просто корявая какая-то, расчет квадратов оптимизирован, а при считывании результатов вместо того чтобы сделать циклу шаг 2 добавили проверку кратности 3 и 5. С забавным примечанием. Я немного причесал, но не уверен что алгоритм полностью соблюден. Надо еще поискать реализации и в алгоритм посильнее вникнуть, я не понял зачем там инверсии битов. maytonНу и ... стоить покурить ассемблер. Недавно с Сашиком обсуждали тему получение и частного и остатка одним махом. Я там c вами курил, есть команда div в асме, в си div(), только компилятор MS ее в функцию обернул и в тормоз превратил. Надо глянуть во что % компилируется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2015, 09:14 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TНадо глянуть во что % компилируется. Глянул, ничего лишнего: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Значит тормоза внутри проца ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2015, 09:55 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TДля обычного хранения числа размера 2^N надо N бит хранение массивом N * 2^N / ln(2^N) бит биткартой 2^N бит делим, получаем 1 биткарта = N / ln(2^N) = 1/ln(2) = 1,4427 массива т.е. плотность хранения в биткарте всегда будет выше в 1,4427. Т.к. я четные выкинул, то моя биткарта всегда будет занимать меньше места в 2,885 раза по сравнению с массивом. Я понял почему я тебя не понял. Я разрядность int не считал. Мои увлечения primes охладели с резкой нехваткой оперативки. И я вобщем-то не планировал использовать массивы. Меня интересовали дисковые способы хранения расчитанных primes. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2015, 10:06 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TЗначит тормоза внутри проца Это краеугольный камень криптографии. Именно принципиальная невозможность оптимизировать DIV/MOD (в частности факторизацию) обеспечивает безопасность нам всем сегодня. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2015, 10:08 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
mayton, криптография оперирует простыми числами несравнимо больше 10^9, эти алгоритмы к ней отношения не имеют, так что оптимизация div для неё бесполезна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2015, 10:20 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonИ я вобщем-то не планировал использовать массивы. Меня интересовали дисковые способы хранения расчитанных primes. Выше писал как бесконечно можно генерить с минимум 5 мб оперативки: генеришь до 5 млн, пишешь в файл, делаешь решето под 5-10, считываешь посчитанные последовательно с файла до sqrt(10 млн), каждым числом проходишь по решету, получаешь все простые в интервале 5-10, результат в конец файла, и т.д. пока место на диске не кончится Написал, подумал, затестил: кусками по 5 мб в два раза быстрее считает чем в один проход. До 10^9 было 4,5 сек Код: plaintext 1. Стало 2,65 после замены на Код: plaintext 1. Заменил на +1 Мб стало 2.53 сек. Наверно потому что в L3 кэш проца целиком ложится. А когда одним большим куском считешь гоняется проц-память при каждом проходе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2015, 10:46 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Можно назвать этот метод "Хождение по решёткам". (Решетам?) P.S. Как будете решето в множ. числе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2015, 13:29 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Асинхронный Эратосфен Версия 2.0 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. Учел все вышенайденное. Скорость возросла в 2 раза по сравнению с синхронным. До 4 млрд. за 8.7 сек. Что поменялось: 1. За раз считается 1 млн. значений (64 Кб биткарты). 2. Экономнее расходуется память. Массив найденных не хранится. Только биткарта, она компактнее почти в 3 раза. Особенность: почти половина времени уходит на чтение результатов: Код: plaintext 1. после Код: plaintext 1. 2. Т.е. если надо много раз пройтись по расчитанному - лучше закэшировать в массив. В предыдущем варинте сразу писалось в массив, поэтому нельзя было съэкономить на ненужных сохранениях. Если сразу второе запустить то будет 8,7 сек., т.е. на 0,3 сек медленнее. Плата за экономию памяти. В первом случае выделяется сразу столько, сколько нужно. Проверка что до 4 млрд посчитано правильно прошла успешно Код: plaintext 1. 2. 3. 4. 5. 6. То же самое x64Не совсем x64, должно работать до 64 млрд., дальше realloc() не выделит более 4 Гб под биткарту. Сравнивал до 4 млрд. с версией х32 дальше чего нагенерит не проверял. При компиляции под x64 работает так же быстро, под x32 в 1,5 раза медленнее. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. По поводу Аткина: 1. Эмулятор %12 не взлетит на x32 даже если его найти. Т.к. битовые сдвиги 64-битных переменных в x32 реализованы программно. 2. Аткин медленнее в 5,6 раза этого варианта. Вывод: заход далеко за область расчета не дает посчитать более чем до 800 млн. на x32. Возможно на x64 взлетит если переделать на расчет кусками, но я эти подвиги не буду совершать, оставим поле для творчества следующим поколениям :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2015, 20:39 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Круть. Поверхностный code-review даже ни к чему ни цепляется. Думаю что улучшать можно только в направлении теории алгоритмов или спуска на уровни Ассемблеров. Еще есть одно решето. Еще один алгоритм одного индуса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2015, 21:34 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Ребята, что со скоростью ? Можно показать таблицу для 10^7,10^8, 10^9 для двух методов, со значениями скорости и памяти, пожалуйста ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 01:58 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Где бы запустить эти алгоритмы для 10^20 элементов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 02:39 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Кстати, почему отсев Аткина завязан на числе 60 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 07:07 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Дмитрий, так у тебя упрощенный вариант, я сначала не понял. Деление происходит на 12. В оригинальной работе , используется число 60. И как я понял, это число должно динамически менять в зависимость от мощности исследуемого множества ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 08:28 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Здесь .... эээ думаю помогут мои исторические знания. 60 - это основание древней вавилонской системы счисления. 60 уникально тем что имеет следующие делители 1,2,3,4,5,6. С шагом 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 08:34 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
SashaMercuryРебята, что со скоростью ? Можно показать таблицу для 10^7,10^8, 10^9 для двух методов, со значениями скорости и памяти, пожалуйста Я-бы предложил для начала прогнать модульный тест на корректность. Иначе мы в погоне за скоростью забудем самое главное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 09:02 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Затестил x32 версию - ищет все до 2^32. Ошибок нет, только зацикливается после последнего. чтобы возвращала 0 по окончании, после строчки Код: plaintext 1. добавить Код: plaintext 1. 2. 3. 4. SashaMercuryРебята, что со скоростью ? Можно показать таблицу для 10^7,10^8, 10^9 для двух методов, со значениями скорости и памяти, пожалуйста Памяти надо 1 байт на каждые 16 чисел. Т.е. для расчета 10^9 надо ~62 Мб. Реально довыделяется +20% к имеющемуся, чтобы не сильно тормозило из-за realloc() Скорость померь сам. Пример замера скорости Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. У меня такой результат10^7=10000019 time 20 msec 10^8=100000007 time 110 msec 10^9=1000000007 time 1101 msec all to 10^9=1000000007 time 2143 msec Для чистоты эксперимента последнего замера, чтобы исключить перевыделение памяти, задай в next_prime() сразу выделение максимума Код: plaintext 1. вместо if(bm_size_new > 0xB000000) ... SashaMercuryГде бы запустить эти алгоритмы для 10^20 элементов Если считать все до 10^20, то надо под хранение результата ~10^19 байт или 10^7 терабайт, думаю мало у кого столько есть. Задача отпадает. Можно попробовать посчитать какой-нибудь диапазон, например 10^20...10^20 + 70 млн., для этого надо посчитать все до 10^10 (625 Мб памяти под хранение). Инициализировать ими решето только для этого диапазона и снять результат. Только тут засада, 64 битная переменная до 1,8*10^19. Можешь порешать задачу: поиск максимально большого простого x64. Думаю за минуту должно посчитаться. Дальше все резко усложняется из-за ограничения разрядности целых переменных. maytonЕще есть одно решето. Еще один алгоритм одного индуса. Решето Сундарама Оно (как и Аткин) заточено на поиск всех от 1 до N. mayton, просьба, добавь в первый пост ссылку на окончательный вариант В конец: UPD Асинхронный Эратосфен. Версия 2.0 17451792 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 09:23 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonЯ-бы предложил для начала прогнать модульный тест на корректность. Иначе мы в погоне за скоростью забудем самое главное. Это было с самого начала. Делал проверки: Dima T Действительно ли числа простые : сравнивал результаты разных алгоритмов между собой, до 100 млн. с 17438916 , до 800 млн. с Аткиным, до 2 млрд. синхронного и асинхронного Эратосфенов. Проверка от 4 млрд. до 2^32 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Так все можно, только ждать устанешь, эти 250 млн. проверялись с полчаса По хорошему еще бы на пропуски проверить после 800 млн. До 800 совпало с Аткиным, а после алгоритмы одинаковые. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 09:36 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TЕсли считать все до 10^20, то надо под хранение результата ~10^19 байт или 10^7 терабайт, думаю мало у кого столько есть. Задача отпадает. Можно попробовать посчитать какой-нибудь диапазон, например 10^20...10^20 + 70 млн., для этого надо посчитать все до 10^10 (625 Мб памяти под хранение). Инициализировать ими решето только для этого диапазона и снять результат. Только тут засада, 64 битная переменная до 1,8*10^19. Можешь порешать задачу: поиск максимально большого простого x64. Думаю за минуту должно посчитаться. Дальше все резко усложняется из-за ограничения разрядности целых переменных. Яж говорил. Primes - коварны. Кажущаяся простота первых результатов - воодушевляет. Но как только - только ты выходишь на очередной уровень размеров (256-2048 бит) - начинают "стрелять" различные технические ограничения. То компиллятор не умеет то железка не тянет то хард диск мал. Ну ладно. Это лирика. Давайте порассуждаем. Есть Эратосфен. Это - серебрянная пуля. Он - стреляет. Он пока эффективнее всяких индусов и прочих Шматкинов-Рабиновичей. Он - реально эффективнее моего pbfa - который я постил лет 4 - 5 назад. И мы реально умеем посчитать все primes за 8 сек до 4 млрд. Но что делать дальше? Нам надо придумать алгоритм репликации всех вычёркиваний на следующее решето от 4 до 8 млрд. на основании того что уже расчитано. Вопрос - как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 10:08 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Марк, а мы разве разобрались с Аткином ? У нас пока только упрощенный алгоритм. Оригинальный алгоритм не реализован ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 10:16 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonНам надо придумать алгоритм репликации всех вычёркиваний на следующее решето от 4 до 8 млрд. на основании того что уже расчитано. Вопрос - как? На самом деле просто, уже писал как (надо два решета 1...sqrt(X) и X...X+70 млн.), вопрос только как код оформить чтобы было универсально и пользоваться удобно. Текущая реализация заточена на то чтобы быть готовой дать от 1 до X. Для больших Х не подходит. Можно сделать поиск ближайшего больше Х, без кэширования результатов, но тогда несколько подряд медленно будут выбираться. Можно запрашивать диапазон X1 ... X2, тогда как-то надо инициализировать этим диапазоном (верхняя граница нужна). Классы не хочу, глобальных переменных тоже, а как при этом все красиво в одну функцию упихать не придумал. В идеале должно также остаться next_prime(X). Думаю пока ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 10:38 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
SashaMercuryМарк, а мы разве разобрались с Аткином ? У нас пока только упрощенный алгоритм. Оригинальный алгоритм не реализован Саш, займись. Даже если не взлетит, то хотя бы им проверим корректность Эратосфена. Для начала надо простейшую корректную реализацию, без оптимизаций, без биткарт (массив bool подойдет), главное чтобы работало, а дальше будем допиливать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 10:59 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TSashaMercuryМарк, а мы разве разобрались с Аткином ? У нас пока только упрощенный алгоритм. Оригинальный алгоритм не реализован Саш, займись. Даже если не взлетит, то хотя бы им проверим корректность Эратосфена. Для начала надо простейшую корректную реализацию, без оптимизаций, без биткарт (массив bool подойдет), главное чтобы работало, а дальше будем допиливать. Через полтора часа начну :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 11:23 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
SashaMercuryЧерез полтора часа начну :) Главное без оптимизаций, чтобы читаемо было. Для начала достаточно чтобы до 1000 считал. У меня вопрос по нему есть: нужны ли ему четные клетки решета? В реализации из википедии я не смог от них избавиться. Поэтому там биткарта в два раза больше места занимает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 11:33 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
SashaMercuryМарк, а мы разве разобрались с Аткином ? У нас пока только упрощенный алгоритм. Оригинальный алгоритм не реализован Если честно для меня оригнальный документ Prime sieves using binary quadratic forms - A.O.L. Atkin , D.J.Bernstein - сложен для понимания. И я пока не знаю как его реализовать. Wiki описывала понятно. Но если это не оригинальный - тогда я временно отложу своё мнение в сторонку. Посмотрю какие будут у вас успехи с этим Шматкины-Бернштейном. Ради интереса поискал сравнение. http://stackoverflow.com/questions/5235865/comparison-of-sieve-of-sundaram-and-sieve-of-atkin-for-generating-a-list-of-prim In theory: The sieve of Sundaram has an arithmetic complexity O(n log n). The basic sieve of Eratosthenes has arithmetic complexity O(n log log n). Optimized variants of the sieve of Eratosthenes have arithmetic complexity O(n). The sieve of Atkin has not only arithmetic but also bit complexity O(n/log log n). A magical sieve where you are given the primes, in order, takes time O(n/log n). In practice, the sieve of Sundaram is so slow that no one uses it, and the sieve of Atkin is slower than optimized Eratosthenes variants (although it's at least competitive). Perhaps one day Atkin or something else will displace Eratosthenes but it's not likely to happen soon. (Also, there's no such thing as magic.) Последний абзац я пробую перевести. Вот что у меня вышло. На практике, решето Сундарама настолько медленно, что никто его не использует, и решето Аткина медленнее, чем оптимизированные варианты Эратосфена (хотя это последнее спорно). Возможно, в один прекрасный день Аткин или какой-либ другой алгоритм будет вытеснять Эратосфена, но это вряд ли произойдет в ближайшее время. Чудес не бывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 12:01 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TSashaMercuryЧерез полтора часа начну :) Главное без оптимизаций, чтобы читаемо было. Для начала достаточно чтобы до 1000 считал. У меня вопрос по нему есть: нужны ли ему четные клетки решета? В реализации из википедии я не смог от них избавиться. Поэтому там биткарта в два раза больше места занимает. судя по алгоритму нужны ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 12:37 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Начало пока такое Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 13:18 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
смысл примерно такой. Но я где-то ошибся, пока данный код работает неккоретно Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 13:58 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Прошу прощение, это не решает проблему, но всё же Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 14:11 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Ребята, исправил практически. Ещё какая-то мелочь осталась Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 14:22 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Сегодня уже не доделаю( Завтра утром постараюсь закончить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 14:52 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Коллеги исходники в форуме это хорошо. Но может давайте постить больше идеи и результаты? А для сорцов я создам SVN. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 15:11 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Коллеги. Я вам щяс подкину концептуальный код. А вы подумайте... Взлетит не? Не тестил. Интересует не компилляция а теоретическая полнота. Интересует перформанс и возможные оптимизации. Интересует масштабирование и мета-компилляция. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Прошу не придираться к возможным ошибкам. Это более идея чем реализация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 15:26 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonКоллеги. Я вам щяс подкину концептуальный код. А вы подумайте... Взлетит не? Не понял это Код: plaintext 1. раз код концептуальный, пиши без Сишной каши с вычислениями в условиях. Это тоже самое: Код: plaintext 1. 2. Фигня какая-то. А в целом, как понимаю, идея считать остаток от деления счетчиками. ИМХУ может взлететь. maytonКоллеги исходники в форуме это хорошо. Но может давайте постить больше идеи и результаты? А для сорцов я создам SVN. +1 Саш, не замусоривай топик, прячь хотя бы под спойлер. А по хорошему кидай только готовое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 16:32 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Я уберу чуть позже под спойлеры. Никто не против? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 16:37 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Немного отвлеку вас. Нашёл страничку. Онлайн факторизатор. http://ru.numberempire.com/numberfactorizer.php Вот такое вот число Код: plaintext 1. было разложено на множители менее чем за сек. Код: plaintext 1. Вам интересно, как? Мне - да. Мне интересно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 16:40 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TФигня какая-то. А в целом, как понимаю, идея считать остаток от деления счетчиками. ИМХУ может взлететь. Я пытался эмулировать решето без самого решета. По сути конечным автоматом без состояния. Моё решето делает лишние калькуляции от 2 до первого делителя впрочем это не должно влиять на выхлоп. Здесь трудность - оценить насколько грузят CPU верчения круговых счётчиков и сверка на не ноль с отсечениями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 16:43 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 16:50 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonВам интересно, как? Мне - да. Мне интересно. Надо возможности мат. библиотек поизучать, думаю там что-то такое задействовано. Типа GMP . Эта либа легко генерит простое число нужного размера, см. mpz_nextprime() maytonЯ пытался эмулировать решето без самого решета. По сути конечным автоматом без состояния. Теоретически сработает, вопрос как по производительности и памяти. Для каждого надо хранить: текущее состояние и до скольки считать. Можно потестить. Назовем "Решето Майтона" :) Нашел косяк в версии 2.0. Увлекся нечетными, забыл что еще четные бывают. next_prime(10) выдает 13 :( это Код: plaintext 1. заменить на это Код: plaintext 1. Позже выложу полную версию. Может еще чего найдется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 17:31 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Хм.... Код: plaintext 1. 2. 3. 4. 5. probabilistic algorithm - это вероятностный алгоритм. Это та шняга которая используется в криптографии для поиска простых чисел для генерации ключа ЕМНИП. У меня пока нет мнения по поводу probabilistic но это явно не та тема, которая мне интересна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 18:51 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
mayton probabilistic algorithm - это вероятностный алгоритм. Это та шняга которая используется в криптографии для поиска простых чисел для генерации ключа ЕМНИП. Для этих целей пользовал. Я для примера, глубоко туда не вникал, может там что еще есть полезное. Решето Майтона не взлетело Рабочий прототип алгоритма Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. Результатtest 100000 atkin 10 msec mayton 911 msec можно подопиливать, но ИМХУ бесполезно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 19:25 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Интересно а какой "разрядности" этот ключик? Попробуем посчитать. Ну грубо говоря 200 бит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 19:57 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Ну не взлетело так не взлетело. Я думал мета-компилляция спасёт моё решето... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 20:02 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Опять же проверить тот сайт ты не можешь. Где гарантия что не врут? Как проверить? Простое число 4200000037 как бы его точно в квадрат возвести и туда запостить. Везде округленные значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 20:12 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Проверил умножением. Не врут. Произведение - точное. Правда проверить на простоту число 271963805968702864258461551790513043662751795453 - это трабл. Поискал другие сайты - тухляк. На многих факторизатор - игрушечный. Ограничен диапазоном int32. А один особо отличился. Подвесил мне браузер нахер. Причем так жёстко что пришлось ребутнуть процесс в taskmanager. Кажется этот http://ru.onlinemschool.com/math/assistance/number_theory/multiplier/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 23:07 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Алгоритм Аткина, согласно Аткину, реализован Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. Пришлось воспользоваться конструкцией предложенной другим автором, но ничего страшного, та конструкция лучше того, что я предлагал вчера ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 03:45 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TОпять же проверить тот сайт ты не можешь. Где гарантия что не врут? Как проверить? Простое число 4200000037 как бы его точно в квадрат возвести и туда запостить. Везде округленные значения. 17640000310800001369 я ведь писал программу для работы с длинной арифметикой :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 03:57 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Тот ресурс корректно справился с этим числом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 04:06 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
SashaMercuryАлгоритм Аткина, согласно Аткину, реализован Пришлось воспользоваться конструкцией предложенной другим автором, но ничего страшного, та конструкция лучше того, что я предлагал вчера В википедии подобная конструкция, но есть разница в мелочах. Хорошо написал, твой код понятнее. Теперь есть точка отсчета для оптимизации. По твоему коду, что можно оптимизировать: 1. element_belong() раскладывается на 3 массива по 60 элементов, проставить true там где надо, затем проверять divisors1[n%60]. Можно 64 бита взять. 2. Вывод результата начиная с 3 и шагом 2. 3. Четные можно выкинуть из биткарты. Просто добавить проверку n на четность перед использованием n. if(n&1) ... Памяти потребуется вдвое меньше. Еще бы n%60 как-то ускорить, т.е. от % избавиться. Мысль появились: для оценки производительности надо посчитать общее количество итераций. Если у Аткина их заметно меньше Эратосфена, то есть смысл дальше бороться за скорость. Замерю - отпишусь. SashaMercury17640000310800001369 я ведь писал программу для работы с длинной арифметикой :) Вчера не сообразил. Вот она первая проблема чисел х64: как результаты смотреть? Надо про printf() почитать, может есть такой тип, или придется накидать что-нибудь простенькое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 06:58 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
printf должен работать для unit64, int64. http://stackoverflow.com/questions/2844/how-do-you-printf-an-unsigned-long-long-intthe-format-specifier-for-unsigned-lo ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 07:57 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonНемного отвлеку вас. Нашёл страничку. Онлайн факторизатор. http://ru.numberempire.com/numberfactorizer.php Вот такое вот число Код: plaintext 1. было разложено на множители менее чем за сек. Код: plaintext 1. Вам интересно, как? Мне - да. Мне интересно.Однозначно не перебором простых делителей. Если 6755603 еще гипотетически можно найти перебором, то например 340282366920938463463374607431768211457 (это 2^128+1 - седьмое число Ферма) разлагается на множители 59649589127497217*5704689200685129054721. Тут перебор делителей не поможет. https://ru.wikipedia.org/wiki/Факторизация_с_помощью_эллиптических_кривых https://ru.wikipedia.org/wiki/Метод_квадратичного_решета https://ru.wikipedia.org/wiki/Общий_метод_решета_числового_поля ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 08:31 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Затестил итерации Аткина и ЭротосфенаАткина взял своего (причесанного из вики), по циклам он с Сашиным совпадает. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. Результатtest 100000000 eratosfen 146286641 times atkin 159115849 times Аткин на 8,7% больше проходов. Это еще без учета того что в первом цикле за раз три значения обрабатываются. Если там по 3 считать, то будет 359115849. Вобщем надо Аткина как-то в эту сторону оптимизировать. По максимуму бороться с четными в переменных цикла. Что смог - уже учел в коде теста. Проверьте, может криво намерил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 08:31 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
А можно 4 млрд. сравнить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 08:39 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
SashaMercuryА можно 4 млрд. сравнить? Тест доЭратосфенАткин10000012161915898610000001311234159126610000000139255881591017810000000014628664115911584980000000012152607781272900787 Аткин до 800 млн. считает корректно. Дальше разрядности x32 не хватает. Проблема отсюда же. 4*x2+y2, т.е. предел 4 млрд./5 Надо как-то выскакивать из цикла досрочно Пробовал так. Вроде логично, но результаты становятся неправильные, затести на своем варианте Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 09:28 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima T Надо как-то выскакивать из цикла досрочно Пробовал так. Вроде логично, но результаты становятся неправильные, затести на своем варианте Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. логично что они становятся неправильные, y растёт, потому n убывает, потому корни ещё могут быть, прерывать нельзя ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 09:46 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
SashaMercuryлогично что они становятся неправильные, y растёт, потому n убывает, потому корни ещё могут быть, прерывать нельзя Понял. Тогда надо как-то перешагнуть область где (n > limit). Надо формулу изобретать. Как вариант: прервать цикл и пойти с обратного конца. Так правильно будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 10:06 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TSashaMercuryлогично что они становятся неправильные, y растёт, потому n убывает, потому корни ещё могут быть, прерывать нельзя Понял. Тогда надо как-то перешагнуть область где (n > limit). Надо формулу изобретать. Как вариант: прервать цикл и пойти с обратного конца. Так правильно будет? Да, скорее всего так и нужно, значение y должно плясать от значение x с конца.. PS Что-то не так. Аткин доказал что его алгоритм эффективнее, пусть это и не заметно на маленьких объёмах. У нас получается обратное, сейчас мы занимаемся оптимизацией. Значит либо Алгоритм реализован неправильно, либо в чём-то другом дело. Аткин говорит о 19 секундах для миллиарда, на более простом алгоритме, на старой машине. Что-то видимо я не так сделал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 10:13 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Вот что соавтор Аткина пишет , и выкладывает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 10:20 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Возможно запустить его код и проверить на своей машине, или это будет проблематично ? Интересно, будет ли тот код быстрее твоей реализации Эратосфена ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 10:25 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
SashaMercuryВозможно запустить его код и проверить на своей машине, или это будет проблематично ? Интересно, будет ли тот код быстрее твоей реализации Эратосфена Видел ту ссылку, только там какая-то гора исходников, внутрь не заглядывал. Можно попробовать. Пока некогда, вечером попробую запустить. Можешь сам затестить. Мой Эратосфен выше. Выкини в обоих случаях сохранение. У меня prime.push_back(). Замени на подсчет количества найденных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 10:32 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonНу не взлетело так не взлетело. Я думал мета-компилляция спасёт моё решето... Вобщем я подумал и вот что решил. Никакое это не решето мейтона. Это фильтр мейтона. (Mayton's numbers filter (MNF)). Ну... вобщем нет смысла хардкодить циклическую арифметику на полную длину primes до SQRT. Но можно эффективно отбрасывать PRIMES которые имеют делители до первой сотни. И вот почему. В современных железках есть команды SIMD. Это когда за 1 шаг мы выполняем вектор инициаций. Вектор сложений. И вектор еще чего-нибудь. Напр 128-битный SSE регист может быть побит на 4х64 или 8х32 регистра и операции сложения будут работать как микро-threads в контексте 1 итерации проверки числа на простоту. Вот такой вот экстенсивный путь еще есть. Мдя... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 12:08 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TSashaMercuryВозможно запустить его код и проверить на своей машине, или это будет проблематично ? Интересно, будет ли тот код быстрее твоей реализации Эратосфена Видел ту ссылку, только там какая-то гора исходников, внутрь не заглядывал. Можно попробовать. Пока некогда, вечером попробую запустить. Можешь сам затестить. Мой Эратосфен выше. Выкини в обоих случаях сохранение. У меня prime.push_back(). Замени на подсчет количества найденных. Саша. Дима. Давайте зальём в репозитарий. Будет удобнее работать совместно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 12:11 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonСаша. Дима. Давайте зальём в репозитарий. Будет удобнее работать совместно. Я не против, только не умею :) Как понимаю ты тут уже все заготовил 17455393 Как туда зацепиться? Есть какая-нибудь инструкция? желательно на русском. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 12:25 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 12:36 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
mayton, Круто, у нас будет собственный fun-проект... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 12:39 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonСкачай и установи себе TortoiseSVN. http://tortoisesvn.net/ Дальше - расскажу. Дальше не надо. Уже стоит. Думал там что-то другое надо. Зарегался, качнул. Вечером освобожусь, подготовлю свои поделки к аплоаду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 12:52 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TДальше не надо. Уже стоит. Думал там что-то другое надо. Зарегался, качнул. Вечером освобожусь, подготовлю свои поделки к аплоаду. Ты должен дать мне реквест на добавление тебя в группу разработки. Иначе доступ - R/O. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 13:09 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
У меня кстати первая в жизни самостоятельная программа была (учебное задание на первом курсе) -- именно генерация простых чисел и именно решетом Эратосфена. На Fortran-IV. На ЕС ЭВМ. До сих пор где-то тетрадка с распечаткой валяется. Это был первый урок постижения, что такое "производительность" и как за неё бороться. Меня отец учил. Сначала написал, отладил на числах до 100, запустил на до миллиона -- задача снята без ответа (на ЕС пакетный режим, и ограничение по процессорному времени были). И дальше -- поехало, такая оптимизация, такая (деталей не помню) -- всё на математике. В конце влезла она в тайм-слот, и напечатала все числа, задание сдал. Попробую отрыть тетрадь для прикола... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 13:09 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
А сколько памяти было на ЕС ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 13:22 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonА сколько памяти было на ЕС ? А угадай ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 13:22 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Ну для миллиона Эратосфена должно быть не меньше 128Кб только для данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 13:24 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Дима. Саша. Я не в силах придумать как должна выглядеть структура каталогов в проекте. Поэтому я пока сделал просто три подкаталога в рабочей ветке. Код: plaintext 1. 2. 3. 4. 5. 6. Делайте коммиты туда. Потом разберёмся и перенесем как надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 13:27 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonМинутку. Может это я должен подключить мембера? Вроде я должен попросится сначала, как понял из инета. Может ты должен как-то разрешить просится? Доки надо читать, у меня с английским не очень. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 14:01 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonНу для миллиона Эратосфена должно быть не меньше 128Кб только для данных. там что-то типа 480к было памяти... Меньше, чем на появившейся чуть позде первой XT (286), где было 640к. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 14:16 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
mayton, Вы бы это, чатик какой что-ли завели, на базе skype или icq, или ещё чего-нибудь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 14:17 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
MasterZivМеньше, чем на появившейся чуть позде первой XT (286), где было 640к. на 286 был 1Мб, можно было второй воткнуть, помню была у меня такая "планка" размером с небольшую клавиатуру :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 14:31 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TMasterZivМеньше, чем на появившейся чуть позде первой XT (286), где было 640к. на 286 был 1Мб, можно было второй воткнуть, помню была у меня такая "планка" размером с небольшую клавиатуру :) Программе доступно было 640к. далее шла видеопамять. HIMEM появился только с 386-го. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 14:36 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Я катался на тройках. SX. Жлобский вариант. 33Мгц. В них еще не было FPU и для запуска Ауто-КАд надо было запускать софтварный эмулятор со-процессора арифметики. В моей перой конфигурации ОС был МС ДОС 5.0 без Нортор-Командира. И я использовал RAR как файловый менеджер для блуждания по каталогам. В каталогах у меня были ништяки. Например setka.exe - транслировала настроечную таблицу. И пищала на tспикер. Prince.exe - страшная хорор-игрушка с поддержкой даже CGA/EGA. Wolf3d - мега крутая игруха про немцев ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 14:49 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
MasterZivПрограмме доступно было 640к. далее шла видеопамять. HIMEM появился только с 386-го. Нет. https://ru.wikipedia.org/wiki/HIMEM.SYS himem появился в 286, в 386 добавился emm386.exe ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 15:07 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
А была еще такая шняга как emm386.exe. Без нее игрухи не шли. Некоторые. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 16:39 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
SashaMercuryВот что соавтор Аткина пишет , и выкладывает Попробовал откомпилировать primespeed.c . Не получилось. Код: plaintext 1. В инете порылся - не нашел. Подсунул пустой файл, пишет нет еще hasgethr.h, еще пустой подсунул - надо primegen.h. Что-то не так я делаю. Я не силен в компиляциях под линуксы. Свой виндовый исходник еще могу доделать чтоб собирался, а с чужими сложнее. Может чего не так запускал. Там есть eratspeed.c (как понимаю эратосфен). Тоже интересно скорость глянуть. Может кто расскажет как запустить в линуксе ? Еще лучше в виндовсе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 16:53 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TMasterZivПрограмме доступно было 640к. далее шла видеопамять. HIMEM появился только с 386-го. Нет. https://ru.wikipedia.org/wiki/HIMEM.SYS himem появился в 286, в 386 добавился emm386.exe Так, ребяты, там же написано, что HIMEM появился в 5-ом DOS-е. У нас был 3-ий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 17:07 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TSashaMercuryВот что соавтор Аткина пишет , и выкладывает Попробовал откомпилировать primespeed.c . Не получилось. ..... Может кто расскажет как запустить в линуксе ? Обычно запустить "make" достаточно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 17:14 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
MasterZivDima Tпропущено... Нет. https://ru.wikipedia.org/wiki/HIMEM.SYS himem появился в 286, в 386 добавился emm386.exe Так, ребяты, там же написано, что HIMEM появился в 5-ом DOS-е. У нас был 3-ий. А кто мешал 5-й запускать на 286 ? Я к тому что было у меня 2 Мб на 286м. И проги их использовали. Пофиг уже. С него сразу на Pentium100 пересел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 17:15 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Экскурс в прошлое. Мдя... Пылью покрылось. Несколько моих скверных поделий 7137996 7138453 (тот самый метод грубой силы. Тупой.) 7139627 Вроде та-же шняга под Win-64x 7140643 Целочисленный SQRT Некий Студентик на(ш)кодил 7149017 Эратосфен на Паскале +еще дофига сорцов на Паскале К сожалению там так и не был опубликован последний вариант PBFA который я тестил на OpenSuse. Похоже я его утерял. Ну и хер с ним. Восстановлю. Собственно он решал задачи ХРАНЕНИЯ в файлах уже расчитанных primes до 2^64. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 17:24 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
BarloneОбычно запустить "make" достаточно Спасибо. Помогло :) Результаты: Аткин (primespeed)50847534 primes up to 1000000000. Timings are in ticks. Nanoseconds per tick: approximately 0.288855. Overall seconds: approximately 0.517420. Эратосфен (eratspeed)50864821 primes up to 1000359390. Timings are in ticks. Nanoseconds per tick: approximately 0.288853. Overall seconds: approximately 0.662039. мои поделкиtest 1000000000 eratosfen 4158 msec next_prime 1098 msec отстаю :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 17:34 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
MasterZivПрограмме доступно было 640к. далее шла видеопамять. HIMEM появился только с 386-го.EMS появился вместе со вторым досом и XT на 8086. Но как всякая железка стоил весьма негуманных денег. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 17:36 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Хорошая новость: есть с чем сравнивать и количество совпало. Аткин50847534 primes up to 1000000000. мой эратосфенtest 1000000000 check prime[50847534] to 999999937 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 17:43 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Нам полюбому нужен сценарий теста. Хорошо-бы чтоб все утилиты в STDOUT сбрасывали результат по ключу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 18:06 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Значит на отрезке 2..1 000 000 000 найдено 50 847 534 primes? ОКИ. Примем это за базовый тест. Будет как smoke. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 18:50 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TMasterZivпропущено... Так, ребяты, там же написано, что HIMEM появился в 5-ом DOS-е. У нас был 3-ий. А кто мешал 5-й запускать на 286 ? Так НЕ БЫЛО его ещё... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 19:20 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonНам полюбому нужен сценарий теста. Хорошо-бы чтоб все утилиты в STDOUT сбрасывали результат по ключу. Не писать не вариант, компилятор просто выкинет ненужный код и получишь нездоровые замеры. Писать в STDOUT - тормоза от printf() не дадут нормально скорость измерить. Я вектор использую, тоже не совсем корректно, память довыдедеряет, хотя это достаточно быстро, но вообще-то уже С++, а не С. Предлагаю изолировать расчет от хранения результатов. Передавать в параметрах функцию void prime_store(uint64_t x), а дальше подсовывай что хочешь: хоть заглушку со счетчиком, хоть вектор. Пусть только верхний уровень знает что подсунул, а нижний честно ее вызывает. PS Дурной день был, умотался, все что наобещал сегодня не успею, завтра зафиксирую свои поделки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 19:41 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
MasterZivDima Tпропущено... А кто мешал 5-й запускать на 286 ? Так НЕ БЫЛО его ещё... Перпендикулярное синхроннее вертикального. Забей, проехали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 19:45 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TmaytonНам полюбому нужен сценарий теста. Хорошо-бы чтоб все утилиты в STDOUT сбрасывали результат по ключу. Не писать не вариант, компилятор просто выкинет ненужный код и получишь нездоровые замеры. Писать в STDOUT - тормоза от printf() не дадут нормально скорость измерить. Я вектор использую, тоже не совсем корректно, память довыдедеряет, хотя это достаточно быстро, но вообще-то уже С++, а не С. Предлагаю изолировать расчет от хранения результатов. Передавать в параметрах функцию void prime_store(uint64_t x), а дальше подсовывай что хочешь: хоть заглушку со счетчиком, хоть вектор. Пусть только верхний уровень знает что подсунул, а нижний честно ее вызывает. Можно делать вычисления отдельным модулем. Функция. Класс. Компонента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 19:54 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TPS Дурной день был, умотался, все что наобещал сегодня не успею, завтра зафиксирую свои поделки. Да бох с ним. Я не тороплю. Этот проект - Just For Fun. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 20:01 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Мужики, мне кажется до определённого размера простые числа можно не хранить, достаточно перебора 999999937 / 50847534 =19.6 вот смотрите, при натуральном k 6k-1 6k - кратно 2 и 3 6k+1 6k+2 - кратно 2 6k+3 - кратно 3 6k+4 - кратно 2 т.е. все простые числа лежат в множестве 6k+/-1, достаточно проверять 1 из 3-х чисел операции с регистрами гораздо быстрее чем попытки лезть в память ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 20:29 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)все простые числа лежат в множестве 6k+/-1 Сходу могу сказать что ты масштабнее Аткина в 102,4 раза :) У того магическое число было 60. Давай, развивай свою идею до примера кода который можно запустить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 20:36 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Мысль: у биткарты есть один большой недостаток, надо перебрать ее целиком чтобы результат получить. Вот бы взамен что-нибудь такое задействовать что быстро инициализируется, быстро убирает лишнее и быстро считывает остатки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 20:48 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), добавлю инфы. Это называется Спираль Улама. На ней чёрными точками обозначены primes - белыми все остальные составные числа. При условии что заполнение шло от центра квадрата против часовой стрелки. На спирали отчётливо виден ближний порядок точек. По сути каждая точка в ряду отстоит от другой на строго фиксированное расстояние которое квадратично зависит от "витка спирали". По сути картинка наглядно показывает что существует формула описывающая "возникновение" следующей точки в ряду. Весь вопрос в том насколько далеко распространяется такой порядок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 20:55 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TМысль: у биткарты есть один большой недостаток, надо перебрать ее целиком чтобы результат получить. Вот бы взамен что-нибудь такое задействовать что быстро инициализируется, быстро убирает лишнее и быстро считывает остатки. Это основной дефект Эратосфена. Нам недостаточно иметь карту простых. Нам нужен итератор. А он к сожалению не очень эффективен. И не очень компактен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 21:03 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonkealon(Ruslan), добавлю инфы. Это называется Спираль Улама. https://ru.wikipedia.org/wiki/Скатерть_Улама . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 21:23 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima Tkealon(Ruslan)все простые числа лежат в множестве 6k+/-1 Сходу могу сказать что ты масштабнее Аткина в 102,4 раза :) У того магическое число было 60. Давай, развивай свою идею до примера кода который можно запустить. залейте исходники рабочие того что есть, что бы сравнивать можно было сюда же вроде как решились лить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 21:59 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Это кому как удобно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2015, 22:10 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima Tkealon(Ruslan)все простые числа лежат в множестве 6k+/-1 Сходу могу сказать что ты масштабнее Аткина в 102,4 раза :) У того магическое число было 60. Давай, развивай свою идею до примера кода который можно запустить. Марк, товарищ привел известный факт, не более ни менее. а 60 скорее всего получено эмпирически, других предположений пока нет, кроме мистицизма об делимости на числа от 1 до 6 ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 01:52 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
А обязательно устанавливать ту программу для совместной работы с репозиторием ? Только через 7 часов смогу этим заняться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 06:18 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
SashaMercuryА обязательно устанавливать ту программу для совместной работы с репозиторием ? Только через 7 часов смогу этим заняться Оттуда брать можешь без нее, но обратно что-то заливать без нее не получится. С ней удобнее, меньше кнопок нажимать. maytonЭто называется Спираль Улама. Глянул мельком, интересная метода, но получить все простые с ее помощью будет проблематично. Например посмотри где стоят 15 и 27. Для криптографии подойдет. probabilistic algorithm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 07:02 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
SashaMercury60 скорее всего получено эмпирически Это произведение первых простых чисел: 2*3*5 = 60 следующее такое 420. Думаю на этом оптимизация как-то завязана. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 07:22 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Мужики, мне кажется до определённого размера простые числа можно не хранить, достаточно перебора 999999937 / 50847534 =19.6 вот смотрите, при натуральном k 6k-1 6k - кратно 2 и 3 6k+1 6k+2 - кратно 2 6k+3 - кратно 3 6k+4 - кратно 2 т.е. все простые числа лежат в множестве 6k+/-1, достаточно проверять 1 из 3-х чисел операции с регистрами гораздо быстрее чем попытки лезть в памятьМожно пойти дальше: остатки от деления на 30 для простых чисел больше 5 могут быть только 1,7,11,13,17,19,23,29. Можно сократить битовую карту почти вдвое - один байт на 30 чисел. Выкидываем кратные 7 - получаем 48 бит (6 байт) на 210 чисел. И т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 07:34 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TSashaMercury60 скорее всего получено эмпирически Это произведение первых простых чисел: 2*3*5 = 60 следующее такое 420. Думаю на этом оптимизация как-то завязана.2*3*5 = 30 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 07:35 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Barlone2*3*5 = 30 вот я затупил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 07:44 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Понял магичность числа 60. Если взять все числа которые не делятся без остатка на 2,3,5, будет такая табличкаЧислоОт предыдущего7114132174192234296312376414432474492534596612676...... если табличку продолжить видно что повторы идут с частотой 60 Исследовал как бы в цикле шаги побольше делать. Для выкидывания четных шаг 2. Т.е. перебор 50% значений Для (2, 3) шаги 2,4,6. Перебор 25% (кол-во эл-тов/сумму) Для (2, 3, 5) шаги 4,2,4,2,4,6,2,6,4,2,4,2,4,6,2,6. Перебор 26,7% (16/60) (отсюда и получилось 2*3*5 = 60) Для (2, 3, 5, 7) Перебор 22,9% (96/420) Неоптимальное число 60, лучше 420 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 08:32 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TГлянул мельком, интересная метода, но получить все простые с ее помощью будет проблематично. Например посмотри где стоят 15 и 27. Для криптографии подойдет. probabilistic algorithm С помощью нее и невозможно получить все простые. Но можно найти ряд полиномов внезапно (!) генерирующих подмножество простых на интервале. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 08:37 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Еще несколько магических чисел: 4620 для (2,3,5,7,11) Перебор 20,8% (960/4620) 60060 для (2,3,5,7,11,13) Перебор 19,2% (11520/60060) 1021020 для (2,3,5,7,11,13,17) это уже сложно в экселе обсчитать Магическая формула простая: перемножаем все простые 2...N и еще раз на 2. Выкидываем кратные 2...N и строим ряд из разницы соседних. Цикл начинаем со следующего простого после N В итоге перебор стремится к 5% (примерно столько простых в диапазоне), но как-то медленно стремится. Попробую для начала тройки выкинуть, уже двухкратное ускорение по сравнению с перебором нечетных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 09:04 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima T, еще раз на 2 то зачем умножать? http://primes.utm.edu/glossary/page.php?sort=WheelFactorization ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 09:14 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Large wheels are not particularly efficient. To remove 90% of the composites, we must use the primes up to 251. 95% requires the primes to 75,037. 96% requires the primes to 1,246,379. 97% requires the primes to 134,253,593! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 09:15 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
BarloneDima T, еще раз на 2 то зачем умножать? я исхожу из того чтобы циклом идти как можно большими шагами, там периодичность именно такая выходит Например для (2,3) начинаем со следующего простого (5) и шагаем 2,4,6,2,4,6... т.е. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Суммарный шаг 12(2+4+6) или (2*3)*2 для (2,3,5) шаги 4,2,4,2,4,6,2,6,4,2,4,2,4,6,2,6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 09:37 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima T, последовательность 4,2,4,2,4,6,2,6 повторяется дважды зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 09:41 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
BarloneDima T, последовательность 4,2,4,2,4,6,2,6 повторяется дважды зачем? Точно, задвоилась. В целом пофиг. На конечный процент пропусков не влияет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 09:49 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
mayton, зафиксировал синхронного этатосфена. Учел все пожелания по оформлению. Можешь посмотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 10:14 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Отлично. Только нам нам надо придумать как это собирать в консоли. Я делаю *.cmd файлы под MinGW (Win_x64). Но честно говоря выглядят они позорно. И я их не коммичу. Хотелось-бы скриптовать сборку приличнее. Я пользовался сборщиками в основном под java (ant,maven,gradle) и слабо знаком с тем какие есть для С/C++. Возможно Илья нас проконсультирует по этому вопросу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 11:03 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonОтлично. Только нам нам надо придумать как это собирать в консоли. Я делаю *.cmd файлы под MinGW (Win_x64). Я тоже не большой спец в этом вопросе. Сделал проект в MSVC Express, там пишу, запускаю, отлаживаю. В линуксе: gcc eratosfentest.cpp -O2 -oerat много накопится, можно make общий сделать. Если ввести требование: один exe из одного cpp то компиляция резко упростится. т.е. все пишем в .h, цепляем нужные в один cpp, его компилируем. Проект небольшой, думаю этого достаточно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 11:37 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
BarloneDima T, еще раз на 2 то зачем умножать? http://primes.utm.edu/glossary/page.php?sort=WheelFactorization ага, оно самое авторNotice that the simple wheel based on 2 and 3 removed 4/6 = 2/3 rds of the composites. The larger wheel using 2, 3, 5, and 7 will remove 162/210 (over 77%) of the composites. Large wheels are not particularly efficient. To remove 90% of the composites, we must use the primes up to 251. 95% requires the primes to 75,037. 96% requires the primes to 1,246,379. 97% requires the primes to 134,253,593! Just imagine how many primes you will need to remove 99% of the composites! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 11:53 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Хотел затестить вместо %6 maytonПо поводу Уоррена я немного ошибся. Старик писал про оптимизацию целочисленного деления. Вот из моих сорцов. К сожалению делители только до 10. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Врет чудоформула OPTDIV_6(2069) = 345 2069/6 = 344,8 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 12:51 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Напутал немного с расчетами шагов. Если кратные 2м и 3м выкинуть, то перебор 33% а не 25%. Зафиксировал. Количество итераций на миллиарде уменьшилось с 1524 млн. до 1191. Правда пропорционально быстрее не стало. Итераций меньше на 22%, время на 7%. Думаю из-за %6. Надо затестить пропуски (2,3,5) Результатыtest eratosfen2() from 1 to 1000M eratosfen2() 1524M steps count 50847534 primes time 4486 msec test eratosfen3() from 1 to 1000M eratosfen3() 1191M steps count 50847534 primes time 4166 msec Нашел странный косяк в next_prime() Пропускает в дебаге число 76293757 в релизе не пропускает. Не заметил, т.к. в основном в релиз компилировал. Тест: Код: plaintext 1. 2. Похоже косяк с довыделением памяти под биткарту как-то связан, если сразу выделить максимум - не проявляется. Поразбираюсь позже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 13:22 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TВрет чудоформула OPTDIV_6(2069) = 345 2069/6 = 344,8 Хм... действительно есть погрешность. Чортов старик Уоррен... Потестил на Java с использованием long64. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 13:43 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonОтлично. Только нам нам надо придумать как это собирать в консоли. Я делаю *.cmd файлы под MinGW (Win_x64). Но честно говоря выглядят они позорно. И я их не коммичу. Хотелось-бы скриптовать сборку приличнее. Я пользовался сборщиками в основном под java (ant,maven,gradle) и слабо знаком с тем какие есть для С/C++. Возможно Илья нас проконсультирует по этому вопросу. CMake используйте... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 13:52 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonХм... действительно есть погрешность. Это приближенные вычисления. Я сначала тупо скопипастил, а как сглючило - задумался. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 13:52 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Наверное весь смысл в том как мы интерпретируем результат целочисленного деления. На досуге попробую поделить в столбик в двоичной системе... Ну.. хотя-бы оно сохраняет монотонность и на том спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 13:56 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TХотел затестить вместо %6 maytonПо поводу Уоррена я немного ошибся. Старик писал про оптимизацию целочисленного деления. Вот из моих сорцов. К сожалению делители только до 10. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Врет чудоформула OPTDIV_6(2069) = 345 2069/6 = 344,8Ну да. 683/2048 == 0,33349609375 и это несколько отличается от 0.33333333333333333 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 14:00 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonНаверное весь смысл в том как мы интерпретируем результат целочисленного деления. До 2000 точно считает, дальше сказывается погрешность: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 14:05 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Адаптировал целочисленный квадратный корень для 64х бит. По сути была добавлена еще одна итерация начального приближения. И некоторые константы я перевел в Hex для лучшего понимания. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Прошу тестить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 14:10 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
MasterZivCMake используйте... Спасибо. Качнул развернул cmake-3.2.1. То что нужно. Не обещаю что буду посвящать этой теме 100% времени но по мере сил... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 14:16 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonПрошу тестить. Не взлетел. Считает точно, но медленно. Посчитал корень всех простых до лярда Код: plaintext 1. 2. sqrt() ты не обгонишь, т.к. там считает процессор. Команда FSQRT По хорошему немного бы точностью пожертвовать, но минимизировать количество итераций, т.е. в нашем случае надо близкое больше, т.к. это предел до которого перебор. Вопрос какая погрешность требуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 14:51 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
У меня - наоборот math::sqrt(double) более медленный. Покажи как ты тестил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 14:53 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TПо хорошему немного бы точностью пожертвовать, но минимизировать количество итераций, т.е. в нашем случае надо близкое больше, т.к. это предел до которого перебор. Вопрос какая погрешность требуется.Дык, выкинуть цикл в конце, сделать одну итерацию. Будет быстрее, но промахиваться вверх. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 15:19 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Немного статистики. Мой жлобский метод PBFA-32bit (power brute force) работал аж 33 минуты. От 2 до 1 000 000 000 нашёл аж 50 847 534 primes. При этом было задействовано 262 Мб памяти (типа std::vector<int> ) для кеша. Сегодня подчищу код и опубликую для всех. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 15:24 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
BarloneDima TПо хорошему немного бы точностью пожертвовать, но минимизировать количество итераций, т.е. в нашем случае надо близкое больше, т.к. это предел до которого перебор. Вопрос какая погрешность требуется.Дык, выкинуть цикл в конце, сделать одну итерацию. Будет быстрее, но промахиваться вверх. Я уже придумал как. Начальное приближение можно брать с предыдущей итерации. Всё равно они отличаются на [0..1] дробное целое. А на больших значениях x, квадратный корень почти пологий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 15:26 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonУ меня - наоборот math::sqrt(double) более медленный. Покажи как ты тестил? зафиксировал sqrtspeed.cpp позапускай. У меня такие результаты Код: plaintext 1. 2. 3. добавил isqrt32 т.к. у меня x32 компилятор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 15:38 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
BarloneDima TПо хорошему немного бы точностью пожертвовать, но минимизировать количество итераций, т.е. в нашем случае надо близкое больше, т.к. это предел до которого перебор. Вопрос какая погрешность требуется.Дык, выкинуть цикл в конце, сделать одну итерацию. Будет быстрее, но промахиваться вверх. Я тестил этот алгоритм сильно вверх тоже плохо, много лишних проходов из-за этого. В итоге просто заменил корень на возведение в квадрат. Выше писал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 15:47 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima T, странно. Не совсем такая картина. У меня - ноут. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 16:13 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonDima T, странно. Не совсем такая картина. От проца наверно зависит. В ноутах электричество надо за счет чего-то экономить. У меня тесты на i7-3770К (это хост, на нем виртуалка ХР с 1 ядром) вот еще тестыскомпилировал в линуксе x64 (тоже виртуалка, там же, 1 ядро) $ g++ sqrtspeed.cpp -O2 -oerat Код: plaintext 1. 2. 3. Вот результат x32 EXE (из прошлого теста) на проце i5-660 Код: plaintext 1. 2. 3. Все равно твой sqrt64 не взлетел. Ускоряй. Тест близкий к реальному использованию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 16:32 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Да нет-же говорю. Я от него откажусь. Будет другой метод. Или подвид Брезенхейма или кусочно-линейный. Или буду использовать приближение предыдущего шага. А что ты в нём хочешь соптимизировать для целых чисел? Алгоритмически - уже вроде не куда. Можно что-то улучшать базируясь на гистограмме входных данных. Разве что. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 16:57 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonА что ты в нём хочешь соптимизировать для целых чисел? Алгоритмически - уже вроде не куда. Начальное значение у тебя грубо степени двойки охватывает. Точнее посчитать несложно сдвигами и т.п. https://ru.wikipedia.org/wiki/Квадратный_корень При работе в двоичной системе, следует использовать другую оценку 2^(D/2) (здесь D это число двоичных цифр). maytonМожно что-то улучшать базируясь на гистограмме входных данных. Разве что. может это взлетит maytonЯ уже придумал как. Начальное приближение можно брать с предыдущей итерации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 17:06 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Убрал кастинг в твоём тесте. Быстрее стало. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 17:09 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonУбрал кастинг в твоём тесте. Быстрее стало. Сейчас твои результаты пропорциональны моим. Похоже это твой компилятор "соптимизировал". У меня в MSVC так вообще не компилируется. Пробовал (float) и (double) - скорость не меняется. затестил так, скорость таже Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 17:20 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
По моему ... float на уровне калькуляций кроме экономии разрядной сетки не даёт вообще ничего. Не пробовал просмотрель ассеблерный выход для float/double на предмет разницы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 17:26 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TУ меня в MSVC так вообще не компилируется. Не заметил что у тебя double* primeDouble затестил так, у меня никаких изменений. затести так Код: plaintext 1. 2. преобразование из int в double не может занимать столько же времени как вычисление корня. Явно глюк компилятора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 17:27 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonНе пробовал просмотрель ассеблерный выход для float/double на предмет разницы? Нет разницы. Отладчиком прошелся, значение передается в Сишный рантайм, а там проверки валидности и fsqrt. Затестил оба, нет разницы в скорости. float еще и неточно посчитал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 17:36 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Флоат втопку. И пепел в море утопить. Я закоммитил 1-й вариант своей тулзы. Работает она медленно. Зато сходу выдаёт итератор primes. Делай Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 17:39 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 17:40 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonЯ уже придумал как. Начальное приближение можно брать с предыдущей итерации.Ну тогда эта функция вообще не нужна, достаточно проверить, пора ли увеличить значение "с предыдущей итерации" на единицу :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 17:49 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Это и есть алгоритм Брезенхейма. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 17:49 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Правда он создавался для рисования растровых кривых эллипсов и линий. Но на курсе Графического моделирования нам рассказывали о параболе. Следовательно я делаю вывод что есть и такая имплементация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 17:51 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonЯ закоммитил 1-й вариант своей тулзы. Работает она медленно. Зато сходу выдаёт итератор primes. Обновил. Чтоб не тормозила - поставь предел поменьше. 10-100 млн. чтоб максимум в 5 сек укладывалась. Вектор быстрая штука, тестил с ним и без него - разница 20-30 мс на расчете до миллиарда. Добавлю тоже себе вариант с вектором. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 17:53 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Хотя конечно смотря что тут подразумевалось под итерацией... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 17:53 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TmaytonЯ закоммитил 1-й вариант своей тулзы. Работает она медленно. Зато сходу выдаёт итератор primes. Обновил. Чтоб не тормозила - поставь предел поменьше. 10-100 млн. чтоб максимум в 5 сек укладывалась. Вектор быстрая штука, тестил с ним и без него - разница 20-30 мс на расчете до миллиарда. Добавлю тоже себе вариант с вектором. Не очень понял о каком пределе ты пишешь. И ... это опенсорц. Закоммить свои изменения в мой файл. И я вобщем-то не буду против если это не крашит приложение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 17:55 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
ребята, вы ведь понимаете, что топик не может заканчиваться не на простом числе страниц? ;)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 18:37 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Я нарисовал табличку для тестов и для оценки плотности распределения primes. Selection from 2 to..Primes detectedAll to primes ratio10025 0.251000 168 0.16810000 1 229 0.1229100000 9 592 0.095921000000 78 498 0.07849810000000 664 579 0.0664579100000000 5 761 455 0.057614551000000000 50 847 534 0.050847534 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 18:45 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonНе очень понял о каком пределе ты пишешь. И ... это опенсорц. Понятно что могу поправить. Я к тому что какой смысл полминуты считать, все-равно долго. Топик с того и начался что я не мог дождаться пока мой перебор насчитается :) egorychребята, вы ведь понимаете, что топик не может заканчиваться не на простом числе страниц? ;)) Верно подмечено, теперь цель 11-я, после 13-й туго будет, присоединяйся Но тут у нас есть оптимизатор - mayton если что имеет права лишнее почистить, т.е. подравнять страницы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 18:53 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Сашик раскурит СВН и я подчищу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 18:58 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TПонятно что могу поправить. Я к тому что какой смысл полминуты считать, все-равно долго. Топик с того и начался что я не мог дождаться пока мой перебор насчитается :) Просто мы решаем разные задачи. Я искал оптимальные способы хранения расчитанных primes на диске чтобы факоризировать сверх-длинные целые. А ты хотел чтобы Эратосфен до 2 млрд считался за несколько секунд. Но это другая задача. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 19:01 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonЯ нарисовал табличку для тестов и для оценки плотности распределения primes. Ты формулу распределения давал n/ln(n) Чем дальше, тем формула точнее предсказывает. На лярде по формуле 48254942, на 5% не совпало. Табличка полезна для контроля точности вычислений. Если совпало, то остается проверить что все найденные простые (взаимно поделив друг н друга) и можно утверждать что генератор корректно работает. По хорошему какой-то экспресс-тест надо изобрести, т.к. делить не быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 19:02 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Формула - асимтотична. На малых величинах она вообще вихляется чудовищно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 19:04 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Но она полезна в другом. У меня был план - хранить расчитанные primes в бинарных файлах специально оптимизированных по размеру (каждое число укладывалось в несколько бит). И индексировать для последовательного от min до max итератора по файлу. Но эта задея до сих пор у меня не взлетела именно из-за капризного характера самих primes. Их невозможно оценить по стат-показателям. Они - постоянно плывут. Дельта между primes плывёт. Плывёт разрядность. Причём постоянно в сторону усложнения архитектур. Пожалуй n/ln(n) это единственное что стационарно. Хоть какая-то точка отсчёта в этом океане хаоса. Вобщем старик Ландау хихикает в своём гробу глядя на мои потуги. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 19:08 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonПросто мы решаем разные задачи. Я искал оптимальные способы хранения расчитанных primes на диске чтобы факоризировать сверх-длинные целые. Готовь диски, всё будет. max_prime(uint64_t x) посчитаем. Точнее уже есть заготовка, просто не доделал, поэтому не выложил. Сначала с Сашей отвлекся на Аткина (не зря, получили ориентир по скорости), потом с наведением порядка и заливкой разбирался. Я привык решать вопросы последовательно. Начали с начала - иду той же последовательностью. Начинал с Эратосфена, тут причесал - выложил. Самое вкусное оставлено на десерт. Тут еще мысль с оптимизацией шага цикла недоделана. maytonА ты хотел чтобы Эратосфен до 2 млрд считался за несколько секунд. Но это другая задача. Он будет считаться за 100 мс. Порвем Аткина. Есть мысли. Потерпи :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 19:15 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
mayton, откомпилировал твой исходник, с ходу не получилось, MSVC 2008 не понял. Пришлось поправить Код: plaintext 1. 2. Вывод в консоль это жесть. Завешивает RDP-терминал наглухо. Ладно хоть до миллиона указал, не долго считалось :) Статистика ожидаемая, пытаюсь с ней боротьсяKey[3] = 7 %, hits = 49999 Key[5] = 5 %, hits = 33331 Key[7] = 4 %, hits = 26660 Key[11] = 3 %, hits = 22846 Key[13] = 3 %, hits = 20754 Key[17] = 2 %, hits = 19148 Key[19] = 2 %, hits = 17999 Key[23] = 2 %, hits = 17039 Key[29] = 2 %, hits = 16271 Key[31] = 2 %, hits = 15669 Key[37] = 2 %, hits = 15154 Key[41] = 2 %, hits = 14692 Key[43] = 2 %, hits = 14290 Key[47] = 2 %, hits = 13935 Key[53] = 2 %, hits = 13584 Key[59] = 1 %, hits = 13230 Key[61] = 1 %, hits = 12904 Key[67] = 1 %, hits = 12630 Key[71] = 1 %, hits = 12321 Key[73] = 1 %, hits = 12052 Key[79] = 1 %, hits = 11823 Key[83] = 1 %, hits = 11533 Key[89] = 1 %, hits = 11283 Key[97] = 1 %, hits = 11004 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 20:11 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Обновись снова. Я не знал что ты будешь компилировать с _DEBUG ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 21:06 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonПросто мы решаем разные задачи. Зафиксировал недоделанную next_prime64(). Она рабочая, но не оптимизированная под последовательности, не x64, считает только до 2^32. Но как считает: Код: plaintext 1. результатprime 4200000037 time 0 Смотри nextprime.cpp С разрядностью разбираюсь. Остальная оптимизация позже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 21:06 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TВывод в консоль это жесть. Завешивает RDP-терминал наглухо. Ладно хоть до миллиона указал, не долго считалось :) Если ты - счастливый обладатель Пингвина - то запускай Код: plaintext 1. Для винды. Код: plaintext 1. или в файл. А так будет ацкий тормоз. Но вобщем-то смысл моей работы был в том что числа нужно где-то хранить. Просто count(*) мне неинтересен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 21:21 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
В debug запустил потому что MS VC его по дефолту ставит. Сейчас вообще в дебаг не компилируется. Мелочи. Сегодняшние изучения. Микрооптимизация ускоряющая твой код на 20-25% Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Это пропуск кратных тройке. Там счетчик итого показывает на 1 больше, но вроде это со счетчиком проблема. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 21:50 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
mayton, Dima T Добавьте простенький CMakeLists хотя бы как во вложении (он для pbfa) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 22:12 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonНо вобщем-то смысл моей работы был в том что числа нужно где-то хранить. Просто count(*) мне неинтересен. Допили под свои потребности Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. пока x32 позже будет next_prime64() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 22:13 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Рационально. Потестил. На 100_000 сошлось. Значит всё будет ок. Выражение step переделал. Скорость еще не мерял но с шагом больше двух полюбому быстрее будет. Код: plaintext 1. 2. Fixed. Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 22:19 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
mayton, похоже ты не понимашь главного: next_prime(X) это простейший супер-интерфейс получения простых чисел. Хочешь с нуля считай, хочешь - любое следующее, как следствие - диапазон от .. до, хочешь на простоту проверяй Х == next_prime(X - 1). Разве что предыдущее сложно получить. а дальше сам решай сохранять их или просто считать сколько получилось. PS mayton, готовь диски, x64 простых ~4*10^17, или 400`000 терачисел :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 22:31 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima T, какие ограничения на память будут действовать для твоего решета x64 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 22:41 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonСкорость еще не мерял но с шагом больше двух полюбому быстрее будет. Это тест был незаконченный, хочу унивесальный пропуск сделать (2,3,5,7 ...) Затестить какой оптимальнее. По замерам времени: возьми мой header.h, там есть now_msec() для замеров в мс, а то в секундах несерьезно. Можешь стандартный clock() использовать, только в линуксе он считает сколько програма реально проработала, всякие sleep() не учитывает, но в данном случае это не критично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 22:41 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonDima T, какие ограничения на память будут действовать для твоего решета x64 ? Можно медленно с 64Кб, можно быстро с максимум 750 Мб(все простые x32 в uint32). Оба варианта дадут одинаково быстро посчитают однократно next_prime64(X), разница в скорости будет на расчете диапазона (при малом кэше придется пересчитывать). Для быстрого расчета next_prime64(X) надо в кэше иметь все простые до sqrt(X), в первый заход они расчитываются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 22:50 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Ну... перефразирую вопрос. Вот задача. Проверить на простоту это число. Код: plaintext 1. Факторизовать. Как более общая постанока. Разложить на простые. Я писал об этом в начале топика. Меня увлекает это. Я - have fun от подобных головоломок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2015, 23:04 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonПросто мы решаем разные задачи. Я искал оптимальные способы хранения расчитанных primes на диске чтобы факоризировать сверх-длинные целые. maytonНу... перефразирую вопрос. Вот задача. Проверить на простоту это число. Код: plaintext 1. Факторизовать. Как более общая постанока. Разложить на простые. Я писал об этом в начале топика. Меня увлекает это. Я - have fun от подобных головоломок.Чтобы "факоризировать сверх-длинные целые", не надо хранить простые числа. Бесполезно это. А число ваше простое, по крайней пере по вероятностным тестам. Нужно доказанное простое - смотрите на что-нибудь типа https://ru.wikipedia.org/wiki/Тест_Миллера_(теория_чисел) или https://ru.wikipedia.org/wiki/Критерий_Поклингтона ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 05:27 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonУ меня был план - хранить расчитанные primes в бинарных файлах специально оптимизированных по размеру (каждое число укладывалось в несколько бит). Делись планом. Это одна из недорешанных проблем. Из моего алгоритма Эратосфен никуда не не исчез, поэтому кэш нужен. Причем нужен быстрый последовательный перебор от 2 до N. Где N макс.простое до 2^32 Самое быстрое это вектор uint32, для расчета любого x64 под него потребуется 750 Мб. Пока использована биткарта, ей хватает 256 Мб, но чтение из нее это побитовый перебор - очень не быстро, секунда на проход. Есть мысль хранить расстояние между соседними, если не окажется дырок больше 128К, то можно будет взять массив uint16 - это 375 Мб ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 06:56 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
mayton271963805968702864258461551790513043662751795453 Критерий Поклингтона для вашего числа: N = 271963805968702864258461551790513043662751795453 N-1 = 90233392513315464829662320219386916428363 * 3014004 Берем a=2, проверяем что 2^(N-1) mod N = 1 и gcd(2^3014004-1, N) = 1 - это легко, возьмите gmp (или mpir под windows) и проверьте. Я проверил. Правда теперь надо еще доказать, что 90233392513315464829662320219386916428363 простое. Для него можно проделать все то же самое, теперь упремся в доказательство простоты 10378812113332811689632196942648598623. С этим хуже, для него N-1 = 2*3*11*73*761*83537*403253*1108092371*75833962769 - тут нет простого множителя больше квадратного корня, критерий Поклингтона не получиться использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 07:41 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonНу... перефразирую вопрос. Вот задача. Проверить на простоту это число. Код: plaintext 1. Факторизовать. Как более общая постанока. Разложить на простые. Я писал об этом в начале топика. Меня увлекает это. Я - have fun от подобных головоломок. Есть библиотеки специальные, GMP например. Результат совместного творчества решения подобных головоломок умными дядьками. ИМХУ мне их точно не перегнать. 271963805968702864258461551790513043662751795453 is probably prime Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. не понял что второй параметр mpz_probab_prime_p() задает https://gmplib.org/manual/Number-Theoretic-Functions.html Я так понимаю нет чудо теста который гарантированно скажет что это простое число, 100% гарантия это только перебор с делениями на все sqrt(x) и производные от него. Вобщем все упирается в sqrt(x), в данном случае до 10^24 или перебор ~10^22 простых. Со скоростью 1 млрд. в секунду уйдет всего 317 млрд. лет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 07:55 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
BarloneЧтобы "факоризировать сверх-длинные целые", не надо хранить простые числа. Бесполезно это. А число ваше простое, по крайней пере по вероятностным тестам. Нужно доказанное простое - смотрите на что-нибудь типа https://ru.wikipedia.org/wiki/Тест_Миллера_(теория_чисел) или https://ru.wikipedia.org/wiki/Критерий_Поклингтона Я вобщем-то ждал этого. Ну что-ж спасибо за совет. Думаю что в обучательных целях некоторое хранилище простых кому-то пригодиться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 08:02 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonДумаю что в обучательных целях некоторое хранилище простых кому-то пригодиться. возможно пригодится 17467271 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 08:08 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TЯ так понимаю нет чудо теста который гарантированно скажет что это простое число, 100% гарантия это только перебор с делениями на все sqrt(x) и производные от него. Вобщем все упирается в sqrt(x), в данном случае до 10^24 или перебор ~10^22 простых. Со скоростью 1 млрд. в секунду уйдет всего 317 млрд. лет :) Дима! Ну что за пессимизм. А векторность. Мультипоточность. Гриды. Ну прямо сел на пенёк и упал духом! Go! Go! Секс. Rock-n-Roll и С++!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 08:12 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonДима! Ну что за пессимизм. А векторность. Мультипоточность. Гриды. Не, это число конечно обсчитаем всей планетой за пару месяцев, а второе где считать будем? Как ни крути - надо ускорять Эратосфена алгоритмическими способами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 08:17 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TЯ так понимаю нет чудо теста который гарантированно скажет что это простое числоНу как же нет, надо провести тест Миллера для всех простых не превосходящих 2*log²(N) - примерно до 23858. А, ну еще гипотезу Римана доказать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 09:35 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TЕсть мысль хранить расстояние между соседними, если не окажется дырок больше 128К, то можно будет взять массив uint16 - это 375 МбВроде бы отсутствие контрпримеров к гипотезе Лежандра гарантирует отсутствие дырок больше 128К для простых не превосходящих 2^32. Или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 10:12 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Зафиксировал next_prime64(). Теперь она x64. Код: plaintext 1. Barlone А, ну еще гипотезу Римана доказать :) Как понимаю из-за этой "мелочи" GMP пишет is probably prime :) Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 10:19 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
BarloneDima TЕсть мысль хранить расстояние между соседними, если не окажется дырок больше 128К, то можно будет взять массив uint16 - это 375 МбВроде бы отсутствие контрпримеров к гипотезе Лежандра гарантирует отсутствие дырок больше 128К для простых не превосходящих 2^32. Или нет? Посчитать элементарно max delta 336 between 3842610773 and 3842611109 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Результатmax delta 6 between 23 and 29 max delta 8 between 89 and 97 max delta 14 between 113 and 127 max delta 18 between 523 and 541 max delta 20 between 887 and 907 max delta 22 between 1129 and 1151 max delta 34 between 1327 and 1361 max delta 36 between 9551 and 9587 max delta 44 between 15683 and 15727 max delta 52 between 19609 and 19661 max delta 72 between 31397 and 31469 max delta 86 between 155921 and 156007 max delta 96 between 360653 and 360749 max delta 112 between 370261 and 370373 max delta 114 between 492113 and 492227 max delta 118 between 1349533 and 1349651 max delta 132 between 1357201 and 1357333 max delta 148 between 2010733 and 2010881 max delta 154 between 4652353 and 4652507 max delta 180 between 17051707 and 17051887 max delta 210 between 20831323 and 20831533 max delta 220 between 47326693 and 47326913 max delta 222 between 122164747 and 122164969 max delta 234 between 189695659 and 189695893 max delta 248 between 191912783 and 191913031 max delta 250 between 387096133 and 387096383 max delta 282 between 436273009 and 436273291 max delta 288 between 1294268491 and 1294268779 max delta 292 between 1453168141 and 1453168433 max delta 320 between 2300942549 and 2300942869 max delta 336 between 3842610773 and 3842611109 end calc to 4294967295 count 203231690 time 23904 msec Замечательно. Хватит одного байта. Все разницы четные, поэтому на 2 поделим. Т.е. итого 203 Мб. 31 вариант всего, можно в 5 бит уместить. Т.е. 127 Мб. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 10:41 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima T31 вариант всего, можно в 5 бит уместить. Т.е. 127 Мб. Обсчитался, немного, не все скопировал с консоли. Еще есть разницы 2 и 4, т.е. вариантов 33, поэтому 6 бит надо. Или 152 Мб. Это если кто хранением захочет заняться. Мне больше однобайтовый вариант подходит, хранить delta/2, чтобы быстро писать и быстро читать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 10:59 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima T31 вариант всего, можно в 5 бит уместить. Т.е. 127 Мб.Не, про 31 вариант неправда. Точно есть разности 2 и 4. Ну и после нахождения большой дельты вы уже не показываете меньшие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 11:02 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Например, между 139 и 149 дельта 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 11:06 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
BarloneНапример, между 139 и 149 дельта 10. Точно, тест про другое. Это не проверилось т.к. раньше было 127 - 113 = 14 Тогда 1 байт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 11:11 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TТогда 1 байт.Надо к ним кодирование Хаффмана применить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 11:20 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Я предполагал использовать знаковое кодирование для кодов Левенштейна или Фибоначчи. Чтобы плотно ужимать поток "Дельт". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 11:42 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
BarloneDima TТогда 1 байт.Надо к ним кодирование Хаффмана применить. Хаффман - это очень хороший вариант. Но надо будет делать перерасчёт таблицы для каждого файла-блока primes. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 11:57 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Да там кстати и повторяющиеся последовательности будут, та же "4,2,4,2,4,6,2,6" где-то вылезет. Так что взять и пожать zlib, ничего не изобретая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 12:12 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
zlib нас ограничивает в произвольном доступе. К примеру если 2-Гб трафик (потока дельт) был сжат. Но нам нужно получить актуальность какогото prime который лежит в середине файла - придётся пробегать с самого начала. Кастомные-же форматы позволяют нам строить индекс по этому сжатому трафику. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 12:41 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Посчитал распределение end calc to 4294967295 time 9203 msec DeltaCountДоляНарастающим120.00%0.00%2127366336.27%6.27%4127372846.27%12.53%62284663311.24%23.78%8102021715.02%28.80%10132239506.51%35.30%12171747328.45%43.75%1495354204.69%48.45%1672012983.54%51.99%18131830606.49%58.48%2072957043.59%62.07%2262556103.08%65.14%2495642594.71%69.85%2645805112.25%72.10%2849938332.46%74.56%3090758874.47%79.03%3228918161.42%80.45%3430441011.50%81.95%3650125382.47%84.41%3823725181.17%85.58%4028216181.39%86.97%4242218192.08%89.05%4417398230.86%89.90%4615094880.74%90.65%4826237321.29%91.94%5015043530.74%92.68%5211399490.56%93.24%5419155290.94%94.18%569988550.49%94.67%588618580.42%95.10%6017945700.88%95.98%625690120.28%96.26%645806200.29%96.54%6610762230.53%97.07%684429190.22%97.29%706351460.31%97.60%726508570.32%97.92%743227110.16%98.08%762889520.14%98.23%785545090.27%98.50%802871550.14%98.64%822038530.10%98.74%844257720.21%98.95%861540200.08%99.03%881601340.08%99.10%903258690.16%99.26%921105000.05%99.32%941012970.05%99.37%961794880.09%99.46%98948970.05%99.50%100989750.05%99.55%1021326480.07%99.62%104610420.03%99.65%106539270.03%99.67%108935500.05%99.72%110569220.03%99.75%112448270.02%99.77%114691480.03%99.80%116294880.01%99.82%118290010.01%99.83%120624470.03%99.86%122199640.01%99.87%124201770.01%99.88%126388010.02%99.90%128140210.01%99.91%130193130.01%99.92%132245740.01%99.93%134105980.01%99.94%13693960.00%99.94%138179890.01%99.95%140112410.01%99.96%14267860.00%99.96%144116100.01%99.96%14649930.00%99.97%14854920.00%99.97%150113100.01%99.98%15236100.00%99.98%15444950.00%99.98%15663390.00%99.98%15826220.00%99.98%16030600.00%99.99%16240850.00%99.99%16419610.00%99.99%16617320.00%99.99%16838700.00%99.99%17018560.00%99.99%17212310.00%99.99%17422060.00%99.99%17610270.00%99.99%1789050.00%99.99%18020070.00%100.00%1827830.00%100.00%1846860.00%100.00%18610700.00%100.00%1884250.00%100.00%1906670.00%100.00%1927390.00%100.00%1943550.00%100.00%1963820.00%100.00%1986480.00%100.00%2003150.00%100.00%2022310.00%100.00%2044130.00%100.00%2061730.00%100.00%2081700.00%100.00%2104190.00%100.00%2121240.00%100.00%214990.00%100.00%2161880.00%100.00%218810.00%100.00%2201140.00%100.00%2221100.00%100.00%224660.00%100.00%226560.00%100.00%228870.00%100.00%230570.00%100.00%232320.00%100.00%234890.00%100.00%236320.00%100.00%238340.00%100.00%240560.00%100.00%242220.00%100.00%244180.00%100.00%246280.00%100.00%248170.00%100.00%250150.00%100.00%252250.00%100.00%25460.00%100.00%256100.00%100.00%258160.00%100.00%26080.00%100.00%26280.00%100.00%264100.00%100.00%266100.00%100.00%26850.00%100.00%270100.00%100.00%27220.00%100.00%27420.00%100.00%27670.00%100.00%27810.00%100.00%28040.00%100.00%28260.00%100.00%28430.00%100.00%28620.00%100.00%28850.00%100.00%29050.00%100.00%29230.00%100.00%30410.00%100.00%30610.00%100.00%31010.00%100.00%32010.00%100.00%33620.00%100.00%203231689100.00% Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 150 вариантов. Минимум 8 бит. Весь диапазон 168 (336/2). ИМХУ нет смысла заморачиваться на хитрое хранение. Не совсем понял зачем вы коды добавлять собрались. Если для контроля целостности при хранении, то проще писать блоками, в начале и конце указывать полное значение, проверить не сложно. Судя по распределению обычный архиватор должен хорошо пожать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 12:42 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Сохранил в файл. Не особо жмется Типразмерисходный203 231 689zip168 118 383rar158 861 104 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 12:58 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonzlib нас ограничивает в произвольном доступе. К примеру если 2-Гб трафик (потока дельт) был сжат. Но нам нужно получить актуальность какогото prime который лежит в середине файла - придётся пробегать с самого начала. Кастомные-же форматы позволяют нам строить индекс по этому сжатому трафику.Ну чтобы получить prime по дельтам, по любому надо с самого начала начинать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 13:00 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TПосчитал распределение DeltaCountДоляНарастающим120.00%0.00% Это что за артефакт? Понятно, 3-2 = 1. А откуда вторая дельта = 1? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 13:05 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
А, увидел, начальное значение, 2-1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 13:07 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
BarloneЭто что за артефакт? Понятно, 3-2 = 1. А откуда вторая дельта = 1? 2-1 перебор с единицы начинается. Код там же. Накосячил немного :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 13:08 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Что в распределении явно выделяются кратные 6 - кажется довольно неожиданным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 13:12 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Сохранил бикарту в файл: Типразмерисходный268 435 456zip141 244 527rar133 962 811 Биткарта лучше жмется. И для произвольного доступа удобнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 13:14 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TБиткарта лучше жмется. И для произвольного доступа удобнее.Я уже предлагал делать биткарту только для некратных 2,3,5. Получается по байту на 30 чисел. Правда доступ чуть сложнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 13:18 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
BarloneЧто в распределении явно выделяются кратные 6 - кажется довольно неожиданным. Это не кратные, а разница 6. В принципе объяснимо кратными 3. для исключения кратных 3 так перебор строится Код: plaintext 1. 2. 3. 4. половина двоек и четверок отсекается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 13:23 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Barlonemaytonzlib нас ограничивает в произвольном доступе. К примеру если 2-Гб трафик (потока дельт) был сжат. Но нам нужно получить актуальность какогото prime который лежит в середине файла - придётся пробегать с самого начала. Кастомные-же форматы позволяют нам строить индекс по этому сжатому трафику.Ну чтобы получить prime по дельтам, по любому надо с самого начала начинать. Всё зависит от того как мы спроектируем. Варианты: 1) Быстрое получение признака primary. Большой объём дискового хранилища. 2) Среднее время получения признака primary. Компромиссный (регулируемый объём) дискового хранилища исходя из требования или пожелания по времени ожидания. 3) Медленное получение признака. Компактный объём. Архив. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 13:24 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
BarloneDima TБиткарта лучше жмется. И для произвольного доступа удобнее.Я уже предлагал делать биткарту только для некратных 2,3,5. Получается по байту на 30 чисел. Правда доступ чуть сложнее. Думаю оптимальный вариант для хранения и произвольного доступа. Компактнее будет чем у меня в RARе. У меня только кратные пропущены. 1 байт 16 чисел. Можно затестить если код будет: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 13:38 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TBarloneЧто в распределении явно выделяются кратные 6 - кажется довольно неожиданным. Это не кратные, а разница 6. В принципе объяснимо кратными 3. для исключения кратных 3 так перебор строится Код: plaintext 1. 2. 3. 4. половина двоек и четверок отсекается Дима. А если мы оставшийся трафик прогоним через какой-нибудь анализ. Вдруг еще чего-то "кикнуть" можно будет? Но желательно чтоб формула была простака. Типа вот разность или xor. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 13:44 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TЭто не кратные, а разница 6.Понятно, что разности кратные 6. Почему-то мне казалось, что распределение должно убывать более равномерно. А нет, например 30 встречается заметно чаще, чем 28 и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 13:49 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
2 all. В сборке pbfa-x64 я добавил подсчёт "чисел-близнецов" twin-primes. Возможно пригодится для оценки. Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 13:50 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TBarloneпропущено... Я уже предлагал делать биткарту только для некратных 2,3,5. Получается по байту на 30 чисел. Правда доступ чуть сложнее. Думаю оптимальный вариант для хранения и произвольного доступа. Компактнее будет чем у меня в RARе. У меня только кратные пропущены. 1 байт 16 чисел. Можно затестить если код будет: Код: plaintext 1. 2. навскидку что-то такое Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 13:54 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
BarloneКритерий Поклингтона для вашего числа: N = 271963805968702864258461551790513043662751795453 N-1 = 90233392513315464829662320219386916428363 * 3014004 Берем a=2, проверяем что 2^(N-1) mod N = 1 и gcd(2^3014004-1, N) = 1 - это легко, возьмите gmp (или mpir под windows) и проверьте. Я проверил. Правда теперь надо еще доказать, что 90233392513315464829662320219386916428363 простое. Для него можно проделать все то же самое, теперь упремся в доказательство простоты 10378812113332811689632196942648598623. С этим хуже, для него N-1 = 2*3*11*73*761*83537*403253*1108092371*75833962769 - тут нет простого множителя больше квадратного корня, критерий Поклингтона не получиться использовать. Уже третий раз берусь писать комментарий но всё откладываю. Спрошу проще. Данный критерий даёт примерно одинаковую вероятность простоты для всех чисел? Или одни числа могут быть простыми с большей вероятностью чем другие? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 13:56 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonДима. А если мы оставшийся трафик прогоним через какой-нибудь анализ. Вдруг еще чего-то "кикнуть" можно будет? Но желательно чтоб формула была простака. Типа вот разность или xor. Который трафик? на входе (диапазон чисел) или на выходе (простые). Я как раз этим и занимался. Не закончил. С тройкой все просто, шаг 2,4,2,4... Дальше сложнее: для (2,3,5) шаги 4,2,4,2,4,6,2,6 тут уже таблица нужна, но тоже достаточно быстро должно быть Код: plaintext 1. 2. 3. 4. 5. 6. это непроверенный код, пока только вычислил шаги, не факт что не ошибся. (2,3,5,7) - 48 шагов (2,3,5,7,11) - 480 шагов (2,3,5,7,11,13) - 5720 шагов По хорошему надо генератор последовательностей написать и затестить какая выше взлетит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 14:08 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonBarloneКритерий Поклингтона для вашего числа: N = 271963805968702864258461551790513043662751795453 N-1 = 90233392513315464829662320219386916428363 * 3014004 Берем a=2, проверяем что 2^(N-1) mod N = 1 и gcd(2^3014004-1, N) = 1 - это легко, возьмите gmp (или mpir под windows) и проверьте. Я проверил. Правда теперь надо еще доказать, что 90233392513315464829662320219386916428363 простое. Для него можно проделать все то же самое, теперь упремся в доказательство простоты 10378812113332811689632196942648598623. С этим хуже, для него N-1 = 2*3*11*73*761*83537*403253*1108092371*75833962769 - тут нет простого множителя больше квадратного корня, критерий Поклингтона не получиться использовать. Уже третий раз берусь писать комментарий но всё откладываю. Спрошу проще. Данный критерий даёт примерно одинаковую вероятность простоты для всех чисел? Или одни числа могут быть простыми с большей вероятностью чем другие?Это как бы детерменированный тест. Про какую вероятность речь? Что для простого N и некоторого а (которое в примере 2) gcd будет не 1? Не знаю, на самом деле это вообще маловероятно. Да, этот критерий используют не для проверки простоты, а для её доказательства. Разница понятна? Для проверки простоты используют вероятностный тест Миллера-Рабина - он говорит "число точно не простое / возможно простое". А критерий Поклингтона - "число точно простое / возможно не простое". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 14:17 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Barloneнавскидку что-то такое Затестил, работает Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. Типразмерисходная143 165 577zip105 477 171rar106 706 171 ИМХУ это пока самый оптимальный вариант для хранения. switch() только на массив заменить, чтобы так было mask[n%30] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 14:52 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
BarloneЭто как бы детерменированный тест. Про какую вероятность речь? Что для простого N и некоторого а (которое в примере 2) gcd будет не 1? Не знаю, на самом деле это вообще маловероятно. Да, этот критерий используют не для проверки простоты, а для её доказательства. Разница понятна? Для проверки простоты используют вероятностный тест Миллера-Рабина - он говорит "число точно не простое / возможно простое". А критерий Поклингтона - "число точно простое / возможно не простое". Спасибо. Всё это надо обдумать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 15:08 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TТипразмерисходная143 165 577zip105 477 171rar106 706 171 ИМХУ это пока самый оптимальный вариант для хранения. switch() только на массив заменить, чтобы так было mask[n%30]Надо уже куда-нибудь выложить файл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 15:11 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
BarloneНадо уже куда-нибудь выложить файл. Смысл один файл вкладывать? Он дольше качаться будет чем генериться. Причесал немного. Сделал x64. Выложил исходник https://sourceforge.net/projects/primegen/ только там _strtoui64(), как понял только в MSVC скомпилируется. Не искал еще аналог для линукса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 16:03 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima Tтолько там _strtoui64(), как понял только в MSVC скомпилируется. Не искал еще аналог для линукса. strtoull ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 16:19 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
BarloneDima Tтолько там _strtoui64(), как понял только в MSVC скомпилируется. Не искал еще аналог для линукса. strtoull ? Поправил. Компилируется в линуксе. Залил. https://sourceforge.net/p/primegen/code/HEAD/tree/trunk/DimaT/bitmap30.cpp ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 16:43 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Взлетает идея с оптимизацией шагов цикла. Результатыtest eratosfen2() skip 2 from 1 to 1000M eratosfen2() 1524M(499M) steps count 50847534 primes time 4786 msec test eratosfen3() skip 2,3 from 1 to 1000M eratosfen3() 1191M(333M) steps count 50847534 primes time 4277 msec test eratosfen5() skip 2,3,5 from 1 to 1000M eratosfen5() 1024M(266M) steps count 50847534 primes time 4095 msec это замер трех вариантов перебора до 10^9 с пропусками кратно 2, затем 2,3, затем 2,3,5 Синим: количество млн. итераций всего(в т.ч. оптимизируемого цикла) Красным: общее время расчета. Цикл такой Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Целиком тут https://sourceforge.net/p/primegen/code/HEAD/tree/trunk/DimaT/eratosfentest.cpp Можно писать генератор, только мне массив offset[] не нравится. Как бы его укоротить. Попробую на switch() заменить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 18:02 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Я тут решил посчитать сколько primes мы выкурим по 64-битной архитектуре. Максимальное целое unit64 = 0xFFFF FFFF FFFF FFFF = 18 446 744 073 709 551 615 415 828 534 307 635 091 или 415 "пета"-чисел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 18:22 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Плотность primes на последних интервалах стремиться к 2%. Если работать по Эратосфену - то по сути гоняем воздух. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 18:26 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonЯ нарисовал табличку для тестов и для оценки плотности распределения primes. Selection from 2 to..Primes detectedAll to primes ratio10025 0.251000 168 0.16810000 1 229 0.1229100000 9 592 0.095921000000 78 498 0.07849810000000 664 579 0.0664579100000000 5 761 455 0.057614551000000000 50 847 534 0.05084753418 446 744 073 709 551 615415 828 534 307 635 091(approx)0.0225421100 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 18:40 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
0.0508 всего в 2.258 раза больше 0.0225. Решаемо. Оптимизатор цикла поглубже сделать. Тестю switch(), есть мысли по 17471110 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 18:48 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Хм... оказывается в Java (BigInteger) есть имплементация некой проверки на простоту. Метод isProbablePrime() который в свою очередь сложно зависим либо от теста passesMillerRabin(), (насколько я понял имеется в виду этот метод) и либо от совокупности решений passesMillerRabin(..) && passesLucasLehmer(..). Последний - скорее всего https://ru.wikipedia.org/wiki/Тест_Люка_—_Лемера Забавно что isProbablePrime в методе МиллераРабина оставляет за собой право вызывать функцию SecureRandom() очевидно для получения некой энтропии. Интересно насколько это влияет на дерерминизм самого метода isProbablePrime. Мда. Коллеги. Я многих веще признаться не знал. Надо подумать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 19:05 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonЗабавно что isProbablePrime в методе МиллераРабина оставляет за собой право вызывать функцию SecureRandom() очевидно для получения некой энтропии. Интересно насколько это влияет на дерерминизм самого метода isProbablePrime. Ну, учитывая основное назначение подобных функций, детерминизм был бы там скорее минус чем плюс )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 19:11 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Еще метод isProbablePrime (в стеке вызовов внутренних методов) содержит искусственный ограничитель раундов проверки Рабина. Машинально делая code-review глазами я застрял на нём сейчас. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Обратите внимание что чем больше разрядная сетка основного числа которое мы проверяем тем меньше циклов Рабина идёт на выход. По всей видимости это искусственное ограничение на сам метод чтобы не грузить пользователя долгим откликом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 19:19 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonЗабавно что isProbablePrime в методе МиллераРабина оставляет за собой право вызывать функцию SecureRandom() очевидно для получения некой энтропии. А может они в качестве финальной проверки используют генерацию RSA-ключа и шифрование-дешифрование блока. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 19:24 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
BigInteger не содержит зависимостей от крипто-библиотек. Скорее наоборот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 19:29 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovА может Пардон, брякнул не прочитав ссылку. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 19:30 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonBigInteger не содержит зависимостей от крипто-библиотек. Для проверки на простоту не надо генерировать криптостойкий RSA ключ, поэтому криптобиблиотеки и не нужны. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 19:35 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Модератор: Коллеги. Я потёр весь оффтопик касающийся SVN клиента и настроек. В дальнейшем давайте либо личным сообщением либо в отдельный топик ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2015, 21:01 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima Tпамяти в x32 не хватает чтобы результаты обоих хранитьСравните контрольные суммы, а не сами результаты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2015, 00:03 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Дима. Я на выходных попробую запилить Рабина-Миллера. И посмотреть его погрешность в определении простоты. Особо меня заинтересовало как можно устранить источник энтропии внутри функции. Иначе это путает все карты. offОказывается Рабин - это не только фамилия. Это еще и титул учёного-толкователя ("раввин"). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2015, 11:40 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonДима. Я на выходных попробую запилить Рабина-Миллера. И посмотреть его погрешность в определении простоты. Всё уже украдено до нас - https://oeis.org/A001262 https://oeis.org/A020229 https://oeis.org/A074773 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2015, 20:37 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
http://web.mit.edu/primes/materials/2014/conf/5-1-Narayanan.pdf Модератор: Не ленись давать комментарии к ссылкам, пожалуйста ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2015, 20:51 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Barlone, почитал ссылки. А на каком языке написан код в разделе 'PROG' ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2015, 22:34 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonBarlone, почитал ссылки. А на каком языке написан код в разделе 'PROG' ? https://en.wikipedia.org/wiki/PARI/GP ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2015, 07:19 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Нарисовал картинку. Слева направо сверху вниз - простые числа обозначенные черными точками. Интервалы в 60 по оси Х обозначены чередующимися бело-жёлтыми полосами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2015, 21:24 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
База данных простых чисел http://habrahabr.ru/post/246789/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2015, 22:24 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Это не первая статья на Хабре про prime generation. К сожалению авторы не продвинулись дальше генерации решета в оперативке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2015, 23:02 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonК сожалению авторы не продвинулись дальше генерации решета в оперативке.На Хабре зачастую комменты бывают очень интересными. ... Я бы порекомендовал автору всесторонне изучить сайт Kim Walisch — http://primesieve.org/ Fast C/C++ prime number generator — и код самой primesieve; реализация шикарная, полированная, ибо человек лет 15 серьезно этим вопросом занимается. Работает primesieve с сумасшедшей производительностью даже на настольном скромном тазике, а подробности реализации сегментированного решета и wheel факторизации полностью документированы. Однако, он явным образом пишет, что «primesieve can generate primes and prime k-tuplets up to 2^64» и всё, край географии. Интересно, почему. Наверное он просто такой задачи себе не ставил, сделать больше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2015, 23:11 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Владимир2012, ОК. Спасибо за ссылку. Топик и так даёт пищу для размышлений на несколько лет вперёд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2015, 23:30 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Владимир2012Однако, он явным образом пишет, что «primesieve can generate primes and prime k-tuplets up to 2^64» и всё, край географии. Интересно, почему. Наверное он просто такой задачи себе не ставил, сделать больше. Надо просто категоризировать задачи которые ставят перед собой энтузиасты и исследователи и прочие фрики. Думаю что задачи такие: 1) Собственно решето . Добавить нечего. Перформанс и скорость. Но на выходе - неизвестно что. Просто отрезок простых чисел. И притом весьма ограниченный. 2) Поиск максимально большого простого. Обычно из подмножества чисел Мерсена. Тема достаточно узкая и кроме того кластерные вычисления уже достаточно далеко зашли. Вики пишет о рекордах отдельно. 3) Доказательство гипотез. (Одна из 23х проблем Гильберта). Тут мне добавить нечего. Я не силён в математике и мне кажется этот вопрос явно не в форум С++. 4) Собственно факторизация. Это то что мне интересно. Особенно для чисел разрядности во много раз превышающей QWORD (64bit). 5) Проверка простоты. Как частный случай варианта 4. Мне также интересна. Но интересно разобрать варианты ложных срабатываний Рабина-Миллера и проанализировать что можно улучшить. Интересно также разобрать AKS. 6) Задачи криптографии. Тут добавить пока нечего. Мало информации. И мало специалистов которые могут внятно дать постановку хотя-бы чего-то полезного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2015, 00:24 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Владимир2012... Я бы порекомендовал автору всесторонне изучить сайт Kim Walisch ... и дальше по тексту это все не мое, а выдержка из комментов к статье. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2015, 00:39 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Немного цифр. По поводу хранения результатов расчёта 64-х битного решета. 2^64 bit = 2^64 / 8 байт = 2^64 / 2 ^ 3 = 2^61 байт = 2^21 Тбайт. В сыром виде эта матрица должна храниться на более чем 2 млн дисковых устройствах типа (HDD 2Тб). При массе 1 устройства 600 г. Весь сторедж будет весить примерно 1 мега-тонну без учота всего остального веса датацентра. Энерго-потребление будет порядка 20 мегаватт при среднем потреблении 1 устройства в 10 ватт. (здесь учтена стационарная работа без процедуры пуска в момент которой ХДД потребляет 1 до ампера) и без обвязки корзинок и RAID агрегаторов и сетевого оборудования. Для питания этого стореджа нехило подошла-бы российская АЭС "Ломоносов" которую производит Росатом и которая даёт с запасиком 35 мегаватт. Надеюсь я если и ошибся то несильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2015, 00:46 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
mayton, ну надо уже к факторизации переходить. Вот только метод решета числового поля я никак понять не могу. Читал не только на википедии, все равно нифига не понимаю. Про квадратичное решето понятно, про эллиптические кривые понятно, а с этим затык. Может, тут есть математики, которые понимают? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2015, 05:24 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
iv_an_ruСравните контрольные суммы, а не сами результаты. Хорошая идея. Думаю достаточно просто XOR всей последовательности и сравнивать количество чисел и XOR. Расчет доКол-воXOR1000012290x25A010000095920xD14B1000000784980x27893100000006645790x274A2610000000057614550x109D7521000000000508475340x5ECF97 сделал микро API для отладки https://sourceforge.net/p/primegen/code/HEAD/tree/trunk/DimaT/header.h Использовать так: Код: plaintext 1. 2. 3. 4. 5. Можно просто скопировать функцию test_check(), забил туда эту табличку. Буду дополнять по мере появления результатов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2015, 07:20 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonНадо просто категоризировать задачи которые ставят перед собой энтузиасты и исследователи и прочие фрики. ... Интереснее просто конкретное применение результатов этого творчества. Из широкоизвестного - криптография, но как понимаю, вся криптография строится на том что задача перебора больших простых нерешаема нынешними тех.средствами. Пример попыток порешать - расчеты биткоинов, по сути тоже криптография и переборы, просто людям дали реальный стимул в это вкладываться в надежде на легкие деньги. Лично мне последний раз понадобился x32 аналог GUID для генерации ID сообщения. Чтобы он был уникален в короткий промежуток времени (пока сообщение в процессе доставки). Сделал так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Т.к. не идеально - просто предусмотрел контроль и ошибку на случай если у получателя приходит второе сообщение с уже имеющимся ID. По ошибке отправитель переинициализирует свой счетчик. По хорошему надо простые числа использовать для максимального уменьшения вероятности повтора. Но было лень качать таблицы и превращать их в массив до 10000. По хорошему так надо инициализировать: Код: plaintext 1. 2. Больше и придумать нечего. Получается что для общего развития и развлечения. Лично мне охота Аткина обогнать, посчитать за <0,5 сек диапазон до 10^9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2015, 08:01 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TБольше и придумать нечего. Получается что для общего развития и развлечения. Ну как сказать, для продвинутых методов факторизации, факторные базы нужны для поиска гладких чисел. Так что там таблица простых пригодится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2015, 08:49 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Сделал генератор таблиц шага, затестил на Эратосфене. РезультатыTest(0M...1000M): eratosfen3_1() skip 2,3 eratosfen3_1() 905M(333M) steps count 50847534 primes. time 4186 msec speed 12147K/sec OK Test(0M...1000M): eratosfen5_1() skip 2,3,5 eratosfen5_1() 772M(266M) steps count 50847534 primes. time 3875 msec speed 13121K/sec OK Test(0M...1000M): eratosfen7() skip 2,3,5,7 eratosfen7() 686M(228M) steps count 50847534 primes. time 3866 msec speed 13152K/sec OK Test(0M...1000M): eratosfen11() skip 2,3,5,7,11 eratosfen11() 635M(207M) steps count 50847534 primes. time 3665 msec speed 13873K/sec OK Test(0M...1000M): eratosfen13() skip 2,3,5,7,11,13 eratosfen13() 593M(191M) steps count 50847534 primes. time 3555 msec speed 14303K/sec OK Лишние итерации уменьшаются, скорость растет, но и вспомогательные таблицы тоже. Для последней надо уже ~140 Кб. Для 17-ти потребуется ~2 Мб. Решил на 13 остановиться. Генератор не буду выкладывать, немного корявый получился, руками надо подправлять таблицу под некоторые случаи (из конца в начало переносить, смещение не точно получилось). Кому готовые таблицы надо - они тут Затестил на mayton\pbfa64.cpp Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Стало быстрее на 15-20% mayton, можешь потестить с таблицей на 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2015, 13:51 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Ого. Ну ладно сегодня вечером затестю. P.S. Понедельник - день тяжкий. Навалилось на меня всё... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2015, 16:01 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TГенератор не буду выкладывать, немного корявый получился, руками надо подправлять таблицу под некоторые случаи (из конца в начало переносить, смещение не точно получилось).Ну генератор же это элементарно Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2015, 16:05 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
BarloneНу генератор же это элементарно Код: plaintext 1. 2. 3. 4. Спасибо. На этом споткнулся, запутался как смещение правильно выставить. Эта двойка иногда на первое место вставала. Причешу, выложу. У меня готовый код цикла генерится. Может кому пригодится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2015, 16:37 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Мета-программинг достиг своих высот. Эратосфен внезапно(!) сгенерил эратосфена... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2015, 16:39 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonМета-программинг достиг своих высот. Эратосфен внезапно(!) сгенерил эратосфена...Да, чтобы не вычеркивать повторно уже вычеркнутые числа, нужен просеиватель вычеркиваемого... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2015, 17:06 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonМета-программинг достиг своих высот. Эратосфен внезапно(!) сгенерил эратосфена... Не, это от лени, лень писать быстрый генератор чтобы просто вставить его в код :) По хорошему надо впилить Эратосфена в инициализацию Эратосфена. Вот думаю может все-таки допилить пример Barlone, а не выкладывать мета-генераторы, тем более таблицы не маленькие получаются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2015, 17:51 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Кстати слабо третью награду получить? :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2015, 19:22 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Дима sorry. Еще нечитал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2015, 22:59 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Ну когда уже факторизацией по серьезному займемся? Есть такой P-1 метод Полларда . И есть Алгоритм Ленстры . У них похожая идея - если порядок некой группы (для P-1 метода - мультипликативная группа кольца вычетов, для алгоритма Ленстры - группа точек эллиптической кривой) по модулю одного из сомножителей - гладкое число, мы можем найти этот сомножитель. Для мультипликативной группы по простому модулю P порядок всегда равен P-1. Для группы точек эллиптической кривой порядок может быть разным, но близким к P - Теорема Хассе . А нельзя ли найти какую-нибудь другую группу, у которой порядок был бы много меньше P? Вот например можно взять решения уравнения Пелля - они тоже образуют группу. Но вот если рассматривать решения по простому модулю P, то порядок группы будет P-1 или P+1. Так что практического интереса не представляет. Однако я некоторое время назад чисто для проверки концепции программку накидал Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2015, 16:36 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Барлон. Я выпал в осадок. Ты мне сначала лекции прочитай по кольцам вычетов а потом уж факторизация.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2015, 17:55 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
И возможно у тебя есть желание присоединиться к нашей группе разработки? PrimeGen. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2015, 18:25 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
BarloneНу когда уже факторизацией по серьезному займемся? Есть такой P-1 метод Полларда .... ... Реализация этого метода на C++ http://gforge.inria.fr/projects/ecm/ svn checkout svn://scm.gforge.inria.fr/svnroot/ecm/trunk PS: То бишь в вашей группе скорее всего должна быть не "лебедь, рак и щука", а иметь обоюдное согласие на апробирование тех или иных математических методов ... Я рад за вас. Если не секрет чего вы хотите достичь? /вполне допускаю, что понимание этого придет во время работы/. Однозначно вам нужен математик. Как по мне, так то чем вы занялись из серии - "... а не замахнуться ли нам на Шекспира". Dima T не обижайся. То чего ты хочешь достичь - "Лично мне охота Аткина обогнать, посчитать за <0,5 сек диапазон до 10^9." Как по мне, то лучше "ляг поспи и все пройдет" /хотя тебе виднее .../ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2015, 19:29 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Владимир2012, Из математических пакетов как по мне лучший - Mathematica http://rutracker.org/forum/viewtopic.php?t=4337743 Это целая вселенная ... /попасть в нее легко .../ PS: Кроме того на просторах inet имеется несколько несколько математических пакетов с исходниками /десятки тысяч математических алгоритмов .../. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2015, 19:39 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Вывихнул мозг асинхронностью очередной раз. Пытаюсь шаги цикла к next_prime() приделать. Пока результаты от 1 до 10^9 такие Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. next_prime() - достраивает решето с 1, пропускает четные, эталонный показатель. next_prime2() - не тратит лишнюю память, только заполняет кусок решета (64 кб), это вышеупомянутый next_prime64() без оптимизации, только в x32 варианте. Тормозит из-за высчитывания смещений перед началом заполнения решета. next_prime3() - тоже самое что и 2, только с пропуском кратных 2 и 3. Причем в обоих циклах (вычеркивания и чтения). Чуть быстрее первого. Надеялся на большее. Цикл вычеркивания дальше не оптимизировать, т.к. там будет куча умножений и из-за них тормозит больше чем без них. Вычеркивание без 2,3 сделал сдвигами. Остается оптимизировать только цикл считывания результатов. С ним все плохо, таблица шагов не ложится сюда один-в-один из моего синхронного Эратосфена. Запутался в смещениях. Доделаю, но не думаю что по времени ниже 1,5 сек. опущусь. Надо еще какие-то идеи по оптимизации алгоритма. PS После из самого быстрого next_primeX() сделаю next_prime64() и найдем MAX(next_prime64()), а пока надо 0.5 сек Аткина как-то обогнать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2015, 19:49 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Владимир2012 Dima T не обижайся. То чего ты хочешь достичь - "Лично мне охота Аткина обогнать, посчитать за <0,5 сек диапазон до 10^9." Как по мне, то лучше "ляг поспи и все пройдет" /хотя тебе виднее .../ Не обижаюсь, обгоню :) У того же автора Эратосфен в три раза быстрее моего (0,6 сек). Он, как ты пишешь, 15 лет занимался проблемой, а я всего вторую неделю. Все еще впереди. PS Туда специально не заглядываю, не люблю списывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2015, 19:58 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TОн, как ты пишешь, 15 лет занимался проблемой, а я всего вторую неделю. Все еще впереди. Да не я это писал ... Всего лишь после ссылки привел выдержку из комментов к статье ... PS: Ну тогда подключаем thread, SSE / http://en.wikipedia.org/wiki/Streaming_SIMD_Extensions /, ... ... С Богом /удачи ни когда не желаю - для не верующих/. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2015, 20:12 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Владимир2012... ... Реализация этого метода на C++ http://gforge.inria.fr/projects/ecm/ svn checkout svn://scm.gforge.inria.fr/svnroot/ecm/trunk Посмотрел, почитал readme. Ну да, есть там и ecm, и P-1, и P+1. Но у меня оригинальный алгоритм, в группе решений уравнения Пелля. По крайней мере я его описания раньше нигде не встречал. Перекрывает P-1 и P+1. Понятно, что на практике малоинтересен по сравнению с ECM, но проще в реализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2015, 20:55 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonБарлон. Я выпал в осадок. Ты мне сначала лекции прочитай по кольцам вычетов а потом уж факторизация....Вычеты по простому модулю... Ну можно немножко упрощенно считать, что это остатки от деления на это простое число. Их можно складывать и умножать, так же беря остаток от деления результата. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 06:07 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
P-1 метод основывается на том, что при операциях умножения остатков по составному модулю эквивалентны параллельным операциям по соответствующим простым модулям (например, 7*8%15 = 11, при этом (7%3)*(8%3)%3=2 и (7%5)*(8%5)%5=1 ну и 11%3=2 и 11%5=1), это кажется следствие китайской теоремы об остатках . А также на малой теореме Ферма : Код: plaintext Так что взяв произвольное не кратное p число a, и последовательно возводя его в степени 2,3,4,5,6... по модулю p то есть ((a^2 % p)^3 %p)^4 % p... рано или поздно получим 1. Если теперь взять составное число N = p*q и a: gcd(a,N)=1, и начать a возводить в степени по модулю N, то есть большая вероятность, что в какой-то момент результат окажется равным единице по модулю одного из сомножителей и неравным единице по модулю другого сомножителя. Тогда gcd(a^K %N - 1, N) - один из делителей N. Вот например gcd(3^4 % 35 - 1, 35) = 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 07:05 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Так всё-таки задача обсуждения обогнать реализацию предложенную соавтором Аткина ? PS кстати, кто-нибудь узнал как тот сайт факторизует 60значные числа в течении одной секунды ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 08:01 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Почитал вышеупомянутый сайт http://primesieve.org/ там форсированный Эратосфен в основе. Причем форсировали его капитально. Затестил до 10^9: 0,06 сек. (4 ядра), 0,12 сек. (1 ядро) Можно смело заявлять: Эратосфен победил Аткина. Optimizations used in primesieve Uses a bit array with 8 flags each 30 numbers for sieving Pre-sieves multiples of small primes <= 19 Compresses the sieving primes in order to improve cache efficiency [5] Starts crossing off multiples at the square Uses a modolo 210 wheel that skips multiples of 2, 3, 5 and 7 Uses specialized algorithms for small, medium and big sieving primes Uses a custom memory pool (for big sieving primes) Processes two sieving primes per loop iteration to increase instruction-level parallelism Parallelized (multi-threaded) using OpenMP По существу направления оптимизации такие: - обсчет окнами - биткарта без кратных 2,3,5 (30 чисел на байт) - оптимизация шагов цикла с пропуском кратных до 19 - оптимизация умножений и корней - распараллеливание расчета У меня все те же направления (два последних обдумываю), осталось суметь нормально реализовать их в коде. А моя поделка выше не взлетает :( Добавил пропуски кратных 2,3,5,7,11,13 - стало чуть медленнее работать. Итераций меньше, но доп.вычисления съедают всю экономию. Вариант с пропуском 2,3 пока самый быстрый. Буду его дотачивать. После распараллеливания на 4 ядра разгоню до <0,5 сек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 09:44 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Дима. Меня интересует продолжение расчёта за границей Эратосфена. У тебя есть рабочий макет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 10:29 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonДима. Меня интересует продолжение расчёта за границей Эратосфена. У тебя есть рабочий макет? Понятней напиши что хочешь получить. Для x64 мой next_prime64() считает почти до 2^64. Споткнется из-за разрядности в самом конце интервала, точнее после квадрата максимального простого 2^32, т.к. там там надо будет next_prime(2^32) посчитать, а это x32 пока. Как это вылечу посчитаю next_prime64(2^64 - 10000). Он немного неоптимизирован по скорости и расходу памяти, но как оказалось скорость особо некуда разгонять, а памяти ему надо максимум 256 мб. По сути сейчас его и ускоряю, только в виде x32 версии. А x32 только потому что компилятор у меня такой, x64 просто тормозит из-за эмуляции работы с x64 Теоретически дальше можно в x128 переделать. Надо только чтобы арифметика x128 считалась (+-*/%). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 10:49 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima T , Не совсем понимаю, какой смысл вычислять простые числа на процессоре, если это замечательно делает видеокарта? Запускаем: D:\aProjects\PrimeSearch\x64\Release>PrimeSearch.exe -nvidia Prime search: 4214924346 .. 4294924346 Accelerator: NVIDIA GeForce GTX 980 Found : 3608107 First prime : 4214924369 Last prime : 4294924289 ============= Exec time : 24.6 seconds. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 12:09 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
SerValExec time : 24.6 seconds. Всего лишь в 100 раз медленнее одного ядра моего проца :) Код: plaintext 1. 2. 3. Можешь затестить у себя Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Остальное тут https://sourceforge.net/p/primegen/code/HEAD/tree/trunk/DimaT/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 12:37 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
SerValFirst prime : 4214924369 Last prime : 4294924289 ============= Exec time : 24.6 seconds. Лажа какая-то! Он что 24 секунды расчитывал 4 294 924 289 - 4 214 924 369 = интервал 79 999 920 ? Или мы здесь все присутствующие неверно истолковали этот отчётик? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 12:53 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima T, так я ничего не оптимизировал. Тупо подсунул видеокарте все нечётные значения из этого диапазона. Эта программулина для проверки видеоадаптеров. И оптимизировать её не буду, потому как мелкие простые числа меня не интересуют. Интересуют где-то начиная с последнего числа Мерсена, поскольку у многих товарищей есть желание найти следующее. :) Ну и о качестве моего "программирования": D:\aProjects\PrimeSearch\x64\Release>PrimeSearch.exe -cpu Prime search: 4214924346 .. 4294924346 Accelerator: CPU Found : 3608107 First prime : 4214924369 Last prime : 4294924289 ============= Exec time : 466 seconds. А поскольку "качество" программирования у меня одинаковое и для CPU и для ГПУ, то видно, что на ГПУ всё выполняется в 20 раз быстрее чем на ЦПУ. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 13:19 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonИли мы здесь все присутствующие неверно истолковали этот отчётик? Всё верно. Что программа выдала, то я сюда и вставил. Смысл программы в проверке и сравнении скорости выполнения одного и того же на различных видеокартах: Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 13:31 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
SerValА поскольку "качество" программирования у меня одинаковое и для CPU и для ГПУ, то видно, что на ГПУ всё выполняется в 20 раз быстрее чем на ЦПУ. :) Мне-то это что дает? Я качество алгоритма улучшаю. Количество (время выполнения) это просто мера сравнения на одном и том же железе. И не факт что мой код взлетит на твоем ГПУ, там нужно сильное распараллеливание алгоритма, а у меня однопоточный. Можешь затестить действительно ли всё в 20 раз быстрее на ГПУ :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 13:43 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
SerVal, тема CUDA/NVidia очень интересна и многогранна. Но я прошу обсудить эти нюансы отдельным топиком. У нас уже сформировалось комьюнити вокруг C/C++ для классической архитектуры, и распыляться на видеокарты нет особого смысла. Тем более что векторы интересов у нас идут намного дальше чем просто хардварная оптимизация. Мы еще не исчерпали алгоритмы и проверки гипотез математики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 14:02 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TМне-то это что дает? Я качество алгоритма улучшаю. Это какбэ даёт понимание, что сколько не улучшай качество алгоритма на одном процессоре, 2048 процессоров Вам не обогнать. Разумеется, если эти процессоры не у такого "программиста" как я :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 14:11 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
SerValDima TМне-то это что дает? Я качество алгоритма улучшаю. Это какбэ даёт понимание, что сколько не улучшай качество алгоритма на одном процессоре, 2048 процессоров Вам не обогнать. Разумеется, если эти процессоры не у такого "программиста" как я :) Эта оценка должна быть пересмотрена с учётом возможности параллелизма и закона Амадала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 14:15 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
SerValЭто какбэ даёт понимание, что сколько не улучшай качество алгоритма на одном процессоре, 2048 процессоров Вам не обогнать. Разумеется, если эти процессоры не у такого "программиста" как я :) Наивный. Если бы все алгоритмы легко паралеллились, то в ЦПУ давно было бы по несколько тысяч ядер, интел давно предлагал 800 ядерный проц выпустить, прототипы показывал, только он нафиг не нужен, т.к. 4 ядра занять нечем. Почитай про Закон Амдала , поймешь что сначала надо мозг сломать об распараллеливание алгоритма, а потом уже его в ГПУ отправлять ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 14:21 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TНаивный. Если бы все алгоритмы легко паралеллились, то в ЦПУ давно было бы по несколько тысяч ядер, интел давно предлагал 800 ядерный проц выпустить, прототипы показывал, только он нафиг не нужен, т.к. 4 ядра занять нечем. Ничей мозг ломать не надо. Всё распараллелено до нас. Ещё на Cray и IBM. Да и у нас в России(в институте Стеклова) давно есть параллельные библиотеки для ГПУ.. но нам они их не дадут... чтобы врагам не достались. :) Intel обещал 80 ядерный проц. И не выпустил потому, что скорость доступа к памяти как была 20 лет назад, так и осталась. Поэтому и добавляет в процессоры немыслимые кэши 2-го, 3-го, 4-го уровня. * про Амдала я слышал. ** за прошедший год появилась хорошая бесплатная библиотека параллельных алгоритмов для С++ AMP. намедни ParallelRadixSort на массиве в 400 MB. Зверь! Глазом не успеваешь моргнуть. ***** А Ваша программа шустренько работает... впечатляет. :) (может в выходные и свою маленько оптимизирую). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 14:59 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
SerValНичей мозг ломать не надо. Всё распараллелено до нас. Ещё на Cray и IBM. * про Амдала я слышал . SerVal. Я читаю в твоём посту два взаимоисключающих параграфа и думаю что тебе еще многому надо научиться и много чудесных чудес предстоит узнать. Классик О сколько нам открытий чудных Готовят просвещенья дух И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель... Good luck! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 15:45 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonSerVal, тема CUDA/NVidia очень интересна и многогранна. Но я прошу обсудить эти нюансы отдельным топиком. У нас уже сформировалось комьюнити вокруг C/C++ ... Ну, как скажете.. сформировалось так сформировалось. Через годик загляну. Всем привет и успехов в решении научных проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2015, 15:48 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Заглох топик пока. Я понял что у меня - пробелы в области Теории Чисел. Читаю в бумажном варианте. И.М. Виноградова. Подытоживая. Сама идея хранения длинных простых чисел для меня уже не особо интересна. Попробую изучить те алгоритмы которые были приведены в топике или хотя-бы понимать проблематику и терминологию которая уже звучала. Пишите и коммитьте если что. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2015, 11:50 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Итоги не очень. Слил все идеи воедино, скорость особо не выросла, получилось только память поэкономить. Переименовал немного, теперь: next_prime() это последняя x64 версия next_prime32() это старый next_prime() next_prime64() тот же какой был, прототип текущего next_prime() Что получилось оптимизировать: 1. Память: под решето 64кб и от 16 кб под кэш для инициализации. 16 кб хватает до ~10^10, максимум 196 Мб для 10^19 2. Пропуск кратных 2,3 немного ускорил, дальше наращивать - бесполезно, тормоза только возрастают. 3. Возможна многопоточность, только надо изначально инициализировать кэш next_prime(MAX) (позже попробую обогнать Аткина на 4 ядрах) Результаты на линукс x64 (g++ nextprime.cpp -O2)Test(0M...1000M): next_prime32() count 50847534 primes. time 1974 msec speed 25758K/sec OK Test(0M...1000M): next_prime64() count 50847534 primes. time 2045 msec speed 24864K/sec OK Test(0M...1000M): next_prime() count 50847534 primes. time 1741 msec speed 29205K/sec OK Test(4000M...6000M): next_prime() count 89583557 primes. time 3540 msec speed 25306K/sec OK Test(4000M...6000M): next_prime64() count 89583557 primes. time 4314 msec speed 20765K/sec OK При компиляции под x32 тормоза в 1,5 раза для x64тоже самое MSVC2008 x32Test(0M...1000M): next_prime32() count 50847534 primes. time 2143 msec speed 23727K/sec OK Test(0M...1000M): next_prime64() count 50847534 primes. time 2764 msec speed 18396K/sec OK Test(0M...1000M): next_prime() count 50847534 primes. time 2804 msec speed 18133K/sec OK Test(4000M...6000M): next_prime() count 89583557 primes. time 5768 msec speed 15531K/sec OK Test(4000M...6000M): next_prime64() count 89583557 primes. time 5778 msec speed 15504K/sec OK Максимума разрядности x64 достигнуть не удалось. Чуть раньше останавливается из-за превышения разрядности во время заполнения решета. Максимум получил 18 446 744 030 759 878 627 до 2^64 не дошел на 42 949 750 784. Исходники next_prime.h зафиксировал. Там же nextprime.cpp тесты PS Потестил корректность сколько смог, рандомно результаты между собой посравнивал. Работает. Но primesieve говорит что в диапазоне 4...6 млрд. на одно число меньше. Поразбираюсь позже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2015, 16:55 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima Tprimesieve говорит что в диапазоне 4...6 млрд. на одно число меньше. Поразбираюсь позже. Нашел причину. Ошибка в тестах была. Поправил. Проверил до 10^10 количество совпадает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2015, 17:12 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
А тут кастинг обязательно указывать? Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2015, 18:22 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonА тут кастинг обязательно указывать? Код: plaintext 1. Не знаю как правильно написать. MSVC нормально понимает без (uint64_t). g++ варнинги писал, добавил (uint64_t) - ничего не поменялось, затестил - понимает правильно, оставил так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2015, 18:34 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Сделал пример многопоточного использования multi_prime.cpp В 4 потока на 4 ядрах посчитал до 10^9 за <0,5 сек :) Код: plaintext 1. 2. PS Сделал потоки на WinAPI, под линуксом не соберется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 10:51 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TВ 4 потока на 4 ядрах посчитал до 10^9 за <0,5 сек :) Код: plaintext 1. 2. Поздравляю! Какие ближайшие планы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 11:05 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TСделал пример многопоточного использования multi_prime.cpp В 4 потока на 4 ядрах посчитал до 10^9 за <0,5 сек :) Код: plaintext 1. 2. PS Сделал потоки на WinAPI, под линуксом не соберется. Макрос есть. __WIN32 или что-то в этом роде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2015, 11:21 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Навел порядок, причесал исходники. Сделал два файла с x32 и x64 версиями next_prime() внутри: next_prime32.h next_prime64.h От x64 в реальности польза сомнительная, все равно тормозит на больших числах, и на малых при x32 компиляторе, поэтому сделал отдельно x32 вариант, для практических задач ее хватит (по крайней мере мне). Настроил x32 на минимальный расход памяти 22.5 кб на расчет любого до 2^32. Исходники тут PS mayton, исправь, пожалуйста, ссылку в первом посте на действительно последний вариант. PPS egorych, ты был прав 17466144 :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2015, 12:22 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Пощупал gmp. Интересно а как проверить некорректную конверсию строка-число? Пока не понял. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. В доке пишут. https://gmplib.org/manual/Assigning-Integers.html — Function: int mpz_set_str (mpz_t rop, const char *str, int base) Set the value of rop from str, a null-terminated C string in base base. White space is allowed in the string, and is simply ignored. The base may vary from 2 to 62, or if base is 0, then the leading characters are used: 0x and 0X for hexadecimal, 0b and 0B for binary, 0 for octal, or decimal otherwise. For bases up to 36, case is ignored; upper-case and lower-case letters have the same value. For bases 37 to 62, upper-case letter represent the usual 10..35 while lower-case letter represent 36..61. This function returns 0 if the entire string is a valid number in base base. Otherwise it returns -1. Получается что я не могу различать присвоение "0" и неуспех. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2015, 14:30 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TPS mayton, исправь, пожалуйста, ссылку в первом посте на действительно последний вариант. Ну... я не совсем понял что на что я должен исправить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2015, 14:40 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonПолучается что я не могу различать присвоение "0" и неуспех. Затести Код: plaintext 1. 2. 3. результат-1 0 0 Там есть mpz_init_set_str() - это совмещенные mpz_init() и mpz_set_str() maytonНу... я не совсем понял что на что я должен исправить. так поправьэту ссылку убрать, т.к. версия в итоге оказалась хоть и рабочей, но промежуточной, да и в sourceforge она тоже есть. Dima T http://www.sql.ru/forum/1149455/generator-prostyh-chisel-do-10-9-za-5-sek?mid=17451792#17451792 а так написать next_prime32.h next_prime64.h Тесты и примеры использования ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2015, 16:10 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Вобщем я решил взять некую паузу и вернуться к истокам. С Эвклиду. Этот старый бородач создал алгоритм которому нет аналогов в мире в соотношении простоты и полезного эффекта. Я имею в виду НОД (в англоязычном варианте GCD - Greatest Common Divisor). Описывать шаги не буду. Вики описала много. Добавлю свои наблюдения + разный материал из разных источников. Некоторые свойства. Если Код: plaintext 1. то числа a и b называются взаимно простые. Например 3 и 5. Взаимно простые образуют несократимую дробь a/b. Для трех аргументов утверждение взаимной простоты не влечёт попарную простоту. Если gcd(a,b,c) = 1 то вовсе не факт что gcd(a,b).... e.t.c. должно быть равно 1. Далее Код: plaintext 1. - число является делителем по отношению к группе таких-же И наконец свёртка: Код: plaintext 1. Последний метод возможно имеет элегантное функциональное описание. Почему я взялся за Эвклида? Ответ - простота. И фундаментальные отсылки которые ведут к постоянной оценке кратности. Без этого алгоритма не упрощаются рациональные дроби. gcd упрощает дроби не привлекая primes в явном виде. И эта особенность - привлекает. Существуют также связи Эвклида с непрерывными дробями и с функцией Эйлера. (Из книги Виноградова.) Книгу пока неосилил но всё будет постепенно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2015, 23:25 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonВобщем я решил взять некую паузу и вернуться к истокам. С Эвклиду. Этот старый бородач создал алгоритм которому нет аналогов в мире в соотношении простоты и полезного эффекта. Я имею в виду НОД (в англоязычном варианте GCD - Greatest Common Divisor). На отличную мысль натолкнул, давно ломал голову над заменой GUID`у в ограниченной распределенной системе. Задача: имеем N несвязанных БД, документы из которых в итоге сливаются в одну. Например клиенты банка в оффлайне готовят платежки, затем пересылают в банк, каждой платежке надо присвоить уникальный id. Пример надуманный, для общего понимания задачи. При ожидаемом общем количестве записей менее 1 млрд. обычного int с запасом хватает, но т.к. распределенная система невозможно гарантировать уникальность, поэтому счетчики не подходят. GUID задачу решает, но тормоза из-за размера, 16 байт на id: база быстро пухнет от хранения и выборки в разы замедяляются. Решение: выдаем каждой БД уникальное простое число (шаг счетчика) не меньше заданного (это константа, минимум), далее счетчиком генерим последовательность с этим шагом. Остатается только пропустить те значения где при разложении на множители есть простые больше минимума. Т.е. задаем какой-то минимум для всей системы, например 1000, и дальше выдаем простые последовательно каждой базе (1009,1013,1019... тысячной базе 9433) по сути это ID базы. Например база с ID 1013 генерит последовательность 1013, 2026, 3039 ... пропуская пересечения с другими последовательностями (например 1022117 = 1009*1013). Остается сделать проверку что нет простого делителя больше заданного минимума. В итоге получаем боле-мене равномерное использование всего диапазона 2^32 Побочный эффект по конкретному значению можно вычислить ID базы которая его сгенерила. Только придумал, не тестил, но вроде должно взлететь. Надо еще над выбором минимума подумать. PS была мысль раздавать диапазоны id (например 1000-1999, 2000-2999, 3000-3999 ...) и по мере использования выдавать следующий, оно более линейно, но тоже не идеально, диапазон кончился, связи с раздающим нет, все встало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2015, 12:53 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima T Решение: выдаем каждой БД уникальное простое число Чего уж там мелочиться. Сделай вэб сервис, который выдаем уникальный ID для зарегитрировавшегося на нем. И все! Осталось за малым, то чтобы этот стандарт приняли все разработчики. Собственно по такому принципу и MAC адреса распределяются. Так как после разработки device, фирма должна обратиться к некой организации, которая отвечает за распределение MAC ... и получить лицензию на допустимый диапазон MAC для производимых device. PS: Далее выдержка из https://ru.wikipedia.org/wiki/GUID Алгоритм, который Microsoft использовала для генерации GUID, был широко раскритикован. В частности, в качестве основы для генерации части цифр GUID использовался MAC-адрес сетевого адаптера, что означало, например, что по данному документу MS Word (также получающему при создании свой уникальный GUID) можно было определить компьютер, на котором он был создан. Позже Microsoft изменила алгоритм таким образом, чтобы он не включал в себя MAC-адрес. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2015, 13:53 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Владимир2012, чтобы флудить не в тему есть отдельный форум . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2015, 14:51 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Потестил. Не взлетело. Слишком много пропускать надо, 50-70% пропусков. Дорогая плата за расширяемость. Если дополнительно максимальное простое ограничить, то пропусков значительно меньше, но с фиксированным максимумом проще классическое решение: задаем уникальное исходное значение <max и увеличиваем счетчик шагом max. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2015, 16:22 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
[quot Dima T Задача: имеем N несвязанных БД, документы из которых в итоге сливаются в одну. Например клиенты банка в оффлайне готовят платежки, затем пересылают в банк, каждой платежке надо присвоить уникальный id. Пример надуманный, для общего понимания задачи. При ожидаемом общем количестве записей менее 1 млрд. обычного int с запасом хватает, но т.к. распределенная система невозможно гарантировать уникальность, поэтому счетчики не подходят. GUID задачу решает, но тормоза из-за размера, 16 байт на id: база быстро пухнет от хранения и выборки в разы замедяляются. Решение: выдаем каждой БД уникальное простое число (шаг счетчика) не меньше заданного (это константа, минимум), далее счетчиком генерим последовательность с этим шагом. Остатается только пропустить те значения где при разложении на множители есть простые больше минимума. .... [/quot] Что ж так сложно то... В первой базе генерим id вида k*N+0, во второй - k*N+1, в третьей k*N+2, ..., в N-ной базе - k*N+(N-1). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2015, 18:00 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
?Что ж так сложно то... В первой базе генерим id вида k*N+0, во второй - k*N+1, в третьей k*N+2, ..., в N-ной базе - k*N+(N-1). Уже написал что к этому все приходит 17505147 Тут жесткое ограничение по N, т.е. с появлением N+1 базы будет большая проблема. Хотел избавиться от ограничения по N, получается непрактично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2015, 20:34 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TТ.е. задаем какой-то минимум для всей системы, например 1000, и дальше выдаем простые последовательно каждой базе (1009,1013,1019... тысячной базе 9433) по сути это ID базы. Например база с ID 1013 генерит последовательность 1013, 2026, 3039 ... пропуская пересечения с другими последовательностями (например 1022117 = 1009*1013). Остается сделать проверку что нет простого делителя больше заданного минимума. В итоге получаем боле-мене равномерное использование всего диапазона 2^32 Побочный эффект по конкретному значению можно вычислить ID базы которая его сгенерила. Только придумал, не тестил, но вроде должно взлететь. Надо еще над выбором минимума подумать. PS была мысль раздавать диапазоны id (например 1000-1999, 2000-2999, 3000-3999 ...) и по мере использования выдавать следующий, оно более линейно, но тоже не идеально, диапазон кончился, связи с раздающим нет, все встало. Данную задачу можно решить 1000 способами. Но самое главное - дать точный ответ на вопрос какие требования ты выставляешь к последовательности. Самый последний вариант (диапазоны id) - вполне себе рабочий. Используй его. А для линейной гистограммы можно сделать расширение разрядной сетки до 128 бит. Потом shuffle всех битов по одной постоянной схеме или еще сделать несколько раундов различных операций с полученным целым. Данная схема вполне рабочая но не криптостойкая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2015, 20:43 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Владимир2012 Чего уж там мелочиться. Сделай вэб сервис, который выдаем уникальный ID для зарегитрировавшегося на нем. И все! Осталось за малым, то чтобы этот стандарт приняли все разработчики. Собственно по такому принципу и MAC адреса распределяются. Это неверно. Дима-ж пишет что сеть БД несвязная. Тоесть должен сущестовать децентрализованный но раздельный механизм генерации GUID. Никаких веб-сервисов. Тоесть это 3-й тип систем по теореме Брюера. У нее есть только availability + partition tolerance (AP). А отсылка к МАС-вообщем-то не по сути. Есть много способов перепрограммировать механизм генерации GUID и МАС/sysdate/IP это просто один из множества способов получить начальное состояние. P.S. Кстати поведение протокола с МАС+GUID совершенно недетрминированно в случае если на сервере мы меняем местами две сетевушки в слотах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2015, 20:52 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonДанную задачу можно решить 1000 способами. Но самое главное - дать точный ответ на вопрос какие требования ты выставляешь к последовательности. Логи надо писать в моей распределенной системе сообщений: кто-кому-когда-чего. В идеале должно фоном копиться и на сервер скидываться по мере возможности, лог надо вести за 1-2 последних месяца, в этом промежутке времени желательно чтобы сообщение имело уникальный ID, чтобы просто сводить логи отправителя и получателя. Сейчас каждый сам генерит ID сообщений, для передачи хватает т.к. срок жизни в кэше получателя = время доставки + минута, если совпало в этом промежутке - есть механизм смены ID, можно конечно извратиться и их использовать, но копаться в таких логах неудобно будет. Сообщений между всеми меньше миллиона в месяц. Т.е. в идеале ID должно быть 7-8 разрядное число. Пока раздача диапазонов приоритетный вариант. Думал может простым числам тут применение найдется. В принципе идея неплохая: выдал один раз каждому узлу по уникальному числу и пусть генерит ID по кругу, лишь бы повторы не чаще раз в 2 месяца, но есть узлы где где всего 10-20 сообщений в сутки, есть 5-10 тысяч. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2015, 21:56 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonЭто неверно. Дима-ж пишет что сеть БД несвязная. Тоесть должен сущестовать децентрализованный но раздельный механизм генерации GUID.Dima T Извиняюсь за флуд. GUID привел в пример потому, что на форумах не встречал ни каких других подходов к получению уникального кода. GUID имеет некоторую структуру ... Было бы весьма не плохо создать какой-то другой механизм создания уникальных кодов, который бы позволил и код генерировать меньшей длины и по возможности нести в себе какие-либо данные об объекте /коды базы, табельный номер, ... .../. Вполне допускаю, что это может быть ссылка к данным об объекте. Возьмем к примеру какой-либо handle /файлу, .../. Он всегда уникальный /обычно это ссылка к данным какого-либо блока памяти/ ... Вообщем то задумка у тебя довольно интересная. PS: mayton. Знаешь я далеко не льстец /и тем более не грубиян/. Но +5 за твой последний ответ. Таким бы таким тоном и конструктивом шли обсуждения, то было бы просто здорово ... /однозначно буду перенимать такой подход/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2015, 22:53 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Владимир2012GUID привел в пример потому, что на форумах не встречал ни каких других подходов к получению уникального кода. Выше 17505369 классический подход генерации ID для распределенных БД. По большому счету все подходы (в т.ч. GUID) сводятся к тому чтобы выдать каждому генератору какую-то уникальную константу, к которой генератор добавляет свое уникальное число по заданному алгоритму. Т.е. константа определяет диапазон в котором работает генератор. А дальше конкретные реализации, связанные с оптимизацией ради уменьшения размера ID. Все оптимизации сводятся к ограничению количества констант и диапазона в котором может работать конкретный генератор. Разрядности 128 бит GUID`а достаточно чтобы не заморачиваться что в один прекрасный день кончатся ID или невозможно будет выдать очередную константу новой базе, но во-первых базы раздуваются в разы по сравнению с int, как следствие в разы замедляются выборки. И во-вторых банальное желание покопаться руками в базе (в поисках какого-нибудь косяка) превращается в кошмар: запомнить/записать 7-8 цифр обычного ID элементарно, а 36 знаков GUID`a - уже проблема. Как-то решал эту проблему двумя ID: int для внутреннего использования в рамках одной базы, GUID для репликации с другими. Не скажу что решение идеальное, один из компромиссов между скоростью выборки и свободой от ограничений по разрядности. По поводу анонимности: она нужна далеко не всегда, но нынешнее маниакальное желание всяких вэб-сервисов собрать максимум инфы о пользователях немного напрягает и заставляет задумываться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 08:32 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TРазрядности 128 бит GUID`а достаточно чтобы не заморачиваться что в один прекрасный день кончатся ID или невозможно будет выдать очередную константу новой базе А что если UNIQ /наш аналог GUID/ будет переменной длины. Т.е. в нем скажем 0-й бит 1-го байта имеет значение: == 0 - UNIQ фиксированной длины; == 1 - UNIQ переменной длины; /даже пока не рассматриваю проблемы SQL баз у которых обычно нет эффективного механизма с манипуляциями и хранением данных переменной длины/. Почему так. Возьмем скажем Microsoft. У них GUID в применении скажем к COM это не просто уникальный ключ, но и ссылка к одной или нескольким веткам реестра /в котором хранятся дополнительные данные об UNIQ/. Подход /как по мне/ - правильный. Так вот сделать архитектуру нашего UNIQ гибкую и расширяемую /может быть даже завязанную с некой базой UNIQs (но ни как не привязанной к реестру)/. PS: Конечно сказанное мной немножко сумбурно и не связанно. Просто вот как бы рассказал немного о том чего бы хотелось иметь. Если удастся решить этот вопрос, то думаю он вполне потянет на новый документ в RFC ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 09:04 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TСделал пример многопоточного использования multi_prime.cpp В 4 потока на 4 ядрах посчитал до 10^9 за <0,5 сек :) Код: plaintext 1. 2. PS Сделал потоки на WinAPI, под линуксом не соберется. Поздравляю! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 10:06 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Владимир2012 А что если UNIQ /наш аналог GUID/ будет переменной длины. Смысл? Цель какая? Владимир2012 Возьмем скажем Microsoft. У них GUID в применении скажем к COM это не просто уникальный ключ, но и ссылка к одной или нескольким веткам реестра /в котором хранятся дополнительные данные об UNIQ/. Подход /как по мне/ - правильный. Так вот сделать архитектуру нашего UNIQ гибкую и расширяемую /может быть даже завязанную с некой базой UNIQs (но ни как не привязанной к реестру)/. Не надо мешать в одну кучу ключи и связанные с ними данные, GUID для COM это именно уникальный ключ конкретного класса, а ветка в реестре - место хранения метаданных этого класса. Никто GUID`ы в реестре хранить не заставляет. COM изобретение MS, решили они хранить в реестре в ветке с именем по GUID - их право, от того что ты изобретешь свое хранилище подход MS никак не поменяется. Проблема именно в размерах: ID придумано именно для уменьшения размеров, для компактного хранения данных. Чтобы диапазон допустимых значений незначительно превосходил количество требуемых. Если бы с размерами проблем не было, то делай 128 бит (хоть самодельным алгоритмом) и забудь про все остальные проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 10:52 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TСмысл? Цель какая?Чтобы затем этот GUID можно было использовать и в WWW, ... Кроме того если далее GUID использовать по примеру Microsoft и иметь доступ к его метаданным, то он будет подобен URL. Проще говоря это будет "URL" к объекту. Т.е. зная GUID объекта можно получить мета данные по нем /к примеру об книге, товаре, .../. При этом нам не нужно будет разрабатывать ни какие вэб сервисы ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 11:34 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Владимир2012 А что если UNIQ /наш аналог GUID/ будет переменной длины. Т.е. в нем скажем 0-й бит 1-го байта имеет значение: == 0 - UNIQ фиксированной длины; == 1 - UNIQ переменной длины; С точки зрения БД - всё равно. Строки и псевдо-числа (Number) хранятся в виде последовательностей символов. 128-битность может быть интересна в тех сферах где основная вычислительная нагрузка падает именно на сравнения 128-битных целых. Но я таких не знаю. К примеру все современные файловые системы NTFS/Zfs в качестве основного вычислимого типа используют uint64_t. Это покрывает все потребности роста ФС на десятки лет в будущее. Представить себе объёмы измеряемые 128 битами не просто невозможно. Это неслыханно. Это астрономически огромное число. Мы можем его попробовать сравнить с секундами возраста вселенной или количеством атомов вещества. Чтобы хотя-бы обладать порядком сравнения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 12:22 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Владимир2012Dima TСмысл? Цель какая?Чтобы затем этот GUID можно было использовать и в WWW, ... Кроме того если далее GUID использовать по примеру Microsoft и иметь доступ к его метаданным, то он будет подобен URL. Проще говоря это будет "URL" к объекту. Т.е. зная GUID объекта можно получить мета данные по нем /к примеру об книге, товаре, .../. При этом нам не нужно будет разрабатывать ни какие вэб сервисы ... В такой постановке как сгенерить GUID дело десятое. По сути ты предлагаешь сделать каталог всего на свете, чтобы потом просто на него ссылаться или брать необходимую инфу. Придумать его структуру и правила хранения - не проблема. Даже RFC написать можно. Только это 0,01% от решения всей задачи. Кто будет наполнять этот каталог и следить за актуальностью? Вот в чем проблема. Все придумано до нас: у товаров есть EAN у книг ISBN. Придумано потому что это выгодно и оправдывает затраты на "придумывание" и главное на поддержание придуманного в рабочем состоянии. Так что оставшиеся 99,99% твоей задачи придумать как доказать владельцу объекта (например производителю товара) что ему выгодно зарегистрироваться в твоей системе и поддерживать в актуальном состоянии информацию о своих объектах. PS Ты не первый с подобными идеями, хотя по размаху яндекс.маркет убогая поделка по сравнению с твоими замыслами :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 12:24 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TВсе придумано до нас: у товаров есть EAN у книг ISBNВот в этом и изюминка. Будет предложен унифицированный подход к созданию meta данных об объекте. PS: Разница в том, что подход "EAN у книг ISBN" порождает неимоверное количество разных сущностей. Что в свою очередь как "ком" тянет за собой другие проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 12:29 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
В внедрением протокола Ipv6. Разрядную сетку IP адреса получателя и отправителя не просто удвоили. А учетверили. Я думаю что перегнули палку. Админам трудно запоминать даже приблизительно Ipv6 адреса. Специально для этого была придумана "сжатая" нотация с двоеточиями (":") чтобы скипать длинные последовательности нулей (капец рациональность) в пустых пока еще диапазонах. Трудно будет также фиксировать сложные правила файрвола. Индивидуальные блокировки e.t.c. Еще сложнее будет хранить мета-базы данных трафика. Думаю что с 128 битами явно поспешили. Не было поэтапного развития. Дай бох планета земля доживёт до новых потребностей в расширении адреса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 12:46 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
SashaMercuryПоздравляю! :) Привет лентяй. А ты собираешся нас порадовать кодингом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 12:48 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonВ внедрением протокола Ipv6. Разрядную сетку IP адреса получателя и отправителя не просто удвоили. А учетверили. maytonПредставить себе объёмы измеряемые 128 битами не просто невозможно. Это неслыханно. Это астрономически огромное число. Мы можем его попробовать сравнить с секундами возраста вселенной или количеством атомов вещества. Чтобы хотя-бы обладать порядком сравнения. Каждой молекуле по IP-шнику дали, а мы тут за какие-то несчастные GUIDы. Надо IP-шники раздавать на все случаи жизни ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 13:05 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Дима. Please review. Код: plaintext 1. 2. 3. 4. 5. 6. 7. + надо-бы написать краткие аннотации или в Help или в каментах что каждая утилита делает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 19:42 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TКаждой молекуле по IP-шнику дали, а мы тут за какие-то несчастные GUIDы. Надо IP-шники раздавать на все случаи жизни А смысл? IP надо раздавать устройствам которые хотя-бы пингуются и светят в мир на 80 порту хоть какой-то веб-мордой. А так - тривиальные клиенты спокойно сидят за proxy, nat и не жужжат. И внешний адрес им нужен как зайцу 5-е колесо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.04.2015, 23:47 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Решил порассуждать о некоторых частных случаях факторизации. Припустим есть некое длинное целое A которое является результатом произведения 2х достаточно больших простых чисел (X,Y). Почему двух? Ну... согласно криптографическим протоколам. Вобщем таковы начальные условия. Какими должны быть эти (X,Y). Ну... предположительно они должны быть достаточно большими чтобы исключать "перебор" решетом primes или таблице или базой. Исходим из предположения что A имеет астрономически-высокую разрядность (512 бит максимум) и разрядная сетка обычно задейстована на 80-100%. Тогда искомые (X,Y) которые удовлетворят уравнению Или находятся на кривой типа гипербола которая проходит через точки: (1,A), (x1,y1), (y1,x1), (A,1). которые имеют целочисленное решение. А все остальные (xi,yi) по сути не имеют целого решения xy=1 по определению. Потому-что такова постановка. Где-бы следовало искать точку (xi,yi) ? По всей видимости не в окрестности (1,A) или (A,1) где решение находится перебором. И не в окрестности (xc,yc)=((SQRT(A),SQRT(A)) где число трудно но всё-таки можно искать от центра симметрии. А скорее всего искомые (x,y) лежат между (xc,yc) и (A/ymaxprime,ymaxprime) и (xmaxprime,A/maxprime) где *maxprime это максимум последовательности простых чисел которые у нас есть и которые легко и удобно извлекаются и имеют единичную оценку сложности алгоритма проверки делимости в рамках нашей решаемой задачи. Уф... написал. Чуть позже нарисую поясняющую картинку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 11:11 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonГде-бы следовало искать точку (xi,yi) ? По всей видимости не в окрестности (1,A) или (A,1) где решение находится перебором. И не в окрестности (xc,yc)=((SQRT(A),SQRT(A)) где число трудно но всё-таки можно искать от центра симметрии. Ага, метод Ферма maytonА скорее всего искомые (x,y) лежат между (xc,yc) и (A/ymaxprime,ymaxprime) и (xmaxprime,A/maxprime) где *maxprime это максимум последовательности простых чисел которые у нас есть и которые легко и удобно извлекаются и имеют единичную оценку сложности алгоритма проверки делимости в рамках нашей решаемой задачи. Вообще-то чтобы получить N-битный RSA ключ, берется пара нечетных случайных N/2-битных чисел A и B, каждое из которых тестируется по Миллеру-Рабину по нескольким основаниям. Никто не стремится специально доказать их простоту. Да, еще неплохо проверить, что A-1 и B-1, а также A+1 и B+1 содержат большие простые множители. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 11:32 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
ОК. Спасибо Барлон. У меня уже целый список чего почитать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 12:03 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonДима. Please review. + надо-бы написать краткие аннотации или в Help или в каментах что каждая утилита делает. Поправил варнинги. Думаю надо там поудалять лишнее. Промежуточные версии наверно никому не интересны. Оставить next_prime32.h next_prime64.h и сделать одну primegen.cpp собрав туда все полезное. Удаляю? primegen.cpp почти сделал (осталось добавить многопоточность). Считает по заданному диапазону и сохраняет найденные в файл. Если файл не задавать, то просто количество считает, т.е. тест на скорость. Можешь потестить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 17:43 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Да. Я думаю что 32х битные версии для сообщества не представляют интереса. Кому надо под легаси-железо - сам поправит и пересоберёт. Я грохну PBFA-32bit няшную шнягу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 17:46 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonДа. Я думаю что 32х битные версии для сообщества не представляют интереса. Не совсем согласен. С математической точки зрения они бесполезны, но с практической - они просто быстрее. 8 байт дольше читается чем 4, пусть ускорение не в 2 раза, но 10-15% времени x32 экономит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 19:25 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Я понял твою мысль. На уровне storage имеет смысл сохранить кеши vector<uint32>, vector<uint64>. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2015, 23:30 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
mayton, ещё вот такая мысль возникла все простые числа >2 можно представить в виде только одним способом при a=b+1 a^2-b^2 =(a-b)(a+b) числа при к>0 всегда не простые и вот интересно, какова доля простых чисел в рядах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 21:57 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Народ считает факториалы с использованием решета Эратосфена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 10:31 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Просмотрел бегло. Оригинально. Они посчитали что затраты на хранение и генерацию дерева целых будут слишком малы (т.к. порядок числа под факториалом обычно мал). Но кому нужен точный расчёт факториала? Пожалуй только в задачах доказательства теорем или схождений рядов им подобных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 11:18 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Добавил многопоточность в primegen.cpp. Правда при запуске в многопоточном варианте он только скорость померяет. В файл запись не стал делать, слишком много кода получится и хранить надо где-то, чтобы последовательно в файл писать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 13:54 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2015, 18:33 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Со ссылкой на хабр http://habrahabr.ru/post/275541/ Еще одно простое число найдено. Эти чортовы ботаны не спят ночей и мучают процессор и видяшку чтобы получить свои 3000 условных енотов и потешить своё самолюбие! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2016, 10:24 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonЭти чортовы ботаны не спят ночей и мучают процессор и видяшку чтобы получить свои 3000 условных енотов и потешить своё самолюбие! Есть от них польза, косяк в интеловском проце нашли :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2016, 10:35 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TmaytonЭти чортовы ботаны не спят ночей и мучают процессор и видяшку чтобы получить свои 3000 условных енотов и потешить своё самолюбие! Есть от них польза, косяк в интеловском проце нашли :) Ну чтож.. остаётся только развести руками и обругавшись спросить как они (Intel) там вообще тестируют новые модели процессоров? Бох с ними с простыми числами. Хотя-бы прогнали регресс по DDIV, экспонентам и элементарной математике. Обжёгшись на молоке как говориццаа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2016, 10:47 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток господа. Смотрю так буйно бились и подостыли?) Я какоето время тоже простыми числами интересуюсь, вот появилось пару недель свободных засел.. Бегло пролистал топик, пока мулач Аткина. Домучал его х32 до 6FFFFFFF размерности.. дальше Аут оф мемори.. а вы вроде все х32 значения им считали? упаковывали байты в биты? (типа по памяти в раз экономи) на производительность пофигу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2016, 21:07 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
VodoleYka, Битовая карта всех 32-битных чисел занимает 4Г/8бит=512 МБ (без упаковки). Такое помещается обычно в памяти, если конечно не совсем древний комп. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2016, 23:54 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, да не древний.. один 7ая корка,16ГБ . 2ой 2ух процессорный ксенон 8гб.. та реализация Аткина что у меня попалась 1 бит занимает 1 байт.(с вики стянул потом допиливал..) т.е в моем случае как раз 4ГБ памяти и надо. и на переполнение 4*x*x+y*y наступил.. пол часа в отладке сидел, не мог понять почему таблицы портятся.. Но это скорее мои личные проблемы. я незнаю может комуто будет интересно, страдал фигней, оптимизировал тривиальный брут простых чисел. Кину сюда на всяк случай, может комуто сгодится. Вроде оптимальней некуда Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 07:18 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
и да.. 1. таблица с праймами.. должна быть 0-терминейт... вобщем по хорошему сразу файл с нулями. 2. и чтоб избегать 2ой проверки при каждом вызове isPrime_asm на предмет prime mod 5.. при старте таблу заполняю сраз до 5ки включительно. Производительность даже в таком виде конечно удручает.. на Коре и7.. гдето 70-80 дней 32бит праймы собираются.. но это скорее для эксперементов, а не для работы ЗЫ. сори за дабл пост, но чет не вижу.. тут свои посты править можно после публикации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 07:26 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
VodoleYka, Посты здесь править нельзя, к сожалению. Никакой оптимизацией у тебя и не пахнет, причем алгоритм - перебора по таблице, причем до конца таблицы тоже вряд ли эффективен. И конечно, чтобы проверить на простоту N - эту таблицу надо сначала всю заполнить, хотя бы до sqrt(N) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 10:58 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Siemargl, оптимизация как бы по скорости.. все в регистрах. это раз. как бы профилировка по скорости. перебор до конца таблицы и вычисления sqrt тоже спорный вопрос, если кому надо добавляем ще 1 параметр, и еще одну проверку после loasd .. ток в так как простые числа идут 1 к 10. и множитель в 90 проц случаев находится быстрее чем + еще одна проверка.. и на каждом этапе вычислять корень. можно конечно его вычислять типа раз в 1000 итераций.. вобщем это на любителя. Допилил Аткина.. судя по всему Done save primes 203 280 221 09:12:20.. верный результат.. ибо сошелся с primesieve-5.7.0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 11:12 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
VodoleYkaDone save primes 203 280 221 09:12:20 Если это 9 часов, то это многовато. Все должно быть в пределах нескольких минут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 11:57 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
VodoleYkaSiemargl, оптимизация как бы по скорости.. все в регистрах. это раз. как бы профилировка по скорости. перебор до конца таблицы и вычисления sqrt тоже спорный вопрос, если кому надо добавляем ще 1 параметр, и еще одну проверку после loasd .. ток в так как простые числа идут 1 к 10. и множитель в 90 проц случаев находится быстрее чем + еще одна проверка.. и на каждом этапе вычислять корень. можно конечно его вычислять типа раз в 1000 итераций.. вобщем это на любителя. Допилил Аткина.. судя по всему Done save primes 203 280 221 09:12:20.. верный результат.. ибо сошелся с primesieve-5.7.0 Какие однако познания в оптимизации от дельфиста =) Открываем сайт http://primesieve.org/#implementation и читаем, что сделали грамотные люди. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 12:26 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyVodoleYkaDone save primes 203 280 221 09:12:20 Если это 9 часов, то это многовато. Все должно быть в пределах нескольких минут. 9мин 12 сек 20 милисек. то я криво формат указал при выводе.. сори. касательно быстрого извлечения корня и возведения в квадрат , а также умнжоения и деления.. простите.. но я вкурсе. я на асме с 94го года.. я вобщемто не спорю.. не нравится.. не берите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 13:38 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
VodoleYkaи на каждом этапе вычислять корень. можно конечно его вычислять типа раз в 1000 итераций.. вобщем это на любителя. Корень можно заменить на возведение в квадрат. Суть корня в том что проверку по таблице нужно останавливать когда p i > sqrt(N) или по другому p i *p i > N где p i очередное простое, N проверяемое. Для 32бит таблицу простых надо всего до 65536. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 13:40 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TVodoleYkaи на каждом этапе вычислять корень. можно конечно его вычислять типа раз в 1000 итераций.. вобщем это на любителя. Корень можно заменить на возведение в квадрат. Суть корня в том что проверку по таблице нужно останавливать когда p i > sqrt(N) или по другому p i *p i > N где p i очередное простое, N проверяемое. Для 32бит таблицу простых надо всего до 65536. ок @loop: lodsd //load prime from tlb ---------- cmp eax,FFFF ja @prime ---------- test eax,eax jz @prime так легче? без корня. потеря в скорости не существенная. вместо FFFF sroot можно если хотите считать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 13:53 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
типа при самом фиговом варианте обработается 6488+54 праймов.. 1..2^8 = 54 2^8..2^16 =6488 2^16..2^24=1 071 329 2^24..2^32=202 202 350 total 2^32 =203 280 221 вы лучше подскажите, кто знает сколько праймов в диапазоне 2^32..2^64. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 13:57 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
VodoleYkaтак легче? Не знаю. По времени расчета какие изменения? Можно квадраты не считать каждый раз, а добавить таблицу квадратов и сравниваться с ней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 14:00 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
VodoleYkaвы лучше подскажите, кто знает сколько праймов в диапазоне 2^32..2^64. в 2^64 примерно 415 828 534 307 635 091 простых (тут прикидывали 17471253 ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 14:05 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima T, cmp eax, $FFFF //0:00:37 vs 0:00:03 ja @prime считай в 40 раз. при одинаковых условиях при расчете 1го 1кк чисел.. (не праймов.. просчет чисел от 0 до 1кк) и по идее дальше должна еще увеличиваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 14:18 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Еще можно ускорить перебирая не все подряд, а пропуская кратные первым простым 2,3,5,7..., т.е. построить таблицу смещений. Например для 2,3,5 таблица 4,2,4,2,4,6,2,6. т.е. проверять значения 5,7,11,13,17,19... Тут генератор 17479728 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 14:26 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima T, это видел. я собственно этот код для себя писал. он все равно сильно много не насчитает. поэтому вылизывать его можно конечно, для перфекционизма, но как рабочий инструмент он почти бесполезен. не ну можно переползти на BigMath и считать дальше.. но смысл. я тут кстати.. ввиде маразма запустил тест 1024 RSA modulus на праймах х32.. чуть позже сообщу время.. на глаз.. гдето 22ч либу там скрещивал сам.. там половина асм кода.. но там еще оптимизировать и оптимизировать.. но по крайней мере бОльшая часть кода там по уму сделана. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 14:33 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Можно по минимуму, четные пропускать. Уже в два раза меньше проверять. В том коде главная проблема в div. Деление достаточно тяжелая операция. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 14:41 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima T, ну совсем меня за лоха то не держи? и 5 пропускается в том числе.. четные просто inc 2 числам.. а 5 ща mod но можно еще ускорить, но повторюсь.. сильно не вижу смысла. я просто кинул кусок кода на асме, который в плане скорости и размера очень мал. поверь.. я в своей жизни на говнокода насмотрелся. я собственно последние лет 10 ток кейгены и пишу.. поэтому и гремучая смесь делфи+асм ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 14:51 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima T, я тебе скажу по секрету.. там самая тяжелая операция это lodsd ... а регистровый div он еще на конвеере полу обрабатывается.. а вот работа с памятью.. в частности использования переменных... вот это самые большие тормоза. но никуда без таблицы праймов не дется. когдато у меня была табла про такты которые тратит проц на обработку комманды.. гдето пол года назад пытался найти свежую, уже не публикуют вроде ибо стало все сложно. ибо CISCO RISC процы уже отсутсвуют.. ща они все гибридные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 14:55 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
VodoleYkaработа с памятью.. в частности использования переменных... вот это самые большие тормоза. но никуда без таблицы праймов не дется. для расчета 2^32 надо всего 6500 чисел или ~26 Кб под таблицу. Она целиком в кэш проца влезет и не будет никаких обращений в память. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 15:42 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
VodoleYkaDima T, cmp eax, $FFFF //0:00:37 vs 0:00:03 ja @prime считай в 40 раз. при одинаковых условиях при расчете 1го 1кк чисел.. (не праймов.. просчет чисел от 0 до 1кк) и по идее дальше должна еще увеличиваться. Затестил, таблица квадратов дает ускорение еще на порядок. Диапазон 2^16..2^24 ФункцияВремяis_prime()14.4 сек.is_prime2()1.2 сек. Исходник Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 16:50 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima T, кстати.. о таблице праймов.. там на хабре статейка была.. на предмет того чтоб не хранить прайм, а хранить шаг между соседом. там получается что всего около 10ка праймов находятся на расстоянии больше 256 байт.. т.е можно просто хранить не 2 3 5 7 а 2 2 2 и т.д.. для тех, где расстояние больше тратить 3 байта типа 0 хх хх, так базу можно на 25 проц ужать, вобщемто без потери скорости работы.. все равно праймы друг за другом перебираются ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 17:02 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
В 4 раза ужимается. Где-то в топике выше обсуждали. Одного байта достаточно до 2^64. Максимум разницу 300 с небольшим находил. Дополнительно еще на 2 делил, т.к. разница всегда четная. Так в 1 байт шаг до 512 влазит. Таблица квадратов не нужна, с умножением время точно такое же Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 17:15 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
ДА но тебе все равно нужен маркер какойто.. что число больше байта. вобщем и это детали ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 17:22 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Затестил. На скорость оптимизация не влияет, те же 1.2 сек, разве что когда до 2^64 считать, то таблица перестанет в кэш проца влазить. Исходник Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 17:33 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
VodoleYkaДА но тебе все равно нужен маркер какойто.. что число больше байта. вобщем и это детали Оно всегда влазит. Я ж писал максимум разница 300 с небольшим нашлась. У меня в коде эратосфена x64 проверка есть, она ни разу не сработала. Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 17:38 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
тю блин.. это я затупил.. вы в таблице уже поделенные значения хранить собирались.. согласен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 17:51 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima TВ 4 раза ужимается. Где-то в топике выше обсуждали. Одного байта достаточно до 2^64. Максимум разницу 300 с небольшим находил. Дополнительно еще на 2 делил, т.к. разница всегда четная. Так в 1 байт шаг до 512 влазит. Таблица квадратов не нужна, с умножением время точно такое же Код: plaintext 1. 2. 3. 4. 5. 6. 7. я может чего не понимаю, а почему просто корень не извлечь сразу? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. вот тут есть приблизительные алгоритмы извлечения корня ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2016, 22:25 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima T, давай актуализируем нашу песочницу. Я кстати решил полностью уйти с SVN и поудалять всё с миграцией в github. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 01:14 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)я может чего не понимаю, а почему просто корень не извлечь сразу? VodoleYka, не хотел с корнями связываться на асме. Затестил, по скорости одинаково что с корнями что с квадратами. maytonDima T, давай актуализируем нашу песочницу. Я кстати решил полностью уйти с SVN и поудалять всё с миграцией в github. Там все актуально, больше доработок не было, переноси как есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 07:12 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima T, ну FSQRT еще никто не отменял.. но там получается 2 операции с памятью. а это не гуд.. а вот регистровое умножение, вполне имеет право на жизнь.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 11:18 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. ну короче както так.. ток теперь вызывающая процедура озабочена записью прайма в таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 11:45 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
тю блин.. в коментах ошибка.. cmp ecx,eax //dwIn<prime[i]*prime[i] ЗЫ как же фигово что нельзя править сообщения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2016, 11:46 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Составил програмку расчёта первых простых чисел по методу Владимира Хренова. http://www.zodiack.narod.ru/nchisla.pdf Первые три миллиарда находит за 7 часов 10 минут. Хотелось бы ослышать оценку по скорости генерации по сравнению с решетом Эратосфена. Протестировано на Intel Core I5-2400 3.1 Ghz, 4 Gb memory, Win 10 Pro. 29 cnt:10 end time: 08:03:18 date: 02/13/18 71 cnt:20 end time: 08:03:18 date: 02/13/18 113 cnt:30 end time: 08:03:18 date: 02/13/18 173 cnt:40 end time: 08:03:18 date: 02/13/18 229 cnt:50 end time: 08:03:18 date: 02/13/18 281 cnt:60 end time: 08:03:18 date: 02/13/18 349 cnt:70 end time: 08:03:18 date: 02/13/18 409 cnt:80 end time: 08:03:18 date: 02/13/18 463 cnt:90 end time: 08:03:18 date: 02/13/18 541 cnt:100 end time: 08:03:18 date: 02/13/18 1223 cnt:200 end time: 08:03:18 date: 02/13/18 1987 cnt:300 end time: 08:03:18 date: 02/13/18 2741 cnt:400 end time: 08:03:18 date: 02/13/18 3571 cnt:500 end time: 08:03:18 date: 02/13/18 4409 cnt:600 end time: 08:03:18 date: 02/13/18 5279 cnt:700 end time: 08:03:18 date: 02/13/18 6133 cnt:800 end time: 08:03:18 date: 02/13/18 6997 cnt:900 end time: 08:03:18 date: 02/13/18 7919 cnt:1000 end time: 08:03:18 date: 02/13/18 17389 cnt:2000 end time: 08:03:18 date: 02/13/18 27449 cnt:3000 end time: 08:03:18 date: 02/13/18 37813 cnt:4000 end time: 08:03:18 date: 02/13/18 48611 cnt:5000 end time: 08:03:18 date: 02/13/18 59359 cnt:6000 end time: 08:03:18 date: 02/13/18 70657 cnt:7000 end time: 08:03:18 date: 02/13/18 81799 cnt:8000 end time: 08:03:18 date: 02/13/18 93179 cnt:9000 end time: 08:03:18 date: 02/13/18 104729 cnt:10000 end time: 08:03:18 date: 02/13/18 224737 cnt:20000 end time: 08:03:18 date: 02/13/18 350377 cnt:30000 end time: 08:03:18 date: 02/13/18 479909 cnt:40000 end time: 08:03:18 date: 02/13/18 611953 cnt:50000 end time: 08:03:18 date: 02/13/18 746773 cnt:60000 end time: 08:03:18 date: 02/13/18 882377 cnt:70000 end time: 08:03:18 date: 02/13/18 1020379 cnt:80000 end time: 08:03:18 date: 02/13/18 1159523 cnt:90000 end time: 08:03:18 date: 02/13/18 1299709 cnt:100000 end time: 08:03:18 date: 02/13/18 2750159 cnt:200000 end time: 08:03:19 date: 02/13/18 4256233 cnt:300000 end time: 08:03:19 date: 02/13/18 5800079 cnt:400000 end time: 08:03:19 date: 02/13/18 7368787 cnt:500000 end time: 08:03:20 date: 02/13/18 8960453 cnt:600000 end time: 08:03:20 date: 02/13/18 10570841 cnt:700000 end time: 08:03:21 date: 02/13/18 12195257 cnt:800000 end time: 08:03:21 date: 02/13/18 13834103 cnt:900000 end time: 08:03:21 date: 02/13/18 15485863 cnt:1000000 end time: 08:03:22 date: 02/13/18 32452843 cnt:2000000 end time: 08:03:26 date: 02/13/18 49979687 cnt:3000000 end time: 08:03:30 date: 02/13/18 67867967 cnt:4000000 end time: 08:03:34 date: 02/13/18 86028121 cnt:5000000 end time: 08:03:39 date: 02/13/18 104395301 cnt:6000000 end time: 08:03:44 date: 02/13/18 122949823 cnt:7000000 end time: 08:03:49 date: 02/13/18 141650939 cnt:8000000 end time: 08:03:54 date: 02/13/18 160481183 cnt:9000000 end time: 08:03:59 date: 02/13/18 179424673 cnt:10000000 end time: 08:04:04 date: 02/13/18 373587883 cnt:20000000 end time: 08:04:58 date: 02/13/18 573259391 cnt:30000000 end time: 08:05:55 date: 02/13/18 776531401 cnt:40000000 end time: 08:06:55 date: 02/13/18 982451653 cnt:50000000 end time: 08:07:58 date: 02/13/18 1190494759 cnt:60000000 end time: 08:09:02 date: 02/13/18 1400305337 cnt:70000000 end time: 08:10:07 date: 02/13/18 1611623773 cnt:80000000 end time: 08:11:13 date: 02/13/18 1824261409 cnt:90000000 end time: 08:12:19 date: 02/13/18 2038074743 cnt:100000000 end time: 08:13:26 date: 02/13/18 4222234741 cnt:200000000 end time: 08:25:12 date: 02/13/18 6461335109 cnt:300000000 end time: 08:37:53 date: 02/13/18 8736028057 cnt:400000000 end time: 08:50:24 date: 02/13/18 11037271757 cnt:500000000 end time: 09:03:08 date: 02/13/18 13359555403 cnt:600000000 end time: 09:16:56 date: 02/13/18 15699342107 cnt:700000000 end time: 09:30:25 date: 02/13/18 18054236957 cnt:800000000 end time: 09:44:45 date: 02/13/18 20422213579 cnt:900000000 end time: 09:58:37 date: 02/13/18 22801763489 cnt:1000000000 end time: 10:12:29 date: 02/13/18 47055833459 cnt:2000000000 end time: 12:38:55 date: 02/13/18 71856445751 cnt:3000000000 end time: 15:14:08 date: 02/13/18 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2018, 01:01 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Без исходника как то незачотно. А вдруг ты пошутил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2018, 01:58 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
mayton, Пошутил в смысле слишком быстро или слишком медленно ? Какие тут шутки. Алгоритм в этой работе нарисован - смотри на картинку дерева чисел. Автор ничего не скрыл - всё на виду. Принцип простой. Все простые числа или их произведения принадлежат двум последовательностям: 1) P1(i)=6*i-1, где i=1,2,....n (n стремится к бесконечности) 2) P2(i)=6*i+1, где i=1,...n То есть: P1(1)=6*1-1=5 - простое P2(1)=6*1+1=7 - простое P1(2)=6*2-1=11 - простое P2(2)=6*2+1=13 - простое P1(3)=6*3-1=17 - простое P2(3)=6*3+1=19 - простое P1(4)=6*4-1=23 - простое P2(4)=6*4+1=25 - составное P1(5)=6*5-1=29 - простое P2(5)=6*5+1=31 - простое ... Далее, каждое новое простое число генерирует две другие бесконечные последовательности. Так называемые "положительные" последовательности вида (m стремится к бесконечности) K1(j) = P1(i)*P1(i)+P1(i)*6*j где j=0,1,2,....m и "отрицаетльные" последовательности вида K2(j)=P1(i)P2(i)+P1(i)*6*j где j=0,1,2,...m Например: Для i=1 и P1(соответствующее простое число 5 ): "Положительная" последовательность K1(P1(1),0)=5*5+5*6*0=25 K1(P1(1),1)=5*5+5*6*1=55 K1(P1(1),2)=5*5+5*6*2=85 ... "Отрицательная" последовательность K2(P1(1),0)=5*7+5*6*0=35 K2(P1(1),1)=5*7+5*6*1=65 K2(P1(1),2)=5*7+5*6*2=95 ... Для i=2 и P2(соответствующее простое число 7 ): "Положительная" последовательность K1(P2(1),0)=7*7+7*6*0=49 K1(P2(1),1)=7*7+7*6*1=91 K1(P2(1),2)=7*7+7*6*2=133 ... "Отрицательная" последовательность K2(P2(1),0)=7*11+7*6*0=77 K2(P2(1),1)=7*11+7*6*1=119 K2(P2(1),2)=7*11+7*6*2=161 ... Числа , которые учавствуют в "положительной" и "отрицательной" последовательностях вычёркиваются из последовательностей P1 и P2. Например, число 25 - первое число последовательности K1(P1(1),0), значит мы его вычёркиваем из ряда - число P2(4). И так далее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2018, 04:03 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
А вот и код. Прошу не пинать сильно - код сырой. Я его только вчера написал. Но в общем рабочий. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2018, 04:32 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
кибальчишПервые три миллиарда находит за 7 часов 10 минут. Хотелось бы ослышать оценку по скорости генерации по сравнению с решетом Эратосфена. В первом посте писал: Dima Tасинхронный до 3 млрд. за 15 сек считает Окончательный вариант быстрее в 3 раза. Ссылки в первом посте на исходники умерли, залил на гитхаб. next_prime32.h next_prime64.h Генератор простых чисел в заданном диапазоне PS Модераторы поправьте ссылки в первом посте на эти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2018, 08:15 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
В одном из prime-топиков у нас были контрольные таблицы с точным подсчетом primes на интервалах целых чисел. Правда не могу вспомнить ссылку. Надо-бы сравнить результат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2018, 09:22 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonВ одном из prime-топиков у нас были контрольные таблицы с точным подсчетом primes на интервалах целых чисел. Правда не могу вспомнить ссылку. Надо-бы сравнить результат. У меня генератор считает количество в диапазоне. Проверил выборочно, эти сходятся: кибальчиш982451653 cnt:50000000 2038074743 cnt:100000000 11037271757 cnt:500000000 22801763489 cnt:1000000000 47055833459 cnt:2000000000 71856445751 cnt:3000000000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2018, 09:53 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima T, Спасибо. Ещё не мог бы ты сообщить время за которое твой генератор находит первые 3 миллиарда простых чисел ? В общем, похоже что метод рабочий, перспективный, но в моей реализации на ассоциативном массиве не достаточно быстро пока получается. Если бы этот принцип переделать по аналогии с решетом на битовые операции - возможно он бы и решето с аткинами по скорости обогнал. Да и возможности для распараллеливания здесь есть. Таблица считается один раз , а дальше запустить параллельные процессы на количество под-диапазонов равных количеству доступных процессоров . Должно дать линейное увеличение по скорости. Как считаете ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2018, 15:22 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
кибальчишDima T, Спасибо. Ещё не мог бы ты сообщить время за которое твой генератор находит первые 3 миллиарда простых чисел ? В один поток 142 сек. Проц i7-6700K 4 ГГц Код: plaintext Можешь сам скомпилировать, если позапускать есть желание, проект для MSVC . Могу собранный exe дать сюда если надо. кибальчишВ общем, похоже что метод рабочий, перспективный, но в моей реализации на ассоциативном массиве не достаточно быстро пока получается. Если бы этот принцип переделать по аналогии с решетом на битовые операции - возможно он бы и решето с аткинами по скорости обогнал. Поизучал твой алгоритм. По сути алгоритм похож на Эратосфена: имеем исходный набор потенциальных простых чисел и с помощью очередного простого числа вычеркиваем непростые. ИМХО Эратосфен выглядит проще, т.е. операций меньше надо сделать. Сомневаюсь что обогнать его сможешь. Главный тормоз у тебя в ассоциативном массиве. Я биткарту использовал вместо него. кибальчишДа и возможности для распараллеливания здесь есть. Таблица считается один раз , а дальше запустить параллельные процессы на количество под-диапазонов равных количеству доступных процессоров . Должно дать линейное увеличение по скорости. Как считаете ? Эратосфен тоже хорошо параллелится. В четыре потока вчетверо быстрее. Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2018, 16:50 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
кибальчишПринцип простой. Все простые числа или их произведения принадлежат двум последовательностям: 1) P1(i)=6*i-1, где i=1,2,....n (n стремится к бесконечности) 2) P2(i)=6*i+1, где i=1,...n ... Далее, каждое новое простое число генерирует две другие бесконечные последовательности. Так называемые "положительные" последовательности вида (m стремится к бесконечности) K1(j) = P1(i)*P1(i)+P1(i)*6*j где j=0,1,2,....m и "отрицаетльные" последовательности вида K2(j)=P1(i)P2(i)+P1(i)*6*j где j=0,1,2,...m Долго вникал, но в итоге считаю что это форсированный Эратосфен. В отличии от оригинала тут пропускаются все числа кратные 2 и 3, за счет чего в идеале 6-тикратное ускорение, реально меньше, т.к. доп. операции появляются. Перечитал свой код - он именно так и работает, пропускает кратные 2 и 3. Правда я своим путем до этого дошел, поэтому код получился слабочитаемым, если мягко сказать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2018, 18:20 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Dima T, Можно назвать этот метод "форсированным Эратосфеном". Но по моему, это Эратосфен да не совсем. Я набросал небольшой примерчик в Экселе поиска всех простых чисел до 102. Посмотри. Группируем числа в группы по 6. Тогда искомые простые числа оказываются в колонках 1 и 5 - и так до бесконечности. Далее - берём первое простое число 5. Оно образует две последовательности: Отрицательную - 35, 65, 95, 125,... (жёлтенькая) Положительную - 25,55,85,115,... (красненькая) На основании этого - вычёркиваем из зелёных колонок 25,35,55,65,85,95 до конца нашего диапазона в 102. Берём второе число - 7. Оно образует две последовательности: Отрицательную - 77,119, 161, 203,... ( коричневая) Положительную - 49,91, 133,175,... (синяя) На основании этого - вычёркиваем из зелёных колонок 49,77,91 Итого после вычёркивания четырёх последовательностей остаются : 5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101 - все простые числа. В общем получается, что весь диапазон до 100 задан всего двумя простыми числами 5 и 7. Мы применили всего 9 вычёркиваний. Теперь сравни с количеством вычёркиваний на анимации вот в этой статье на вики: https://ru.wikipedia.org/wiki/Решето_Эратосфена Главное что теперь понятен принцип формирования простых чисел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 05:27 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
кибальчишМожно назвать этот метод "форсированным Эратосфеном". Но по моему, это Эратосфен да не совсем. Как уже написал - это Эратосфен с пропуском кратных 2 и 3. На вики видно что в оригинальном Эратосфене для вычеркивания использованы 2,3,5,7. Посмотри последовательности для 5 и 7 в оригинальном Эратосфене: Код: plaintext 1. Красным выделил те числа что ты использовал. Заметь, все что пропущено кратно 2 или 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 07:39 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Если решето считать кусками равными 2Гб (для удобства) то. Количество бит (простых чисел) которые можно уложить в интервал равно 17 179 869 184. Пока без учота четных и кратных тройкам. На последнем чанке для целых диапазона int64, по формуле плотности вероятности простых чисел на интервале от 9 223 372 019 674 906 623 до 9 223 372 036 854 775 807 мы получаем примерно 384 408 416 простых чисел. Соотношение primes к общему количеству целых в чанке будет примерно 0.022. Грубо говоря на каждые 50 бит целых чисел приходится 1 бит prime. Не очень рациональный способ укладки данных. Кроме того итератор по данной биткарте будет иметь не очень хороший КПД. И хотя сомнительно что кто-то из нас досчитает до последних интервалов, все равно тема расхода памяти меня интересует. Какова должна быть структура данных чтобы обеспечить проверку на простоту (prime-test) а также обеспечение интерфейса итерации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2018, 00:58 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonНа последнем чанке для целых диапазона int64 , по формуле плотности вероятности простых чисел на интервале от 9 223 372 019 674 906 623 до 9 223 372 036 854 775 807 мы получаем примерно 384 408 416 простых чисел. Соотношение primes к общему количеству целых в чанке будет примерно 0.022. Грубо говоря на каждые 50 бит целых чисел приходится 1 бит prime. Не очень рациональный способ укладки данных. Уместить 64 бита в 50 уже компактно. Пропуск четных делается элементарно, поэтому считай не в 50, а 25. 25 бит на значение это очень хороший результат. Лучше чем массив. Насчет итератора: если нужен последовательный доступ, то удобнее хранить разницу между соседними, тогда 1 байта достаточно на значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2018, 16:26 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Да я помню наши эксперименты по хранению. В данной задаче меня интересовало два пункта. - определение простоты числа - факторизация большого числа эти задачи связанны и постоянно перетекают из одной в другую. Задача генерации решета - решает половину вопроса. Как оптимально хранить результат? Нужно-ли хранить? Как поддержать Iterable<Number>? Прошло много лет. Я с тех пор периодически возвращаюсь к этой теме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2018, 20:43 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
Вот как они так шустренько факторизируют? Здесь https://www.alpertron.com.ar/ECM.HTM Вбил достаточно толстое число и получил разложение за доли секунды. 999999 139457 198374 509187 352837 465872 364875 628743 (48 digits) = 13 × 71 × 301153 × 740 107003 × 1 019694 655739 × 4 767010 128311 620141 Особенно последний множитель. Он - достаточно велик чтобы просто так его быстро разложить. Рабин-Миллер? Нет. Он вроде только определяет факт простоты. И то с вероятностью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 00:39 |
|
||
|
Генератор простых чисел (до 10^9 за 5 сек)
|
|||
|---|---|---|---|
|
#18+
maytonВот как они так шустренько факторизируют? Если ткнуть в кнопку "Help", то там будет и описание и ссылка на исходник. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 15:53 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2017971]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
74ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
272ms |
get tp. blocked users: |
1ms |
| others: | 16ms |
| total: | 408ms |

| 0 / 0 |
