fork(1) 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. // Вычисляем целое k >= 0 и нечетное t: r = t * 2^k
  11. k = t = 0;
  12. while(r % 2 == 0)
  13. {
  14. k++; // Показатель степени двойки в числе r
  15. r >>= 1; // Делим r на 2
  16. }
  17. t = r; // В t находится результат деления r на 2^k
  18. s = (s + k * (v*v - 1)/8 + (t - 1)*(v - 1)/4) % 2;
  19. if(t == 1)
  20. return (s) ? -1 : 1;
  21. // Новая итерация
  22. u = v;
  23. v = t;
  24. }while(t >= 3);
  25. }
  26.  
  27. int main() {
  28. std::cout << jacobi(6, 11) << std::endl; // -1
  29. std::cout << jacobi(226, 135) << std::endl; // 1
  30. std::cout << jacobi(26, 35) << std::endl; // -1
  31. std::cout << jacobi(888, 1999) << std::endl; // -1
  32. std::cout << jacobi(893, 997) << std::endl;
  33. return 0;
  34. }
Success #stdin #stdout 0s 3456KB
stdin
Standard input is empty
stdout
-1
1
-1
-1
-1