Advertisement
Yanislav29

Untitled

Jan 3rd, 2020
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.27 KB | None | 0 0
  1. void fastPow_2variant(int num, int MOD,int m) {//изпълнение на задача 10
  2. cout << "Variant 2:" << endl;
  3. int c = 0;//променливав която ще извършваме степенуване на всяка итерация на цикъла
  4.  
  5. int b = num;//запазваме стойноста на въведеното число num
  6. int tmp = 0;// променлива в която ще съхраним (c % MOD)
  7. int res = 0;
  8. for (int i = 2;i < m;i*= 2) {
  9.  
  10. if (i & 1)
  11.  
  12.  
  13. b = ((long long)b * b) % MOD;
  14. c = pow(num, i);
  15.  
  16.  
  17. if (i == 2)
  18. cout << num << "^" << i << " =" << "(" << num << "^" << i / 2 << ")" "^" << 2 << "mod(" << MOD << ")" << " " << c % MOD << endl;
  19.  
  20. else {
  21. if (i > 2) {
  22. c = pow(num, i / 2);
  23. tmp = abs(c % MOD);
  24. res = pow(tmp, 2);
  25. cout << num << "^" << i << " =" << "(" << num << "^" << i / 2 << ")" "^" << 2 << "mod(" << MOD << ")" << " " << tmp << "^" << 2 << "mod(" << MOD << ")" << res % MOD << endl;
  26. }
  27.  
  28. }
  29. }
  30.  
  31. cout << endl;
  32.  
  33. cout << num << "^" << m << "=" << num << "^64 + 32 + 4 =" << MOD << " " << 4 << "*" << 2 << "*" << 4 << "mod(" << MOD << ")" << " " << (4*2*4) % MOD;
  34. }
  35. bool isPrime(int n)//фунция за проверка дали едно число е просто
  36. {
  37.  
  38. if (n <= 1) return false;
  39. if (n <= 3) return true;
  40.  
  41.  
  42. if (n % 2 == 0 || n % 3 == 0) return false;
  43.  
  44. for (int i = 5; i*i <= n; i = i + 6)
  45. if (n%i == 0 || n % (i + 2) == 0)
  46. return false;
  47.  
  48. return true;
  49. }
  50.  
  51.  
  52. int power(int x, unsigned int y, int p)
  53. {
  54. int s = 1;
  55.  
  56. x = x % p;
  57.  
  58. while (y > 0)
  59. {
  60.  
  61. if (y & 1)
  62. s = (s*x) % p;
  63.  
  64. y = y >> 1;
  65. x = (x*x) % p;
  66. }
  67. return s;
  68. }
  69. void findPrimefactors(unordered_set<int> &s, int n) //намираме простите числа
  70. {
  71.  
  72. while (n % 2 == 0)
  73. {
  74. s.insert(2);
  75. n = n / 2;
  76. }
  77.  
  78. for (int i = 3; i <= sqrt(n); i = i + 2)
  79. {
  80.  
  81. while (n%i == 0)
  82. {
  83. s.insert(i);
  84. n = n / i;
  85. }
  86. }
  87.  
  88.  
  89. if (n > 2)
  90. s.insert(n);
  91. }
  92. int CheckFor_PR(int n) //изпълнение на задача 11 проверка за примитивен корен
  93. {
  94. unordered_set<int> s;
  95.  
  96.  
  97. if (isPrime(n) == false)
  98. return false;
  99.  
  100.  
  101. int p = n - 1;
  102.  
  103.  
  104. findPrimefactors(s, p);
  105.  
  106.  
  107. for (int r = 2; r <= p; r++)
  108. {
  109.  
  110. bool flag = false;
  111. for (auto it = s.begin(); it != s.end(); it++)
  112. {
  113.  
  114.  
  115. if (power(r, p / (*it), n) == 1)
  116. {
  117. flag = true;
  118. break;
  119. }
  120. }
  121.  
  122.  
  123. if (flag == false)
  124. return true;
  125. }
  126.  
  127.  
  128. return false;
  129. }
  130.  
  131. void findALLprimities(int n)// изпълнение на задача 12 отпечатване на примитивните корени
  132. {
  133. unordered_set<int> s;
  134.  
  135. // Check if n is prime or not
  136. if (isPrime(n) == false)
  137. cout << "There is not a primitive root in Z(" << n << ")" << endl;
  138.  
  139.  
  140. int p = n - 1;
  141.  
  142.  
  143. findPrimefactors(s, p);
  144.  
  145.  
  146. for (int r = 2; r <= p; r++)
  147. {
  148.  
  149. bool flag = false;
  150. for (auto it = s.begin(); it != s.end(); it++)
  151. {
  152.  
  153.  
  154. if (power(r, p / (*it), n) == 1)
  155. {
  156. flag = true;
  157. }
  158.  
  159.  
  160.  
  161. }
  162. if (flag == false) {
  163. cout << r << " ";
  164. }
  165. }
  166.  
  167.  
  168. }
  169. int discreteLogarithm(int a, int modul) //изпълнение на задача 13 намиране на дискретен логаритъм
  170. {
  171. int n = (int)sqrt(modul) + 1;
  172.  
  173.  
  174. int arr[200];
  175. for (int i = 0;i < modul;i++) {
  176. arr[i] = i;
  177. }
  178.  
  179. for (int i = n; i >= 1; --i)
  180. arr[power(a, i * n, modul)] = i;
  181.  
  182. for (int j = 0; j < n; ++j)
  183. {
  184.  
  185. int cur = (power(a, j, modul) * arr[j]) % modul;
  186.  
  187.  
  188. if (arr[cur])
  189. {
  190. int discreteLOG = arr[cur] * n - j;
  191.  
  192. if (discreteLOG < modul)
  193. return discreteLOG;
  194. }
  195. }
  196. return -1;
  197. }
  198. void findResidualField(int num, int modul) {
  199. int arr[200];
  200. bool flag = false;
  201. for (int i = 0;i < modul;i++) {
  202. arr[i] = i;
  203. if (arr[i] == num && (isPrime(num) == true)) {
  204. flag = true;
  205. break;
  206. }
  207. }
  208. if (flag && CheckFor_PR(modul)) {
  209. cout << "There are a residual field in Z(" << modul << ")" << endl;
  210. for (int i = 1;i < modul;i++) {
  211. arr[i] = i;
  212. }
  213. cout << "F(" << modul << ") = {";
  214. for (int i = 1; i < modul; i++)
  215. {
  216. cout << arr[i] << ((i == modul - 1) ? "" : ",");
  217. }
  218. cout << "}";
  219. }
  220. else {
  221. cout << "NO" << endl;
  222. }
  223. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement