void complex_prodassign(complex a,complex b) {complex_prod(a,a,b);}
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; } }