И то, что реальный шаг здесь всё-таки 6-кратный.
Я всё же предпочитаю использовать термин шаг в применении к pp=Mod(), потому что именно этот шаг виден в программах на PARI работающих с ускорителями.
А какой он реально внутри ускорителей - дело десятое.
Например в 310-м комплекте при bb=[5,37] как собственно Вы использовали шаг проверки индексов очевидно был Blocks=1110/104=
10.673x - не 6х, а
в среднем 10.673х.
В 1744 комплекте я выставил bb=[17,41] и шаг проверки индексов получился Blocks=4182/180=
23.233x, уже ну совсем не 6х.
В 482 комплекте я не пожадничал памяти (что впрочем несколько затормозило счёт) и выставил bb=[5,17,43], что дало шаг проверки индексов уже Blocks=21930/768=
28.555x.
И это увеличение шага проверки индексов обрабатывается на этапе компиляции, потом ускоритель на это времени уже не тратит (как и программа VAL не тратит времени на ушестерение шага).
Так что нет,
реальный шаг в ускорителях обычно вовсе не шестикратный, а больше, иногда в разы, даже в среднем, а уж между каждыми соседними допустимыми индексами разница может и ещё больше быть (если окажутся недопустимыми несколько индексов подряд).
Но это
проблемы личное дело ускорителя, какой у него шаг проверки индексов, переборная PARI программа счёта от этого никак не зависит, она всегда спокойно работает в терминах pp=Mod(). И я не вижу никакой вменяемой причины наводить путаницу с увеличением шага, которое только внутри ускорителей и которое зависит от параметров компиляции ускорителей даже для одних и тех же паттернов. Полезно отделять математику (шаг в pp=Mod()) от варианта конкретной реализации (варианты bb[]). При этом в математике не надо помнить во сколько раз надо увеличить шаг для каждого класса паттернов (это только для M12 можно 6х, для многих других нельзя, только 2х).
То есть болле 7 тысяч раз для того или иного комплекта проверка по стартовой точке передаётся в Пари. А дальше что происходит? Если смягчить условия(в большом ифе), какие-то цепочки найдутся?
А дальше каждый ускоритель проверяет такой индекс на допустимость по остальным простым до выбранного порога (4096) и если нулевой остаток для всех них допустим (это эквивалентно что числа цепочки не делятся на данные простые), то такой индекс (нулевой) вернётся в PARI как результат работы ускорителя и PARI допроверит цепочку. Разумеется индекс вернётся не моментально по нахождению, а лишь по окончанию проверки всего заказанного ускорителю интервала индексов, а всё найденное вернётся в PARI в виде списка (массива, вектора) индексов (в vi[]).
Если по какому то простому нулевой остаток для индекса недопустим, значит какое-то число в цепочке (может и не одно) делится на соответствующее простое и соответственно оно уже не большое простое, т.е. данный индекс цепочки не подходит и в PARI не вернётся, а ускоритель перейдёт к проверке следующего допустимого индекса.
-- 14.08.2022, 16:17 --YadryaraПо большому счёту для ускорителей вообще нет понятия шаг проверки индексов. Есть список допустимых индексов (по модулю блока), посмотреть можно в таблице по метке offsets в файле .inc, вот они и проверяются. А уж с каким они идут шагом, постоянным, переменным или ещё каким - фиолетово.
Но можно ввести (и я именно так и пользуюсь везде выше) понятие
среднего шага - просто как отношение общего количества индексов в блоке (произведение простых из bb[]) к количеству проверяемых индексов в блоке. Именно это число и показывается при компиляции в строке Blocks=4182/180=23.233x. Это понятие удобно для оценки скорости работы, но никак не порядка проверки.
Да, можно заставить ускоритель использовать фиксированный шаг проверки (оставить bb[] пустым или вписать туда только те простые, по которым допустимы абсолютно все остатки - а такого не бывает), но это обычно приводит к тому что допустимым оказывается лишь один индекс, что резко тормозит ускоритель и потому не применяется. Хотите попробуйте. Я где-то выше в советах о выборе параметров bb[] говорил - очень желательно чтобы количество допустимых индексов (число в знаменателе в Blocks=4182/180) было порядка сотни и более, иначе начнутся тормоза в работе ускорителей.
Понятие блока нужно для ускорения работы ускорителя, (сорри), чтобы пореже выполнять очень длительные действия (перерасчёт текущих остатков по модулю всех простых до указанного порога для всех 11-ти проверяемых чисел, это порядка 3000 остатков!), не на каждый допустимый индекс, а лишь один раз на блок. Во внешней переборной PARI программе счёта понятия блок индексов не используется, там математика, а не тонкости оптимизации вычислений в ускорителях.
-- 14.08.2022, 16:36 --YadryaraЕсли Вам так интересно возвращаются ли в PARI нулевые индексы, запустите в консоли в корневой папке любого комплекта ускорителей команду типа
for /f %f in ('dir /a-d /s /b *.exe') do @%f 0 6 и посмотрите на результат, если что-то найдётся, то массив/вектор окажется не пустым. У меня одна группа из 720 ускорителей x32 SSE какого-то комплекта отработала эту команду за 21с. В принципе эти 30мс можно считать накладными расходами на вызов ускорителя.
Для исходного комплекта все 46080 x32 SSE ускорителей выдали два варианта: 3 и 5. Нулевого не выдали.