Потом это сводится к возведению в квадрат полинома вида

с простыми степенями, ну и всё это мгновенно
Это не мгновенно, но это за

делается.
Алгоритм из слегка продвинутых, но широко известный. Если мы возведем в квадрат Ваш полином, то коэффициент при

- это как раз число упорядоченных способов представить

в виде суммы двух простых.
Теперь у нас есть полином

. Давайте посчитаем

- его дискретное преобразование Фурье,

, где
![$\omega = \sqrt[N]{1}$ $\omega = \sqrt[N]{1}$](https://dxdy-02.korotkov.co.uk/f/d/f/8/df85dfb61394c16d7a31fba48bf182f282.png)
. Понятно, что

. Поэтому теперь наша задача сводится к вычислению дискретного преобразования Фурье. И это легко, если заметить, что для если

, то

, а если

, то

- тем самым вычисление ДПФ для

сводится к его вычислению для двух полиномов вдвое меньшей степени.
На практике это выражается в том, что
scipy справляется со свёрткой 50 миллионов элементов (для ускорения процесса я взял только нечетные простые) за 19с (для калибровки -
sympy на той же машине требует 2 минуты на собственно вычисление первых 100 миллионов простых).
А что дальше с этим предлагается делать?