В частности: у меня есть два целых числа без знака (a,b), и я хочу вычислить (a*b)%UINT_MAX (UINT_MAX определяется как максимальное целое число без знака). Как лучше всего это сделать?
Предыстория: мне нужно написать модуль для linux, который будет эмулировать геометрическую последовательность, чтение из нее даст мне следующий элемент (по модулю UINT_MAX), единственное решение, которое я нашел, это добавить текущий элемент к самому себе раз, пока добавление выполняется используя следующую логику: (которую я использую для арифметической последовательности)
for(int i=0; i<b; ++i){
if(UINT_MAX - current_value > difference) {
current_value += difference;
} else {
current_value = difference - (UINT_MAX - current_value);
}
когда current_value = a в первой итерации (и обновляется на каждой итерации, а разность = a (всегда). Очевидно, это не разумное решение. Как разумный человек может этого добиться?
Спасибо!
2^64-1 = 3 x 5 x 17 x 257 x 641 x 65537 x 6700417
- person ypercubeᵀᴹ   schedule 14.01.20122^32-1
17 бит, всего на один больше половины от 32, и это все усложняет. - person ypercubeᵀᴹ   schedule 14.01.2012a=2^n
, тоXY mod(a-1) = ((XY mod a) + (XY div a)) mod (a-1)
- person ypercubeᵀᴹ   schedule 14.01.2012