ASSERT (0 < an && an <= rn);
ASSERT (0 < bn && bn <= rn);
if (an >= bn)
refmpn_mul (rp, ap, an, bp, bn); else
refmpn_mul (rp, bp, bn, ap, an);
an += bn; if (an > rn) {
cy = mpn_add (rp, rp, rn, rp + rn, an - rn); /* If cy == 1, then the value of rp is at most B^rn - 2, so there can
* be no overflow when adding in the carry. */
MPN_INCR_U (rp, rn, cy);
}
}
/* We generate an in the MIN_N <= n <= (1 << size_range). */
size_range = size_min
+ gmp_urandomm_ui (rands, SIZE_LOG + 1 - size_min);
n = MIN_N
+ gmp_urandomm_ui (rands, (1L << size_range) + 1 - MIN_N);
n = mpn_mulmod_bnm1_next_size (n);
if ( (test & 1) || n == 1) { /* Half of the tests are done with the main scenario in mind:
both an and bn >= rn/2 */
an = ((n+1) >> 1) + gmp_urandomm_ui (rands, (n+1) >> 1);
bn = ((n+1) >> 1) + gmp_urandomm_ui (rands, (n+1) >> 1);
} else { /* Second half of the tests are done using mulmod to compute a
full product with n/2 < an+bn <= n. */
an = 1 + gmp_urandomm_ui (rands, n - 1); if (an >= n/2)
bn = 1 + gmp_urandomm_ui (rands, n - an); else
bn = n/2 + 1 - an + gmp_urandomm_ui (rands, (n+1)/2);
}
/* Make sure an >= bn */ if (an < bn)
MP_SIZE_T_SWAP (an, bn);
mpn_random2 (ap, an);
mpn_random2 (bp, bn);
/* Sometime trigger the borderline conditions A=-1,0,+1orB=-1,0,+1orA*B==-1,0,1Mod(B^{n/2}+1).
This only makes sense if there is at least a split, i.e. n is even. */ if ((test & 0x1f) == 1 && (n & 1) == 0) {
mp_size_t x;
MPN_COPY (ap, ap + (n >> 1), an - (n >> 1));
MPN_ZERO (ap + an - (n >> 1) , n - an);
MPN_COPY (bp, bp + (n >> 1), bn - (n >> 1));
MPN_ZERO (bp + bn - (n >> 1) , n - bn);
x = 0; /* x = (n == an) ? 0 : gmp_urandomm_ui (rands, n - an); */
ap[x] += gmp_urandomm_ui (rands, 3) - 1; /* x = (n >> 1) - x % (n >> 1); */
bp[x] += gmp_urandomm_ui (rands, 3) - 1; /* We don't propagate carry, this means that the desired condition
is not triggered all the times. A few times are enough anyway. */
}
rn = MIN(n, an + bn);
mpn_random2 (pp-1, rn + 2);
p_before = pp[-1];
p_after = pp[rn];
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.