Advertisement
Guest User

Untitled

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