Проблема в том, что я вычисляю mod с помощью целого числа без знака std64, поэтому mod становится положительным, что зависит от реализации
Ссылка: C ++ 03, параграф 5.6, пункт 4:
Двоичный / операторвыдает частное, а бинарный оператор% возвращает остаток от деления первого выражения на второе.Если второй операнд / или% равен нулю, поведение не определено;в противном случае (a / b) * b + a% b равно a.Если оба операнда неотрицательны, то остаток неотрицателен;если нет, то знак остатка определяется реализацией.
Поэтому, чтобы избежать этой проблемы, я попытался ниже изменить тип данных с большим простым числом на int64_t, это работало и делалось ниже
std::int64_t iHashValRecur = ( (Text[uiIdx] % uiLargePrime) +
((uiXValue % uiLargePrime * hashValLastIdx % uiLargePrime) % uiLargePrime) -
((Text[uiIdx + uiPatternLength] % uiLargePrime * (uiXExpVal % uiLargePrime)) % uiLargePrime)
);
std::int64_t iHashVal = hash(Text.substr(uiIdx, uiPatternLength));
iHashValRecur = iHashValRecur % uiLargePrime;
while (iHashValRecur < 0) {
iHashValRecur += uiLargePrime;
}
iHashValRecur = iHashValRecur % uiLargePrime;