Чем больше период, тем лучше фильтрация. Но КТО будет генерить добавки по всему огроменному диапазону.
Ещё вот здесь расписано, как генерить добавки. Но они же всё равно генерятся по всему диапазону. В этом с тех пор прогресса нету. Или есть?
Да, КТО генерит добавки по всему диапазону. Но проблема не только сгенерить добавки, но и проверить их на кортеж 19-252, это значительно дольше. И по ссылке как раз как проверять добавки используя КТО и не генеря при этом саму добавку, а только и нужные вычеты/остатки по модулям простых. Как работает сама КТО было понятно и до того, вопрос был как её применить для получения вычетов без использования медленных команд делений.
Про прогресс уже сказал: идеи есть, но на практике они все оказываются медленнее текущего варианта. В разы.
Ограничить же КТО небольшим диапазоном легко. Для примера возьму диапазон 67#, т.е. надо среди 997# найти только добавки меньшие 67#. При этом считаем что 293e15 добавок в 67# уже известны (это не обязательное условие, так проще объяснить).
Смотрим на формулу КТО для двух векторов
:
, где
. Положим
, тогда
это вектор из 293e15 добавок по модулю 67#.
В
подставляем оставшиеся простые по 997 в любом порядке, в том числе их произведения. Чтобы при этом число
осталось меньше 67# надо чтобы второе слагаемое было равно нулю. Это возможно только если
, именно по модулю
(именно это портит всю малину). Т.е. для каждого
надо проверить существуют ли
(для каждого
) равные по соответствующему модулю
. Если не существуют, то такая добавка
отбрасывается.
В пределе, если каждый раз
просто одно из простых чисел, в
будут лишь допустимые вычеты/остатки по этому простому. Их много. Потому выгоднее сделать обратное сравнение, иметь список запрещённых остатков вместо разрешённых, запрещённых всего 19шт независимо от величины простого (для простых больше 41). И тогда достаточно сравнить каждую добавку
по модулю каждого простого 71-997 с 19-ю числами (причём эти 19 чисел можно сделать одинаковыми для всех простых больше 252), при первом же совпадении добавку
отбрасывать.
Собственно всё. Не отброшенными останутся только те добавки
которые по модулю 997# дают число меньше
, что и требовалось.
Вместо вычисления сначала полного огроменного числа
и потом долгого деления на малое простое для получения остатка можно оперировать лишь остатками по малым простым и вместо умножений и делений выполнять простое сравнение на равенство.
Да, если есть лишь
, то их по любому придётся делить на все простые 71-997 для получения остатков, но, как собственно и было показано в январе, можно и не хранить и не вычислять все
, а получать из массивов меньших размеров сразу остатки по простым 71-997, без умножений и делений, только лишь сравнениями и сложениями/вычитаниями, причём не больших чисел, а весьма малых, лишь по модулям простых 71-997, что тоже заметно проще и быстрее.
-- 29.12.2024, 09:20 --Собственно всё. Не отброшенными останутся только те добавки
которые по модулю 997# дают число меньше
, что и требовалось.
Если внимательно посмотреть, то это просто переформулировка что добавка
имеет разрешённые остатки по простым 71-997.
Поэтому сейчас программа фильтрует по простым 71-131071 и выдаёт лишь те добавки по модулю 67#, которые имеют разрешённые остатки по всем простым 71-131071, что равносильно тому что эти добавки по модулю 131071# дают числа меньшие 67#. Номер периода 67# учитывается отдельно и в общем на вышесказанное не влияет.