DilyaraL

jb

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