В языках программирования остаток от деления всегда равен: n % k = n - (n / k) * k Где / - целочисленное деление.
И пока n и k неотрицательные числа, проблем не возникает.
А вот дальше все языки делятся на 2 группы:
В первой группе в качестве результата целочисленного деления берётся ближайшее целое число, не превышающее частное вещественного деления (округление к минус бесконечности).
В этих языках (Python) частное: 34 / 6 == 5, но -34 / 6 == -6.
Остаток: -34 % 6 = -34 - (-34 / 6) * 6 = -34 - -6 * 6 = -34 + 36 = 2
Во второй группе результат целочисленного деления получается отбрасыванием дробной части вещественного деления (округление к нулю).
В этих языках (С++) частное: 34 / 6 == 5 и -34 / 6 == -5.
Остаток: -34 % 6 = -34 - (-34 / 6) * 6 = -34 - -6 * 5 = -34 + 30 = -4
Оба варианта математически абсолютно корректны - просто это две разные операции целочисленного деления. И какая из них будет использована в языке программирования, зависит только от разработчиков этого языка. Например, в стандарте Forth 79 прописано округление к нулю, а в стандарте Forth 83 - к минус бесконечности.