/* w.b. hart */ void zz_normalise(zz_ptr r) { if (r->size < 0) r->size = -nn_normalise(r->n, -r->size); else r->size = nn_normalise(r->n, r->size); }
/* w.b. hart */ void zz_add_1(zz_ptr r, zz_srcptr a, word_t c) { long usize = ABS(a->size); zz_fit(r, usize + 1); if (a->size >= 0) { r->n[usize] = nn_add_1(r->n, a->n, usize, c); r->size = nn_normalise(r->n, usize + 1); } else { nn_sub_1(r->n, a->n, usize, c); r->size = -nn_normalise(r->n, usize); } }
void randoms_of_len(len_t n, flag_t flag, rand_t state, ...) { va_list ap; nn_t * obj; va_start(ap, state); while ((obj = va_arg(ap, nn_t *)) != NULL) { (*obj) = alloc_redzoned_nn(n); nn_test_random(*obj, state, n); switch (flag) { case ANY: break; case FULL: while (nn_normalise(*obj, n) != n) nn_test_random(*obj, state, n); break; case ODD: (*obj)[0] |= (word_t) 1; break; default: talker("Unknown flag in randoms_of_len"); abort(); } garbage = new_node(NN, (void *) (*obj), n, garbage); } va_end(ap); }
/* w.b. hart */ void zz_div(zz_ptr q, zz_srcptr a, zz_srcptr b) { long asize = ABS(a->size); long bsize = ABS(b->size); long rsize = bsize; long qsize = asize - bsize + 1; int qsign = (a->size ^ b->size); zz_t r; if (asize < bsize) q->size = 0; else { zz_init(r); zz_copy(r, a); zz_fit(q, qsize); if (qsign < 0) { nn_divrem(q->n, r->n, asize, b->n, bsize); rsize = nn_normalise(r->n, rsize); } else nn_div(q->n, r->n, asize, b->n, bsize); qsize -= q->n[qsize - 1] == 0; q->size = qsign >= 0 ? qsize : -qsize; if (q->size < 0 && rsize != 0) zz_sub_1(q, q, 1); zz_clear(r); } }
/* w.b. hart */ void zz_divrem(zz_ptr q, zz_t r, zz_srcptr a, zz_srcptr b) { long asize = ABS(a->size); long bsize = ABS(b->size); long rsize = bsize; long qsize = asize - bsize + 1; zz_copy(r, a); if (asize < bsize) q->size = 0; else { zz_fit(q, qsize); nn_divrem(q->n, r->n, asize, b->n, bsize); qsize -= q->n[qsize - 1] == 0; rsize = nn_normalise(r->n, rsize); q->size = (a->size ^ b->size) >= 0 ? qsize : -qsize; r->size = a->size >= 0 ? rsize : -rsize; if (q->size < 0 && r->size != 0) { zz_sub_1(q, q, 1); zz_add(r, r, b); } } }
/* w.b. hart */ void zz_randbits(zz_ptr a, rand_t state, long bits) { long ubits = ABS(bits); long size = (ubits + WORD_BITS - 1)/WORD_BITS; zz_fit(a, size); nn_randbits(a->n, state, ubits); size = nn_normalise(a->n, size); a->size = bits < 0 & n_randint(state, 2) ? -size : size; }