@@ -11,10 +11,14 @@ use rug::{integer::Order, Integer as GmpInteger};
11
11
#[ cfg( feature = "tests-openssl" ) ]
12
12
use openssl:: bn:: BigNum ;
13
13
14
+ #[ cfg( feature = "multicore" ) ]
15
+ use rand_core:: RngCore ;
16
+
14
17
use crypto_primes:: {
15
18
generate_prime_with_rng, generate_safe_prime_with_rng,
16
19
hazmat:: {
17
- lucas_test, random_odd_integer, AStarBase , BruteForceBase , LucasCheck , MillerRabin , SelfridgeBase , Sieve ,
20
+ lucas_test, random_odd_integer, AStarBase , BruteForceBase , LucasCheck , MillerRabin , SelfridgeBase ,
21
+ SmallPrimesSieve ,
18
22
} ,
19
23
is_prime_with_rng, is_safe_prime_with_rng,
20
24
} ;
@@ -25,13 +29,20 @@ fn make_rng() -> ChaCha8Rng {
25
29
ChaCha8Rng :: from_seed ( * b"01234567890123456789012345678901" )
26
30
}
27
31
32
+ #[ cfg( feature = "multicore" ) ]
33
+ fn make_random_rng ( ) -> ChaCha8Rng {
34
+ let mut seed = <ChaCha8Rng as SeedableRng >:: Seed :: default ( ) ;
35
+ OsRng . fill_bytes ( & mut seed) ;
36
+ ChaCha8Rng :: from_seed ( seed)
37
+ }
38
+
28
39
fn random_odd_uint < T : RandomBits + Integer > ( rng : & mut impl CryptoRngCore , bit_length : u32 ) -> Odd < T > {
29
40
random_odd_integer :: < T > ( rng, NonZero :: new ( bit_length) . unwrap ( ) )
30
41
}
31
42
32
- fn make_sieve < const L : usize > ( rng : & mut impl CryptoRngCore ) -> Sieve < Uint < L > > {
43
+ fn make_sieve < const L : usize > ( rng : & mut impl CryptoRngCore ) -> SmallPrimesSieve < Uint < L > > {
33
44
let start = random_odd_uint :: < Uint < L > > ( rng, Uint :: < L > :: BITS ) ;
34
- Sieve :: new ( start. get ( ) , NonZero :: new ( Uint :: < L > :: BITS ) . unwrap ( ) , false )
45
+ SmallPrimesSieve :: new ( start. get ( ) , NonZero :: new ( Uint :: < L > :: BITS ) . unwrap ( ) , false )
35
46
}
36
47
37
48
fn make_presieved_num < const L : usize > ( rng : & mut impl CryptoRngCore ) -> Odd < Uint < L > > {
@@ -49,7 +60,7 @@ fn bench_sieve(c: &mut Criterion) {
49
60
group. bench_function ( "(U128) creation" , |b| {
50
61
b. iter_batched (
51
62
|| random_odd_uint :: < U128 > ( & mut OsRng , 128 ) ,
52
- |start| Sieve :: new ( start. get ( ) , NonZero :: new ( 128 ) . unwrap ( ) , false ) ,
63
+ |start| SmallPrimesSieve :: new ( start. get ( ) , NonZero :: new ( 128 ) . unwrap ( ) , false ) ,
53
64
BatchSize :: SmallInput ,
54
65
)
55
66
} ) ;
@@ -70,7 +81,7 @@ fn bench_sieve(c: &mut Criterion) {
70
81
group. bench_function ( "(U1024) creation" , |b| {
71
82
b. iter_batched (
72
83
|| random_odd_uint :: < U1024 > ( & mut OsRng , 1024 ) ,
73
- |start| Sieve :: new ( start. get ( ) , NonZero :: new ( 1024 ) . unwrap ( ) , false ) ,
84
+ |start| SmallPrimesSieve :: new ( start. get ( ) , NonZero :: new ( 1024 ) . unwrap ( ) , false ) ,
74
85
BatchSize :: SmallInput ,
75
86
)
76
87
} ) ;
@@ -282,38 +293,58 @@ fn bench_presets(c: &mut Criterion) {
282
293
#[ cfg( feature = "multicore" ) ]
283
294
fn bench_multicore_presets ( c : & mut Criterion ) {
284
295
let mut group = c. benchmark_group ( "Presets (multicore)" ) ;
285
- let mut rng = make_rng ( ) ;
296
+
286
297
group. bench_function ( "(U128) Random prime" , |b| {
287
- b. iter ( || par_generate_prime_with_rng :: < U128 > ( & mut rng, 128 , num_cpus:: get ( ) ) )
298
+ b. iter_batched (
299
+ make_random_rng,
300
+ |mut rng| par_generate_prime_with_rng :: < U128 > ( & mut rng, 128 , num_cpus:: get ( ) ) ,
301
+ BatchSize :: SmallInput ,
302
+ )
288
303
} ) ;
289
304
290
- let mut rng = make_rng ( ) ;
291
305
group. bench_function ( "(U1024) Random prime" , |b| {
292
- b. iter ( || par_generate_prime_with_rng :: < U1024 > ( & mut rng, 1024 , num_cpus:: get ( ) ) )
306
+ b. iter_batched (
307
+ make_random_rng,
308
+ |mut rng| par_generate_prime_with_rng :: < U1024 > ( & mut rng, 1024 , num_cpus:: get ( ) ) ,
309
+ BatchSize :: SmallInput ,
310
+ )
293
311
} ) ;
294
312
295
- let mut rng = make_rng ( ) ;
296
313
group. bench_function ( "(U128) Random safe prime" , |b| {
297
- b. iter ( || par_generate_safe_prime_with_rng :: < U128 > ( & mut rng, 128 , num_cpus:: get ( ) ) )
314
+ b. iter_batched (
315
+ make_random_rng,
316
+ |mut rng| par_generate_safe_prime_with_rng :: < U128 > ( & mut rng, 128 , num_cpus:: get ( ) ) ,
317
+ BatchSize :: SmallInput ,
318
+ )
298
319
} ) ;
299
320
300
321
group. sample_size ( 20 ) ;
301
- let mut rng = make_rng ( ) ;
302
322
group. bench_function ( "(U1024) Random safe prime" , |b| {
303
- b. iter ( || par_generate_safe_prime_with_rng :: < U1024 > ( & mut rng, 1024 , num_cpus:: get ( ) ) )
323
+ b. iter_batched (
324
+ make_random_rng,
325
+ |mut rng| par_generate_safe_prime_with_rng :: < U1024 > ( & mut rng, 1024 , num_cpus:: get ( ) ) ,
326
+ BatchSize :: SmallInput ,
327
+ )
304
328
} ) ;
305
329
306
- let mut rng = make_rng ( ) ;
307
330
group. bench_function ( "(Boxed128) Random safe prime" , |b| {
308
- b. iter ( || par_generate_safe_prime_with_rng :: < BoxedUint > ( & mut rng, 128 , num_cpus:: get ( ) ) )
331
+ b. iter_batched (
332
+ make_random_rng,
333
+ |mut rng| par_generate_safe_prime_with_rng :: < BoxedUint > ( & mut rng, 128 , num_cpus:: get ( ) ) ,
334
+ BatchSize :: SmallInput ,
335
+ )
309
336
} ) ;
310
337
311
338
group. sample_size ( 20 ) ;
312
- let mut rng = make_rng ( ) ;
313
339
group. bench_function ( "(Boxed1024) Random safe prime" , |b| {
314
- b. iter ( || par_generate_safe_prime_with_rng :: < BoxedUint > ( & mut rng, 1024 , num_cpus:: get ( ) ) )
340
+ b. iter_batched (
341
+ make_random_rng,
342
+ |mut rng| par_generate_safe_prime_with_rng :: < BoxedUint > ( & mut rng, 1024 , num_cpus:: get ( ) ) ,
343
+ BatchSize :: SmallInput ,
344
+ )
315
345
} ) ;
316
346
}
347
+
317
348
#[ cfg( not( feature = "multicore" ) ) ]
318
349
fn bench_multicore_presets ( _c : & mut Criterion ) { }
319
350
@@ -419,7 +450,7 @@ fn bench_glass_pumpkin(c: &mut Criterion) {
419
450
fn prime_like_gp ( bit_length : u32 , rng : & mut impl CryptoRngCore ) -> BoxedUint {
420
451
loop {
421
452
let start = random_odd_integer :: < BoxedUint > ( rng, NonZero :: new ( bit_length) . unwrap ( ) ) . get ( ) ;
422
- let sieve = Sieve :: new ( start, NonZero :: new ( bit_length) . unwrap ( ) , false ) ;
453
+ let sieve = SmallPrimesSieve :: new ( start, NonZero :: new ( bit_length) . unwrap ( ) , false ) ;
423
454
for num in sieve {
424
455
let odd_num = Odd :: new ( num. clone ( ) ) . unwrap ( ) ;
425
456
@@ -443,7 +474,7 @@ fn bench_glass_pumpkin(c: &mut Criterion) {
443
474
fn safe_prime_like_gp ( bit_length : u32 , rng : & mut impl CryptoRngCore ) -> BoxedUint {
444
475
loop {
445
476
let start = random_odd_integer :: < BoxedUint > ( rng, NonZero :: new ( bit_length) . unwrap ( ) ) . get ( ) ;
446
- let sieve = Sieve :: new ( start, NonZero :: new ( bit_length) . unwrap ( ) , true ) ;
477
+ let sieve = SmallPrimesSieve :: new ( start, NonZero :: new ( bit_length) . unwrap ( ) , true ) ;
447
478
for num in sieve {
448
479
let odd_num = Odd :: new ( num. clone ( ) ) . unwrap ( ) ;
449
480
0 commit comments