prime 0.1.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 69c11faf9d0618a701ec125b9e6f4166770ade54b7868896535b75ef549c7beb
4
+ data.tar.gz: f86764a32b94750b27444875ec6282cdfb2398de1bf55f643eb26c225b5a532d
5
+ SHA512:
6
+ metadata.gz: f5aa14e41c4c80c3c95828b2d7f019f220e1ba2ad461ab638ab32af7e98296e233ef390b90c13847e78b639e24fc47df8052e8f7c10c72181de743b3f78342e5
7
+ data.tar.gz: 74d959b3a3d2ddb296dbf116cc8bed6314ca43fcedd98a7667ed520d3efa1340077b567a197ce0e164e21b2c7be43be28fb718ed80660d903b86d795a75c0bfb
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ Gemfile.lock
@@ -0,0 +1,6 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.5.1
5
+ - ruby-head
6
+ before_install: gem install bundler -v 1.16.2
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in prime.gemspec
6
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved.
2
+
3
+ Redistribution and use in source and binary forms, with or without
4
+ modification, are permitted provided that the following conditions
5
+ are met:
6
+ 1. Redistributions of source code must retain the above copyright
7
+ notice, this list of conditions and the following disclaimer.
8
+ 2. Redistributions in binary form must reproduce the above copyright
9
+ notice, this list of conditions and the following disclaimer in the
10
+ documentation and/or other materials provided with the distribution.
11
+
12
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
13
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
16
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
17
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
18
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
19
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
20
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
21
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
22
+ SUCH DAMAGE.
@@ -0,0 +1,46 @@
1
+ # Prime
2
+
3
+ Prime numbers and factorization library.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'prime'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install prime
20
+
21
+ ## Usage
22
+
23
+ ```ruby
24
+ require 'prime'
25
+
26
+ # Prime is the set of all prime numbers, and it is Enumerable.
27
+ Prime.take(4) #=> [2, 3, 5, 7]
28
+ Prime.first(4) #=> [2, 3, 5, 7]
29
+ Prime.each(7).to_a #=> [2, 3, 5, 7]
30
+
31
+ # Determining whether an arbitrary integer is a prime number
32
+ Prime.prime?(7) #=> true
33
+ 8.prime? #=> false
34
+
35
+ # Factorization in prime numbers
36
+ Prime.prime_division(779) #=> [[19, 1], [41, 1]]
37
+ Prime.int_from_prime_division([[19, 1], [41, 1]]) #=> 779
38
+ ```
39
+
40
+ ## Contributing
41
+
42
+ Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/prime.
43
+
44
+ ## License
45
+
46
+ The gem is available as open source under the terms of the [BSD-2-Clause](LICENSE.txt).
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList["test/**/test_*.rb"]
8
+ end
9
+
10
+ task :default => :test
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "prime"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,463 @@
1
+ # frozen_string_literal: false
2
+ #
3
+ # = prime.rb
4
+ #
5
+ # Prime numbers and factorization library.
6
+ #
7
+ # Copyright::
8
+ # Copyright (c) 1998-2008 Keiju ISHITSUKA(SHL Japan Inc.)
9
+ # Copyright (c) 2008 Yuki Sonoda (Yugui) <yugui@yugui.jp>
10
+ #
11
+ # Documentation::
12
+ # Yuki Sonoda
13
+ #
14
+
15
+ require "singleton"
16
+ require "forwardable"
17
+
18
+ class Integer
19
+ # Re-composes a prime factorization and returns the product.
20
+ #
21
+ # See Prime#int_from_prime_division for more details.
22
+ def Integer.from_prime_division(pd)
23
+ Prime.int_from_prime_division(pd)
24
+ end
25
+
26
+ # Returns the factorization of +self+.
27
+ #
28
+ # See Prime#prime_division for more details.
29
+ def prime_division(generator = Prime::Generator23.new)
30
+ Prime.prime_division(self, generator)
31
+ end
32
+
33
+ # Returns true if +self+ is a prime number, else returns false.
34
+ def prime?
35
+ return self >= 2 if self <= 3
36
+ return true if self == 5
37
+ return false unless 30.gcd(self) == 1
38
+ (7..Integer.sqrt(self)).step(30) do |p|
39
+ return false if
40
+ self%(p) == 0 || self%(p+4) == 0 || self%(p+6) == 0 || self%(p+10) == 0 ||
41
+ self%(p+12) == 0 || self%(p+16) == 0 || self%(p+22) == 0 || self%(p+24) == 0
42
+ end
43
+ true
44
+ end
45
+
46
+ # Iterates the given block over all prime numbers.
47
+ #
48
+ # See +Prime+#each for more details.
49
+ def Integer.each_prime(ubound, &block) # :yields: prime
50
+ Prime.each(ubound, &block)
51
+ end
52
+ end
53
+
54
+ #
55
+ # The set of all prime numbers.
56
+ #
57
+ # == Example
58
+ #
59
+ # Prime.each(100) do |prime|
60
+ # p prime #=> 2, 3, 5, 7, 11, ...., 97
61
+ # end
62
+ #
63
+ # Prime is Enumerable:
64
+ #
65
+ # Prime.first 5 # => [2, 3, 5, 7, 11]
66
+ #
67
+ # == Retrieving the instance
68
+ #
69
+ # For convenience, each instance method of +Prime+.instance can be accessed
70
+ # as a class method of +Prime+.
71
+ #
72
+ # e.g.
73
+ # Prime.instance.prime?(2) #=> true
74
+ # Prime.prime?(2) #=> true
75
+ #
76
+ # == Generators
77
+ #
78
+ # A "generator" provides an implementation of enumerating pseudo-prime
79
+ # numbers and it remembers the position of enumeration and upper bound.
80
+ # Furthermore, it is an external iterator of prime enumeration which is
81
+ # compatible with an Enumerator.
82
+ #
83
+ # +Prime+::+PseudoPrimeGenerator+ is the base class for generators.
84
+ # There are few implementations of generator.
85
+ #
86
+ # [+Prime+::+EratosthenesGenerator+]
87
+ # Uses eratosthenes' sieve.
88
+ # [+Prime+::+TrialDivisionGenerator+]
89
+ # Uses the trial division method.
90
+ # [+Prime+::+Generator23+]
91
+ # Generates all positive integers which are not divisible by either 2 or 3.
92
+ # This sequence is very bad as a pseudo-prime sequence. But this
93
+ # is faster and uses much less memory than the other generators. So,
94
+ # it is suitable for factorizing an integer which is not large but
95
+ # has many prime factors. e.g. for Prime#prime? .
96
+
97
+ class Prime
98
+
99
+ VERSION = "0.1.0"
100
+
101
+ include Enumerable
102
+ include Singleton
103
+
104
+ class << self
105
+ extend Forwardable
106
+ include Enumerable
107
+
108
+ def method_added(method) # :nodoc:
109
+ (class<< self;self;end).def_delegator :instance, method
110
+ end
111
+ end
112
+
113
+ # Iterates the given block over all prime numbers.
114
+ #
115
+ # == Parameters
116
+ #
117
+ # +ubound+::
118
+ # Optional. An arbitrary positive number.
119
+ # The upper bound of enumeration. The method enumerates
120
+ # prime numbers infinitely if +ubound+ is nil.
121
+ # +generator+::
122
+ # Optional. An implementation of pseudo-prime generator.
123
+ #
124
+ # == Return value
125
+ #
126
+ # An evaluated value of the given block at the last time.
127
+ # Or an enumerator which is compatible to an +Enumerator+
128
+ # if no block given.
129
+ #
130
+ # == Description
131
+ #
132
+ # Calls +block+ once for each prime number, passing the prime as
133
+ # a parameter.
134
+ #
135
+ # +ubound+::
136
+ # Upper bound of prime numbers. The iterator stops after it
137
+ # yields all prime numbers p <= +ubound+.
138
+ #
139
+ def each(ubound = nil, generator = EratosthenesGenerator.new, &block)
140
+ generator.upper_bound = ubound
141
+ generator.each(&block)
142
+ end
143
+
144
+
145
+ # Returns true if +value+ is a prime number, else returns false.
146
+ #
147
+ # == Parameters
148
+ #
149
+ # +value+:: an arbitrary integer to be checked.
150
+ # +generator+:: optional. A pseudo-prime generator.
151
+ def prime?(value, generator = Prime::Generator23.new)
152
+ raise ArgumentError, "Expected a prime generator, got #{generator}" unless generator.respond_to? :each
153
+ raise ArgumentError, "Expected an integer, got #{value}" unless value.respond_to?(:integer?) && value.integer?
154
+ return false if value < 2
155
+ generator.each do |num|
156
+ q,r = value.divmod num
157
+ return true if q < num
158
+ return false if r == 0
159
+ end
160
+ end
161
+
162
+ # Re-composes a prime factorization and returns the product.
163
+ #
164
+ # == Parameters
165
+ # +pd+:: Array of pairs of integers. The each internal
166
+ # pair consists of a prime number -- a prime factor --
167
+ # and a natural number -- an exponent.
168
+ #
169
+ # == Example
170
+ # For <tt>[[p_1, e_1], [p_2, e_2], ...., [p_n, e_n]]</tt>, it returns:
171
+ #
172
+ # p_1**e_1 * p_2**e_2 * .... * p_n**e_n.
173
+ #
174
+ # Prime.int_from_prime_division([[2,2], [3,1]]) #=> 12
175
+ def int_from_prime_division(pd)
176
+ pd.inject(1){|value, (prime, index)|
177
+ value * prime**index
178
+ }
179
+ end
180
+
181
+ # Returns the factorization of +value+.
182
+ #
183
+ # == Parameters
184
+ # +value+:: An arbitrary integer.
185
+ # +generator+:: Optional. A pseudo-prime generator.
186
+ # +generator+.succ must return the next
187
+ # pseudo-prime number in the ascending
188
+ # order. It must generate all prime numbers,
189
+ # but may also generate non prime numbers too.
190
+ #
191
+ # === Exceptions
192
+ # +ZeroDivisionError+:: when +value+ is zero.
193
+ #
194
+ # == Example
195
+ # For an arbitrary integer:
196
+ #
197
+ # n = p_1**e_1 * p_2**e_2 * .... * p_n**e_n,
198
+ #
199
+ # prime_division(n) returns:
200
+ #
201
+ # [[p_1, e_1], [p_2, e_2], ...., [p_n, e_n]].
202
+ #
203
+ # Prime.prime_division(12) #=> [[2,2], [3,1]]
204
+ #
205
+ def prime_division(value, generator = Prime::Generator23.new)
206
+ raise ZeroDivisionError if value == 0
207
+ if value < 0
208
+ value = -value
209
+ pv = [[-1, 1]]
210
+ else
211
+ pv = []
212
+ end
213
+ generator.each do |prime|
214
+ count = 0
215
+ while (value1, mod = value.divmod(prime)
216
+ mod) == 0
217
+ value = value1
218
+ count += 1
219
+ end
220
+ if count != 0
221
+ pv.push [prime, count]
222
+ end
223
+ break if value1 <= prime
224
+ end
225
+ if value > 1
226
+ pv.push [value, 1]
227
+ end
228
+ pv
229
+ end
230
+
231
+ # An abstract class for enumerating pseudo-prime numbers.
232
+ #
233
+ # Concrete subclasses should override succ, next, rewind.
234
+ class PseudoPrimeGenerator
235
+ include Enumerable
236
+
237
+ def initialize(ubound = nil)
238
+ @ubound = ubound
239
+ end
240
+
241
+ def upper_bound=(ubound)
242
+ @ubound = ubound
243
+ end
244
+ def upper_bound
245
+ @ubound
246
+ end
247
+
248
+ # returns the next pseudo-prime number, and move the internal
249
+ # position forward.
250
+ #
251
+ # +PseudoPrimeGenerator+#succ raises +NotImplementedError+.
252
+ def succ
253
+ raise NotImplementedError, "need to define `succ'"
254
+ end
255
+
256
+ # alias of +succ+.
257
+ def next
258
+ raise NotImplementedError, "need to define `next'"
259
+ end
260
+
261
+ # Rewinds the internal position for enumeration.
262
+ #
263
+ # See +Enumerator+#rewind.
264
+ def rewind
265
+ raise NotImplementedError, "need to define `rewind'"
266
+ end
267
+
268
+ # Iterates the given block for each prime number.
269
+ def each
270
+ return self.dup unless block_given?
271
+ if @ubound
272
+ last_value = nil
273
+ loop do
274
+ prime = succ
275
+ break last_value if prime > @ubound
276
+ last_value = yield prime
277
+ end
278
+ else
279
+ loop do
280
+ yield succ
281
+ end
282
+ end
283
+ end
284
+
285
+ # see +Enumerator+#with_index.
286
+ def with_index(offset = 0)
287
+ return enum_for(:with_index, offset) { Float::INFINITY } unless block_given?
288
+ return each_with_index(&proc) if offset == 0
289
+
290
+ each do |prime|
291
+ yield prime, offset
292
+ offset += 1
293
+ end
294
+ end
295
+
296
+ # see +Enumerator+#with_object.
297
+ def with_object(obj)
298
+ return enum_for(:with_object, obj) { Float::INFINITY } unless block_given?
299
+ each do |prime|
300
+ yield prime, obj
301
+ end
302
+ end
303
+
304
+ def size
305
+ Float::INFINITY
306
+ end
307
+ end
308
+
309
+ # An implementation of +PseudoPrimeGenerator+.
310
+ #
311
+ # Uses +EratosthenesSieve+.
312
+ class EratosthenesGenerator < PseudoPrimeGenerator
313
+ def initialize
314
+ @last_prime_index = -1
315
+ super
316
+ end
317
+
318
+ def succ
319
+ @last_prime_index += 1
320
+ EratosthenesSieve.instance.get_nth_prime(@last_prime_index)
321
+ end
322
+ def rewind
323
+ initialize
324
+ end
325
+ alias next succ
326
+ end
327
+
328
+ # An implementation of +PseudoPrimeGenerator+ which uses
329
+ # a prime table generated by trial division.
330
+ class TrialDivisionGenerator < PseudoPrimeGenerator
331
+ def initialize
332
+ @index = -1
333
+ super
334
+ end
335
+
336
+ def succ
337
+ TrialDivision.instance[@index += 1]
338
+ end
339
+ def rewind
340
+ initialize
341
+ end
342
+ alias next succ
343
+ end
344
+
345
+ # Generates all integers which are greater than 2 and
346
+ # are not divisible by either 2 or 3.
347
+ #
348
+ # This is a pseudo-prime generator, suitable on
349
+ # checking primality of an integer by brute force
350
+ # method.
351
+ class Generator23 < PseudoPrimeGenerator
352
+ def initialize
353
+ @prime = 1
354
+ @step = nil
355
+ super
356
+ end
357
+
358
+ def succ
359
+ if (@step)
360
+ @prime += @step
361
+ @step = 6 - @step
362
+ else
363
+ case @prime
364
+ when 1; @prime = 2
365
+ when 2; @prime = 3
366
+ when 3; @prime = 5; @step = 2
367
+ end
368
+ end
369
+ @prime
370
+ end
371
+ alias next succ
372
+ def rewind
373
+ initialize
374
+ end
375
+ end
376
+
377
+ # Internal use. An implementation of prime table by trial division method.
378
+ class TrialDivision
379
+ include Singleton
380
+
381
+ def initialize # :nodoc:
382
+ # These are included as class variables to cache them for later uses. If memory
383
+ # usage is a problem, they can be put in Prime#initialize as instance variables.
384
+
385
+ # There must be no primes between @primes[-1] and @next_to_check.
386
+ @primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101]
387
+ # @next_to_check % 6 must be 1.
388
+ @next_to_check = 103 # @primes[-1] - @primes[-1] % 6 + 7
389
+ @ulticheck_index = 3 # @primes.index(@primes.reverse.find {|n|
390
+ # n < Math.sqrt(@@next_to_check) })
391
+ @ulticheck_next_squared = 121 # @primes[@ulticheck_index + 1] ** 2
392
+ end
393
+
394
+ # Returns the +index+th prime number.
395
+ #
396
+ # +index+ is a 0-based index.
397
+ def [](index)
398
+ while index >= @primes.length
399
+ # Only check for prime factors up to the square root of the potential primes,
400
+ # but without the performance hit of an actual square root calculation.
401
+ if @next_to_check + 4 > @ulticheck_next_squared
402
+ @ulticheck_index += 1
403
+ @ulticheck_next_squared = @primes.at(@ulticheck_index + 1) ** 2
404
+ end
405
+ # Only check numbers congruent to one and five, modulo six. All others
406
+
407
+ # are divisible by two or three. This also allows us to skip checking against
408
+ # two and three.
409
+ @primes.push @next_to_check if @primes[2..@ulticheck_index].find {|prime| @next_to_check % prime == 0 }.nil?
410
+ @next_to_check += 4
411
+ @primes.push @next_to_check if @primes[2..@ulticheck_index].find {|prime| @next_to_check % prime == 0 }.nil?
412
+ @next_to_check += 2
413
+ end
414
+ @primes[index]
415
+ end
416
+ end
417
+
418
+ # Internal use. An implementation of Eratosthenes' sieve
419
+ class EratosthenesSieve
420
+ include Singleton
421
+
422
+ def initialize
423
+ @primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101]
424
+ # @max_checked must be an even number
425
+ @max_checked = @primes.last + 1
426
+ end
427
+
428
+ def get_nth_prime(n)
429
+ compute_primes while @primes.size <= n
430
+ @primes[n]
431
+ end
432
+
433
+ private
434
+ def compute_primes
435
+ # max_segment_size must be an even number
436
+ max_segment_size = 1e6.to_i
437
+ max_cached_prime = @primes.last
438
+ # do not double count primes if #compute_primes is interrupted
439
+ # by Timeout.timeout
440
+ @max_checked = max_cached_prime + 1 if max_cached_prime > @max_checked
441
+
442
+ segment_min = @max_checked
443
+ segment_max = [segment_min + max_segment_size, max_cached_prime * 2].min
444
+ root = Integer.sqrt(segment_max)
445
+
446
+ segment = ((segment_min + 1) .. segment_max).step(2).to_a
447
+
448
+ (1..Float::INFINITY).each do |sieving|
449
+ prime = @primes[sieving]
450
+ break if prime > root
451
+ composite_index = (-(segment_min + 1 + prime) / 2) % prime
452
+ while composite_index < segment.size do
453
+ segment[composite_index] = nil
454
+ composite_index += prime
455
+ end
456
+ end
457
+
458
+ @primes.concat(segment.compact!)
459
+
460
+ @max_checked = segment_max
461
+ end
462
+ end
463
+ end
@@ -0,0 +1,27 @@
1
+ begin
2
+ require_relative "lib/prime"
3
+ rescue LoadError
4
+ # for Ruby core repository
5
+ require_relative "prime"
6
+ end
7
+
8
+ Gem::Specification.new do |spec|
9
+ spec.name = "prime"
10
+ spec.version = Prime::VERSION
11
+ spec.authors = ["Yuki Sonoda"]
12
+ spec.email = ["yugui@yugui.jp"]
13
+
14
+ spec.summary = %q{Prime numbers and factorization library.}
15
+ spec.description = %q{Prime numbers and factorization library.}
16
+ spec.homepage = "https://github.com/ruby/prime"
17
+ spec.license = "BSD-2-Clause"
18
+
19
+ spec.files = [".gitignore", ".travis.yml", "Gemfile", "LICENSE.txt", "README.md", "Rakefile", "bin/console", "bin/setup", "lib/prime.rb", "prime.gemspec"]
20
+ spec.bindir = "exe"
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.add_development_dependency "bundler"
25
+ spec.add_development_dependency "rake"
26
+ spec.add_development_dependency "test-unit"
27
+ end
metadata ADDED
@@ -0,0 +1,95 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: prime
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Yuki Sonoda
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-04-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: test-unit
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Prime numbers and factorization library.
56
+ email:
57
+ - yugui@yugui.jp
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - ".travis.yml"
64
+ - Gemfile
65
+ - LICENSE.txt
66
+ - README.md
67
+ - Rakefile
68
+ - bin/console
69
+ - bin/setup
70
+ - lib/prime.rb
71
+ - prime.gemspec
72
+ homepage: https://github.com/ruby/prime
73
+ licenses:
74
+ - BSD-2-Clause
75
+ metadata: {}
76
+ post_install_message:
77
+ rdoc_options: []
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ requirements: []
91
+ rubygems_version: 3.2.0.pre1
92
+ signing_key:
93
+ specification_version: 4
94
+ summary: Prime numbers and factorization library.
95
+ test_files: []