DilyaraL

диплом

Jun 13th, 2021
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.16 KB | None | 0 0
  1.  
  2. //#include <NTL/GF2.h>
  3. //#include <NTL/GF2X.h>
  4. #include <iostream>
  5. //#include <unordered_map>
  6. //#include <map>
  7. using namespace std;
  8. //using namespace NTL;
  9.  
  10. int f[9] = {-1, 3, 7, 11, 19, 37, 67, 131, 285 };
  11. int pow2[9] = {1, 2, 4, 8, 16, 32, 64, 128, 256};
  12.  
  13.  
  14. int power(int b, int z) ///y=b^z
  15. {
  16. int y = 1;
  17. while (z > 0)
  18. {
  19. if (z % 2 == 1)
  20. y = (y * b) ;
  21. b = (b * b);
  22. z = z / 2;
  23. }
  24.  
  25. return y;
  26. }
  27.  
  28. int mult_obr(int a, int n)/// a*x = d (mod n)
  29. {
  30. int d = a;
  31. int m = n;
  32. int y = 0;
  33. int x = 1;
  34. int q, z;
  35. int r = m % d;
  36. while (r > 0)
  37. {
  38. q = m / d;
  39. z = (y + (n - ((q * x) % n))) % n;
  40. m = d;
  41. d = r;
  42. y = x;
  43. x = z;
  44. r = m % d;
  45. }
  46. return x;
  47. }
  48.  
  49. int kit_ost(int* a, int* m, int k)
  50. {
  51. int M = 1;
  52. for (int i = 0; i < k; i++)
  53. {
  54. M *= m[i];
  55. }
  56.  
  57. int z = 0, M_s, N_s;
  58. for (int s = 0; s < k; s++)
  59. {
  60. M_s = M / m[s];
  61. N_s = mult_obr(M_s, m[s]);
  62. z = (z + ((a[s] * M_s ) % M * N_s) % M ) % M ;
  63. }
  64.  
  65. return z ;
  66. }
  67.  
  68. int Mult(int a, int b, int pow)//// Для 𝑎(𝑥), 𝑏(𝑥) возвращает 𝑐(𝑥)=𝑎(𝑥)∙𝑏(𝑥) 𝑚𝑜𝑑 𝑓(𝑥).
  69. {
  70. int t = 0, mask = 1;
  71. for (int i = 0; i < pow; i++)
  72. {
  73. if ((b & mask) != 0)
  74. t ^= a;
  75. if ((a & pow2[pow-1]) == 0) a = a << 1;
  76. else a = (a << 1) ^ f[pow];
  77. mask = mask << 1;
  78. }
  79. return t;
  80. }
  81.  
  82. int Power(int a, int b, int pow)//// Возведение в степень: возвращает 𝑎(𝑥)^𝑏 𝑚𝑜𝑑 𝑓(𝑥).
  83. {
  84. int c = 1;
  85. while (b > 0)
  86. {
  87. if (b % 2 != 0) c = Mult(c, a, pow);
  88. a = Mult(a, a, pow);
  89. b = b >> 1;
  90. }
  91. return c;
  92. }
  93.  
  94. int Tr(int betta, int pow)
  95. {
  96. int s = betta;
  97. for (int i = 2; i < 256; i*=2)
  98. {
  99. // формирую betta^2, betta^4, betta^8...
  100. s = s ^ Power(betta, i,pow);
  101. }
  102. return s;
  103. }
  104.  
  105. int kv_yp(int a, int b, int pow )/// квадратные уравнения x^2+a*x+b=0
  106. {
  107. if (a == 0)
  108. cout << "x= " << (Power(b, pow2[ pow - 1],pow))<<endl;
  109. else {
  110. int betta = Mult(b, Power(Power(a, 256 - 2,pow), 2,pow),pow);
  111.  
  112. if (Tr(betta,pow) == 0)
  113. {
  114. int y0 = 0, y1 = 1;
  115. int u = 0;////////////////////////////////////////////
  116.  
  117. while ((u < 256) && (Tr(u, pow)!=1))
  118. {
  119. u++;
  120. }
  121.  
  122. int summ = 0, s_u;
  123. int current;
  124. for (int i = 1; i < 8; i++)
  125. {
  126. s_u = 0;
  127.  
  128. for (int j = 0; j < i; j++)
  129. {
  130. s_u ^= Power(u, pow2[j], pow);
  131. }
  132. summ ^= Mult(Power(betta, pow2[i], pow), s_u,pow);
  133. }
  134. y0 = (y0 + summ) ;
  135. y1 = (y1 + summ) ;
  136. //cout << "x_0= " << Mult_256(y0, a) << " " << "x_1= " << Mult_256(y1, a);
  137. return (Mult(y1, a,pow));
  138. }
  139. return -1;
  140. }
  141. }
  142.  
  143. int gcd(int a, int b) {
  144. return b ? gcd(b, a % b) : a;
  145. }
  146.  
  147. int diskr(int b, int pow)// дисретный логарифм
  148. {
  149. int q = 256;
  150. int s = 3;
  151. int p[3] = { 3, 5, 17 };
  152. int k[3] = { 1, 1, 1 };
  153. int v[3];
  154. int u[13];
  155.  
  156. int pp, kk, r, h, t, c;
  157.  
  158. for (int i = 0; i < s; i++)
  159. {
  160. pp = p[i];
  161. kk = k[i];
  162. r = power(p[i], k[i]);
  163. h = (q - 1) / r;
  164. c = Power(2, h* power (pp,kk-1),pow);
  165. u[0] = 0;
  166. while (Power(b,h*power(pp, kk-1),pow) != Power(c, u[0],pow))
  167. {
  168. u[0] += 1;
  169. }
  170. int alpha_1 = Power(2, q - 2,pow);
  171. for (int j = 0; j <= kk -1 ; j++)
  172. {
  173. t = 0;
  174.  
  175. while (Power(Mult(Power(b, h,pow), Power(alpha_1, h*u[j],pow),pow), power(pp, kk -(j+1)),pow) != Power(c, t,pow))
  176. {
  177. t += 1;
  178. }
  179. u[j + 1] = u[j] + Mult(t, Power(pp, j,pow),pow);
  180. }
  181.  
  182. v[i] = u[kk];
  183. }
  184.  
  185. return kit_ost(v, p, s);
  186. }
  187.  
  188. int* dv_yp(int m, int a, int pow)// x^m - a = 0
  189. {
  190. int* ar = new int[3];
  191. for (int i = 0; i < 3; i++)
  192. {
  193. ar[i] = -1;
  194. }
  195. int s = 8;// степень двойки в нашем поле
  196. int t = 0;
  197. int n = m;
  198. while (n % 2 == 0)
  199. {
  200. n /= 2;
  201. t++;
  202. }
  203. /// спорный момент
  204. int r = s - t;
  205. int b = Power(a, power(2, r),pow);
  206. int z = diskr(b, pow);
  207. int q_1 = pow2[s] - 1;
  208. int d = gcd(n, q_1);
  209. if ((Power(b, q_1 /d, pow)==1) && (z % d == 0))
  210. {
  211. n /= d;
  212. z /= d;
  213. q_1 /= d;
  214. int n_1 = mult_obr(n, q_1);
  215. int y = (z * n_1) % q_1;
  216. for (int i = 0; i < d; i++)
  217. {
  218. ar[i]= Power(2, y + i * q_1, pow);
  219. }
  220. }
  221. return ar;
  222.  
  223. }
  224.  
  225. void third(int a, int b, int c, int pow)//многочлен третьей степени
  226. {
  227. int x = 0;
  228. int p;
  229. if (Mult(a, a, pow) == b)
  230. {
  231. p = dv_yp(3, (Power(a, 3, pow) ^ c),pow)[0];
  232. x = p ^ a;
  233. cout << x << " ";
  234. }
  235. else
  236. {
  237. int k = Mult((Mult(a, b, pow) ^ c), Power(dv_yp(2, Power(Power(a, 2, pow) ^ b, 3, pow),pow)[0], 254,pow),pow);
  238. if (Tr(Power( k,254,pow),pow) == Tr(1,pow))
  239. {
  240. int z = kv_yp(k, 1,pow);
  241. for (int i = 0; i < 3; i++)
  242. {
  243. int w = dv_yp(3, z,pow)[i];
  244. int y = w ^ Power(w, 254,pow);
  245. x = a ^ Mult(y, a ^ Power(b, 128,pow),pow);
  246. cout <<x<<" ";
  247. }
  248. }
  249. else cout << "Net" << endl;
  250. cout << endl;
  251. }
  252. }
  253.  
  254. int main()
  255. {
  256. //cout<<Power_256(17, 2);
  257. third(17, 28,121,8);
  258. //int x = 255;
  259. //cout << (Power_256(x, 3) ^ Mult_256(17, Power_256(x, 2)) ^ Mult_256(28, x) ^ 121);
  260. //cout << (Mult_256(, a) == b);
  261. }
  262.  
Advertisement
Add Comment
Please, Sign In to add comment