Advertisement
Guest User

Untitled

a guest
Mar 26th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.73 KB | None | 0 0
  1. #include <iostream>
  2. #include <random>
  3. #include <vector>
  4. #include <string>
  5. #include <fstream>
  6.  
  7. using namespace std;
  8.  
  9. int NWD(int a, int b) //algorytm Euklidesa
  10. {
  11. while (a != b)
  12. if (a>b)
  13. a -= b;
  14. else
  15. b -= a;
  16. return a;
  17. }
  18.  
  19. long int powmod(int a, int b, int m) {
  20. int i;
  21. int result = 1;
  22. long int x = a%m;
  23. for (i = 1; i <= b; i <<= 1) {
  24. x %= m;
  25. if ((b&i) != 0) {
  26. result *= x;
  27. result %= m;
  28. }
  29. x *= x;
  30. }
  31. return result;
  32. }
  33.  
  34. vector<int> dzielnikiPierwsze(int n)
  35. {
  36. vector<int> myvector;
  37. int k = 2; //ustawiamy k na pierwszą liczbę pierwszą
  38. //rozkład liczby na czynniki pierwsze
  39. while (n>1)
  40. {
  41. while (n%k == 0) //dopóki liczba jest podzielna przez k
  42. {
  43. if(myvector.empty()==true || myvector.back()!=k)myvector.push_back(k);
  44. n /= k;
  45. }
  46. ++k;
  47. }
  48. return myvector;
  49. }
  50.  
  51. void checkN(int n) {
  52. if (n < 0) {
  53. cout << "Zmienna n posiada niepoprawna wartosc." << endl;
  54. getchar();
  55. cin.ignore();
  56. exit(0);
  57. }
  58. }
  59.  
  60. void checkM(int n) {
  61. if (n <= 0) {
  62. cout << "Modul m posiada niepoprawna wartosc." << endl;
  63. getchar();
  64. cin.ignore();
  65. exit(0);
  66. }
  67. }
  68.  
  69.  
  70. int main() {
  71. int method;
  72. //POCZĄTEK MENU
  73. cout << "WYBIERZ RODZAJ GENERATORA" << endl;
  74. cout << "1 - GENERATOR KONGRUENTNY LGC" << endl;
  75. cout << "2 - GENERATOR ADDYTYWNY KONGRUENTNY" << endl;
  76. cin >> method;
  77. //KONIEC MENU
  78. if (method == 1) { //POCZĄTEK PIERWSZEGO GENERATORA
  79.  
  80. //DEKLARACJE ZMIENNYCH
  81. int n, m, lam, c, xMax, seed, b, a = 0, x;
  82. vector<int> tabA;
  83. vector<int> tabLam;
  84. vector<int> czynnikim;
  85. tabLam.push_back(0);
  86. random_device rd;
  87. mt19937 mt(rd());
  88. ofstream file;
  89. string filename = "plik.txt";
  90. file.open(filename);
  91. cout << "PODAJ GRANICE GORNA" << endl;
  92. cin >> xMax;
  93. m = xMax + 1;
  94. checkM(m);
  95. cout << endl <<"PODAJ LICZBE LICZB PSEUDOLOSOWYCH" << endl;
  96. cin >> n;
  97. cout << endl;
  98. checkN(n);
  99. uniform_int_distribution<int>dist(1, m - 1); // LOSOWANE LICZBY Z PRZEDZIAŁU <1,m-1>
  100.  
  101. do
  102. {
  103. c = dist(rd);
  104. } while (NWD(m, c) != 1); // c jest losowane aż będzie względnie pierwsze z m
  105.  
  106. seed = dist(rd);
  107.  
  108. for (int i = 2; i < m; i++) // wyznaczenie tych a, dla których lambda jest maksymalna (a^lam mod m =1) do wektora tabA
  109. {
  110. lam = 1;
  111. while (powmod(i, lam, m) != 1)
  112. {
  113. if (lam == m*m) {
  114. lam = 0;
  115. break;
  116. }
  117. ++lam;
  118. }
  119. if (lam > tabLam.back()) {
  120. tabA.clear();
  121. tabLam.clear();
  122. tabA.push_back(i);
  123. tabLam.push_back(lam);
  124. }
  125. else if(lam == tabLam.back()){
  126. tabA.push_back(i);
  127. tabLam.push_back(lam);
  128. }
  129. }
  130.  
  131. czynnikim = dzielnikiPierwsze(m); // w czynnikim przechowywane są dzielniki liczby m które są liczbami pierwszymi
  132.  
  133. for (int i = 0; i < static_cast<int>(tabA.size()); i++) //sprawdzenie poprawności kolejnych wartości a z twierdzeniem
  134. {
  135. b = tabA.at(i) - 1;
  136. if (b % 4 == 0 && m % 4 == 0) {
  137. for (int j = 0; j < static_cast<int>(czynnikim.size()); j++)
  138. {
  139. if (czynnikim.at(j) % b == 0) {
  140. a = tabA.at(i);
  141. }
  142. }
  143. }
  144. }
  145.  
  146. if (a == 0)a = tabA.back();
  147.  
  148. x = ((a*seed) + c) % m; // pierwszą liczbę pseudolosową należy wygenerować z użyciem seeda
  149. file << x << endl;
  150. for (int i = 0; i < n-1; i++)
  151. {
  152. x = ((a*x) + c) % m; // kolejne na podstawie poprzedniej liczby pseudolosowej
  153. file << x << endl;
  154. }
  155. cout << "Wygenerowano plik o nazwie: " << filename << endl;
  156. file.close();
  157.  
  158. } // KONIEC PIERWSZEGO GENERATORA
  159. else if (method == 2) // POCZĄTEK DRUGIEGO GENERATORA
  160. {
  161. cout << "Pan da 3 :)" << endl;
  162. } // KONIEC DRUGIEGO GENERATORA
  163. else {
  164. cout << "Niepoprawnie wybrano rodzaj generatora. " << endl;
  165. }
  166. cout << "Program sie zakonczyl.";
  167. getchar();
  168. cin.ignore();
  169. return 0;
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement