Guest User

Untitled

a guest
Oct 15th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.29 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int isZero(int* a)
  5. {
  6. if (a[0] == 0)
  7. return 1;
  8. int i = 1;
  9. for (; i<=a[0]; i++)
  10. if (a[i] != 0)
  11. return 0;
  12. return 1;
  13. }
  14.  
  15. long long int arr2long (int* a)
  16. {
  17. if (a[0] == 0)
  18. return 0;
  19. long long int p2 = 1;
  20. p2 <<= (a[0]-1); // a[0] <= 30
  21. long long int res = 0;
  22. int i;
  23. for (i=1; i<=a[0]; i+=1, p2>>=1)
  24. res += (long long int)a[i]*p2;
  25. return res;
  26. }
  27.  
  28. int* long2arr (long long int a)
  29. {
  30. int* res = (int*) malloc(260);
  31. int i;
  32. for (i = 64; a > 0; i--)
  33. {
  34. res[i] = a & 1;
  35. a = a >> 1;
  36. }
  37. res[i] = 64 - i;
  38. res = res + i;
  39. return res;
  40. }
  41.  
  42. int* prepend(int* bin, int n)
  43. {
  44. int i = 1;
  45. int* res = (int*) malloc((n+bin[0]+1) << 2);
  46. res[0] = bin[0]+n;
  47. for (; i<=n; i++)
  48. res[i] = 0;
  49. for (i=1; i<=bin[0]; i++)
  50. res[n+i] = bin[i];
  51. return res;
  52. }
  53.  
  54. void bin2hex(int* bin) {
  55. int i;
  56. int r = bin[0] & 3;
  57. if (r)
  58. bin = prepend(bin, 4-r);
  59. for (i = 1; i < bin[0]; i += 4) {
  60. int j;
  61. int n = 0;
  62. for (j = 0; j < 4; j++)
  63. n = n * 2 + bin[i + j];
  64. if( n < 10 )
  65. putchar(n+48);
  66. else
  67. putchar(n+55);
  68. }
  69. }
  70.  
  71. int* add(int* a, int* b) {
  72. if (a[0] < b[0])
  73. return add(b, a);
  74. else if (a[0] > b[0])
  75. return add(a, prepend(b,a[0]-b[0]));
  76.  
  77. int n = a[0];
  78. int *ans = (int *) malloc((n + 2) << 2);
  79. ans[0] = n + 1;
  80. int i, carry = 0;
  81. for (i = n + 1; i > 1; i--) {
  82. ans[i] = a[i - 1] + b[i - 1] + carry;
  83. carry = ans[i] >> 1;
  84. ans[i] = ans[i] & 1;
  85. }
  86. ans[1] = carry;
  87.  
  88. return ans; // length n+1
  89. }
  90.  
  91. void print(int* a) {
  92. int i, n = a[0];
  93. for (i = 1; i <= n; i++)
  94. printf("%d", a[i]);
  95. printf("\n");
  96. }
  97.  
  98. int* sub(int* a, int* b) {
  99. if (a[0] > b[0])
  100. return sub(a, prepend(b,a[0]-b[0]));
  101.  
  102. int n = a[0];
  103. int *ans = (int *) malloc((n + 1) << 2);
  104. ans[0] = n;
  105. int i, borrow = 0;
  106. for (i = n; i > 0; i--) {
  107. ans[i] = a[i] - b[i] - borrow;
  108. borrow = 0;
  109. if( ans[i] < 0 ) {
  110. borrow = 1;
  111. ans[i] &= 1;
  112. }
  113. }
  114.  
  115. return ans; // length n+1
  116. }
  117.  
  118.  
  119.  
  120. int* mul2(int* a) {
  121. int *res = (int *) malloc((a[0] + 2) << 2);
  122.  
  123. int i;
  124. res[0] = a[0] + 1;
  125.  
  126. for (i = 1; i <= a[0]; i++)
  127. res[i] = a[i];
  128. res[i] = 0;
  129.  
  130. return res; // length n+1
  131. }
  132.  
  133. void chunkify(int *a, int *A[2]) {
  134. int n1, n2;
  135. n1 = a[0]/2;
  136. n2 = a[0] - n1;
  137.  
  138. A[0] = (int*) malloc((n1+1) << 2);
  139. A[1] = (int*) malloc((n2+1) << 2);
  140. A[0][0] = n1;
  141. A[1][0] = n2;
  142.  
  143. int i, j;
  144. for(i = 1; i <= n1; ++i)
  145. A[0][i] = a[i];
  146. for(j = 1; j <= n2; ++i, ++j)
  147. A[1][j] = a[i];
  148. }
  149.  
  150. int* shiftAndAdd(int* a, int* b, int* c, int x)
  151. { // assumption: a is the least significant chunk
  152. int i;
  153. for (i=0; i<x; i++)
  154. b = mul2(b);
  155. for (i=0; i<2*x; i++)
  156. c = mul2(c);
  157. int* res = add(add(a,b),c);
  158. return res;
  159. }
  160.  
  161. int* karatsuba(int* a, int* b) {
  162. if(isZero(a) || isZero(b)) {
  163. int* r = malloc(4);
  164. *r = 0;
  165. return r;
  166. }
  167. if(a[0] < b[0])
  168. return karatsuba(prepend(a,b[0]-a[0]), b);
  169. if(a[0] > b[0])
  170. return karatsuba(a, prepend(b, a[0]-b[0]));
  171. if(a[0] <= 30) {
  172. long long int A = arr2long(a), B = arr2long(b), C;
  173. C = A*B;
  174. return long2arr(C);
  175. }
  176.  
  177. int *A[2], *B[2];
  178. chunkify(a,A);
  179. chunkify(b,B);
  180. if(isZero(A[0]) && isZero(B[0])) {
  181. return karatsuba(A[1],B[1]);
  182. }
  183. int x = A[1][0];
  184. int* z2 = karatsuba(A[0], B[0]);
  185. int* z0 = karatsuba(A[1], B[1]);
  186. int* z1 = sub(sub(karatsuba(add(A[1],A[0]),add(B[1],B[0])),z0),z2);
  187. int* r = shiftAndAdd(z0, z1, z2, x);
  188. return r;
  189. }
  190.  
  191.  
  192. void hex2bin(int* a, char* s) {
  193. int i;
  194. for(i = 0; s[i] != '\0'; ++i) {
  195. int j = i << 2;
  196. switch(s[i]) {
  197. case 48: a[j+1] = 0;
  198. a[j+2] = 0;
  199. a[j+3] = 0;
  200. a[j+4] = 0;
  201. break;
  202. case 49: a[j+1] = 0;
  203. a[j+2] = 0;
  204. a[j+3] = 0;
  205. a[j+4] = 1;
  206. break;
  207. case 50: a[j+1] = 0;
  208. a[j+2] = 0;
  209. a[j+3] = 1;
  210. a[j+4] = 0;
  211. break;
  212. case 51: a[j+1] = 0;
  213. a[j+2] = 0;
  214. a[j+3] = 1;
  215. a[j+4] = 1;
  216. break;
  217. case 52: a[j+1] = 0;
  218. a[j+2] = 1;
  219. a[j+3] = 0;
  220. a[j+4] = 0;
  221. break;
  222. case 53: a[j+1] = 0;
  223. a[j+2] = 1;
  224. a[j+3] = 0;
  225. a[j+4] = 1;
  226. break;
  227. case 54: a[j+1] = 0;
  228. a[j+2] = 1;
  229. a[j+3] = 1;
  230. a[j+4] = 0;
  231. break;
  232. case 55: a[j+1] = 0;
  233. a[j+2] = 1;
  234. a[j+3] = 1;
  235. a[j+4] = 1;
  236. break;
  237. case 56: a[j+1] = 1;
  238. a[j+2] = 0;
  239. a[j+3] = 0;
  240. a[j+4] = 0;
  241. break;
  242. case 57: a[j+1] = 1;
  243. a[j+2] = 0;
  244. a[j+3] = 0;
  245. a[j+4] = 1;
  246. break;
  247. case 97:
  248. case 65: a[j+1] = 1;
  249. a[j+2] = 0;
  250. a[j+3] = 1;
  251. a[j+4] = 0;
  252. break;
  253. case 98:
  254. case 66: a[j+1] = 1;
  255. a[j+2] = 0;
  256. a[j+3] = 1;
  257. a[j+4] = 1;
  258. break;
  259. case 99:
  260. case 67: a[j+1] = 1;
  261. a[j+2] = 1;
  262. a[j+3] = 0;
  263. a[j+4] = 0;
  264. break;
  265. case 100:
  266. case 68: a[j+1] = 1;
  267. a[j+2] = 1;
  268. a[j+3] = 0;
  269. a[j+4] = 1;
  270. break;
  271. case 101:
  272. case 69: a[j+1] = 1;
  273. a[j+2] = 1;
  274. a[j+3] = 1;
  275. a[j+4] = 0;
  276. break;
  277. case 102:
  278. case 70: a[j+1] = 1;
  279. a[j+2] = 1;
  280. a[j+3] = 1;
  281. a[j+4] = 1;
  282. break;
  283.  
  284. }
  285. }
  286. a[0] = i << 2;
  287. }
  288.  
  289. void main(void) {
  290. int a[1024], b[1024];
  291.  
  292. char s1[256], s2[256];
  293. scanf("%s\n%s", s1, s2);
  294. hex2bin(a,s1);
  295. hex2bin(b,s2);
  296.  
  297. int *c;
  298. c = karatsuba(a,b);
  299.  
  300. bin2hex(c);
  301. printf("\n");
  302. }
Add Comment
Please, Sign In to add comment