Если вам не нужно полностью уменьшать свои целые числа по модулю 65521, тогда вы можете использовать тот факт, что 65521 близка к 2 ** 16. То есть если x - это беззнаковое целое число, которое вы хотите уменьшить, тогда вы можете сделать следующее:
unsigned int low = x &0xffff;
unsigned int hi = (x >> 16);
x = low + 15 * hi;
При этом используется 2 ** 16% 65521 == 15. Обратите внимание, что это не полное сокращение. То есть начиная с 32-битного ввода, вам гарантируется, что результат будет не более 20 бит и, конечно, он будет соответствовать входному модулю 65521.
Этот прием можно использовать в приложениях, где существует множество операций, которые должны быть уменьшены по модулю одной и той же константы, и где промежуточные результаты не должны быть наименьшим элементом в его классе вычетов.
например. Одним из приложений является реализация Adler-32, в которой используется модуль 65521. Эта хеш-функция выполняет много операций по модулю 65521. Для ее эффективной реализации можно было бы выполнять модульные сокращения только после тщательно рассчитанного числа добавлений. Приведенного выше сокращения достаточно, и только для вычисления хэша потребуется полная операция по модулю.