Esempio n. 1
0
t_nb	*naive_mod(t_nb *nb1, t_nb *nb2, int base)
{
  t_nb	*i;
  t_nb	*j;
  t_nb	*cpy;

  if (nb2->nb[0] == 0)
    {
      my_putstr("error: modulo by zero\n");
      return (NULL);
    }
  if (nb2->nb[0] == 1 && nb2->nb[1] == 255)
    return (nb1);
  if (nbr_cmp(nb1, nb2) < 0)
    return (create_tnbzero());
  i = create_tnbzero();
  j = create_tnbone();
  while (nbr_cmp(nb1, nb2) >= 0)
    {
      cpy = my_tnbcpy(nb2);
      nb1 = my_substract(nb1, cpy, base);
      i = testadd(i, j, base);
      free_snb(cpy);
    }
  free_snb(j);
  return (nb1);
}
Esempio n. 2
0
t_nb	*naive_multp(t_nb *nb1, t_nb *nb2, int base)
{
  t_nb	*i;
  t_nb	*j;
  t_nb	*cpy;

  if (nb2->nb[0] == 0 || nb1->nb[0] == 0)
    return (create_tnbzero());
  i = create_tnbone();
  j = create_tnbone();
  cpy = malloc(sizeof(t_nb));
  if (cpy == NULL)
    return (NULL);
  cpy->nb = malloc(sizeof(unsigned char) * (nb1->len + 2));
  cpy->nb = my_nbcpy(nb1->nb, nb1->len, cpy->nb);
  cpy->len = nb1->len;
  if (cpy->nb == NULL)
    return (NULL);
  while (nbr_cmp(i, nb2) == -1)
    {
      nb1 = testadd(nb1, cpy, base);
      cpy->nb = my_revnbr(cpy->nb, cpy->len);
      i = testadd(i, j, base);
    }
  free_multp(i, j);
  return (nb1);
}
Esempio n. 3
0
t_nb	*my_substract(t_nb *nb1, t_nb *nb2, int base)
{
  t_nb	*res;

  if (nbr_cmp(nb1, nb2) == 0)
    return (create_tnbzero());
  res = swap_min_max(&nb1, &nb2);
  if (res == NULL)
    return (NULL);
  return (loop_my_substract(nb1, nb2, base, res));
}
Esempio n. 4
0
t_nbr	*reduc(t_nbr *n)
{
  t_nbr	*un;

  un = alloc_nbr(n->base);
  un->nbr[0] = n->base->base[1];
  un->nbr_len++;
  if (nbr_cmp(un, n, 1))
    {
      free_nbr(un);
      return (real_reduc(n));
    }
  check_zero(n, 0);
  free_nbr(un);
  return n;
}
Esempio n. 5
0
void	m_denom(t_nbr *n1, t_nbr *n2)
{
  t_mul	nb1, nb2;
  t_nbr	*temp;

  if (nbr_cmp(n1, n2, 1))
    {
      nb1.nbr = n1->nbr;
      nb1.nbr_len = n1->nbr_len;
      nb2.nbr = n2->frac;
      nb2.nbr_len = n2->frac_len;
      temp = mul_temp(&nb1, &nb2, n1->base);
      if (n1->makefree)
	free(n1->nbr);
      n1->nbr = temp->nbr;
      n1->nbr_len = temp->nbr_len;
      free(temp->frac);
      free(temp);
      m_denom2(n1, n2);
    }
}
Esempio n. 6
0
static t_nbr	*my_pgcd(t_nbr *n)
{
  t_nbr		*rest, *zero;
  t_nbr		*a, *b;

  (zero = alloc_nbr(n->base))->nbr[0] = n->base->base[0];
  zero->nbr_len = 1;
  (rest = alloc_nbr(n->base))->nbr[0] = rest->frac[0];
  rest->nbr_len++;
  a = alloc_nbr(n->base);
  if (!(a->nbr = realloc(a->nbr, a->nbr_len = n->nbr_len)))
    my_puterror(E_THE_WORLD_IS_OVER);
  my_strncpy(a->nbr, n->nbr, a->nbr_len);
  b = alloc_nbr(n->base);
  if (!(b->nbr = realloc(b->nbr, b->nbr_len = n->frac_len)))
    my_puterror(E_THE_WORLD_IS_OVER);
  my_strncpy(b->nbr, n->frac, n->frac_len);
  while (nbr_cmp(rest, zero, 0))
    process(&a, &b, &rest);
  free_nbr(b);
  free_nbr(zero);
  return a;
}