// 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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
	}
}
Esempio n. 5
0
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++;
	}
}