Disable 32bit table when big-table is not enabled

This commit is contained in:
Jacob Zhong
2022-10-12 11:32:25 -04:00
parent 6a63e59f25
commit f66fe121e5
2 changed files with 20 additions and 16 deletions
+19 -16
View File
@@ -16,7 +16,7 @@ use crate::factor::{one_line, pollard_rho, squfof, SQUFOF_MULTIPLIERS};
use crate::mint::SmallMint;
use crate::primality::{PrimalityBase, PrimalityRefBase};
use crate::tables::{
MILLER_RABIN_BASE32, MOEBIUS_ODD, SMALL_PRIMES, SMALL_PRIMES_NEXT, WHEEL_NEXT, WHEEL_PREV,
MOEBIUS_ODD, SMALL_PRIMES, SMALL_PRIMES_NEXT, WHEEL_NEXT, WHEEL_PREV,
WHEEL_SIZE,
};
#[cfg(feature = "big-table")]
@@ -33,7 +33,7 @@ use std::collections::BTreeMap;
use std::convert::TryFrom;
#[cfg(feature = "big-table")]
use crate::tables::MILLER_RABIN_BASE64;
use crate::tables::{MILLER_RABIN_BASE64, MILLER_RABIN_BASE32};
/// Fast primality test on a u64 integer. It's based on
/// deterministic Miller-rabin tests. If target is larger than 2^64 or more
@@ -93,6 +93,23 @@ pub fn is_prime64(target: u64) -> bool {
is_prime64_miller(target)
}
// Primality test for u64 with only miller-rabin tests, used during factorization.
// It assumes the target is odd, not too small and cannot be divided small primes
#[cfg(not(feature = "big-table"))]
fn is_prime64_miller(target: u64) -> bool {
// The collection of witnesses are from http://miller-rabin.appspot.com/
if let Ok(u) = u32::try_from(target) {
const WITNESS32: [u32; 3] = [2, 7, 61];
let u = SmallMint::from(u);
WITNESS32.iter().all(|&x| u.is_sprp(SmallMint::from(x)))
} else {
const WITNESS64: [u64; 7] = [2, 325, 9375, 28178, 450775, 9780504, 1795265022];
let u = SmallMint::from(target);
WITNESS64.iter().all(|&x| u.is_sprp(SmallMint::from(x)))
}
}
#[cfg(feature = "big-table")]
fn is_prime32_miller(target: u32) -> bool {
let h = target as u64;
let h = ((h >> 16) ^ h).wrapping_mul(0x45d9f3b);
@@ -102,20 +119,6 @@ fn is_prime32_miller(target: u32) -> bool {
return u.is_sprp(SmallMint::from(MILLER_RABIN_BASE32[h as usize] as u32));
}
// Primality test for u64 with only miller-rabin tests, used during factorization.
// It assumes the target is odd, not too small and cannot be divided small primes
#[cfg(not(feature = "big-table"))]
fn is_prime64_miller(target: u64) -> bool {
if let Ok(u) = u32::try_from(target) {
return is_prime32_miller(u);
}
// The collection of witnesses are from http://miller-rabin.appspot.com/
const WITNESS64: [u64; 7] = [2, 325, 9375, 28178, 450775, 9780504, 1795265022];
let u = SmallMint::from(target);
WITNESS64.iter().all(|&x| u.is_sprp(SmallMint::from(x)))
}
// Primality test for u64 with only miller-rabin tests, used during factorization.
// It assumes the target is odd, not too small and cannot be divided small primes
#[cfg(feature = "big-table")]
+1
View File
@@ -1131,6 +1131,7 @@ pub const SMALL_PRIMES_INV: [P64; 1024] = [
* https://people.ksp.sk/~misof/primes/
*/
#[cfg(feature = "big-table")]
pub const MILLER_RABIN_BASE32: [u16; 256] = [
0x3ce7, 0x07e2, 0x00a6, 0x1d05, 0x1f80, 0x3ead, 0x2907, 0x112f, 0x079d, 0x050f, 0x0ad8, 0x0e24,
0x0230, 0x0c38, 0x145c, 0x0a61, 0x08fc, 0x07e5, 0x122c, 0x05bf, 0x2478, 0x0fb2, 0x095e, 0x4fee,