fork download
  1. #include <iostream>
  2.  
  3. int jacobi(int q, int p)
  4. {
  5. int s = 0, u = q, v = p;
  6. int r, k, t;
  7. do{
  8. // Вычисляем r - наименьший положительный остаток при делении u на v
  9. r = u % v;
  10. // Вычисляем целое r >= 0 и нечетное t: r = t * 2^k
  11. k = t = 0;
  12. while(r & 0x1 == 0) // Пока r делится на 2
  13. {
  14. k++; // Выделяем степень двойки в числе r
  15. }
  16. // Используем t для вычисления 2^k при помощи битовых сдвигов
  17. t = 1; // Единицу умножаем на степень двойки (следующая строка)
  18. t <<= k;
  19. //t = r / t; // Разделили r на 2^k, теперь в t результат этого деления
  20. t = r / t; // Разделили r на 2^k, теперь в t результат этого деления
  21. s = (s + k * (v*v - 1) / 8 + (t - 1) * (v - 1) / 4) % 2;
  22. if(t == 1)
  23. return (s == 1) ? -1 : 1;
  24. u = v;
  25. v = t;
  26. }while(t >= 3);
  27. }
  28.  
  29. int main() {
  30. std::cout << jacobi(184, 347) << std::endl;
  31. return 0;
  32. }
Success #stdin #stdout 0s 3456KB
stdin
Standard input is empty
stdout
1