numb 0.21.0 → 0.63.0

Sign up to get free protection for your applications and to get access to all the features.
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