numb 0.21.0 → 0.63.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +3 -2
- data/VERSION +1 -1
- data/lib/numb/abundancy.rb +6 -0
- data/lib/numb/abundant.rb +1 -1
- data/lib/numb/almost_perfect.rb +6 -0
- data/lib/numb/amicable.rb +8 -0
- data/lib/numb/aspiring.rb +19 -0
- data/lib/numb/centered_n_gonal.rb +9 -0
- data/lib/numb/centered_triangular.rb +5 -0
- data/lib/numb/congruum.rb +13 -0
- data/lib/numb/coprime.rb +9 -0
- data/lib/numb/core.rb +7 -0
- data/lib/numb/cototient.rb +7 -0
- data/lib/numb/d.rb +6 -0
- data/lib/numb/deficient.rb +1 -1
- data/lib/numb/fermat_pseudoprime.rb +9 -0
- data/lib/numb/friendly.rb +9 -0
- data/lib/numb/hexagonal.rb +1 -2
- data/lib/numb/highly_abundant.rb +7 -0
- data/lib/numb/highly_composite.rb +10 -0
- data/lib/numb/hyperperfect.rb +1 -1
- data/lib/numb/idoneal.rb +65 -0
- data/lib/numb/integer_p.rb +11 -0
- data/lib/numb/interprime.rb +6 -0
- data/lib/numb/jacobsthal_lucas.rb +10 -0
- data/lib/numb/k_perfect.rb +8 -0
- data/lib/numb/knodel.rb +12 -0
- data/lib/numb/leonardo.rb +13 -0
- data/lib/numb/leyland.rb +13 -0
- data/lib/numb/lucas_carmichael.rb +1 -1
- data/lib/numb/mersenne_prime.rb +5 -0
- data/lib/numb/minimal.rb +8 -0
- data/lib/numb/mobius.rb +5 -6
- data/lib/numb/n_gonal.rb +1 -2
- data/lib/numb/next_prev_prime.rb +13 -0
- data/lib/numb/noncototient.rb +9 -0
- data/lib/numb/nth_prime.rb +17 -0
- data/lib/numb/number_of_divisors.rb +21 -0
- data/lib/numb/octagonal.rb +0 -3
- data/lib/numb/ore.rb +8 -0
- data/lib/numb/perfect.rb +1 -3
- data/lib/numb/perfect_power.rb +1 -1
- data/lib/numb/poulet.rb +5 -0
- data/lib/numb/powerful.rb +1 -1
- data/lib/numb/prime_count.rb +16 -0
- data/lib/numb/prime_signature.rb +5 -0
- data/lib/numb/primitive_pseudoperfect.rb +1 -1
- data/lib/numb/primorial.rb +26 -0
- data/lib/numb/proth.rb +12 -0
- data/lib/numb/refactorable.rb +7 -0
- data/lib/numb/repunit.rb +5 -0
- data/lib/numb/rough.rb +5 -0
- data/lib/numb/semiperfect.rb +3 -3
- data/lib/numb/semiprime.rb +1 -1
- data/lib/numb/smooth.rb +5 -0
- data/lib/numb/sphenic.rb +1 -3
- data/lib/numb/square.rb +1 -2
- data/lib/numb/square_free.rb +1 -1
- data/lib/numb/sublime.rb +6 -0
- data/lib/numb/sum_of_squares.rb +116 -0
- data/lib/numb/superabundant.rb +8 -0
- data/lib/numb/superperfect.rb +6 -0
- data/lib/numb/totient.rb +10 -0
- data/lib/numb/unitary_divisor.rb +5 -0
- data/lib/numb/unitary_perfect.rb +7 -0
- data/lib/numb/untouchable.rb +14 -0
- data/lib/numb/zeisel.rb +13 -0
- data/lib/numb.rb +35 -28
- data/spec/abundancy_spec.rb +20 -0
- data/spec/abundant_spec.rb +15 -15
- data/spec/achilles_spec.rb +15 -15
- data/spec/almost_perfect_spec.rb +20 -0
- data/spec/amicable_spec.rb +25 -0
- data/spec/aspiring_spec.rb +16 -0
- data/spec/automorphic_spec.rb +106 -202
- data/spec/balanced_prime_spec.rb +14 -9
- data/spec/carmichael_spec.rb +7 -7
- data/spec/carol_spec.rb +11 -10
- data/spec/centered_n_gonal_spec.rb +66 -0
- data/spec/centered_triangular_spec.rb +20 -0
- data/spec/composite_spec.rb +13 -12
- data/spec/congruum_spec.rb +20 -0
- data/spec/coprime_spec.rb +26 -0
- data/spec/core_spec.rb +14 -0
- data/spec/cube_spec.rb +17 -13
- data/spec/d_spec.rb +21 -0
- data/spec/decagonal_spec.rb +13 -9
- data/spec/deficient_spec.rb +14 -14
- data/spec/dihedral_prime_spec.rb +24 -24
- data/spec/{factor_spec.rb → divides_spec.rb} +7 -7
- data/spec/dodecagonal_spec.rb +10 -8
- data/spec/dudeney_spec.rb +9 -7
- data/spec/economical_spec.rb +23 -20
- data/spec/emrip_spec.rb +12 -12
- data/spec/equidigital_spec.rb +15 -15
- data/spec/extravagant_spec.rb +12 -12
- data/spec/fermat_pseudoprime_spec.rb +78 -0
- data/spec/fibonacci_spec.rb +7 -7
- data/spec/friendly_spec.rb +38 -0
- data/spec/frugal_spec.rb +12 -12
- data/spec/happy_spec.rb +14 -14
- data/spec/harshad_spec.rb +17 -18
- data/spec/heptagonal_spec.rb +14 -9
- data/spec/hexagonal_spec.rb +13 -9
- data/spec/highly_abundant_spec.rb +20 -0
- data/spec/highly_composite_spec.rb +20 -0
- data/spec/hilbert_spec.rb +13 -14
- data/spec/hyperperfect_spec.rb +25 -55
- data/spec/idoneal_spec.rb +20 -0
- data/spec/integer_p_spec.rb +21 -0
- data/spec/interprime_spec.rb +21 -0
- data/spec/jacobsthal_lucas_spec.rb +20 -0
- data/spec/k_perfect.rb +40 -0
- data/spec/kaprekar_spec.rb +12 -11
- data/spec/keith_spec.rb +12 -12
- data/spec/knodel_spec.rb +49 -0
- data/spec/kynea_spec.rb +11 -11
- data/spec/leonardo_spec.rb +20 -0
- data/spec/leyland_spec.rb +20 -0
- data/spec/lucas_carmichael_spec.rb +14 -8
- data/spec/lucas_spec.rb +12 -10
- data/spec/maris_mcgwire_sosa_pair_spec.rb +12 -12
- data/spec/mersenne_prime_spec.rb +26 -0
- data/spec/minimal_spec.rb +19 -0
- data/spec/mobius_spec.rb +22 -37
- data/spec/myriagonal_spec.rb +9 -7
- data/spec/narcissistic_spec.rb +13 -11
- data/spec/nivenmorphic_spec.rb +21 -15
- data/spec/noncototient_spec.rb +19 -0
- data/spec/nth_prime_spec.rb +8 -0
- data/spec/number_of_distinct_prime_factors_spec.rb +21 -17
- data/spec/number_of_prime_factors_spec.rb +10 -16
- data/spec/ore_spec.rb +21 -0
- data/spec/perfect_spec.rb +10 -10
- data/spec/poulet_spec.rb +20 -0
- data/spec/prime_count_spec.rb +13 -0
- data/spec/prime_signature_spec.rb +70 -0
- data/spec/primorial_spec.rb +30 -0
- data/spec/proth_spec.rb +21 -0
- data/spec/refactorable_spec.rb +20 -0
- data/spec/repunit_spec.rb +25 -0
- data/spec/rough_spec.rb +70 -0
- data/spec/smooth_spec.rb +72 -0
- data/spec/spec_helper.rb +51 -1
- data/spec/square_free_spec.rb +2 -0
- data/spec/sublime_spec.rb +18 -0
- data/spec/sum_of_squares.rb +24 -0
- data/spec/superabundant_spec.rb +20 -0
- data/spec/superperfect_spec.rb +17 -0
- data/spec/totient_spec.rb +13 -0
- data/spec/unitary_divisor_spec.rb +32 -0
- data/spec/unitary_perfect.rb +14 -0
- data/spec/untouchable_spec.rb +19 -0
- data/spec/zeisel_spec.rb +20 -0
- metadata +144 -10
- data/lib/numb/prime.rb +0 -495
- data/lib/numb/ruby1.8.rb +0 -9
- 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'
|
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.
|
1
|
+
0.63.0
|
data/lib/numb/abundant.rb
CHANGED
@@ -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,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
|
data/lib/numb/coprime.rb
ADDED
data/lib/numb/core.rb
ADDED
data/lib/numb/d.rb
ADDED
data/lib/numb/deficient.rb
CHANGED
data/lib/numb/hexagonal.rb
CHANGED
@@ -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
|
data/lib/numb/hyperperfect.rb
CHANGED
data/lib/numb/idoneal.rb
ADDED
@@ -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
|
data/lib/numb/knodel.rb
ADDED
@@ -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
|
data/lib/numb/leyland.rb
ADDED
data/lib/numb/minimal.rb
ADDED
data/lib/numb/mobius.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
class Integer
|
3
3
|
def mobius
|
4
|
-
|
5
|
-
|
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
|
-
|
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,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
|
data/lib/numb/octagonal.rb
CHANGED
data/lib/numb/ore.rb
ADDED
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
|
-
|
7
|
-
return false unless (divisors.size + 1).even?
|
8
|
-
divisors.reduce(:+) == self
|
6
|
+
k_perfect?(2)
|
9
7
|
end
|
10
8
|
end
|
data/lib/numb/perfect_power.rb
CHANGED
data/lib/numb/poulet.rb
ADDED
data/lib/numb/powerful.rb
CHANGED
@@ -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,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
|
data/lib/numb/repunit.rb
ADDED
data/lib/numb/rough.rb
ADDED
data/lib/numb/semiperfect.rb
CHANGED
@@ -3,9 +3,9 @@ class Integer
|
|
3
3
|
def semiperfect?
|
4
4
|
return false if deficient?
|
5
5
|
return true if perfect?
|
6
|
-
possibles
|
7
|
-
proper_sod = (sod =
|
8
|
-
|
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
|