Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Это неоптимально. При проверке на Prime можно сразу скипать чётные числа. Шаг делать равным 2. А двойку проверить отдельно вне цикла. Код: plaintext 1. Это нужно выкинуть нафиг. Код: plaintext 1. Есть инкрементальный целочисленный расчёт квадратного корня. Есть просто целочисленный квадратный корень. Ищите в форуме мои посты 2-х годичной давности. Там генератор простых чисел обсуждался. + Если уже имеется вектор расчитанных простых то их можно использовать в качестве делителей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 12:43 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Без таблицы никак, иначе считать каждый раз. Тут хорошо расписана оптимизация генераторов. http://habrahabr.ru/post/122538/ Переписал оттуда генератор на С Код: 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. До миллиона за десятки мс генерит, если больше надо - тут алгоритмы посерьезнее http://habrahabr.ru/post/133037/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 13:16 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Вы меня испугали. Я уже подумал что нужно больше отдыхать, если я так сильно ошибался когда пытался решить данную задачу без дополнительных затрат статической памяти. Но это оказалось не так. Вообще говоря, Кнут(если не ошибаюсь) пишет примерно следующее: если число вариантов перебора менее 10! то можно использовать перебор. В данном конкретном случае, мы имели дело с простыми числами в диапазоне . Согласитесь, это немного. Потеря производительности была на другом участке кода, ниже рефакторинг с оптимизациями касаемо поиска простых чисел (они не играют решающую роль, можно оставить их как и прежде), и изменением в алгоритме Дмитрия Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 06:39 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Не удержался C: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 06:44 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Хотя если так подумать, это не изменения в алгоритме Дмитрия(ибо его алгоритм предназначен для таблицы простых числе куда может входить число а), а модификация алгоритма для решения задачи без статической таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 07:08 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
От моего алгоритма только каркас остался :) Еще была версия m_Sla 17433850 Это лишнее Код: plaintext 1. a всегда больше 0 и sqrtl((long double)x) не панацея: от того что точность повышаешь она идеальной не становится, нет гарантии что корень из 9 не получится 2.999999999999999 и приведется к 2, я бы так писал Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 07:40 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Я выше ссылки на статью про генераторы давал, не почитал? Там хорошая мысль была как корни не считать. Это Код: plaintext 1. равносильно этому Код: plaintext 1. В принципе ничего гениального, но все считают корни. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 07:52 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Да, сравнивать нет смысла, строчка лишняя. Можно сравнивать произведение, знаю об этом. Ознакомился с информацией по ссылкам, спасибо :) но т.к. я этой проблемой глубоко не занимаюсь, и пока не планирую, не стал углубляться. Решето Эратосфена мне знакомо давно. Аткина, в общих чертах знал, сейчас посмотрел ещё раз ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 08:47 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Dima T, более того, такой for вообще ересь — условие выхода из цикла считается заново каждую итерацию, при том, что оно не меняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 10:00 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
RWolfболее того, такой for вообще ересь — условие выхода из цикла считается заново каждую итерацию, при том, что оно не меняется. В целом согласен, но в данном случае корень тоже считается каждую итерацию, но наверно компилятор это оптимизирует. В принципе цикл можно соптимизировать расчетом последовательности квадратов: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 10:29 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Dima T, простой тест: Код: plaintext 1. 2. 3. 4. 5. 6. 7. gcc -std=c99 -O2 -S 1.c .globl _count_op .def _count_op; .scl 2; .type 32; .endef _count_op: LFB39: .cfi_startproc pushl %esi .cfi_def_cfa_offset 8 .cfi_offset 6, -8 pushl %ebx .cfi_def_cfa_offset 12 .cfi_offset 3, -12 subl $36, %esp .cfi_def_cfa_offset 48 xorl %ebx, %ebx movl $1, %esi fildl 48(%esp) fstpl 16(%esp) jmp L4 .p2align 2,,3 L5: sall %esi incl %ebx L4: fldl 16(%esp) fstpl (%esp) call _sqrt movl %ebx, 28(%esp) fildl 28(%esp) fxch %st(1) fucompp fnstsw %ax testb $69, %ah je L5 movl %esi, %eax addl $36, %esp .cfi_def_cfa_offset 12 popl %ebx .cfi_restore 3 .cfi_def_cfa_offset 8 popl %esi .cfi_restore 6 .cfi_def_cfa_offset 4 ret .cfi_endproc call _sqrt в каждой итерации, хотя, казалось бы, оптимизация включена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 10:40 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Понравилась идея SashaMercury с get_next_prime(), переделал немного свой генератор 17434730 Расчет следующего простого с кэшем Заменил глобальный массив на static и добавил дописывание кэша по необходимости Код: 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. До миллиона быстро генерит. Может кому пригодится. Я уже не раз качал таблицы, шаманил с форматированием чтоб в код вставить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 10:54 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Только производная от квадратного корня имеет другой вид. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 11:03 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
RWolfDima T, простой тест: Код: plaintext 1. 2. 3. 4. 5. 6. 7. gcc -std=c99 -O2 -S 1.c .globl _count_op .def _count_op; .scl 2; .type 32; .endef _count_op: LFB39: .cfi_startproc pushl %esi .cfi_def_cfa_offset 8 .cfi_offset 6, -8 pushl %ebx .cfi_def_cfa_offset 12 .cfi_offset 3, -12 subl $36, %esp .cfi_def_cfa_offset 48 xorl %ebx, %ebx movl $1, %esi fildl 48(%esp) fstpl 16(%esp) jmp L4 .p2align 2,,3 L5: sall %esi incl %ebx L4: fldl 16(%esp) fstpl (%esp) call _sqrt movl %ebx, 28(%esp) fildl 28(%esp) fxch %st(1) fucompp fnstsw %ax testb $69, %ah je L5 movl %esi, %eax addl $36, %esp .cfi_def_cfa_offset 12 popl %ebx .cfi_restore 3 .cfi_def_cfa_offset 8 popl %esi .cfi_restore 6 .cfi_def_cfa_offset 4 ret .cfi_endproc call _sqrt в каждой итерации, хотя, казалось бы, оптимизация включена. странно, z в теле цикла не меняется в данном конкретном случае. По хорошему должен оптимизировать. Может быть есть квалификатор обратный к volitile ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 14:03 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
maytonТолько производная от квадратного корня имеет другой вид. Марк, можно подробнее причём тут производная, для особо одарённых :D ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 14:07 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
А откуда оптимизатору знать что sqrt - это чистая функция, которая зависит только от аргументов? А без этого знания ни о каком предварительном вычислении не может быть и речи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 14:07 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
SashaMercury, Просто компилятор не знает, что sqrt() не имеет побочных эффектов, и поэтому не может выкинуть лишние вызовы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 14:08 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyА откуда оптимизатору знать что sqrt - это чистая функция, которая зависит только от аргументов? А без этого знания ни о каком предварительном вычислении не может быть и речи. а нет оптимизаций во время выполнения программы ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 14:09 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
SashaMercuryа нет оптимизаций во время выполнения программы ? Нет. А как бы это помогло? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 14:16 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Можно оптимизатору помочь иногда Код: plaintext 1. 2. или так (если направление не важно) Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 14:19 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskySashaMercuryа нет оптимизаций во время выполнения программы ? Нет. А как бы это помогло? :) Видимо никак. Если бы компилятор знал о том что у этой функции нет побочных эффектов, и аргументы не меняются в теле цикла, он мог бы оптимизировать. Впрочем, Дмитрий предложил хороший вариант, который будет применим и для других аналогичных ситуаций ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 14:26 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Думайте шЫрше. Мы можем (грубо) заменить параболу на последовательность кусочно-линейных функций. И это будет выигрыш. Главное чтоб эти кусочки были больше либо равны параболе. Весь вопрос в выборе шага. Побочный эффект - парочка "лишних" делений. Которые на результат не влияют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 15:41 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
maytonМы можем (грубо) заменить параболу на последовательность кусочно-линейных функций. И это будет выигрыш. Главное чтоб эти кусочки были больше либо равны параболе. В данном случае можно вообще таблицей в пару тысяч значений. Вопрос будет ли оно быстрее умножения? На своем генераторе затестил 17438916 заменил умножение в цикле Код: plaintext 1. 2. на корень перед циклом Код: plaintext 1. 2. 3. Умножение в цикле быстрее. next_prime(10 000 000) с умножением 741 мс с корнем 851 мс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 15:59 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
посчитал в разах: корней 5`000`008 умножений 277`474`804 Т.е. если на расчет потребуется меньше 55 умножений, то выгодно. Теоретически должно взлететь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 16:07 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Прямые рисовать не стал, пошел другим путем, т.к. i у меня возрастает: Код: plaintext 1. 2. 3. 4. 5. Т.е. умножений стало на 270 млн. меньше. ИМХУ самый оптимальный вариант. Ничего не изменилось, т.е. 270 млн. умножений занимают меньше 10 мс (дискретность таймера). Интересный прикол, переключился в debug, такой код работает 1610 мс Код: plaintext 1. 2. 3. 4. 5. а если while() разремить то 1550 мс, т.е. лишние циклы ускоряют программу ХЗ кто помог, компилятор по другому регистры использовал или внутри проца какая-то оптимизация случилась. Затестил раз на десять. Стабильно проявляется в дебаге. Хорошо хоть в релизе нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 17:47 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38918558&tid=2019045]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
104ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 286ms |
| total: | 491ms |

| 0 / 0 |
