Advertisement
Yanislav29

Untitled

Jan 5th, 2020
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.93 KB | None | 0 0
  1.  
  2.  
  3. #include "pch.h"
  4. #include <iostream>
  5. #include <cmath>
  6. #include <unordered_set>
  7. #include <unordered_map>
  8. #include <algorithm>
  9. using namespace std;
  10.  
  11. void Masiv_s_Elementite_na_Ostatucite(int modul) {
  12. //изпълнение на задача 1 от проекта
  13. int arr[200];
  14. for (int i = 0;i < modul;i++) {
  15. arr[i] = i;
  16. }
  17. for (int i = 0; i < modul; i++)
  18. {
  19. cout << arr[i] << ((i == modul - 1) ? "" : ",");
  20. }
  21.  
  22. }
  23. void SumOfElementsIN_Z(int a,int b,int n) {//изпълнение на задача 2
  24. int sum = a + b;
  25. int modul = sum % n;
  26. cout << "The sum of the elements" << " " << a << " " << "and" << " " << b << " " << "in Z(" << n << ") is:" << " " << sum << endl;
  27. }
  28. void SubstractionOfElementsIn_Z(int a,int b,int n) {//изпълнение на задача 3
  29. int sub = a - b;
  30. int modul;
  31. if (sub >= 0) {
  32. modul = sub % n;
  33. }
  34. else {
  35. //ako sub e otricatelno:
  36. modul = (sub % n + n) % n;
  37. }
  38.  
  39. cout << "The subsraction of the elements" << " " << a << " " << "and" << " " << b<< " " << "in Z(" << n << ") is:" << " " << sub << endl;
  40. }
  41. int ProdOfElementsin_Z(int a,int b,int n) {//изпълнение на задача 4
  42. int prod = a * b;
  43. int modul = prod % n;
  44.  
  45. return modul;
  46. return 0;
  47. }
  48.  
  49. int **Reciproals(int num, int *count) {//изпълнение на задача 5
  50. //бройм реципрочните числа
  51. *count = 0;
  52. for (int i = 0; i < num;i++) {
  53. //умножаваме i с всички числа докато даде 1
  54. for (int j = 0;j < num;j++) {
  55. if (ProdOfElementsin_Z(i, j, num) == 1) {
  56. (*count)++;
  57.  
  58. }
  59. }
  60. }
  61. int **recip = new int*[2];
  62. recip[0] = new int[*count];
  63. recip[1] = new int[*count];
  64.  
  65. int index = 0;
  66. for (int i = 0; i < num;i++) {
  67.  
  68. for (int j = 0;j < num;j++) {
  69.  
  70. //подавам му числа с които ги умножава и търси реципрочните с който пълни масивите
  71. if (ProdOfElementsin_Z(i, j, num) == 1) {
  72. recip[0][index] = i;
  73. recip[1][index] = j;
  74. index++;
  75.  
  76. }
  77. }
  78. }
  79. return recip;
  80. }
  81. int Find_Recip(int n, int ** recip, int cnt) {//изпълнение на задача 6
  82. for (int i = 0;i < cnt;i++) {
  83. if (recip[0][i] == n) {
  84. return recip[1][i];
  85. }
  86. }
  87. return -1;
  88. }
  89. int RecipBezu(int a, int mod) {//изпълнение на задача 7
  90.  
  91. int q = mod;/* delimo*/
  92. int r = a;
  93.  
  94. int tmp = q % r; // брой остатъци
  95.  
  96. int coll = 2;
  97. while (tmp) { //if it is not 0 is true ; else its false
  98.  
  99. q = r; //delimoto stawa delitel
  100. r = tmp; //ostatuka stawa delimo
  101.  
  102. tmp = q % r;
  103.  
  104. coll++;
  105.  
  106. }
  107. std::cout << coll;
  108.  
  109.  
  110.  
  111.  
  112.  
  113. return 0;
  114. }
  115.  
  116. int divideRecip(int a, int b, int ** recip, int cnt, int modul) {//изпълнение на задача 8
  117. int p = Find_Recip(b, recip, cnt);
  118. if (p != 0) {
  119. //ако p не е равно на 0 сме намерили реципрочното му
  120. return ProdOfElementsin_Z(a, p, modul);//функцията на 4та задача
  121. }
  122. else {
  123. return -1;//ако делението не е възможно
  124. }
  125. }
  126. void fastPow_1variant(int num,int MOD,int m) {//изпълнение на задача 9
  127.  
  128. cout << "Variant 1:" << endl;
  129. int c = 0;//променливав която ще извършваме степенуване на всяка итерация на цикъла
  130. int k = 0;
  131. int b = num;//запазваме стойноста на въведеното число
  132. int tmp = 0;//тук ще пазим стойноста на m % k
  133. for (int i = 2;i < MOD;i++) {
  134.  
  135. if (i & 1)
  136.  
  137.  
  138. b = ((long long)b * b) % MOD;
  139. c = pow(num, i);
  140. cout << num << "^" << i << " =" << num << "*" << num << "^" << i - 1 << "mod(" << MOD << ")" << c % MOD << endl;
  141.  
  142. if (c % MOD == 1) {
  143. k = i;
  144. tmp = m % k;
  145. int result = pow(num, tmp);
  146. cout << "The smallest integer,which a^k mod(n) = 1 ,k = " << " " << i << endl;
  147. cout << num << "^" << m << " = " << MOD << " " << num << "^" << m << "mod(" << k << ") =" << MOD << " " << num << "^" << tmp << "=" << MOD << " "<< result % MOD;
  148. break;
  149. }
  150. }
  151. // cout << num << "^" << m << " = " << MOD;
  152. }
  153. void fastPow_2variant(int num, int MOD,int m) {//изпълнение на задача 10
  154. cout << "Variant 2:" << endl;
  155. int c = 0;//променливав която ще извършваме степенуване на всяка итерация на цикъла
  156.  
  157. int b = num;//запазваме стойноста на въведеното число num
  158. int tmp = 0;// променлива в която ще съхраним (c % MOD)
  159. int res = 0;
  160. for (int i = 2;i < m;i*= 2) {
  161.  
  162. if (i & 1)
  163.  
  164.  
  165. b = ((long long)b * b) % MOD;
  166. c = pow(num, i);
  167.  
  168.  
  169. if (i == 2)
  170. cout << num << "^" << i << " =" << "(" << num << "^" << i / 2 << ")" "^" << 2 << "mod(" << MOD << ")" << " " << c % MOD << endl;
  171.  
  172. else {
  173. if (i > 2) {
  174. c = pow(num, i / 2);
  175. tmp = abs(c % MOD);
  176. res = pow(tmp, 2);
  177. cout << num << "^" << i << " =" << "(" << num << "^" << i / 2 << ")" "^" << 2 << "mod(" << MOD << ")" << " " << tmp << "^" << 2 << "mod(" << MOD << ")" << res % MOD << endl;
  178. }
  179.  
  180. }
  181. }
  182.  
  183. cout << endl;
  184.  
  185. cout << num << "^" << m << "=" << num << "^64 + 32 + 4 =" << MOD << " " << 4 << "*" << 2 << "*" << 4 << "mod(" << MOD << ")" << " " << (4*2*4) % MOD;
  186. }
  187. bool isPrime(int n)//фунция за проверка дали едно число е просто
  188. {
  189.  
  190. if (n <= 1) return false;
  191. if (n <= 3) return true;
  192.  
  193.  
  194. if (n % 2 == 0 || n % 3 == 0) return false;
  195.  
  196. for (int i = 5; i*i <= n; i = i + 6)
  197. if (n%i == 0 || n % (i + 2) == 0)
  198. return false;
  199.  
  200. return true;
  201. }
  202.  
  203.  
  204. int power(int x, unsigned int y, int p)
  205. {
  206. int s = 1;
  207.  
  208. x = x % p;
  209.  
  210. while (y > 0)
  211. {
  212.  
  213. if (y & 1)
  214. s = (s*x) % p;
  215.  
  216. y = y >> 1;
  217. x = (x*x) % p;
  218. }
  219. return s;
  220. }
  221. void findPrimefactors(unordered_set<int> &s, int n)
  222. {
  223.  
  224. while (n % 2 == 0)
  225. {
  226. s.insert(2);
  227. n = n / 2;
  228. }
  229.  
  230. for (int i = 3; i <= sqrt(n); i = i + 2)
  231. {
  232.  
  233. while (n%i == 0)
  234. {
  235. s.insert(i);
  236. n = n / i;
  237. }
  238. }
  239.  
  240.  
  241. if (n > 2)
  242. s.insert(n);
  243. }
  244. int CheckFor_PR(int n) //изпълнение на задача 11 проверка за примитивен корен
  245. {
  246. unordered_set<int> s;
  247.  
  248.  
  249. if (isPrime(n) == false)
  250. return false;
  251.  
  252.  
  253. int p = n - 1;
  254.  
  255.  
  256. findPrimefactors(s, p);
  257.  
  258.  
  259. for (int r = 2; r <= p; r++)
  260. {
  261.  
  262. bool flag = false;
  263. for (auto it = s.begin(); it != s.end(); it++)
  264. {
  265.  
  266.  
  267. if (power(r, p / (*it), n) == 1)
  268. {
  269. flag = true;
  270. break;
  271. }
  272. }
  273.  
  274.  
  275. if (flag == false)
  276. return true;
  277. }
  278.  
  279.  
  280. return false;
  281. }
  282.  
  283. void findALLprimities(int n)// изпълнение на задача 12 отпечатване на примитивните корени
  284. {
  285. unordered_set<int> s;
  286.  
  287. // Check if n is prime or not
  288. if (isPrime(n) == false)
  289. cout << "There is not a primitive root in Z(" << n << ")" << endl;
  290.  
  291.  
  292. int p = n - 1;
  293.  
  294.  
  295. findPrimefactors(s, p);
  296.  
  297.  
  298. for (int r = 2; r <= p; r++)
  299. {
  300.  
  301. bool flag = false;
  302. for (auto it = s.begin(); it != s.end(); it++)
  303. {
  304.  
  305.  
  306. if (power(r, p / (*it), n) == 1)
  307. {
  308. flag = true;
  309. }
  310.  
  311.  
  312.  
  313. }
  314. if (flag == false) {
  315. cout << r << " ";
  316. }
  317. }
  318.  
  319.  
  320. }
  321. int discreteLogarithm(int a, int modul) //изпълнение на задача 13 намиране на дискретен логаритъм
  322. {
  323. int n = (int)sqrt(modul) + 1;
  324.  
  325.  
  326. int arr[200];
  327. for (int i = 0;i < modul;i++) {
  328. arr[i] = i;
  329. }
  330.  
  331. for (int i = n; i >= 1; --i)
  332. arr[power(a, i * n, modul)] = i;
  333.  
  334. for (int j = 0; j < n; ++j)
  335. {
  336.  
  337. int cur = (power(a, j, modul) * arr[j]) % modul;
  338.  
  339.  
  340. if (arr[cur])
  341. {
  342. int discreteLOG = arr[cur] * n - j;
  343.  
  344. if (discreteLOG < modul)
  345. return discreteLOG;
  346. }
  347. }
  348. return -1;
  349. }
  350. void findResidualField(int num, int modul) {//изпълнение на задача 14
  351. int arr[200];
  352. bool flag = false;
  353. for (int i = 0;i < modul;i++) {
  354. arr[i] = i;
  355. if (arr[i] == num && (isPrime(num) == true)) {
  356. flag = true;
  357. break;
  358. }
  359. }
  360. if (flag && CheckFor_PR(modul)) {
  361. cout << "There are a residual field in Z(" << modul << ")" << endl;
  362. for (int i = 1;i < modul;i++) {
  363. arr[i] = i;
  364. }
  365. cout << "F(" << modul << ") = {";
  366. for (int i = 1; i < modul; i++)
  367. {
  368. cout << arr[i] << ((i == modul - 1) ? "" : ",");
  369. }
  370. cout << "}";
  371. }
  372. else {
  373. cout << "NO" << endl;
  374. }
  375. }
  376. int printingArray(int arr[], int n) {//функция за принтиране на масив която ще се използва в следаващите задачи
  377. for (unsigned i = 0;i < n;i++) {
  378.  
  379. cout << arr[i] << ((i == n - 1) ? "" : ",");
  380.  
  381. }
  382. cout << endl;
  383.  
  384. return 0;
  385. }
  386. int main()
  387. {
  388.  
  389. cout << "Hello this is a Modular Arithmetic project made by Yanislav Yanev" << endl;
  390. cout << "You can choose exercise betweеn 1,2,3,4,5,6,7,8,9,10,11,12,13,14" << endl;
  391. int zadacha, modul;
  392. cout << "Enter number of exercise: ";
  393.  
  394. cin >> zadacha;
  395.  
  396.  
  397. while (zadacha != 0) {
  398. cout << "Enter modul:";
  399. cin >> modul;
  400.  
  401. if (zadacha == 1) {
  402. //изпълнение на задача 1
  403. cout << "Izpalnenie na zadacha 1:" << endl;
  404. cout << "Z" << "(" << modul << ") = {";
  405. Masiv_s_Elementite_na_Ostatucite(modul);
  406. cout << "}";
  407. cout << endl;
  408. }
  409.  
  410. if (zadacha != 1 && zadacha <= 4) {
  411. int a, b;
  412.  
  413.  
  414. cout << "Enter first number:";
  415. cin >> a;
  416.  
  417. cout << "Enter second number:";
  418. cin >> b;
  419.  
  420.  
  421.  
  422.  
  423. if (zadacha == 2) {
  424. cout << "Izpalnenie na zadacha 2:" << endl;
  425. //изпълнение на задача 2
  426. SumOfElementsIN_Z(a, b, modul);
  427. cout << endl;
  428. }
  429. if (zadacha == 3) {
  430. // изпълнение на задача 3
  431.  
  432. cout << "Izpalnenie na zadacha 3:" << endl;
  433. SubstractionOfElementsIn_Z(a, b, modul);
  434. cout << endl;
  435. }
  436. if (zadacha == 4) {
  437. //изпълнение на задача 4
  438. cout << "Izpalnenie na zadacha 4:" << endl;
  439. cout << "The prod of the elements" << " " << a << " " << "and" << " " << b << " " << "in Z(" << modul << ") is:" << " " << ProdOfElementsin_Z(a, b, modul) << endl;
  440.  
  441. cout << endl;
  442. }
  443. }
  444. else {
  445. int counter = 0, n;
  446. int **reciprochno = Reciproals(7, &counter);
  447. cout << " Enter number:";
  448. cin >> n;
  449. if (zadacha == 5) {
  450. //изпълнение на задача 5
  451. cout << "Izpalnenie na zadacha 5:";
  452. cout << endl;
  453.  
  454.  
  455. printingArray(reciprochno[0], counter);
  456.  
  457. printingArray(reciprochno[1], counter);
  458. cout << endl;
  459. }
  460. if (zadacha == 6) {
  461. //изпълнение на задача 6
  462. cout << "Izpalnenie na zadacha 6:" << endl;
  463. cout << Find_Recip(n, reciprochno, counter) << endl;
  464. }
  465. if (zadacha == 7) {
  466. cout << "Izpalnenie na zadacha 7:" << endl;
  467. cout << RecipBezu(n, modul) << endl;
  468. }
  469. if (zadacha == 8) {
  470. int c;
  471. cout << "Enter another number:";
  472. cin >> c;
  473. cout << "Izpalnenie na zadacha 8:" << endl;
  474. cout << divideRecip(n, c, reciprochno, counter, modul) << endl;
  475. }
  476. if (zadacha == 9) {
  477. //изпълнение на задача 9
  478. cout << "Izpalnenie na zadacha 9:" << endl;
  479. fastPow_1variant(n, modul, 100);
  480. cout << endl;
  481. }
  482. if (zadacha == 10) {
  483. //изпълнение на задача 10
  484. cout << "Izpalnenie na zadacha 10:" << endl;
  485. fastPow_2variant(n, modul, 100);
  486. cout << endl;
  487. }
  488. if (zadacha == 11) {
  489. // изпълнение на задача 11
  490. cout << "Izpalnenie na zadacha 11:" << endl;
  491. if (CheckFor_PR(modul)) {
  492. cout << "In Z(" << modul << ") have primitive roots" << endl;
  493. }
  494. else {
  495. cout << "In Z(" << modul << ") do not have any primitive roots" << endl;
  496. }
  497. }
  498. if (zadacha == 12) {
  499. //изпълнение на задача 12
  500. cout << "Izpalnenie na zadacha 12:" << endl;
  501. cout << "All primitive roots in Z(" << modul << ") are:" << " ";
  502. findALLprimities(modul);
  503. cout << endl;
  504. }
  505. if (zadacha == 13) {
  506. //изпълнение на задача 13
  507. cout << "Izpalnenie na zadacha 13:" << endl;
  508. cout << "The discrete logaritum of number" << " " << n << " " << "in Z(" << modul << ") is:" << " " << discreteLogarithm(n, modul);
  509. cout << endl;
  510. }
  511. if (zadacha == 14) {
  512. //изпълнение на задача 14
  513. cout << "Izpalnenie na zadacha 14:" << endl;
  514. findResidualField(n, modul);
  515. }
  516.  
  517.  
  518.  
  519.  
  520. //освобождаване на паметта заета за 5та задача
  521. if (reciprochno != nullptr) {
  522. delete[]reciprochno[1];
  523. delete[]reciprochno[0];
  524. delete[]reciprochno;
  525. reciprochno = NULL;
  526. }
  527. }
  528.  
  529. cout << "(if you want to stop the program enter 0)" << endl;
  530. cout << "Enter number of exercise:";
  531. cin >> zadacha;
  532.  
  533.  
  534.  
  535. }
  536.  
  537. return 0;
  538.  
  539. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement