Esempio n. 1
0
/* Set "mask" to a value such that "mask & (1<<idx)" is non-zero if
   "-(idx<<mod_bits)" can be a square modulo m.  */
void
square_mask (mpz_t mask, int m)
{
  int    p, i, r, idx;

  p = mul_2exp_mod (1, mod_bits, m);
  p = neg_mod (p, m);

  mpz_set_ui (mask, 0L);
  for (i = 0; i < m; i++)
    {
      r = (i * i) % m;
      idx = (r * p) % m;
      mpz_setbit (mask, (unsigned long) idx);
    }
}
Esempio n. 2
0
static void	my_store(t_func_arg *arg)
{
  int		pos;
  char		qrt;

  qrt = arg->proc->wbuf->buf[arg->proc->wbuf->place / 2];
  if (arg->proc->wbuf->place % 2)
    qrt <<= 4;
  pos = (pc2int(arg->proc->pc) +
	 neg_mod(reg2int(arg->proc->reg[arg->rx - 1]) + 3 -
		 arg->proc->wbuf->place, IDX_MOD));
  while (pos < 0)
    pos += arg->vm->size;
  pos %= arg->vm->size;
  add_write(pos, qrt, arg);
  (arg->proc->wbuf->place)--;
  if (arg->proc->wbuf->place < 3 - arg->proc->p)
    {
      arg->proc->wbuf->place = -1;
      arg->proc->cur_work = WAIT_AFTER;
      arg->proc->rw->delay = 0;
    }
}