Viiitamibka

Bzzzzzzzzzz

Apr 29th, 2022
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.90 KB | None | 0 0
  1. // Practice1_spring_pro.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
  2. //
  3.  
  4. #include <iostream>
  5. #include <time.h>
  6. #include "\Program Files (x86)\Math (под VisualC++)\MMATH.H"
  7. #include "\Program Files (x86)\Math (под VisualC++)\!-Src\Src_DivTest\DivTest.h"
  8.  
  9. void PrintBin(M_LONG N, bool EOL);
  10. void PrintHex(M_LONG N, bool EOL = true) {
  11. int word = N[0];
  12. printf("%X ", N[word--]);
  13. for (; word > 0; --word)
  14. printf("%08X ", N[word]);
  15. if (EOL)
  16. printf("\n");
  17. }
  18. /*
  19. 16 - hex
  20. 10 - dec
  21. 2 - bin
  22.  
  23. 1 - false
  24. 0 -true
  25. */
  26.  
  27. int PrintLONG(M_LONG N, DIGIT Base, bool EOL = true) {
  28. if (Base != 16 && Base != 10 && Base != 2)
  29. return 1;
  30.  
  31. int word = N[0];
  32. switch (Base)
  33. {
  34.  
  35. case 16:
  36. printf("Hexidecimal: %X ", N[word--]);
  37. for (; word > 0; --word)
  38. printf(" %08X ", N[word]);
  39. if (EOL)
  40. printf("\n");
  41. break;
  42.  
  43. case 10:
  44. printf("Decimal: %u ", N[word--]);
  45. for (; word > 0; --word)
  46. printf(" %010u ", N[word]);
  47. if (EOL)
  48. printf("\n");
  49. break;
  50.  
  51. case 2:
  52. PrintBin(N, EOL);
  53. break;
  54. }
  55. return 0;
  56. }
  57.  
  58. // для нормализованого числа. Длина корректная. Пример №7 в пз
  59. DIGIT BitLen(M_LONG N) {
  60. DIGIT word, MSW;
  61. int bit;
  62. // нормализация числа. У MSW стоят 0.
  63. word = N[0];
  64. while (N[word] == 0 && word > 1)
  65. {
  66. --word;
  67. N[0] = word; // Длина корректная
  68. }
  69. MSW = N[word];
  70. for (bit = 31; (MSW & (1 << bit)) == 0 && bit >= 0; --bit);
  71. bit = (word - 1) * 32 + bit + 1;
  72. return bit;
  73. }
  74.  
  75. void PrintBin(M_LONG N, bool EOL = true)
  76. {
  77. DIGIT word = N[0];
  78. DIGIT MSW;
  79. int bit;
  80. // визначення позиции старшого значушого бита в старшому значушому слову (число нормализоане)
  81.  
  82. // нормализация числа. У MSW стоят 0.
  83. word = N[0];
  84. while (N[word] == 0 && word > 1)
  85. {
  86. --word;
  87. N[0] = word; // Длина корректная
  88. }
  89. MSW = N[word];
  90. for (bit = 31; (MSW & (1 << bit)) == 0 && bit >= 0; --bit);
  91.  
  92. for (; bit >= 0; --bit)
  93. {
  94. printf("%u", (N[word] >> bit) & 1);
  95.  
  96. }
  97. printf(" ");
  98. --word;
  99.  
  100. for (; word > 0; --word)
  101. {
  102. for (bit = 31; bit >= 0; --bit)
  103. {
  104. //printf("&u", (N[word] & (1 << bit)) >> bit); //Second option
  105. printf("%u", (N[word] >> bit) & 1);
  106. /* N[word] & (1 << bit);// First option
  107. if (N[word] & (1 << bit)!=0)
  108. {
  109. return 1;
  110. }*/
  111. }
  112. printf(" ");
  113. }
  114. if (EOL)
  115. printf("\n");
  116. }
  117.  
  118.  
  119. void GenRandBinVect(M_LONG P, DIGIT BitLen) {
  120. int Len32;
  121. srand(time(NULL));
  122. Len32 = (BitLen + 31) / 32;
  123. //Len32 = BitLen / 32 + (BitLen%32)?1:0;
  124. m_rand(P, Len32);
  125.  
  126. P[Len32] &= (1 << (BitLen % 32)) - 1;
  127. P[Len32] |= (1 << ((BitLen % 32) - 1));
  128.  
  129. }
  130.  
  131. int LemanTest(M_LONG P, int k) {//100-150
  132. M_LONG P_1, P_1_2, a,res;// P-1, (P-1)/2
  133. int i,counter=0;
  134. m_copy(P_1, P);
  135. P_1[1]--; //P-1 7 0111 -- 0110
  136. m_copy(P_1_2, P);
  137. m_shr(P_1_2, 1);
  138. for ( i = 0; i < k; ++i)
  139. {
  140. m_rand(a, P[0]);
  141. m_blockpowmod(a, P_1_2, P, res);
  142. if (res[0] == 1 && res[1] == 1)//{1,1}
  143. continue;
  144. if (m_cmp(res, P_1) == 0) {
  145. ++counter;
  146. continue;
  147. }
  148. return 1;
  149. }
  150. if (counter)
  151. return 0; //pseudo prime
  152. return 1; //composite
  153. }
  154.  
  155. int RabinTest(M_LONG P, int k){
  156. M_LONG P1, a, res;
  157. int counter=0;
  158. M_LONG s;
  159. DIGIT r = 0;
  160. m_copy(P1, P);
  161. P1[1] &= 0XFFFFfffE; //P-1 7 0111 -- 01100000/ Для парных не будет зануляться
  162. while (!(P1[1] & 1)) {
  163. //P1[1]=P1[1] >> 1;
  164. m_shr(P1, 1);
  165. r++;
  166. }
  167. m_copy(s,P1);
  168. printf("2 ^ %u * %d + 1", r,s);
  169.  
  170. for (int i = 0; i < k; ++i)
  171. {
  172. m_rand(a, P1[0]);
  173. m_blockpowmod(a,s, P, res);
  174. if (res[0] == 1 && res[1] == 1)//{1,1}
  175. ++counter;
  176. //else if (m_cmp(res, P1) == 0)
  177. //{
  178. // ++counter;
  179. // continue;
  180. //}
  181. //return 1;
  182. else
  183. {
  184. for ( int j = 0; j < r-1; ++j)
  185. {
  186. if (m_cmp(res, P1) == 0) {
  187. ++counter;
  188. continue;
  189. }
  190.  
  191. }
  192. return 1;
  193. }
  194.  
  195. }
  196. if (counter)
  197. return 0; //pseudo prime
  198. return 1; //composite
  199. }
  200.  
  201. void GenPrimeRabin(M_LONG P, DIGIT BitLength, int k) {
  202. M_LONG two = { 1,2 };
  203.  
  204. GenRandBinVect(P, BitLength);
  205. P[1] |= 1;
  206. while ( RabinTest(P, k) || DivTest(P))
  207. {
  208. m_add(P, two, P);
  209. if (BitLen(P) > BitLength)
  210. {
  211. GenRandBinVect(P, BitLength);
  212. P[1] |= 1; // odd
  213. }
  214. }
  215. }
  216.  
  217. void GenPrimeLeman(M_LONG P, DIGIT BitLength, int k) {
  218. M_LONG two = { 1,2 };
  219.  
  220. GenRandBinVect(P, BitLength);
  221. P[1] |= 1;
  222. while ( DivTest(P)||LemanTest(P, k))
  223. {
  224. m_add(P, two, P);
  225. if (BitLen(P) > BitLength)
  226. {
  227. GenRandBinVect(P, BitLength);
  228. P[1] |= 1; // odd
  229. }
  230. }
  231.  
  232. }
  233.  
  234. int main()
  235. {
  236.  
  237.  
  238. M_LONG P = { 16, 0x6f18544d,0xedb374f5,0xffbc3bcc,0x7249bb52,
  239. 0xb09152ec,0x9551dc2c,0x7f6e2853,0xa4dba914,
  240. 0xa9bd6e9b,0x70cd54ce,0x31fe7bd3,0xcc61f6d2,
  241. 0x5d45c7fc,0x11a20acc,0x39b8708c,0x9df3ef1d },
  242. Q = { 16, 0xab74d85d,0x8e352852,0xf440ab72,0x790f53f3,
  243. 0xb51fbad0,0x10555a11,0xd79b004c,0x90ca7e6c,
  244. 0x8bcca0b1,0xba0262f8,0xc2e3603d,0x52e68e5e,
  245. 0xb4a22921,0xa234ee79,0x5ae28905,0xf5fe50db };
  246.  
  247. M_LONG N, FN, E, D, P_1, Q_1, two = { 1,2 }, M = { 1,3 }, C, M1;
  248. char* str = (char*)&M[1];
  249. //gets_s(str, 100);
  250. // L = ByteLen / 4; k = (ByteLen % 4) * 8
  251. //blabla = (1 << (strlen(str) % 4)) - 1
  252. //M[1] &= blabla;
  253.  
  254. srand(time(NULL)); // not necessary
  255.  
  256. // option 1 LEMAN TEST
  257. //if (RabinTest(P, 10))
  258. //{
  259. // printf("Error");
  260. // return 1;
  261. //}else
  262. //{
  263. // printf("OK");
  264. // return 0;
  265. //}
  266.  
  267. GenPrimeLeman(P, 512, 10); // Bitlen(N) = BitLen(P)+Bitlen(Q)
  268. do {
  269. GenPrimeLeman(Q, 512, 10);
  270. } while (m_cmp(P, Q) == 0);
  271.  
  272.  
  273. //Rabin test
  274. GenPrimeRabin(P, 512, 10); // Bitlen(N) = BitLen(P)+Bitlen(Q)
  275. do {
  276. GenPrimeRabin(Q, 512, 10);
  277. } while (m_cmp(P, Q) == 0);
  278.  
  279. m_mul(P, Q, N);
  280.  
  281. printf("P = "); PrintLONG(P, 16);
  282. printf("Q = "); PrintLONG(Q, 16);
  283. printf("N = "); PrintLONG(N, 16);
  284.  
  285. m_copy(P_1, P); m_copy(Q_1, Q);
  286. P_1[1]--; Q_1[1] &= 0XFFFFfffE;
  287.  
  288. m_mul(P_1, Q_1, FN);
  289.  
  290. printf("P = "); PrintLONG(P, 16);
  291. printf("Q = "); PrintLONG(Q, 16);
  292. printf("N = "); PrintLONG(N, 16);
  293.  
  294. // Variant 1
  295. do {
  296. m_rand(E, FN[0] - 1);
  297. // in loop using m_cmp() make sure size of FN < size of E
  298. E[1] |= 1;
  299. } while (m_inv(E, FN, D) || m_cmp(E, D) == 0);
  300.  
  301. // Variant 2
  302. //m_rand(E, FN[0] - 1);
  303. //// in loop using m_cmp() make sure size of FN < size of E
  304. //E[1] |= 1;
  305. //while (m_inv(E, FN, D) m_cmp(E, D) == 0) {
  306. // m_add(E, two, E);
  307. //}
  308.  
  309. // Variant 3
  310. srand(time(NULL));
  311. //do {
  312. // m_rand(E, FN[0]);
  313. //} while (m_cmp(E, FN) >= 0);
  314. //in loop using m_cmp() make sure size of FN < size of E
  315. //E[1] |= 1;
  316.  
  317. printf("\nE = "); PrintLONG(E, 16);
  318. printf("D = "); PrintLONG(D, 16);
  319.  
  320. while (m_inv(E, FN, D) || m_cmp(E, D) == 0) {
  321. m_add(E, two, E);
  322. // m_cmp(E,FN)>=0 ???
  323. }
  324. m_blockmontpowmod(M, E, N, C);
  325. m_blockmontpowmod(C, D, N, M1);
  326. if (m_cmp(M, M1) == 0) {
  327. printf("\nM1 = M = %u", M1[1]);
  328. printf("\nM = "); PrintLONG(M, 16);
  329. printf("C = "); PrintLONG(C, 16);
  330. printf("M1 = "); PrintLONG(M1, 16);
  331. }
  332. else {
  333. printf("Error");
  334. }
  335.  
  336.  
  337.  
  338. }
  339.  
  340. // Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
  341. // Отладка программы: F5 или меню "Отладка" > "Запустить отладку"
  342.  
  343. // Советы по началу работы
  344. // 1. В окне обозревателя решений можно добавлять файлы и управлять ими.
  345. // 2. В окне Team Explorer можно подключиться к системе управления версиями.
  346. // 3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
  347. // 4. В окне "Список ошибок" можно просматривать ошибки.
  348. // 5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
  349. // 6. Чтобы с
  350.  
  351. // Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки"
  352. // Отладка программы: F5 или меню "Отладка" > "Запустить отладку"
  353.  
  354. // Советы по началу работы
  355. // 1. В окне обозревателя решений можно добавлять файлы и управлять ими.
  356. // 2. В окне Team Explorer можно подключиться к системе управления версиями.
  357. // 3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения.
  358. // 4. В окне "Список ошибок" можно просматривать ошибки.
  359. // 5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода.
  360. // 6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл.
Advertisement
Add Comment
Please, Sign In to add comment