Проблема прямо здесь:
#define abs(x) (x>0)?(x):(-x)
В макросе abs
отсутствуют некоторые круглые скобки. Попробуйте:
#define abs(x) ((x)>0 ? (x) : -(x))
вместо этого. (Рассмотрим, что происходит, когда abs(x-xx)
развернуто в случае x-xx <= 0
.)
Кроме того, почему ваша функция gcd возвращает int, а не BigInteger?
Вы также должны знать, что (при условии, что длинная строка без знака является 64-разрядным целочисленным типом), этот код не будет работать правильно для N
больше 2**32
: если x
(или xx
) больше или равно 2**32
, тогда x*x
обернет по модулю 2**64
, давая вам неправильное значение для x*x % N
.