Advertisement
Guest User

Untitled

a guest
Mar 27th, 2017
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.76 KB | None | 0 0
  1. #include <iostream>
  2. #include <random>
  3. #define ll long long
  4. using namespace std;
  5.  
  6.  
  7. int *dynamic_board(int m, int &Size)
  8. {
  9. int *t = nullptr;
  10.  
  11.  
  12. int k = 2; //ustawiamy k na pierwsza liczbe pierwsza
  13. while (m > 1) //rozbijamy m
  14. {
  15. while (m % k == 0) // dopoki liczba jest podzielna przez k
  16. {
  17.  
  18. m /= k;
  19. Size++;
  20.  
  21. }
  22. k++;
  23.  
  24. }
  25. try
  26. {
  27. t = new int(Size);
  28. }
  29. catch (bad_alloc) //badam poprawnosc alokacji
  30. {
  31. exit(0);
  32. }
  33. return t;
  34.  
  35. }
  36.  
  37. void losuj(int &los, int m)//funkcja do losowania ziarna i c
  38. {
  39. random_device rd;
  40. mt19937 mt(rd());
  41. uniform_int_distribution<int>dist(0, m - 1);
  42. los = dist(mt);
  43. }
  44.  
  45. void wpisz_do_tab(int *tab, int m) //do wpisnia do tablicy rozkladu liczby m
  46. {
  47. int i = 0, k = 2;
  48. while (m > 1) //rozbijamy m
  49. {
  50. while (m % k == 0) // dopoki liczba jest podzielna przez k
  51. {
  52.  
  53. m /= k;
  54. tab[i] = k;
  55. i++;
  56. }
  57. k++;
  58. }
  59. }
  60.  
  61. int NWD(int a, int b)
  62. {
  63. while (a != b)
  64. if (a>b)
  65. a -= b; //lub a = a - b;
  66. else
  67. b -= a; //lub b = b-a
  68. return a; // lub b - obie zmienne przechowują wynik NWD(a,b)
  69. }
  70. ll modular_pow(ll podstawa, ll wykladnik, int modulo);
  71.  
  72. int *znajdz_lambde(int m, int *t2)
  73. {
  74. int lambda;
  75. int wynik;
  76. int pomocniczy_indeks = 0;
  77. for (int a = 2; a < m; a++)
  78. {
  79. lambda = 1;
  80. do {
  81. wynik = modular_pow(a, lambda, m);
  82. lambda++;
  83. } while (wynik != 1 && lambda<m);
  84. t2[pomocniczy_indeks++] = a;
  85. t2[pomocniczy_indeks++] = --lambda;
  86. cout << "A to " << a << " lambda to " << lambda << endl;
  87.  
  88. }
  89. return t2;
  90. }
  91.  
  92. ll modular_pow(ll podstawa, ll wykladnik, int modulo) // funkcja do wyliczenia wielkich poteg
  93. {
  94. ll wynik = 1;
  95. while (wykladnik > 0)
  96. {
  97. if (wykladnik % 2 == 1)
  98. wynik = (wynik * podstawa) % modulo;
  99. wykladnik = wykladnik >> 1;
  100. podstawa = (podstawa * podstawa) % modulo;
  101. }
  102. return wynik;
  103. }
  104. int *dynamic_board2(int Size)
  105. {
  106. int *t2 = nullptr;
  107. try
  108. {
  109. t2 = new int(Size);
  110. }
  111. catch (bad_alloc) //badam poprawnosc alokacji
  112. {
  113. exit(0);
  114. }
  115. return t2;
  116. }
  117. void max_lambda(int *t2, int m)
  118. {
  119. int maksimum=t2[1];
  120. for (int a = 1; a < m; a +=2)
  121. {
  122. if (t2[a] >= maksimum)
  123. {
  124. maksimum = t2[a];
  125. cout << "Max lambda to " << maksimum << " dla a= " << a << endl;
  126. }
  127. }
  128. }
  129.  
  130. /*void max_lambda(int *t2, int m) //pisane samemu nr1, zle
  131. {
  132. int lambda = 0;
  133. int a = 0, b=0;
  134. for (int i = 1; i < m; i += 2)
  135. {
  136. if (t2[i] > lambda)
  137. {
  138. lambda = t2[i];
  139. a = i;
  140.  
  141. // }
  142. cout << "Max lambda to " << --lambda << "a a to " << a << endl;
  143. }
  144. else if (t2[i] == lambda)
  145. {
  146. b = i;
  147. cout << "Z 2 warunku max lambda " << lambda << "a to " << b;
  148. }
  149. }
  150.  
  151. }*/
  152. int main()
  153. {
  154.  
  155. int Size = 0;
  156. int *t=nullptr;
  157. int *t2 = nullptr;
  158. int x_zero; // ziarno
  159. cout << "Wybierz metode, ktora chcesz wygenerowac liczbe" << endl;
  160. cout << "1.Liniowa metoda kongruencyjna" << endl;
  161. cout << "2.Addytywna metoda kongruencyjna" << endl;
  162. int wybor;
  163. cin >> wybor;
  164. switch (wybor)
  165. {
  166. case 1: cout << "Wybrales nr 1" << endl;
  167. int x_max, n; //zakres liczb pseudolosowych, ilosc wylosowanych liczb
  168.  
  169. cout << "Podaj ile chcesz wylosowac liczb" << endl;
  170. cin >> n;
  171. cout << "Podaj zakres liczb psuedolosowych" << endl;
  172. cin >> x_max;
  173.  
  174. int m;
  175. m = x_max + 1;
  176. t = dynamic_board(m, Size);
  177. losuj(x_zero, m);
  178. cout << "Wylosowane ziarno to " << x_zero << endl;
  179. int c;
  180.  
  181. do
  182. {
  183. losuj(c, m);
  184. } while (NWD(c,m) != 1);
  185.  
  186. wpisz_do_tab(t, m);
  187. losuj(c, m);
  188. cout << "Wylosowany przyrost c to " << c << endl;
  189. cout <<"NWD x_zero i c to "<< NWD(x_zero, c)<<endl;
  190. t2 = dynamic_board2(2*m - 4); //2*(m-2)
  191. znajdz_lambde(m, t2);
  192. max_lambda(t2, m);
  193. break;
  194. case 2: cout << "Wybrales nr 2" << endl; break;
  195. default: cout << "Zly wybor" << endl; break;
  196. }
  197. system("pause");
  198. return 0;
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement