Мне нужно умножить длинные целые числа на произвольную ОСНОВУ цифр, используя БПФ в целочисленных кольцах. Операнды всегда имеют длину n = 2^k
для некоторых k
, а вектор свертки имеет 2n
компонентов, поэтому мне нужен 2n'th
примитивный корень из единицы.
Меня не особенно интересуют вопросы эффективности, поэтому я не хочу использовать алгоритм Штрассена и Шёнхаге — просто вычисляю базовую свертка, затем некоторые переносы, и больше ничего.
Несмотря на то, что многим математикам это кажется простым, я очень плохо понимаю алгебру, поэтому у меня много вопросов:
Каковы существенные различия или нюансы между выполнением БПФ в целочисленных кольцах по модулю
2^n + 1
(возможно, составных) и в целочисленных ПОЛЯХ по модулю некоторого простого числаp
?
Я спрашиваю это, потому что2
является(2n)th
примитивным корнем из единицы в таком кольце, потому что2^n == -1 (mod 2^n+1)
. Напротив, целочисленное поле потребовало бы от меня поиска такого примитивного корня.
Но, возможно, есть и другие нюансы, которые помешают мне использовать кольца такой формы для БПФ.Если я выбрал целочисленные кольца, то каковы достаточные условия для существования
2^n
-го корня из единицы в этом поле?
Все остальные2^k
-го корня из единицы меньшего порядка можно было бы получить возведением этого корня в квадрат, верно?..Какие существенные ограничения накладываются на умножение по модулю кольца? Может быть, по их длине, может быть, по числовой основе, может быть, даже по числовым типам, используемым для умножения.
Я подозреваю, что может быть некоторая потеря информации, если коэффициенты свертки уменьшаются операцией по модулю. Так ли это и почему?.. Какие общие условия позволят мне этого избежать?- Есть ли вероятность того, что для векторов БПФ, их произведения и вектора свертки будет достаточно просто динамических списков примитивного типа (т.е.
long
)? Или мне на всякий случай преобразовать коэффициенты вBigInteger
(а какой "случай", когда действительно надо)?
Если общий ответ на эти вопросы занимает слишком много времени, я был бы особенно удовлетворен ответом при следующих условиях. Я нашел таблицу первообразных корней единичного порядка до 2^30
в поле Z_70383776563201:
http://people.cis.ksu.edu/~rhowell/calculator/roots.html
Итак, если я использую 2^30
th корень из единицы для умножения чисел длины 2^29
, какие нюансы точности/алгоритма/эффективности я должен учитывать?..
Огромное спасибо заранее! Я собираюсь присудить награду за лучший ответ - пожалуйста, рассмотрите возможность помочь с некоторыми примерами.