diff --git a/Gemfile b/Gemfile index e71e93bfd..3068b5b4a 100644 --- a/Gemfile +++ b/Gemfile @@ -17,7 +17,6 @@ gem "goodcheck" gem "dbm" gem 'digest' gem 'tempfile' -gem "prime" gem "rdoc", "~> 6.4.0" # Test gems diff --git a/Gemfile.lock b/Gemfile.lock index d748d5c19..ccd9bcf88 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -17,7 +17,6 @@ GEM dbm (1.1.0) diff-lcs (1.5.0) digest (3.1.1) - forwardable (1.3.2) goodcheck (3.1.0) marcel (>= 1.0, < 2.0) psych (>= 3.1, < 5.0) @@ -35,9 +34,6 @@ GEM racc power_assert (2.0.3) prettier_print (1.2.1) - prime (0.1.2) - forwardable - singleton psych (4.0.6) stringio public_suffix (5.0.1) @@ -82,7 +78,6 @@ GEM sorbet-runtime syntax_tree (>= 6.1.1, < 7) ruby-progressbar (1.13.0) - singleton (0.1.1) sorbet-runtime (0.5.10827) stackprof (0.2.25) stringio (3.0.7) @@ -105,7 +100,6 @@ DEPENDENCIES json json-schema minitest - prime rake rake-compiler rbs! diff --git a/stdlib/prime/0/integer-extension.rbs b/stdlib/prime/0/integer-extension.rbs deleted file mode 100644 index 19077c8ad..000000000 --- a/stdlib/prime/0/integer-extension.rbs +++ /dev/null @@ -1,41 +0,0 @@ -%a{annotate:rdoc:skip} -class Integer - # - # Iterates the given block over all prime numbers. - # - # See `Prime`#each for more details. - # - def self.each_prime: (Integer) { (Integer) -> void } -> void - - # - # Re-composes a prime factorization and returns the product. - # - # See Prime#int_from_prime_division for more details. - # - def self.from_prime_division: (Array[[ String ]]) -> Integer - - # - # Returns the factorization of `self`. - # - # See Prime#prime_division for more details. - # - def prime_division: (?Prime::PseudoPrimeGenerator) -> Array[[ Integer, Integer ]] - - # - # Returns true if `self` is a prime number, else returns false. Not recommended - # for very big integers (> 10**23). - # - def prime?: () -> bool -end diff --git a/stdlib/prime/0/manifest.yaml b/stdlib/prime/0/manifest.yaml deleted file mode 100644 index 1f0237922..000000000 --- a/stdlib/prime/0/manifest.yaml +++ /dev/null @@ -1,2 +0,0 @@ -dependencies: - - name: singleton diff --git a/stdlib/prime/0/prime.rbs b/stdlib/prime/0/prime.rbs deleted file mode 100644 index a4038adae..000000000 --- a/stdlib/prime/0/prime.rbs +++ /dev/null @@ -1,372 +0,0 @@ -# -# The set of all prime numbers. -# -# ## Example -# -# Prime.each(100) do |prime| -# p prime #=> 2, 3, 5, 7, 11, ...., 97 -# end -# -# Prime is Enumerable: -# -# Prime.first 5 # => [2, 3, 5, 7, 11] -# -# ## Retrieving the instance -# -# For convenience, each instance method of `Prime`.instance can be accessed as a -# class method of `Prime`. -# -# e.g. -# Prime.instance.prime?(2) #=> true -# Prime.prime?(2) #=> true -# -# ## Generators -# -# A "generator" provides an implementation of enumerating pseudo-prime numbers -# and it remembers the position of enumeration and upper bound. Furthermore, it -# is an external iterator of prime enumeration which is compatible with an -# Enumerator. -# -# `Prime`::`PseudoPrimeGenerator` is the base class for generators. There are -# few implementations of generator. -# -# `Prime`::`EratosthenesGenerator` -# : Uses Eratosthenes' sieve. -# `Prime`::`TrialDivisionGenerator` -# : Uses the trial division method. -# `Prime`::`Generator23` -# : Generates all positive integers which are not divisible by either 2 or 3. -# This sequence is very bad as a pseudo-prime sequence. But this is faster -# and uses much less memory than the other generators. So, it is suitable -# for factorizing an integer which is not large but has many prime factors. -# e.g. for Prime#prime? . -# -class Prime - include Singleton - - include Enumerable[Integer] - - extend Enumerable[Integer] - - # - # Iterates the given block over all prime numbers. - # - # ## Parameters - # - # `ubound` - # : Optional. An arbitrary positive number. The upper bound of enumeration. - # The method enumerates prime numbers infinitely if `ubound` is nil. - # `generator` - # : Optional. An implementation of pseudo-prime generator. - # - # - # ## Return value - # - # An evaluated value of the given block at the last time. Or an enumerator which - # is compatible to an `Enumerator` if no block given. - # - # ## Description - # - # Calls `block` once for each prime number, passing the prime as a parameter. - # - # `ubound` - # : Upper bound of prime numbers. The iterator stops after it yields all prime - # numbers p <= `ubound`. - # - def self.each: (?Integer? ubound, ?PseudoPrimeGenerator generator) { (Integer) -> void } -> void - | (?Integer? ubound, ?PseudoPrimeGenerator generator) -> PseudoPrimeGenerator - - # - # Iterates the given block over all prime numbers. - # - # ## Parameters - # - # `ubound` - # : Optional. An arbitrary positive number. The upper bound of enumeration. - # The method enumerates prime numbers infinitely if `ubound` is nil. - # `generator` - # : Optional. An implementation of pseudo-prime generator. - # - # - # ## Return value - # - # An evaluated value of the given block at the last time. Or an enumerator which - # is compatible to an `Enumerator` if no block given. - # - # ## Description - # - # Calls `block` once for each prime number, passing the prime as a parameter. - # - # `ubound` - # : Upper bound of prime numbers. The iterator stops after it yields all prime - # numbers p <= `ubound`. - # - def each: (?Integer? ubound, ?PseudoPrimeGenerator generator) { (Integer) -> void } -> void - | (?Integer? ubound, ?PseudoPrimeGenerator generator) -> PseudoPrimeGenerator - - # - # Re-composes a prime factorization and returns the product. - # - # For the decomposition: - # - # [[p_1, e_1], [p_2, e_2], ..., [p_n, e_n]], - # - # it returns: - # - # p_1**e_1 * p_2**e_2 * ... * p_n**e_n. - # - # ## Parameters - # `pd` - # : Array of pairs of integers. Each pair consists of a prime number -- a - # prime factor -- and a natural number -- its exponent (multiplicity). - # - # - # ## Example - # Prime.int_from_prime_division([[3, 2], [5, 1]]) #=> 45 - # 3**2 * 5 #=> 45 - # - def self.int_from_prime_division: (Array[[ Integer, Integer ]]) -> Integer - - # - # Re-composes a prime factorization and returns the product. - # - # For the decomposition: - # - # [[p_1, e_1], [p_2, e_2], ..., [p_n, e_n]], - # - # it returns: - # - # p_1**e_1 * p_2**e_2 * ... * p_n**e_n. - # - # ## Parameters - # `pd` - # : Array of pairs of integers. Each pair consists of a prime number -- a - # prime factor -- and a natural number -- its exponent (multiplicity). - # - # - # ## Example - # Prime.int_from_prime_division([[3, 2], [5, 1]]) #=> 45 - # 3**2 * 5 #=> 45 - # - def int_from_prime_division: (Array[[ Integer, Integer ]]) -> Integer - - # - # Returns true if `value` is a prime number, else returns false. Integer#prime? - # is much more performant. - # - # ## Parameters - # - # `value` - # : an arbitrary integer to be checked. - # `generator` - # : optional. A pseudo-prime generator. - # - def self.prime?: (Integer value, ?PseudoPrimeGenerator generator) -> bool - - # - # Returns true if `value` is a prime number, else returns false. Integer#prime? - # is much more performant. - # - # ## Parameters - # - # `value` - # : an arbitrary integer to be checked. - # `generator` - # : optional. A pseudo-prime generator. - # - def prime?: (Integer value, ?PseudoPrimeGenerator generator) -> bool - - # - # Returns the factorization of `value`. - # - # For an arbitrary integer: - # - # p_1**e_1 * p_2**e_2 * ... * p_n**e_n, - # - # prime_division returns an array of pairs of integers: - # - # [[p_1, e_1], [p_2, e_2], ..., [p_n, e_n]]. - # - # Each pair consists of a prime number -- a prime factor -- and a natural number - # -- its exponent (multiplicity). - # - # ## Parameters - # `value` - # : An arbitrary integer. - # `generator` - # : Optional. A pseudo-prime generator. `generator`.succ must return the next - # pseudo-prime number in ascending order. It must generate all prime - # numbers, but may also generate non-prime numbers, too. - # - # - # ### Exceptions - # `ZeroDivisionError` - # : when `value` is zero. - # - # - # ## Example - # - # Prime.prime_division(45) #=> [[3, 2], [5, 1]] - # 3**2 * 5 #=> 45 - # - def self.prime_division: (Integer, ?PseudoPrimeGenerator generator) -> Array[[ Integer, Integer ]] - - # - # Returns the factorization of `value`. - # - # For an arbitrary integer: - # - # p_1**e_1 * p_2**e_2 * ... * p_n**e_n, - # - # prime_division returns an array of pairs of integers: - # - # [[p_1, e_1], [p_2, e_2], ..., [p_n, e_n]]. - # - # Each pair consists of a prime number -- a prime factor -- and a natural number - # -- its exponent (multiplicity). - # - # ## Parameters - # `value` - # : An arbitrary integer. - # `generator` - # : Optional. A pseudo-prime generator. `generator`.succ must return the next - # pseudo-prime number in ascending order. It must generate all prime - # numbers, but may also generate non-prime numbers, too. - # - # - # ### Exceptions - # `ZeroDivisionError` - # : when `value` is zero. - # - # - # ## Example - # - # Prime.prime_division(45) #=> [[3, 2], [5, 1]] - # 3**2 * 5 #=> 45 - # - def prime_division: (Integer, ?PseudoPrimeGenerator generator) -> Array[[ Integer, Integer ]] - - # Returns the singleton instance. - # - def self.instance: () -> Prime - - # - # An abstract class for enumerating pseudo-prime numbers. - # - # Concrete subclasses should override succ, next, rewind. - # - class PseudoPrimeGenerator - # - # - def initialize: (?Integer?) -> void - - include Enumerable[Integer] - - # - # ---- - # - # - attr_accessor upper_bound(): Integer? - - # - # Iterates the given block for each prime number. - # - def each: () { (Integer) -> void } -> void - - # - # alias of `succ`. - # - def next: () -> Integer - - # - # Rewinds the internal position for enumeration. - # - # See `Enumerator`#rewind. - # - def rewind: () -> void - - # - # - def size: () -> Float - - # - # returns the next pseudo-prime number, and move the internal position forward. - # - # `PseudoPrimeGenerator`#succ raises `NotImplementedError`. - # - def succ: () -> Integer - end - - # - # An implementation of `PseudoPrimeGenerator`. - # - # Uses `EratosthenesSieve`. - # - class EratosthenesGenerator < PseudoPrimeGenerator - end - - # - # An implementation of `PseudoPrimeGenerator` which uses a prime table generated - # by trial division. - # - class TrialDivisionGenerator < PseudoPrimeGenerator - end - - # - # Generates all integers which are greater than 2 and are not divisible by - # either 2 or 3. - # - # This is a pseudo-prime generator, suitable on checking primality of an integer - # by brute force method. - # - class Generator23 < PseudoPrimeGenerator - end -end diff --git a/test/stdlib/Prime_test.rb b/test/stdlib/Prime_test.rb deleted file mode 100644 index b3da041fb..000000000 --- a/test/stdlib/Prime_test.rb +++ /dev/null @@ -1,75 +0,0 @@ -require_relative "test_helper" - -require "prime" - -class PrimeSingletonTest < Test::Unit::TestCase - include TypeAssertions - - library "singleton", "prime" - testing "singleton(::Prime)" - - def test_each - assert_send_type "(?::Integer? ubound, ?::Prime::PseudoPrimeGenerator generator) { (::Integer) -> void } -> void", - Prime, :each do break end - assert_send_type "(?::Integer? ubound, ?::Prime::PseudoPrimeGenerator generator) { (::Integer) -> void } -> void", - Prime, :each, 10 do break end - assert_send_type "(?::Integer? ubound, ?::Prime::PseudoPrimeGenerator generator) { (::Integer) -> void } -> void", - Prime, :each, 10, Prime::TrialDivisionGenerator.new do break end - assert_send_type "(?::Integer? ubound, ?::Prime::PseudoPrimeGenerator generator) -> ::Prime::PseudoPrimeGenerator", - Prime, :each - end - - def test_int_from_prime_division - assert_send_type "(::Array[[ ::Integer, ::Integer ]]) -> ::Integer", - Prime, :int_from_prime_division, [[3, 1], [19, 1]] - end - - def test_prime? - assert_send_type "(::Integer value, ?::Prime::PseudoPrimeGenerator generator) -> bool", - Prime, :prime?, 57 - end - - def test_prime_division - assert_send_type "(::Integer, ?::Prime::PseudoPrimeGenerator generator) -> ::Array[[ ::Integer, ::Integer ]]", - Prime, :prime_division, 57 - end - - def test_instance - assert_send_type "() -> ::Prime", - Prime, :instance - end -end - -class PrimeTest < Test::Unit::TestCase - include TypeAssertions - - library "singleton", "prime" - testing "::Prime" - - - def test_each - assert_send_type "(?::Integer? ubound, ?::Prime::PseudoPrimeGenerator generator) { (::Integer) -> void } -> void", - Prime.instance, :each do break end - assert_send_type "(?::Integer? ubound, ?::Prime::PseudoPrimeGenerator generator) { (::Integer) -> void } -> void", - Prime.instance, :each, 10 do break end - assert_send_type "(?::Integer? ubound, ?::Prime::PseudoPrimeGenerator generator) { (::Integer) -> void } -> void", - Prime.instance, :each, 10, Prime::TrialDivisionGenerator.new do break end - assert_send_type "(?::Integer? ubound, ?::Prime::PseudoPrimeGenerator generator) -> ::Prime::PseudoPrimeGenerator", - Prime.instance, :each - end - - def test_int_from_prime_division - assert_send_type "(::Array[[ ::Integer, ::Integer ]]) -> ::Integer", - Prime.instance, :int_from_prime_division, [[3, 1], [19, 1]] - end - - def test_prime? - assert_send_type "(::Integer value, ?::Prime::PseudoPrimeGenerator generator) -> bool", - Prime.instance, :prime?, 57 - end - - def test_prime_division - assert_send_type "(::Integer, ?::Prime::PseudoPrimeGenerator generator) -> ::Array[[ ::Integer, ::Integer ]]", - Prime.instance, :prime_division, 57 - end -end