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); }
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); }
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)); }
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; }
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); } }
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; }