numb 0.21.0 → 0.63.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.
Files changed (158) hide show
  1. data/Rakefile +3 -2
  2. data/VERSION +1 -1
  3. data/lib/numb/abundancy.rb +6 -0
  4. data/lib/numb/abundant.rb +1 -1
  5. data/lib/numb/almost_perfect.rb +6 -0
  6. data/lib/numb/amicable.rb +8 -0
  7. data/lib/numb/aspiring.rb +19 -0
  8. data/lib/numb/centered_n_gonal.rb +9 -0
  9. data/lib/numb/centered_triangular.rb +5 -0
  10. data/lib/numb/congruum.rb +13 -0
  11. data/lib/numb/coprime.rb +9 -0
  12. data/lib/numb/core.rb +7 -0
  13. data/lib/numb/cototient.rb +7 -0
  14. data/lib/numb/d.rb +6 -0
  15. data/lib/numb/deficient.rb +1 -1
  16. data/lib/numb/fermat_pseudoprime.rb +9 -0
  17. data/lib/numb/friendly.rb +9 -0
  18. data/lib/numb/hexagonal.rb +1 -2
  19. data/lib/numb/highly_abundant.rb +7 -0
  20. data/lib/numb/highly_composite.rb +10 -0
  21. data/lib/numb/hyperperfect.rb +1 -1
  22. data/lib/numb/idoneal.rb +65 -0
  23. data/lib/numb/integer_p.rb +11 -0
  24. data/lib/numb/interprime.rb +6 -0
  25. data/lib/numb/jacobsthal_lucas.rb +10 -0
  26. data/lib/numb/k_perfect.rb +8 -0
  27. data/lib/numb/knodel.rb +12 -0
  28. data/lib/numb/leonardo.rb +13 -0
  29. data/lib/numb/leyland.rb +13 -0
  30. data/lib/numb/lucas_carmichael.rb +1 -1
  31. data/lib/numb/mersenne_prime.rb +5 -0
  32. data/lib/numb/minimal.rb +8 -0
  33. data/lib/numb/mobius.rb +5 -6
  34. data/lib/numb/n_gonal.rb +1 -2
  35. data/lib/numb/next_prev_prime.rb +13 -0
  36. data/lib/numb/noncototient.rb +9 -0
  37. data/lib/numb/nth_prime.rb +17 -0
  38. data/lib/numb/number_of_divisors.rb +21 -0
  39. data/lib/numb/octagonal.rb +0 -3
  40. data/lib/numb/ore.rb +8 -0
  41. data/lib/numb/perfect.rb +1 -3
  42. data/lib/numb/perfect_power.rb +1 -1
  43. data/lib/numb/poulet.rb +5 -0
  44. data/lib/numb/powerful.rb +1 -1
  45. data/lib/numb/prime_count.rb +16 -0
  46. data/lib/numb/prime_signature.rb +5 -0
  47. data/lib/numb/primitive_pseudoperfect.rb +1 -1
  48. data/lib/numb/primorial.rb +26 -0
  49. data/lib/numb/proth.rb +12 -0
  50. data/lib/numb/refactorable.rb +7 -0
  51. data/lib/numb/repunit.rb +5 -0
  52. data/lib/numb/rough.rb +5 -0
  53. data/lib/numb/semiperfect.rb +3 -3
  54. data/lib/numb/semiprime.rb +1 -1
  55. data/lib/numb/smooth.rb +5 -0
  56. data/lib/numb/sphenic.rb +1 -3
  57. data/lib/numb/square.rb +1 -2
  58. data/lib/numb/square_free.rb +1 -1
  59. data/lib/numb/sublime.rb +6 -0
  60. data/lib/numb/sum_of_squares.rb +116 -0
  61. data/lib/numb/superabundant.rb +8 -0
  62. data/lib/numb/superperfect.rb +6 -0
  63. data/lib/numb/totient.rb +10 -0
  64. data/lib/numb/unitary_divisor.rb +5 -0
  65. data/lib/numb/unitary_perfect.rb +7 -0
  66. data/lib/numb/untouchable.rb +14 -0
  67. data/lib/numb/zeisel.rb +13 -0
  68. data/lib/numb.rb +35 -28
  69. data/spec/abundancy_spec.rb +20 -0
  70. data/spec/abundant_spec.rb +15 -15
  71. data/spec/achilles_spec.rb +15 -15
  72. data/spec/almost_perfect_spec.rb +20 -0
  73. data/spec/amicable_spec.rb +25 -0
  74. data/spec/aspiring_spec.rb +16 -0
  75. data/spec/automorphic_spec.rb +106 -202
  76. data/spec/balanced_prime_spec.rb +14 -9
  77. data/spec/carmichael_spec.rb +7 -7
  78. data/spec/carol_spec.rb +11 -10
  79. data/spec/centered_n_gonal_spec.rb +66 -0
  80. data/spec/centered_triangular_spec.rb +20 -0
  81. data/spec/composite_spec.rb +13 -12
  82. data/spec/congruum_spec.rb +20 -0
  83. data/spec/coprime_spec.rb +26 -0
  84. data/spec/core_spec.rb +14 -0
  85. data/spec/cube_spec.rb +17 -13
  86. data/spec/d_spec.rb +21 -0
  87. data/spec/decagonal_spec.rb +13 -9
  88. data/spec/deficient_spec.rb +14 -14
  89. data/spec/dihedral_prime_spec.rb +24 -24
  90. data/spec/{factor_spec.rb → divides_spec.rb} +7 -7
  91. data/spec/dodecagonal_spec.rb +10 -8
  92. data/spec/dudeney_spec.rb +9 -7
  93. data/spec/economical_spec.rb +23 -20
  94. data/spec/emrip_spec.rb +12 -12
  95. data/spec/equidigital_spec.rb +15 -15
  96. data/spec/extravagant_spec.rb +12 -12
  97. data/spec/fermat_pseudoprime_spec.rb +78 -0
  98. data/spec/fibonacci_spec.rb +7 -7
  99. data/spec/friendly_spec.rb +38 -0
  100. data/spec/frugal_spec.rb +12 -12
  101. data/spec/happy_spec.rb +14 -14
  102. data/spec/harshad_spec.rb +17 -18
  103. data/spec/heptagonal_spec.rb +14 -9
  104. data/spec/hexagonal_spec.rb +13 -9
  105. data/spec/highly_abundant_spec.rb +20 -0
  106. data/spec/highly_composite_spec.rb +20 -0
  107. data/spec/hilbert_spec.rb +13 -14
  108. data/spec/hyperperfect_spec.rb +25 -55
  109. data/spec/idoneal_spec.rb +20 -0
  110. data/spec/integer_p_spec.rb +21 -0
  111. data/spec/interprime_spec.rb +21 -0
  112. data/spec/jacobsthal_lucas_spec.rb +20 -0
  113. data/spec/k_perfect.rb +40 -0
  114. data/spec/kaprekar_spec.rb +12 -11
  115. data/spec/keith_spec.rb +12 -12
  116. data/spec/knodel_spec.rb +49 -0
  117. data/spec/kynea_spec.rb +11 -11
  118. data/spec/leonardo_spec.rb +20 -0
  119. data/spec/leyland_spec.rb +20 -0
  120. data/spec/lucas_carmichael_spec.rb +14 -8
  121. data/spec/lucas_spec.rb +12 -10
  122. data/spec/maris_mcgwire_sosa_pair_spec.rb +12 -12
  123. data/spec/mersenne_prime_spec.rb +26 -0
  124. data/spec/minimal_spec.rb +19 -0
  125. data/spec/mobius_spec.rb +22 -37
  126. data/spec/myriagonal_spec.rb +9 -7
  127. data/spec/narcissistic_spec.rb +13 -11
  128. data/spec/nivenmorphic_spec.rb +21 -15
  129. data/spec/noncototient_spec.rb +19 -0
  130. data/spec/nth_prime_spec.rb +8 -0
  131. data/spec/number_of_distinct_prime_factors_spec.rb +21 -17
  132. data/spec/number_of_prime_factors_spec.rb +10 -16
  133. data/spec/ore_spec.rb +21 -0
  134. data/spec/perfect_spec.rb +10 -10
  135. data/spec/poulet_spec.rb +20 -0
  136. data/spec/prime_count_spec.rb +13 -0
  137. data/spec/prime_signature_spec.rb +70 -0
  138. data/spec/primorial_spec.rb +30 -0
  139. data/spec/proth_spec.rb +21 -0
  140. data/spec/refactorable_spec.rb +20 -0
  141. data/spec/repunit_spec.rb +25 -0
  142. data/spec/rough_spec.rb +70 -0
  143. data/spec/smooth_spec.rb +72 -0
  144. data/spec/spec_helper.rb +51 -1
  145. data/spec/square_free_spec.rb +2 -0
  146. data/spec/sublime_spec.rb +18 -0
  147. data/spec/sum_of_squares.rb +24 -0
  148. data/spec/superabundant_spec.rb +20 -0
  149. data/spec/superperfect_spec.rb +17 -0
  150. data/spec/totient_spec.rb +13 -0
  151. data/spec/unitary_divisor_spec.rb +32 -0
  152. data/spec/unitary_perfect.rb +14 -0
  153. data/spec/untouchable_spec.rb +19 -0
  154. data/spec/zeisel_spec.rb +20 -0
  155. metadata +144 -10
  156. data/lib/numb/prime.rb +0 -495
  157. data/lib/numb/ruby1.8.rb +0 -9
  158. data/lib/numb/ruby1.9.rb +0 -8
data/Rakefile CHANGED
@@ -10,8 +10,9 @@ begin
10
10
  gem.email = "runrun@runpaint.org"
11
11
  gem.homepage = "http://github.com/runpaint/numb"
12
12
  gem.authors = ["Run Paint Run Run"]
13
- gem.rdoc_options = ['-x', 'lib/numb/ruby1.9.rb']
13
+ gem.rdoc_options = ['-x']
14
14
  gem.add_dependency "gemcutter", ">= 0.1.0"
15
+ gem.required_ruby_version = '1.9'
15
16
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
16
17
  end
17
18
  Jeweler::GemcutterTasks.new
@@ -22,7 +23,7 @@ end
22
23
  require 'spec/rake/spectask'
23
24
  Spec::Rake::SpecTask.new(:spec) do |spec|
24
25
  spec.libs << 'lib' << 'spec'
25
- spec.spec_files = FileList['spec/**/*_spec.rb']
26
+ spec.spec_files = FileList['spec/spec_helper.rb', 'spec/**/*_spec.rb']
26
27
  end
27
28
 
28
29
  Spec::Rake::SpecTask.new(:rcov) do |spec|
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.21.0
1
+ 0.63.0
@@ -0,0 +1,6 @@
1
+ # coding: utf-8
2
+ class Integer
3
+ def abundancy
4
+ Rational(σ, self)
5
+ end
6
+ end
data/lib/numb/abundant.rb CHANGED
@@ -13,7 +13,7 @@ class Integer
13
13
  #
