Advertisement
Guest User

Untitled

a guest
Dec 8th, 2016
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.84 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. #define N 4
  6. int polynome1[N];
  7. int polynome2[N];
  8. time_t t;
  9.  
  10. void randomInit(int* array){
  11. int i = 0;
  12. for(i = 0; i < N ; i++){
  13. array[i] = rand() % 12;
  14. }
  15. }
  16.  
  17.  
  18.  
  19. int * calcul(int * p0, int * p1, int * p2, int n){
  20.  
  21. int *calculResult = calloc(2*n-1, sizeof (int));
  22. int i;
  23.  
  24. for (i = 0 ; i < n-1; i++){
  25. calculResult[i] += p0[i];
  26. calculResult[i+n/2] += p1[i];
  27. calculResult[i+n] += p2[i];
  28. }
  29.  
  30. return calculResult;
  31. }
  32.  
  33. int *add(int *a,int *b,int n){
  34. int i = 0;
  35. int *c = calloc(n,sizeof(c));
  36. for(i = 0; i < n ; i++){
  37. c[i] = a[i]+b[i];
  38. }
  39. return c;
  40. }
  41.  
  42. int * sub(int * p0, int * p1, int * p2, int n){
  43. int * subResult = calloc(n, sizeof (int));
  44. for (int i = 0 ; i < n; i++){
  45. subResult[i] = p1[i] - p0[i] -p2[i];
  46. }
  47. return subResult;
  48. }
  49.  
  50. int *multiply(int *a,int *b,int n){
  51. int i,j = 0;
  52. int *c = calloc(n,sizeof(c));
  53. for(i = 0; i < n ; i++){
  54. for(j = 0; j < n ; j++){
  55. c[j] += a[i] * b[j];
  56. }
  57. }
  58. return c;
  59. }
  60.  
  61. int* karastuba(int* polynome1,int* polynome2,int n){
  62.  
  63.  
  64.  
  65. //memcpy(a0,polynome1,n/2);
  66.  
  67. //memcpy(b0,polynome2,n/2);
  68. if(n == 1){
  69. //return multiply(polynome1,polynome2,n/2);
  70. int * res = calloc((n/2), sizeof (int));
  71. res[0] = polynome1[0] * polynome2[0];
  72. // pareil que *res = A[0] * B[0]
  73. return res;
  74. }
  75. int *a1 = malloc(sizeof(polynome1)*(n/2));
  76. int *b1 = malloc(sizeof(polynome2)*(n/2));
  77. int *a0 = malloc(sizeof(polynome1)*(n/2));
  78. int *b0 = malloc(sizeof(polynome2)*(n/2));
  79. /*a0 = polynome1;
  80. b0 = polynome2;
  81. a1 = polynome1+n+2;
  82. b1 = polynome2+n+2;*/
  83.  
  84. int i ;
  85. for (i = 0 ; i < n/2 ; i++){
  86. a0[i] = polynome1[i];
  87. a1[(n/2) -i -1] = polynome1[n-i-1];
  88.  
  89. b0[i] = polynome2[i];
  90. b1[(n/2) -i -1] = polynome2[n-i-1];
  91. }
  92. //memcpy(a1,polynome1+(n/2),n/2);
  93. //memcpy(b1,polynome2+(n/2),n/2);
  94. int *p2 = karastuba(a1,b1,n/2);
  95. int *p0 = karastuba(a0,b0,n/2);
  96. int *p1 = karastuba(add(a1,a0,n/2),add(b1,b0,n/2),n/2);
  97. p1 = sub(p0,p1,p2,n);
  98.  
  99.  
  100. free(a1);
  101. free(b1);
  102. free(a0);
  103. free(b0);
  104.  
  105. return calcul(p0,p1,p2,n);
  106. }
  107.  
  108. void printPolynome(int *poly,int n){
  109. int i = 0;
  110. printf("polynome : [" );
  111. for(int i = 0; i < n ;i++){
  112. if(i < n-1)
  113. printf("%d,",poly[i] );
  114. else
  115. printf("%d]",poly[i] );
  116. }
  117. printf("\n");
  118.  
  119. }
  120.  
  121. int *intToPoly(int a){
  122. int base = 110;
  123. int n = 0;
  124. while(a/base > 0){
  125. a /= 10;
  126. n = a;
  127. printf("%d ",n);
  128. }
  129. printf("\n");
  130.  
  131. }
  132.  
  133. int main(){
  134. srand((unsigned) time(&t));
  135. intToPoly(10);
  136. randomInit(polynome1);
  137. randomInit(polynome2);
  138. printPolynome(polynome1,N);
  139. printPolynome(polynome2,N);
  140. int *res = karastuba(polynome1,polynome2,N);
  141. printPolynome(res,2*N-1);
  142.  
  143.  
  144.  
  145. return 0;
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement