Ejemplo n.º 1
0
/* 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);
}
Ejemplo n.º 2
0
/* 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);
   }
}
Ejemplo n.º 3
0
Archivo: test.c Proyecto: dhowden/bsdnt
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);
}
Ejemplo n.º 4
0
/* 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);
   }
}
Ejemplo n.º 5
0
/* 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);
      }
   }
}
Ejemplo n.º 6
0
/* 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;
}