14
14
  def abundant?
15
15
  return false unless self > 0
16
- sum_of_divisors > (2 * self)
16
+ σ > (2 * self)
17
17
  end
18
18
 
19
19
  alias :excessive? :abundant?
@@ -0,0 +1,6 @@
1
+ class Integer
2
+ def almost_perfect?
3
+ return true if self == 1
4
+ proper_divisors.reduce(:+) == self - 1
5
+ end
6
+ end
@@ -0,0 +1,8 @@
1
+ class Integer
2
+ def amicable?(other)
3
+ return false if other == self
4
+ [self, other].map do |n|
5
+ n.proper_divisors.reduce(:+)
6
+ end == [other, self]
7
+ end
8
+ end
@@ -0,0 +1,19 @@
1
+ class Integer
2
+ def aliquot_sequence
3
+ sequence = [self]
4
+ max_iterations = Math.sqrt(self).floor
5
+ max_iterations.times do |limit|
6
+ divisors = sequence.last.proper_divisors
7
+ break if divisors.empty?
8
+ sequence << divisors.reduce(:+)
9
+ break if sequence[0..-2].include?(sequence.last)
10
+ return sequence << (1/0.0) if limit.succ == max_iterations
11
+ end
12
+ sequence
13
+ end
14
+
15
+ def aspiring?
16
+ return false if perfect?
17
+ (last = aliquot_sequence.last).to_f.finite? ? last.perfect? : false
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ class Integer
2
+ def centered_n_gonal?(n)
3
+ raise ArgumentError unless n > 2
4
+ Rational(
5
+ -n + Math.sqrt( n**2 - 8 * (n - n * self) ),
6
+ 2 * n
7
+ ).denominator == 1
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ class Integer
2
+ def centered_triangular?
3
+ centered_n_gonal?(3)
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+ class Integer
2
+ def congruum?
3
+ # Fibonacci proved that h|24
4
+ # Fermat’s right triangle theorem shows h is not square
5
+ return false unless divides?(24) and not square?
6
+ h = self
7
+ (1..Math.sqrt(h)).any? do |n|
8
+ (n.succ..Math.sqrt(h)).any? do |m|
9
+ h == (4 * m * n) * (m**2 - n**2)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ # coding: utf-8
2
+ class Integer
3
+ def coprime?(x)
4
+ gcd(x) == 1
5
+ end
6
+ alias :⊥ :coprime?
7
+ alias :stranger? :coprime?
8
+ end
9
+
data/lib/numb/core.rb ADDED
@@ -0,0 +1,7 @@
1
+ # coding: utf-8
2
+ class Integer
3
+ def core
4
+ raise ArgumentError if self <= 0
5
+ divisors.sort.select{|m| (self/m).square?}.first
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ # coding: utf-8
2
+ class Integer
3
+ def cototient
4
+ self - φ
5
+ end
6
+ end
7
+
data/lib/numb/d.rb ADDED
@@ -0,0 +1,6 @@
1
+ # coding:utf-8
2
+ class Integer
3
+ def d?
4
+ knödel?(3)
5
+ end
6
+ end
@@ -12,7 +12,7 @@ class Integer
12
12
  #
13
13
  def deficient?
14
14
  return false unless self > 0
15
- sum_of_divisors < (2 * self)
15
+ σ < (2 * self)
16
16
  end
17
17
 
18
18
  alias :defective? :deficient?
@@ -0,0 +1,9 @@
1
+ class Integer
2
+ def fermat_pseudoprime?(a=10)
3
+ return false unless composite?
4
+ q = self
5
+ raise ArgumentError unless a >= 2
6
+ raise ArgumentError unless (q - 2) >= a
7
+ (a**(q-1)).modulo(q) == 1
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class Integer
2
+ def friendly?(*others)
3
+ raise ArgumentError unless others.size >= 1 && others.uniq.size == others.size
4
+ abundancy = self.abundancy
5
+ others.all? {|o| o.abundancy == abundancy}
6
+ end
7
+ end
8
+
9
+
@@ -1,7 +1,6 @@
1
1
  class Integer
2
2
  def hexagonal?
3
3
  return true if zero?
4
- n = ((Math.sqrt((8*self) + 1) + 1)/4)
5
- n == n.to_i
4
+ ((Math.sqrt((8*self) + 1) + 1)/4).integer?
6
5
  end
7
6
  end
@@ -0,0 +1,7 @@
1
+ # coding: utf-8
2
+ class Integer
3
+ def highly_abundant?
4
+ return true if self == 1
5
+ (self - 1).downto(1).all?{|m| σ > m.σ }
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ class Integer
2
+ def highly_composite?
3
+ return false if self > 6 and not (abundant? or primorial_product?)
4
+ return true if [1,4,36].include?(self)
5
+ n_divisors = number_of_divisors
6
+ (self-1).downto(1).none? do |x|
7
+ x.number_of_divisors >= n_divisors
8
+ end
9
+ end
10
+ end
@@ -2,6 +2,6 @@
2
2
  class Integer
3
3
  def hyperperfect?(k=1)
4
4
  raise ArgumentError unless k >= 1
5
- (1 + (k * (sum_of_divisors - self - 1))) == self
5
+ (1 + (k * (σ - self - 1))) == self
6
6
  end
7
7
  end
@@ -0,0 +1,65 @@
1
+ class Integer
2
+ def idoneal?
3
+ n = self
4
+ # Conjecture 2 (Euler) The largest idoneal number is n = 1848
5
+ # Conjecture 5 (Gauss) If c(−4n) = 1, then n ≤ 1848.
6
+ return false if n > 1848
7
+
8
+ # Theorem 3 (Euler)
9
+ # 1. If n is an idoneal number which is a square, then n = 1, 4, 9, 16, or 25.
10
+ return false if n.square? and ![1, 4, 9, 16, 25].include?(n)
11
+ if n.divides?(4)
12
+ n_over_4 = n/4
13
+
14
+ # Theorem 12 (Grube)
15
+ # (c) If n is idoneal and 4||n, then n = 4, 12, 28, 60
16
+ return false if n_over_4.odd? and ![4,12,28,60].include?(n)
17
+
18
+ # Theorem 12 (Grube)
19
+ # If n is idoneal and 16|n, then n = 16, 48, 112, 240.
20
+ if n.divides?(16)
21
+ return [16, 48, 112, 240].include?(n)
22
+ end
23
+
24
+ # Theorem 3 (Euler)
25
+ # 6. If n ≡ 1 (mod 4) is idoneal and n != 1, then 4n is not idoneal.
26
+ # 8. If n ≡ 8 (mod 16) is idoneal, then 4n is not idoneal.
27
+ # 9. If n ≡ 16 (mod 32) is idoneal, then 4n is not idoneal.
28
+
29
+ # Corollary 10 (Euler)
30
+ # Thus, if n ≡ 0 (mod 32) or if n ≡ 4 (mod 16) and n > 4, then n is not idoneal.
31
+ if n.modulo(32).zero? or n.modulo(16) == 4 and n > 4
32
+ return false
33
+ end
34
+ end
35
+
36
+ # Theorem 12 (Grube)
37
+ # (a) If n is idoneal and 9|n, then n = 9, 18, 45, 72.
38
+ return [9, 18, 45, 72].include?(n) if n.divides?(9)
39
+
40
+ # Theorem 12 (Grube)
41
+ # (b) If n is idoneal and 25|n, then n = 25.
42
+ return n == 25 if n.divides?(25)
43
+
44
+ # Corollary 8
45
+ # If n ≡ 3 (mod 4) is idoneal, then n = 3, 7 or 15.
46
+ return [3, 7, 15].include?(n) if n.modulo(4) == 3
47
+
48
+ # Perform a brute force test of whether n == ab + bc + ca; if it does, for
49
+ # some distinct integer a, b, and c, n is not idoneal
50
+ max = Math.sqrt(n/3)
51
+ (1..max).each do |a|
52
+ b_max = n - (a**2) - (a+1)**2 - (a+1)**2
53
+ ((a+1)..b_max).each do |b|
54
+ ab = a*b
55
+ c_max = n - ab - b*(b+1)
56
+ ((b+1)..c_max).each do |c|
57
+ sum = ab + b*c + c*a
58
+ return false if sum == n
59
+ break if sum > n
60
+ end
61
+ end
62
+ end
63
+ true
64
+ end
65
+ end
@@ -0,0 +1,11 @@
1
+ class Integer
2
+ def integer?
3
+ true
4
+ end
5
+ end
6
+
7
+ class Float
8
+ def integer?
9
+ self == to_i
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ class Integer
2
+ def interprime?
3
+ return false if prime?
4
+ self == (next_prime + prev_prime)/2
5
+ end
6
+ end
@@ -0,0 +1,10 @@
1
+ class Integer
2
+ def jacobsthal_lucas?
3
+ [self + 1, self - 1].any? do |n|
4
+ exp = Math.log2(n)
5
+ if exp.integer?
6
+ self == 2**exp + (-1)**exp
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ # coding: utf-8
2
+ class Integer
3
+ def k_perfect?(k)
4
+ σ == k * self
5
+ end
6
+
7
+ alias :multiply_perfect? :k_perfect?
8
+ end
@@ -0,0 +1,12 @@
1
+ # coding: utf-8
2
+ class Integer
3
+ def knödel?(k)
4
+ n = self
5
+ return false unless n > k and composite?
6
+ exp = n - k + 1
7
+ (1...n).select{|j| j.coprime?(n)}.all? do |j|
8
+ (j**exp - j).remainder(n).zero?
9
+ end
10
+ end
11
+ alias :knodel? :knödel?
12
+ end
@@ -0,0 +1,13 @@
1
+ class Integer
2
+ def leonardo?
3
+ n = self
4
+ return 1 if n <= 1
5
+ phi = Hash[[:+, :-].map{|sign| [sign, (1.send(sign, Math.sqrt(5)) / 2) ]}]
6
+ divisor = phi[:+] - phi[:-]
7
+ (1..n).any? do |m|
8
+ sum = ((2 * ( ( phi[:+]**(m+1) - phi[:-]**(m+1) ).fdiv( divisor ) )) - 1)
9
+ return false unless sum.finite?
10
+ sum.floor == self
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ class Integer
2
+ def leyland?
3
+ (2..Math.sqrt(self)).each do |x|
4
+ (x..Math.sqrt(self)).each do |y|
5
+ sum = x**y + y**x
6
+ return true if sum == self
7
+ break if sum > self
8
+ end
9
+ end
10
+ false
11
+ end
12
+ end
13
+
@@ -2,7 +2,7 @@ class Integer
2
2
  def lucas_carmichael?
