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