primes-utils 3.1.1 → 3.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +23 -29
- data/lib/primes/utils/version.rb +1 -1
- data/lib/primes/utils.rb +24 -20
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3435da9b5d2751b38cfcd941c71b3964f6720d49d6135e107a6d510c94d1a300
|
|
4
|
+
data.tar.gz: 643aaddc60f88c661a5df46a157694dc09ccb1985d0934850b4cee10aec96315
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1ba81561472f6b2f0aca9fa13e64f7ebd646cb9dc87c967f6eac8c7d2abe201b65a5bf9ee8b4356e66112a71b3f88568f0182f7d2ec25ffc31419eeabc78688f
|
|
7
|
+
data.tar.gz: c124bddc0251d7362b01b62a1e64f4caee2e6b0c0bca837a1a472cdf0eb743592786d6af017dd3b07f1eec840bccbe8f5244e929653a1d7662df243f77dfc841
|
data/README.md
CHANGED
|
@@ -34,32 +34,6 @@ Then require as:
|
|
|
34
34
|
|
|
35
35
|
## Methods
|
|
36
36
|
|
|
37
|
-
**prime?**
|
|
38
|
-
|
|
39
|
-
Determine if an integer value is prime, and return `true` or `false`.
|
|
40
|
-
This replaces the `prime?` method in the `prime.rb` standard library.
|
|
41
|
-
Uses PGT residues tests, then Miller-Rabin test using `primemr?`.
|
|
42
|
-
|
|
43
|
-
```
|
|
44
|
-
101.prime? => true
|
|
45
|
-
100.prime? => false
|
|
46
|
-
-71.prime? => false
|
|
47
|
-
0.prime? => false
|
|
48
|
-
1.prime? => false
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
**primemr?(k=5)**
|
|
52
|
-
|
|
53
|
-
Optimized deterministic (to 128-bits) implementation of Miller-Rabin algorithm.
|
|
54
|
-
It's the underlying primality test for `prime`, and used in other methods.
|
|
55
|
-
Default probabilistic reliability constant set at k = 5, set higher if desired for numbers > 128-bts.
|
|
56
|
-
Not really necessary to do though.
|
|
57
|
-
|
|
58
|
-
```
|
|
59
|
-
5_000_000_000_000_000_003.primemr? => true
|
|
60
|
-
987_654_321_012_345_678_901_382_737.primemr? 6 => true
|
|
61
|
-
987_654_321_012_345_678_901_382_739.primemr? 6 => false
|
|
62
|
-
```
|
|
63
37
|
|
|
64
38
|
**factors or prime_division**
|
|
65
39
|
|
|
@@ -90,7 +64,26 @@ Always available if OS doesn't have coreutils `factor`.
|
|
|
90
64
|
987_654_321_012_345_678_901_382_739.factors1 => [[3, 1], [23, 1], [139, 1], [421, 1], [3469, 1], [7393, 1], [135899, 1], [70180703, 1]]
|
|
91
65
|
```
|
|
92
66
|
|
|
93
|
-
**
|
|
67
|
+
**prime?(k=5) or primemr?(k=5)**
|
|
68
|
+
|
|
69
|
+
Determine if an integer value is prime, and return `true` or `false`.
|
|
70
|
+
`prime?` replaces the `prime?` method in the `prime.rb` standard library.
|
|
71
|
+
It uses PGT residues tests, then Miller-Rabin test using `primemr?`.
|
|
72
|
+
Default probabilistic reliability constant set at k = 5, set higher if desired for numbers > 128-bts.
|
|
73
|
+
Not really necessary to do though.
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
101.prime? => true
|
|
77
|
+
100.prime? => false
|
|
78
|
+
-71.prime? => false
|
|
79
|
+
0.primemr? => false
|
|
80
|
+
1.primemr? => false
|
|
81
|
+
5_000_000_000_000_000_003.primemr? => true
|
|
82
|
+
987_654_321_012_345_678_901_382_737.prime? 6 => true
|
|
83
|
+
987_654_321_012_345_678_901_382_739.prime? 6 => false
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**primes(start=0) or primesmr(start=0)**
|
|
94
87
|
|
|
95
88
|
Return an array of prime values within the inclusive integers range `[start_num - end_num]`.
|
|
96
89
|
Input order doesn't matter if both given: `start_num.primes end_num <=> end_num.prime start_num`.
|
|
@@ -113,7 +106,7 @@ prms => [1000003, 1000033, 1000037, 1000039, 1000081, 1000099]
|
|
|
113
106
|
0.primesmr => []
|
|
114
107
|
```
|
|
115
108
|
|
|
116
|
-
**primescnt(start=0)
|
|
109
|
+
**primescnt(start=0) or primescntmr(start=0)**
|
|
117
110
|
|
|
118
111
|
Provide count of primes within the inclusive integers range `[start_num - end_num]`.
|
|
119
112
|
Input order doesn't matter if both given: `start_num.primes end_num <=> end_num.prime start_num`.
|
|
@@ -188,7 +181,7 @@ Return value of previous prime < n > 2. Returns `nil` for n < 2 (and negatives)
|
|
|
188
181
|
Displays a list of all the `primes-utils` methods available for a system.
|
|
189
182
|
Use as eg: `0.primes_utils` where input n is any `class Integer` value.
|
|
190
183
|
|
|
191
|
-
Available methods for 3.1.
|
|
184
|
+
Available methods for 3.1.2.
|
|
192
185
|
|
|
193
186
|
```
|
|
194
187
|
0.primes_utils => "prime? primes primesmr primescnt primescntmr primenth|nthprime factors|prime_division factors1 next_prime prev_prime primes_utils"
|
|
@@ -222,6 +215,7 @@ All the `primes-utils` methods are `instance_methods` for `Class Integer`.
|
|
|
222
215
|
|
|
223
216
|
## History
|
|
224
217
|
```
|
|
218
|
+
3.1.2 – method refactor, documentation updates
|
|
225
219
|
3.1.1 – some methods refactoring|DRYing, documentation updates
|
|
226
220
|
3.1.0 – major performance enhancements for methods primescnt, primescntmr, and nthprimes,
|
|
227
221
|
primarily by extending nth primes hash values up to 10.1 billion. Can now find nth primes
|
data/lib/primes/utils/version.rb
CHANGED
data/lib/primes/utils.rb
CHANGED
|
@@ -167,7 +167,7 @@ module Primes
|
|
|
167
167
|
end
|
|
168
168
|
|
|
169
169
|
# PGT and Miller-Rabin combined primality tests for random n
|
|
170
|
-
def prime?
|
|
170
|
+
def prime?(k = 5) # Can change k up|down for primemr?
|
|
171
171
|
# Use PGT residue checks for small values < PRIMES.last**2
|
|
172
172
|
return PRIMES.include? self if self <= PRIMES.last
|
|
173
173
|
return false if MODPN.gcd(self) != 1
|
|
@@ -271,20 +271,24 @@ module Primes
|
|
|
271
271
|
residues.sort << (modpg - 1) << (modpg + 1)
|
|
272
272
|
end
|
|
273
273
|
|
|
274
|
-
# Determine number of pcs upto the effective start
|
|
274
|
+
# Determine number of pcs upto the effective start, end, and range width.
|
|
275
275
|
# The effective start_num is first pc >= start_num, first pc <= end_num,
|
|
276
276
|
# and effective range is number of pcs between them (inclusive).
|
|
277
|
-
# inputs: end_num
|
|
278
|
-
# outputs:
|
|
279
|
-
#
|
|
280
|
-
#
|
|
281
|
-
|
|
282
|
-
|
|
277
|
+
# inputs: end_num and start_num of range, and PGs residues array
|
|
278
|
+
# outputs: pcs_to_end - number of pcs in <= end_num pc for PG
|
|
279
|
+
# pcs_to_start - number of pcs < effective start_num pc for range
|
|
280
|
+
# r1 - residue index for effective start_num pc
|
|
281
|
+
# modk1 - mod resgroup value for effective start_num pc
|
|
282
|
+
# pcs_in_range - total number of pcs in effective range
|
|
283
|
+
def pcs_to_nums(end_num, start_num, residues)
|
|
283
284
|
modpg, rescnt = residues[-1] - 1, residues.size
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
285
|
+
end_num, k2 = end_num < residues[0] ? [1, 0] : [(end_num - 1)|1, ((end_num - 1)|1)/modpg]
|
|
286
|
+
start_num, k1 = start_num < residues[0] ? [1, 0] : [start_num - 1, (start_num - 2)/modpg]
|
|
287
|
+
r1, r2, resk1, resk2 = 0, 0, start_num - (modk1 = k1 * modpg), end_num - (k2 * modpg)
|
|
288
|
+
r1 = r1.succ while resk1 >= residues[r1]
|
|
289
|
+
r2 = r2.succ while resk2 >= residues[r2]
|
|
290
|
+
pcs_to_end, pcs_to_start = k2 * rescnt + r2, k1 * rescnt + r1
|
|
291
|
+
[pcs_to_end, pcs_to_start, r1, modk1, (pcs_in_range = pcs_to_end - pcs_to_start)]
|
|
288
292
|
end
|
|
289
293
|
|
|
290
294
|
# Select SP Prime Generator to parametize the pcs within inputs range
|
|
@@ -300,9 +304,11 @@ module Primes
|
|
|
300
304
|
elsif range < 24_494_897; 510_510 # P17; Math.isqrt(600_000_000_000_000)
|
|
301
305
|
else 9_699_690 # P19
|
|
302
306
|
end
|
|
303
|
-
residues = make_residues(modpg)
|
|
307
|
+
residues = make_residues(modpg) # chosen PG residues
|
|
304
308
|
primes = PRIMES.select { |p| p < residues[0] && p.between?(start_num, end_num) }
|
|
305
|
-
|
|
309
|
+
start_num = start_num < residues[0] ? 1 : start_num - 1
|
|
310
|
+
k = (start_num - 1) / modpg; modk = k * modpg; r = 0; resk = start_num - modk
|
|
311
|
+
r = r.succ while resk >= residues[r]
|
|
306
312
|
[r, modk, residues, primes]
|
|
307
313
|
end
|
|
308
314
|
|
|
@@ -315,12 +321,10 @@ module Primes
|
|
|
315
321
|
# pcs2start- number of pcs < start_num pc
|
|
316
322
|
# rs - residue index location for first pc >= start_num
|
|
317
323
|
def sozcore2(end_num, start_num, modpg)
|
|
318
|
-
residues = make_residues(modpg)
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
pcs_to_sqrtN, _ = pcs_to_num(sqrtN, residues, false) # num pcs <= sqrtN
|
|
323
|
-
inputs_range, pcs_range = end_num - start_num, maxpcs - pcs_to_start
|
|
324
|
+
residues = make_residues(modpg); rescnt = residues.size
|
|
325
|
+
pcs_to_end, pcs_to_start, rs, modks, pcs_range = pcs_to_nums(end_num, start_num, residues)
|
|
326
|
+
sqrtN, maxpcs, inputs_range = Integer.sqrt(end_num), pcs_to_end, end_num - start_num
|
|
327
|
+
pcs_to_sqrtN, _ = pcs_to_nums(sqrtN, 0, residues) # num pcs <= sqrtN
|
|
324
328
|
|
|
325
329
|
m = pcs_to_start # index to start retrieving primes in prms array
|
|
326
330
|
split_arrays = (start_num > sqrtN) # flag, true for split arrays
|