Guest User

struct Polynomial

a guest
Jan 13th, 2021
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.28 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. #define ZERO 1e-10
  6.  
  7. struct Polynomial {
  8. int deg;
  9. double* coeff;
  10. };
  11.  
  12. void findDeg(struct Polynomial* p) {
  13. for (int i = p->deg; i >= 0; i--) {
  14. if (fabs(p->coeff[i]) > ZERO) {
  15. p->deg = i;
  16. return ;
  17. }
  18. }
  19. p->deg = 0;
  20. }
  21.  
  22.  
  23. struct Polynomial* addPolynomials(struct Polynomial* a, struct Polynomial* b) {
  24. int newDeg = a->deg > b->deg ? a->deg : b->deg;
  25. struct Polynomial* n = malloc(sizeof(*n));
  26. n->coeff = malloc((newDeg + 1) * sizeof(*n->coeff));
  27.  
  28. for (int i = newDeg - abs(a->deg - b->deg); i >= 0; i--) {
  29. n->coeff[i] = a->coeff[i] + b->coeff[i];
  30. }
  31.  
  32. if (a->deg > b->deg) {
  33. for (int i = a->deg; i > a->deg - abs(a->deg - b->deg); i--) {
  34. n->coeff[i] = a->coeff[i];
  35. }
  36. } else {
  37. for (int i = b->deg; i > b->deg - abs(a->deg - b->deg); i--) {
  38. n->coeff[i] = b->coeff[i];
  39. }
  40. }
  41.  
  42. for (int i = newDeg; i >= 0; i--) {
  43. if (n->coeff[i] != 0.0) {
  44. n->deg = i;
  45. return n;
  46. }
  47. }
  48. n->deg = 0;
  49. return n;
  50. }
  51.  
  52. struct Polynomial* substractPolynomials(struct Polynomial* a, struct Polynomial* b) {
  53. int newDeg = a->deg > b->deg ? a->deg : b->deg;
  54. struct Polynomial* n = malloc(sizeof(*n));
  55. n->coeff = malloc((newDeg + 1) * sizeof(*n->coeff));
  56.  
  57. for (int i = newDeg - abs(a->deg - b->deg); i >= 0; i--) {
  58. n->coeff[i] = a->coeff[i] - b->coeff[i];
  59. }
  60.  
  61. if (a->deg > b->deg) {
  62. for (int i = a->deg; i > a->deg - abs(a->deg - b->deg); i--) {
  63. n->coeff[i] = a->coeff[i];
  64. }
  65. } else {
  66. for (int i = b->deg; i > b->deg - abs(a->deg - b->deg); i--) {
  67. n->coeff[i] = -b->coeff[i];
  68. }
  69. }
  70.  
  71. for (int i = newDeg; i >= 0; i--) {
  72. if (n->coeff[i] != 0.0) {
  73. n->deg = i;
  74. return n;
  75. }
  76. }
  77. n->deg = 0;
  78. return n;
  79. }
  80.  
  81. struct Polynomial* multiplyPolynomials(struct Polynomial* a, struct Polynomial* b) {
  82. struct Polynomial* n = malloc(sizeof(*n));
  83. n->deg = a->deg + b->deg;
  84. n->coeff = calloc((a->deg + b->deg + 1), sizeof(*n->coeff));
  85.  
  86. for (int i = 0; i < a->deg + 1; i++) {
  87. for (int j = 0; j < b->deg + 1; j++) {
  88. n->coeff[i + j] += a->coeff[i] * b->coeff[j];
  89. }
  90. }
  91.  
  92. return n;
  93. }
  94.  
  95. struct Polynomial* dividePolynomials(struct Polynomial* a, struct Polynomial* b, struct Polynomial* r) {
  96. struct Polynomial* q = malloc(sizeof(*q));
  97. if (a->deg < b->deg)
  98. {
  99. q->deg = 0;
  100. q->coeff = malloc((q->deg + 1) * sizeof(*q->coeff));
  101. q->coeff[0] = 0.0;
  102. r->deg = a->deg;
  103. for(int i=r->deg;i>=0;i--)
  104. r->coeff[i] = a->coeff[i];
  105. return q;
  106. }
  107. struct Polynomial* temp = malloc(sizeof(*temp));
  108.  
  109. temp->coeff = malloc((a->deg + 1) * sizeof(*temp->coeff));
  110. temp->deg = a->deg;
  111.  
  112. q->coeff = malloc((a->deg + 1) * sizeof(*q->coeff));
  113. q->deg = a->deg;
  114.  
  115. for (int i = 0; i < a->deg + 1; i++) {
  116. temp->coeff[i] = a->coeff[i];
  117. q->coeff[i] = 0.0;
  118. }
  119.  
  120. for (int i = a->deg - b->deg; i >= 0; i--) {
  121. q->coeff[i] = temp->coeff[b->deg + i] / b->coeff[b->deg];
  122. for (int j = b->deg + i - 1; j >= i; j--) {
  123. temp->coeff[j] -= q->coeff[i] * b->coeff[j - i];
  124. }
  125. }
  126.  
  127. for (int i = 0; i < b->deg; i++) {
  128. r->coeff[i] = temp->coeff[i];
  129. }
  130.  
  131. if (r->deg < a->deg) {
  132. for (int i = b->deg; i < r->deg + 1; i++) {
  133. r->coeff[i] = 0.0;
  134. }
  135. } else {
  136. for (int i = b->deg; i < a->deg + 1; i++) {
  137. r->coeff[i] = 0.0;
  138. }
  139. }
  140.  
  141. free(temp->coeff);
  142. free(temp);
  143.  
  144. findDeg(r);
  145. findDeg(q);
  146.  
  147. return q;
  148. }
  149.  
  150.  
  151. struct Polynomial *GCD(struct Polynomial* a, struct Polynomial* b)
  152. {
  153. struct Polynomial * temp = malloc(sizeof(*temp));
  154. while(b->deg != 0 || fabs(b->coeff[0]) > ZERO) // Negujemy warunek b->deg == 0 && b->coeff[0] == 0.0 korzystajac z prawa De Morgana
  155. {
  156. temp->deg = a->deg;
  157. temp->coeff = malloc((temp->deg+1)*sizeof(*temp->coeff));
  158. for(int i=0;i <= a->deg;i++)
  159. {
  160. temp->coeff[i] = a->coeff[i];
  161. }
  162. free(a->coeff);
  163. a->deg = b->deg;
  164. a->coeff = malloc((a->deg+1)*sizeof(*a->coeff));
  165. for(int i = 0;i <= a->deg;i++)
  166. {
  167. a->coeff[i] = b->coeff[i];
  168. }
  169. dividePolynomials(temp,b,b);
  170. free(temp->coeff);
  171. }
  172. findDeg(a);
  173. free(temp);
  174. return a;
  175. }
  176.  
  177.  
  178. void printPolynomial(struct Polynomial* c) {
  179. int s=0;
  180. for (int i = c->deg; i >= 0; i--) {
  181. if (c->coeff[i] < 0.0) {
  182. printf(" -%lfx^%d ", -c->coeff[i], i);
  183. s = 1;
  184. } else if (c->coeff[i] > 0.0) {
  185. s = 1;
  186. printf(" +%lfx^%d ", c->coeff[i], i);
  187. }
  188. }
  189. if(s == 0)
  190. printf("%lfx^%d ",c->coeff[0],0);
  191. printf("\n");
  192. }
  193.  
  194. int main(int argc, char** argv) {
  195. struct Polynomial* a = malloc(sizeof(*a));
  196. struct Polynomial* b = malloc(sizeof(*b));
  197. struct Polynomial* c = malloc(sizeof(*c));
  198. struct Polynomial* r = malloc(sizeof(*r));
  199. printf("Podaj stopien wielomianu a\n");
  200. scanf("%d",&a->deg);
  201. r->deg = a->deg;
  202. r->coeff = malloc((a->deg + 1) * sizeof(*r->coeff));
  203. a->coeff = malloc((a->deg + 1) * sizeof(*a->coeff));
  204.  
  205. printf("Podaj stopien wielomianu b\n");
  206. scanf("%d",&b->deg);
  207. b->coeff = malloc((b->deg + 1) * sizeof(*b->coeff));
  208.  
  209.  
  210. for(int i=a->deg;i>=0;i--)
  211. {
  212. printf("a[%d]=",i);
  213. scanf("%lf",&a->coeff[i]);
  214. }
  215.  
  216. for(int i=b->deg;i>=0;i--)
  217. {
  218. printf("b[%d]=",i);
  219. scanf("%lf",&b->coeff[i]);
  220. }
  221.  
  222.  
  223. //c = dividePolynomials(a, b, b);
  224. c = GCD(a, b);
  225.  
  226. //printf("\n%d\n", c->deg);
  227.  
  228. printPolynomial(c);
  229. printf("\n");
  230. // printPolynomial(b);
  231. //for (int i = 0; i < b->deg; i++) printf("%lf", b->coeff[i]);
  232. printf("\n%d", c->deg);
  233. printf("\n%d", b->deg);
  234.  
  235. system("PAUSE");
  236. }
  237.  
Advertisement
Add Comment
Please, Sign In to add comment