Skip to main content

pg

Macro pg 

Source
macro_rules! pg {
    ($input: expr, $pgc: expr, $all: expr, $size:tt, $lim: expr) => { ... };
}
Expand description

Flexible prime number generator.

Beware, macro returns Result<PrimeGenRes, PrimeGenErr>. Thus it can be directly unusable within fn body. Check with PrimeGenRes, PrimeGenErr for details.

Unity is not cosidered to be prime number.

2 variants available:

Both variants can return only number required or whole row of prime numbers.

use big_num_math::{pg, PrimeGenClass, PrimeGenRes, PrimeGenErr, PrimeGenResAide};
use std::time::{Instant, Duration};

let all1 = || { pg!(11, PrimeGenClass::Nth, true, usize, None) };
let all2 = || { pg!(31, PrimeGenClass::Lim, true, usize, None) };

let proof: [usize; 11] = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31];

let all1 = all1().uproot_all();
let all2 = all2().uproot_all();

assert_eq!(all1, all2);
assert_eq!(proof, all1.as_slice());

In either case generation is limited by isize::MAX bytes. Expect memory reservation twice amount of $size type byte size per one prime number. For PrimeGenClass::Lim variant expect more. Given by formula (lim ÷⌊max(1, ㏑(lim))⌋) ⋅1.15.

Reason above implies that generating further large prime numbers can be impossible. Since direct generation of PlaceRows would be in-depth time demanding, this macro, sensibly, does use simpler numeric output.

Whole prime number row is generated and held, always. Since that, production can require considerable amount of time and be optionally time-limited.

use big_num_math::{pg, PrimeGenClass, PrimeGenRes, PrimeGenErr, PrimeGenResAide};
use std::time::{Instant, Duration};

let limit = Duration::from_secs(1);
let result = (|| { pg!(5_000, PrimeGenClass::Nth, false, u128, Some(limit)) })();

assert_eq!(48_611, result.uproot_max());

When confident about outputs, type setting can speed up computation. Use usize or wider type in contrary case.

use big_num_math::{pg, PrimeGenClass, PrimeGenRes, PrimeGenErr, PrimeGenResAide};
use std::time::{Instant, Duration};

let num = || { pg!(20_000, PrimeGenClass::Nth, false, u64, None) };
assert_eq!(224_737, num().uproot_max());

let num = || { pg!(20_000, PrimeGenClass::Nth, false, u32, None) };
assert_eq!(224_737, num().uproot_max());

u32 version of sample above will perform better. The gain stems from reduced data set size.