Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.45 KB | None | 0 0
  1. private List<Long> brute(long n) {
  2. List<Long> res = new ArrayList<Long>();
  3. for (long i = 2; i * i <= n; ++i) {
  4. while (n % i == 0) {
  5. res.add(i);
  6. n /= i;
  7. }
  8. }
  9. if (n > 1) {
  10. res.add(n);
  11. }
  12. return res;
  13. }
  14. Random rm = new Random(31);
  15.  
  16. private List<Long> solve(long n) {
  17. if (n < 100) {
  18. return brute((int) n);
  19. }
  20. List<Long> res = new ArrayList<Long>();
  21. if (n != 1) {
  22. if (BigInteger.valueOf(n).isProbablePrime(100)) {
  23. res.add(n);
  24. } else {
  25. long x = Math.abs(rm.nextInt()) % n;
  26. long y = x;
  27. while (true) {
  28. x = f(x, n);
  29. y = f(f(y, n), n);
  30. long diff = Math.abs(x - y);
  31. long divider = gcd(diff, n);
  32. if (divider == 1) {
  33. continue;
  34. } else if (divider == n) {
  35. x = Math.abs(rm.nextInt()) % n;
  36. y = x;
  37. } else {
  38. res.addAll(solve(n / divider));
  39. res.addAll(solve(divider));
  40. break;
  41. }
  42. }
  43. Collections.sort(res);
  44. }
  45. }
  46. return res;
  47. }
  48.  
  49. private long gcd(long a, long b) {
  50. while (b != 0) {
  51. long tmp = a % b;
  52. a = b;
  53. b = tmp;
  54. }
  55. return a;
  56. }
  57.  
  58. private long f(long x, long n) {
  59. return (multiply(x, x, n) + 7) % n;
  60. }
  61.  
  62. private long multiply(long a, long b, long MOD) {
  63. long res = 0;
  64. while (b > 0) {
  65. if ((b & 1) != 0) {
  66. res += a;
  67. if (res >= MOD) {
  68. res -= MOD;
  69. }
  70. }
  71. b >>= 1;
  72. a += a;
  73. if (a >= MOD) {
  74. a -= MOD;
  75. }
  76. }
  77. return res;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement