// The evaluation of the derivative happens here in // the same way as the funtion bove. _complex df(_complex z, int grad, double poly[]){ int i; _complex df; df=complex_init(grad*poly[grad],0); for(i=grad-1;i>0;i--){ df=complex_sum(complex_mult(df,z),complex_init(i*poly[i],0)); } return df; }
// Here the polynomial function is evaluated at a point Z // in the complex plane. _complex f(_complex z, int grad, double poly[]){ int i; _complex f; f=complex_init(poly[grad],0); for(i=grad-1;i>=0;i--){ f=complex_sum(complex_mult(f,z),complex_init(poly[i],0)); } return f; }
int compute_value(double cr, double ci) { int i; double zr = 0.0; double zi = 0.0; double sz; double max = 2.0; double tmpr, tmpi; i = 0; while (i < 1000) { complex_product(zr, zi, zr, zi, &tmpr, &tmpi); complex_sum(tmpr, tmpi, cr, ci, &zr, &zi); i++; complex_size(zr, zi, &sz); if (sz > max) break; } return i; }
complex_t *polynomial_eval(polynomial_t *p, complex_t *coef, monomial_t *m, complex_t *eval) { complex_t *result = NULL, *tmp = NULL; unsigned long diff = 0; if (p == NULL || coef == NULL || eval == NULL) return NULL; if (p->first->degree == 0) return complex_init(coef->re, coef->im); else { diff = (m == NULL) ? p->last->degree : m->previous->degree - m->degree; while (diff > 0) { if (result == NULL) { result = complex_prod(coef, eval); if (result == NULL) return NULL; } else { tmp = complex_prod(result, eval); if (tmp == NULL) { complex_free(result); return NULL; } complex_free(result); result = tmp; } diff--; } if (m != NULL) { tmp = complex_sum(result, m->coef); if (tmp == NULL) { complex_free(result); return NULL; } complex_free(result); result = tmp; if (m->next != NULL || m->degree > 0) { result = polynomial_eval(p, tmp, m->next, eval); complex_free(tmp); } } return result; } }
void polynomial_insert(polynomial_t *p, monomial_t *m) { monomial_t *current = NULL; complex_t *tmp = NULL; // Mesure de sécurité if (p == NULL || m == NULL) return; // On parcourt la liste jusqu'à ce que la puissance de monôme ne soit plus inférieure current = p->first; while (current != NULL && m->degree < current->degree) current = current->next; // S'il n'y a pas d'éléments dans la liste if (current == NULL && p->first == NULL && p->last == NULL) { // On définit le monôme comme le premier et dernier élément du polynôme p->first = m; p->last = m; p->degree = m->degree; p->size++; } else if (current == NULL) // Si on se trouve à la fin du polynôme { // On définit la nouvelle fin du polynôme m->previous = p->last; m->previous->next = m; p->last = m; p->size++; } else if (current->degree == m->degree) // Si on est dans le polynôme et que le monôme courant à le même degré { // On fait la somme des facteurs tmp = complex_sum(current->coef, m->coef); if (tmp == NULL) return; complex_free(current->coef); current->coef = tmp; // Si notre monôme a un coefficient nul if (current->coef->mod == 0.0) polynomial_remove(p, current->degree); // Et on libère le monôme à insérer pour n'en garder qu'un monomial_free(m); } else // Sinon { // On place le monôme dans le polynôme m->previous = current->previous; m->next = current; // On règle les liens ascendant et descendant du monôme current->previous = m; if (m->previous != NULL) m->previous->next = m; else p->first = m; // Si le monôme inséré a le plus grand degré if (m->degree > p->degree) p->degree = m->degree; p->size++; } }