3
3
  return false unless composite? and odd? and square_free?
4
4
  prime_factors.all? do |prime_factor|
5
- succ.factor?(prime_factor + 1)
5
+ succ.divides?(prime_factor + 1)
6
6
  end
7
7
  end
8
8
  end
@@ -0,0 +1,5 @@
1
+ class Integer
2
+ def mersenne_prime?
3
+ prime? and repunit?(2)
4
+ end
5
+ end
@@ -0,0 +1,8 @@
1
+ class Integer
2
+ def minimal?
3
+ div_n = number_of_divisors
4
+ (self-1).downto(1).all? do |n|
5
+ n.number_of_divisors != div_n
6
+ end
7
+ end
8
+ end
data/lib/numb/mobius.rb CHANGED
@@ -1,11 +1,10 @@
1
1
  # coding: utf-8
2
2
  class Integer
3
3
  def mobius
4
- case
5
- when (self < 1) then nil
6
- when (square_free? and number_of_distinct_prime_factors.even?) then 1
7
- when (square_free? and number_of_distinct_prime_factors.odd?) then -1
8
- when (not square_free?) then 0
9
- end
4
+ return if self < 1
5
+ ω < Ω ? 0 : (-1)**(Ω)
10
6
  end
7
+
8
+ alias :möbius :mobius
9
+ alias :μ :mobius
11
10
  end
data/lib/numb/n_gonal.rb CHANGED
@@ -2,7 +2,6 @@ class Integer
2
2
  def n_gonal?(n)
3
3
  raise ArgumentError unless n.is_a?(Integer) and n >= 3
4
4
  return true if zero?
5
- x = (Math.sqrt((8*n - 16)*self + (n-4)**2) + n - 4) / (2*n - 4)
6
- x == x.to_i
5
+ ((Math.sqrt((8*n - 16)*self + (n-4)**2) + n - 4) / (2*n - 4)).integer?
7
6
  end
8
7
  end
