Вообщем задача простая, нужно выполнить умножение и взять результат по модулю
unsigned long a, b, c, res;
......
res = (a * b) % c;
При этом a * b может быть достаточно большим и не поместится в unsigned long.
известно также что
a % c == a
b % c == b
Что бы избежать переполнения на 32 разрядной машине можно сгородить:
unsigned long a, b, c, res;
......
res = ( (unsigned long long)a * (unsigned long long)b) % (unsigned long long)c;
1). Но как быть на 64 разрядной машине?
2). Есть ли в gcc встроенные функции, хотелось бы что-нибудь типа MulDiv на винде, только делает mulmod
P.S.
Решение должно быть достаточно быстрым