// Rabin-Miller method for finding a strong pseudo-prime // Preconditions: High bit and low bit of n = 1 bool RabinMillerPrimeTest( IRandom *prng, const u32 *n, // Number to check for primality int limbs, // Number of limbs in n u32 k) // Confidence level (40 is pretty good) { // n1 = n - 1 u32 *n1 = (u32 *)alloca(limbs*4); Set(n1, limbs, n); Subtract32(n1, limbs, 1); // d = n1 u32 *d = (u32 *)alloca(limbs*4); Set(d, limbs, n1); // remove factors of two from d while (!(d[0] & 1)) ShiftRight(limbs, d, d, 1); u32 *a = (u32 *)alloca(limbs*4); u32 *t = (u32 *)alloca(limbs*4); u32 *p = (u32 *)alloca((limbs*2)*4); u32 n_inv = MonReducePrecomp(n[0]); // iterate k times while (k--) { do prng->Generate(a, limbs*4); while (GreaterOrEqual(a, limbs, n, limbs)); // a = a ^ d (Mod n) ExpMod(a, limbs, d, limbs, n, limbs, n_inv, a); Set(t, limbs, d); while (!Equal(limbs, t, n1) && !Equal32(a, limbs, 1) && !Equal(limbs, a, n1)) { // TODO: verify this is actually working // a = a^2 (Mod n), non-critical path Square(limbs, p, a); Modulus(p, limbs*2, n, limbs, a); // t <<= 1 ShiftLeft(limbs, t, t, 1); } if (!Equal(limbs, a, n1) && !(t[0] & 1)) return false; } return true; }
void Greater() { Match('>'); if(Look == '=') { GreaterOrEqual(); } else { Expression(); Compare(); SetGreater(); Pop(); } }
template <bool align> v128_u8 LbpEstimate(const uint8_t * src, ptrdiff_t stride) { v128_u8 threshold = Load<false>(src); v128_u8 lbp = K8_00; lbp = vec_or(lbp, vec_and(GreaterOrEqual(Load<align>(src - 1 - stride), threshold), K8_01)); lbp = vec_or(lbp, vec_and(GreaterOrEqual(Load<false>(src - stride), threshold), K8_02)); lbp = vec_or(lbp, vec_and(GreaterOrEqual(Load<false>(src + 1 - stride), threshold), K8_04)); lbp = vec_or(lbp, vec_and(GreaterOrEqual(Load<false>(src + 1 ), threshold), K8_08)); lbp = vec_or(lbp, vec_and(GreaterOrEqual(Load<false>(src + 1 + stride), threshold), K8_10)); lbp = vec_or(lbp, vec_and(GreaterOrEqual(Load<false>(src + stride), threshold), K8_20)); lbp = vec_or(lbp, vec_and(GreaterOrEqual(Load<align>(src - 1 + stride), threshold), K8_40)); lbp = vec_or(lbp, vec_and(GreaterOrEqual(Load<align>(src - 1 ), threshold), K8_80)); return lbp; }