Слишком много или не слишком, тут важен сам факт. Что человек, который заинтересовался кортежами сравнительно недавно, смог предложить рабочую идею ускорения чрезвычайно быстрой программы, которая, как понимаю, совершенствовалась годами. Ведь, грубо говоря, ничегошеньки я не понимаю в этих тактах.
Безусловно. Любая идея может оказаться полезной, не здесь (текущая программа оказалась слишком уж быстрой, вот и многие идеи не дают ощутимого эффекта), так ещё где-нибудь.
А симметрия - очень красивая идея.
Но раньше-то Вы об этом не говорили. Можно этот момент подробнее осветить?
Да там и так запутанно, о некоторых деталях умолчал (но упомянул что их пропустил): и многопоточность (ещё цикл в п.4), и оптимизация трафика памяти (ещё цикл, причём работающий между п.1 и п.4, блоки по 32 числа перебираются сначала этим циклом с шагом 37# или 47# несколько раз (фиксированное количество, не по всему заказанному диапазону), а уж потом продвигаются внутри таблицы 37#), ну и вынос части перебора наружу. Поясню конечно.
Так как моя программа стоит таблицу сама из переданного паттерна, то ещё в марте 2021 пришла идея вынести часть переборов наружу и передавать ей что по некоторым простым не надо анализировать остатки, а брать только один прямо указанный - это автоматически построит таблицу только с ним и без увеличения размера таблицы она будет покрывать больший диапазон чисел. Понятно что на одном простом не остановился и сделал передачу до 9 остатков по простым 41-71. Тогда же сделал очередной "подход к снаряду" 19-252, запустил счёт по новому, только не из PARI, а из командной строки (файла cmd) с записью в файлы и допроверкой в PARI. Считалось неделю, просчиталось 21% диапазона 0-1e22, 3374 файла в основном вообще без кандидатов, редко 1-2, лишь в 4 из них по 3 кандидата. Посмотрел я на это дело тогда и бросил. Как-то слишком геморно показалось, да и десятки тысяч файлов раздражали. Ещё и оценка времени улетала в годы. И возможно в программе ещё и глюк сидел. В общем посмотрел и бросил. А вызов программы из PARI без сохранения в файлы тогда ещё видимо не умел.
Вот пример запуска программы с передачей трёх остатков:
Код:
n=19, max=252, x: 0 6 12 30 42 72 90 96 120 126 132 156 162 180 210 222 240 246 252
3:1,2, n=2, d=2 / 6
5:1,2, n=2, d=4 / 30
7:3,4, n=2, d=8 / 210
11:4,8, n=2, d=16 / 2310
13:3,5, n=2, d=32 / 30.03e3
17:1,2, n=2, d=64 / 510.5e3
19:2,3,11,12,16,17, n=6, d=384 / 9.700e6
23:3,9,10,14,15,21, n=6, d=2304 / 223.1e6
29:1,2,3,4,5,6,7,8,11,14,24,27, n=12, d=27.65e3 / 6.470e9
31:5,9,10,11,12,13,14,15,16,17,18,22, n=12, d=331.8e3 / 200.6e9
37:1,3,4,6,8,9,10,11,14,17,18,20,24,26,27,30,33,34,35,36, n=20, d=6.636e6 / 7.421e12
41:1, n=1, d=6.636e6 / 304.3e12
43:2, n=1, d=6.636e6 / 13.08e15
47:3, n=1, d=6.636e6 / 614.9e15
53:1,4,5,6,7,8,9,12,14,15,17,18,20,21,22,24,26,28,29,30,31,35,36,37,38,40,42,44,45,46,48,49,51,52, n=34, d=225.6e6 / 32.59e18
59:1,2,3,4,5,6,7,8,9,10,11,12,13,16,18,19,20,23,24,25,27,30,31,32,33,34,35,36,37,38,39,40,41,42,44,48,50,52,54,58, n=40, d=9.024e9 / 1.923e21
61:1,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,23,24,25,28,29,30,33,35,36,37,38,39,40,41,42,43,44,45,46,47,48,52,54,56,58,60, n=42, d=379.0e9 / 117.3e21
Size:6.636e6*(16(53..127)+23(128..256))=365MB, 0.043s, d=614.9e15, k[]:0.466s, kk[]:1.034s
Как видно вместо таблицы 37# будет использоваться таблица 47#, но с тремя фиксированными остатками по 41,43,47 и потому той же длины, а делимости будут проверяться лишь по 53-.
Соответственно перебор допустимых остатков по простым 41,43,47 возлагался на внешнюю программу (любую), т.е. эту программу нужно было вызвать 24*24*28=16128 раз с разными передаваемыми остатками для каждого диапазона.
0.043с потрачено на таблицу допустимых остатков (по простым примерно до 1000) и выбор размера таблицы (в зависимости от переданного паттерна), к 0.47с вычислена КТО для 6.636e6 чисел, а к 1c вычислены и все остатки по простым 53-256 для всех 6.636e6 чисел (всё в 4 потока).
И вот тут возникает тот хитрый момент о котором говорил выше, даже два.
Так как в программе есть некие подготовительные действия (построение таблиц), то сколько-то времени тратится на них и потому чтобы не слишком замедлять общую работу надо чтобы основной счёт занимал времени раз в 10 больше инициализации, а она занимает около секунды, значит счёт должен занимать секунд 10. Это ограничивает диапазон снизу до 1e21, которые перебираются секунд за 9. Делать диапазон ещё меньше уже невыгодно, замедление от наличия инициализации будет больше 10%. Но 9с на вызов, которых надо 16128, это 40ч на 1e21. И при любом глюке можно потерять всё насчитанное в диапазоне за 40ч. Неприятно. Потому пришлось сохранять лог каждые 9с, их потерять вообще не страшно, но это усложнило перезапуск после глюков, автоматический писать не стал, всё руками (найти точку останова, поправить, аккуратно указать её в двух местах в .gp программе, запустить продолжение счёта).
Второй неприятный момент: раз проверяем делимости лишь по 53-, то допустимость 32 проверяемых чисел уменьшается медленнее и доходит ниже 1 (чтобы можно было оборвать проверку) позже, заметно позже чем при проверке с 41-. А значит выполняется больше итераций на первом отсеве, а значит медленнее работает программа. Сколько я тогда бошку ломал почему скорость на число уменьшается при попытке ускорения счёта ... А она уменьшается почти вдвое, с 2e9/c до 1.25e9/c! Но в итоге выигрыш 47/28*43/24*41/24=5.1 раз от уменьшения перебора его всё равно перекрывает и внешний перебор 41,43,47 оказывается выгодным. А и по 53 скорость падает до 0.985e9/c. Но тогда вызовов нужно сделать уже полмиллиона, и каждый хотя бы на 5e22 за 10с (и 2с на 1e22 и 4с на 2e22 и 5с на 2.5e22 слишком коротки) и выигрыш от внешнего перебора по 53 падает до 23%, зато ждать перебора всего 5e22 придётся два месяца. Посчитал это уже слишком неудобным и ограничился 47 (да, вероятно потеряв в скорости около 20%).
PS. Все цифры скорости указаны для основного компа, счёт же идёт на другом более быстром (плюс немного у Демиса). Собственно и текущий "подход к снаряду" в апреле 2023 состоялся именно из-за появления другого компа, так бы на основном запускать не стал, скорость ещё в марте 2021 совсем не радовала, а так появилась надежда управиться за полгода (но не оправдалась).
PPS. Вопрос-то пояснил или вышло пустое бла-бла-бла? Повторю, я могу и на PARI всё функционально переписать, но будет ли это понятнее? Сомневаюсь. И оно уж точно будет непригодно для анализа скорости, даже близко.