@@ -0,0 +1,13 @@
1
+ class Integer
2
+ def next_prime
3
+ p = succ
4
+ p += 1 until p.prime?
5
+ p
6
+ end
7
+
8
+ def prev_prime
9
+ p = self - 1
10
+ p -= 1 until p.prime?
11
+ p
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ # coding: utf-8
2
+ class Integer
3
+ def noncototient?
4
+ return false if self < 10 or odd?
5
+ (Math.sqrt(self).floor..(2 * self)).none? do |m|
6
+ m.cototient == self
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,17 @@
1
+ # coding: utf-8
2
+ class Integer
3
+ # Algorithm derived from Formulas for pi(n) and the n-th prime by Sebastian
4
+ # Martin Ruiz and Jonathan Sondow [arXiv:math/0210312v2 [math.NT]]
5
+
6
+ # Returns, after many eons, the nth prime, where n = self
7
+ def nth_prime
8
+ n = self
9
+ return 2 if n == 1
10
+ raise ArgumentError if n < 1
11
+ (2..( 2*n * Math.log(n) + 2).floor).map do |k|
12
+ 1 - (k.π.fdiv(n)).floor
13
+ end.reduce(:+) + 2
14
+ end
15
+
16
+ alias :prime :nth_prime
17
+ end
@@ -0,0 +1,21 @@
1
+ # coding: utf-8
2
+ class Integer
3
+ # Algorithm derived from Formulas for pi(n) and the n-th prime by Sebastian
4
+ # Martin Ruiz and Jonathan Sondow [arXiv:math/0210312v2 [math.NT]]
5
+
6
+ # Returns the number of divisors of self
7
+ def τ
8
+ n = self
9
+ return @nod if defined?(@nod)
10
+ square_root = Math.sqrt(n)
11
+ @nod = (1..square_root.floor).
12
+ map {|i| n.quo(i).to_i - (n - 1).quo(i).to_i }.
13
+ reduce(:+) * 2
14
+ @nod -= 1 if square_root.integer?
15
+ @nod
16
+ end
17
+
18
+
19
+ alias :number_of_divisors :τ
20
+ alias :d :τ
21
+ end
@@ -1,8 +1,5 @@
1
1
  class Integer
2
2
  def octagonal?
3
3
  n_gonal?(8)
4
- #return true if zero?
5
- #x = (Math.sqrt(48*self + 16) + 4)/12
6
- #x.to_i == x
7
4
  end
8
5
  end
data/lib/numb/ore.rb ADDED
@@ -0,0 +1,8 @@
1
+ class Integer
2
+ def ore?
3
+ div = divisors
4
+ Rational(div.size, div.map{|d| Rational(1, d)}.reduce(:+)).denominator == 1
5
+ end
6
+
7
+ alias :harmonic_divisor? :ore?
8
+ end
data/lib/numb/perfect.rb CHANGED
@@ -3,8 +3,6 @@ class Integer
3
3
  def perfect?
4
4
  return false if self < 6 or self.odd? or self.to_s !~ /(6|8)$/
5
5
  return false if self != 6 and digital_root != 1
6
- divisors = proper_positive_divisors
7
- return false unless (divisors.size + 1).even?
8
- divisors.reduce(:+) == self
6
+ k_perfect?(2)
9
7
  end
10
8
  end
@@ -3,7 +3,7 @@ class Integer
3
3
  def perfect_power?
4
4
  return false unless self > 0
5
5
  return true if self == 1
6
- divisors = positive_divisors
6
+ divisors = self.divisors
7
7
  (2..Math.log2(self)).any? { |pow| divisors.any? {|div| (div ** pow) == self} }
8
8
  end
9
9
  end
@@ -0,0 +1,5 @@
1
+ class Integer
2
+ def poulet?
3
+ fermat_pseudoprime? 2
4
+ end
5
+ end
data/lib/numb/powerful.rb CHANGED
@@ -2,7 +2,7 @@
2
2
  class Integer
3
3
  def powerful?
4
4
  return false unless self > 0
