Быстрое умножение и вычитание по простому модулю

Мне нужно оптимизировать код, в котором я умножаю вектор целых чисел (32 бита) на скаляр по модулю p (где p - простое число (2 ^ 32) -5), а затем вычитаю этот вектор из другой вектор по модулю p.

Код выглядит следующим образом:

public static void multiplyAndSubtract(long fragmentCoefficient, long[] equationToSubtractFrom, long[] equationToSubtract) {
    for (int i = 0; i < equationToSubtractFrom.length; i++) {
        equationToSubtractFrom[i] =  modP(equationToSubtractFrom[i] - multiplyModP(fragmentCoefficient, equationToSubtract[i]));
    }
}

Я использую длинные числа, потому что Java не поддерживает целые числа без знака, но оба вектора имеют mod p, поэтому вы можете ожидать, что каждое число будет 0 <= x <(2 ^ 32) - 5

Есть идеи по оптимизации? Операция mod p - это то, что занимает большую часть времени выполнения, поэтому один из способов ее оптимизации может как-то не выполнять modP после умножения, а делать это только после вычитания. Есть идеи, как это сделать?

9
задан Yrlec 27 October 2011 в 10:29
поделиться