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.
- 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
|