5
- divisors = positive_divisors
5
+ divisors = self.divisors
6
6
  divisors.select {|d| d.prime? }.all?{|prime| divisors.include? (prime ** 2)}
7
7
  end
8
8
  end
@@ -0,0 +1,16 @@
1
+ # coding: utf-8
2
+ class Integer
3
+ # Algorithm derived from Formulas for pi(n) and the n-th prime by Sebastian
4
+ # Martin Ruiz and Jonathan Sondow [arXiv:math/0210312v2 [math.NT]]
5
+
6
+ # Returns the number of primes equal to or less than self
7
+ def π
8
+ x = self
9
+ return 0 if x == 1
10
+ @prime_count ||= ([2] + (3..x).select(&:odd?)).map do |j|
11
+ 1 + ( ((2 - j.τ)/j).floor ).floor
12
+ end.reduce(:+)
13
+ end
14
+ alias :prime_pi :π
15
+ alias :prime_count :π
16
+ end
@@ -0,0 +1,5 @@
1
+ class Integer
2
+ def prime_signature
3
+ prime_division.map{|base, exponent| exponent}.sort.reverse
4
+ end
5
+ end
@@ -1,5 +1,5 @@
1
1
  class Integer
2
2
  def primitive_pseudoperfect?
3
- pseudoperfect? and proper_positive_divisors.sort.none?(&:pseudoperfect?)
3
+ pseudoperfect? and proper_divisors.sort.none?(&:pseudoperfect?)
4
4
  end
5
5
  end
@@ -0,0 +1,26 @@
1
+ require 'prime'
2
+ class Integer
3
+ def primorial?
4
+ return true if self == 1
5
+ pd = prime_division
6
+ (pd.map{|b,e| e}.uniq == [1]) and (pd.map{|b,e| b} == Prime.first(pd.size))
7
+ end
8
+
9
+ def primorial_product?
10
+ return true if primorial?
11
+ return false if prime?
12
+ divisors.each_slice(2).
13
+ reject{|pair| pair == [1, self]}.
14
+ any?{|pair| pair.all?(&:primorial_product?)}
15
+ end
16
+
17
+ def primorial
18
+ return nil if self < 1
19
+ return 1 if self == 1
20
+ if prime?
21
+ self * (self - 1).primorial
22
+ else
23
+ (self - 1).primorial
24
+ end
25
+ end
26
+ end
data/lib/numb/proth.rb ADDED
@@ -0,0 +1,12 @@
1
+ class Integer
2
+ def proth?
3
+ return false if self < 3
4
+ n_max = Math.log2(self-1).ceil
5
+ (1..(self / n_max)).select{|k| k.odd?}.any? do |k|
6
+ (1..n_max).select{|n| 2**n > k}.any? do |n|
7
+ break if (x = (k * (2**n)) + 1) > self
8
+ x == self
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ # coding: utf-8
2
+ class Integer
3
+ def refactorable?
4
+ divides?(τ)
5
+ end
6
+ alias :tau? :refactorable?
7
+ end
@@ -0,0 +1,5 @@
1
+ class Integer
2
+ def repunit?(base)
3
+ !!to_s(base).match(/^1+$/)
4
+ end
5
+ end
data/lib/numb/rough.rb ADDED
@@ -0,0 +1,5 @@
1
+ class Integer
2
+ def rough?(k)
3
+ prime_factors.all?{|f| f >= k}
4
+ end
5
+ end
@@ -3,9 +3,9 @@ class Integer
3
3
  def semiperfect?
4
4
  return false if deficient?
5
5
  return true if perfect?
6
- possibles, divisors = { 0 => true}, proper_positive_divisors
7
- proper_sod = (sod = sum_of_divisors || 0) - self
8
- divisors.reverse.each do |divisor|
6
+ possibles = { 0 => true}
7
+ proper_sod = (sod = σ || 0) - self
8
+ proper_divisors.reverse.each do |divisor|
9
9
  possibles.keys.each do |possible|
10
10
  possibles.delete(possible) if possible + sod < self
11
11
  x = possible + divisor