Advertisement
Guest User

Untitled

a guest
Nov 14th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.86 KB | None | 0 0
  1. #include <time.h>
  2. #include <cmath>
  3. #include <cstdlib>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <map>
  7. #include <iostream>
  8.  
  9. using namespace std;
  10.  
  11. vector<long long> base;
  12. vector<long long> ans;
  13.  
  14. long long gcd(long long a, long long b) {
  15. if (b == 0)
  16. return a;
  17. return gcd(b, a%b);
  18. }
  19.  
  20. long long isprime(long long n) {
  21. if (n == 1)
  22. return false;
  23.  
  24. for (int i = 2; i*i <= n; i++) {
  25. if (n%i == 0)
  26. return false;
  27. }
  28. return true;
  29. }
  30.  
  31. void init_base(long long n) {
  32.  
  33. long long M = long long(sqrt(exp(sqrt(log(n)*log(log(n))))));
  34. for (long long i = 2; i < M + 1; i++)
  35. if (isprime(i))
  36. base.push_back(i);
  37. }
  38.  
  39. void faktor(long long n) {
  40.  
  41. srand(static_cast <unsigned int> (time(NULL)));
  42. long long a, b, x;
  43. int size = base.size();
  44.  
  45. while (true) {
  46. map<int, vector<long long>> last_a;
  47. map<int, vector<long long>> last_e;
  48. while (last_a.size() < size+1) {
  49.  
  50. b = rand() % (n- long long (sqrt(n)) - 1) + sqrt(n);
  51. a = (b*b) % n;
  52.  
  53. if (a == 0)
  54. continue;
  55.  
  56. vector<long long> vec_a;
  57. vector<long long> vec_e;
  58. x = a;
  59.  
  60. for (int i = 0; i < base.size(); i++) {
  61. int k = 0;
  62. while (x % base[i] == 0) {
  63. k++;
  64. x = long long(x / base[i]);
  65. }
  66.  
  67. vec_a.push_back(k);
  68. vec_e.push_back(k % 2);
  69. }
  70.  
  71. if (x != 1)
  72. continue;
  73.  
  74. bool fl = true;
  75.  
  76. for (long long i = 0; i < last_a.size(); i++)
  77. for (long long j = 0; j < last_a[i].size(); j++)
  78. if (last_a[i][j] == b)
  79. {
  80. fl = false;
  81. break;
  82. }
  83.  
  84. if (fl)
  85. {
  86. last_a[b] = vec_a;
  87. last_e[b] = vec_e;
  88. }
  89.  
  90. }
  91.  
  92. vector<long long> vec;
  93. for (auto it1 = last_e.begin(); it1 != last_e.end(); ++it1)
  94.  
  95. { bool flag = false;
  96. for (auto it = last_e.begin(); it != last_e.end(); ++it)
  97. {
  98. if ((*it1).first != (*it).first && (*it1).second == (*it).second)
  99. {
  100. if (!flag)
  101. {
  102. vec.push_back((*it1).first);
  103. flag = true;
  104. }
  105.  
  106. vec.push_back((*it).first);
  107. }
  108. }
  109.  
  110. if (vec.size() != 0)
  111. break;
  112.  
  113. }
  114.  
  115. if (vec.size() == 0)
  116. continue;
  117. long long w = 1;
  118.  
  119. for (long long p = 0; p < vec.size(); p++)
  120. w *= vec[p];
  121. w %= n;
  122.  
  123. long long h = 1, d = 0;
  124.  
  125. for (long long i = 0; i < base.size(); i++)
  126. {
  127. long long s = 0;
  128. for (long long p = 0; p < vec.size(); p++)
  129. s += last_a[vec[p]][d];
  130.  
  131. h *= (pow(base[i], int(s / 2)));
  132. d++;
  133.  
  134. }
  135.  
  136. h %= n;
  137.  
  138. if(w % n != h%n && w % n != ((-h + n ) % n+n) % n){
  139. long long f = gcd(w + h, n);
  140. long long e = gcd(w - h, n);
  141.  
  142. if (f*e != n)
  143. continue;
  144. ans.push_back(f);
  145. ans.push_back(e);
  146. break;
  147.  
  148. }
  149. }
  150. }
  151.  
  152. int main()
  153. {
  154. long long n;
  155. cin >> n;
  156.  
  157. init_base(n);
  158. faktor(n);
  159.  
  160. for (long long p = 0; p < ans.size(); p++)
  161. cout << ans[p] << " " << endl;
  162.  
  163. system("pause");
  164. return 0;
  165.  
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement