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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6e4efbd1adfba3980cb7d23ff8d6a604c835a1d8159993d52676941534ac9454
4
- data.tar.gz: 1e730c6ec9e6e505cc7dbcaa706c7a788f25fd3b746b8d3738002f2c95d2d8bd
3
+ metadata.gz: 3435da9b5d2751b38cfcd941c71b3964f6720d49d6135e107a6d510c94d1a300
4
+ data.tar.gz: 643aaddc60f88c661a5df46a157694dc09ccb1985d0934850b4cee10aec96315
5
5
  SHA512:
6
- metadata.gz: 6af6def197418a3c5cf68c0a75d0ce182a96b60f1f414d6da2762ddf7156476a0d863f79bc65d08dc6824d62421f932e082ffb0b718f632a19ac416af618292a
7
- data.tar.gz: 954aa75ea469ef4ccaaaf3b14b20c78d4d2c1b7e2ee7803126d40e2d35fbcd68e9682bf30710ca7127af31b2f86688951970bef2f7e51ac8ff3102973d0ca984
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
- **primes(start=0), primesmr(start=0)**
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), primescntmr(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.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
@@ -1,5 +1,5 @@
1
1
  module Primes
2
2
  module Utils
3
- VERSION = "3.1.1"
3
+ VERSION = "3.1.2"
4
4
  end
5
5
  end
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? (k = 5) # Can change k up|down for primemr?
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|end vals; w/flag
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|start_num of range, PGs residues array, start:t|end:f flag
278
- # outputs: pcs_to_num - number of pcs < start_num or <= end_num
279
- # r - residue index for effective start_num pc
280
- # modk - mod resgroup value for effective num value
281
- def pcs_to_num(num, residues, flag)
282
- return [0, 0, 0] if num < residues[0]
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
- val1, val2 = flag ? [num-2, num-1] : [(num-1)|1, (num-1)|1]
285
- k = val1 / modpg; modk = k * modpg; r = 0; resk = val2 - modk
286
- r = r.succ while resk >= residues[r]; pcs_to_num = k * rescnt + r
287
- [pcs_to_num, r, modk]
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) # chosen PG residues
307
+ residues = make_residues(modpg) # chosen PG residues
304
308
  primes = PRIMES.select { |p| p < residues[0] && p.between?(start_num, end_num) }
305
- _, r, modk = pcs_to_num(start_num, residues, true)
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
- rescnt, sqrtN = residues.size, Integer.sqrt(end_num)
320
- pcs_to_start, rs, modks = pcs_to_num(start_num, residues, true) # num pcs < start_num
321
- maxpcs, _ = pcs_to_num(end_num, residues, false) # num pcs <= end_num
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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: primes-utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.1
4
+ version: 3.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jabari Zakiya