numb 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +5 -0
- data/LICENSE +20 -0
- data/README.rdoc +10 -0
- data/Rakefile +52 -0
- data/VERSION +1 -0
- data/lib/numb/abundant.rb +20 -0
- data/lib/numb/achilles.rb +15 -0
- data/lib/numb/automorphic.rb +24 -0
- data/lib/numb/carol.rb +21 -0
- data/lib/numb/deficient.rb +19 -0
- data/lib/numb/dihedral_prime.rb +25 -0
- data/lib/numb/dudeney.rb +15 -0
- data/lib/numb/economical.rb +16 -0
- data/lib/numb/emrip.rb +17 -0
- data/lib/numb/equidigital.rb +18 -0
- data/lib/numb/extravagant.rb +18 -0
- data/lib/numb/factorion.rb +15 -0
- data/lib/numb/frugal.rb +16 -0
- data/lib/numb/happy.rb +15 -0
- data/lib/numb/harshad.rb +8 -0
- data/lib/numb/hilbert.rb +7 -0
- data/lib/numb/hyperperfect.rb +7 -0
- data/lib/numb/impolite.rb +6 -0
- data/lib/numb/kaprekar.rb +14 -0
- data/lib/numb/keith.rb +15 -0
- data/lib/numb/kynea.rb +9 -0
- data/lib/numb/mms_pair.rb +11 -0
- data/lib/numb/mobius.rb +11 -0
- data/lib/numb/narcissistic.rb +8 -0
- data/lib/numb/nivenmorphic.rb +9 -0
- data/lib/numb/ordinal.rb +11 -0
- data/lib/numb/parasitic.rb +10 -0
- data/lib/numb/perfect.rb +10 -0
- data/lib/numb/perfect_power.rb +9 -0
- data/lib/numb/polite.rb +7 -0
- data/lib/numb/polydivisible.rb +10 -0
- data/lib/numb/powerful.rb +8 -0
- data/lib/numb/practical.rb +26 -0
- data/lib/numb/prime.rb +495 -0
- data/lib/numb/ruby1.8.rb +9 -0
- data/lib/numb/ruby1.9.rb +8 -0
- data/lib/numb/self.rb +13 -0
- data/lib/numb/self_descriptive.rb +9 -0
- data/lib/numb/semi_perfect.rb +15 -0
- data/lib/numb/semiprime.rb +6 -0
- data/lib/numb/smarandache_wellin.rb +11 -0
- data/lib/numb/smith.rb +7 -0
- data/lib/numb/sphenic.rb +8 -0
- data/lib/numb/square.rb +8 -0
- data/lib/numb/square_free.rb +6 -0
- data/lib/numb/triangular.rb +8 -0
- data/lib/numb/trimorphic.rb +6 -0
- data/lib/numb/undulating.rb +11 -0
- data/lib/numb/vampire.rb +11 -0
- data/lib/numb/weird.rb +8 -0
- data/lib/numb.rb +80 -0
- data/numb.gemspec +201 -0
- data/spec/abundant_spec.rb +24 -0
- data/spec/achilles_spec.rb +24 -0
- data/spec/automorphic_spec.rb +208 -0
- data/spec/carol_spec.rb +18 -0
- data/spec/deficient_spec.rb +23 -0
- data/spec/digital_sum_spec.rb +8 -0
- data/spec/dihedral_prime_spec.rb +38 -0
- data/spec/dudeney_spec.rb +14 -0
- data/spec/economical_spec.rb +28 -0
- data/spec/emrip_spec.rb +26 -0
- data/spec/equidigital_spec.rb +27 -0
- data/spec/extravagant_spec.rb +20 -0
- data/spec/factor_spec.rb +22 -0
- data/spec/factorion_spec.rb +13 -0
- data/spec/frugal_spec.rb +20 -0
- data/spec/happy_spec.rb +24 -0
- data/spec/harshad_spec.rb +25 -0
- data/spec/hilbert_spec.rb +24 -0
- data/spec/hyperperfect_spec.rb +59 -0
- data/spec/kaprekar_spec.rb +25 -0
- data/spec/keith_spec.rb +21 -0
- data/spec/kynea_spec.rb +19 -0
- data/spec/maris_mcgwire_sosa_pair_spec.rb +20 -0
- data/spec/mobius_spec.rb +52 -0
- data/spec/narcissistic_spec.rb +18 -0
- data/spec/nivenmorphic_spec.rb +24 -0
- data/spec/number_of_distinct_prime_factors_spec.rb +35 -0
- data/spec/number_of_prime_factors_spec.rb +32 -0
- data/spec/ordinal_spec.rb +64 -0
- data/spec/parasitic_spec.rb +29 -0
- data/spec/perfect_power_spec.rb +24 -0
- data/spec/perfect_spec.rb +103 -0
- data/spec/polite_spec.rb +14 -0
- data/spec/politeness_spec.rb +11 -0
- data/spec/polydivisible_spec.rb +19 -0
- data/spec/powerful_spec.rb +25 -0
- data/spec/practical_spec.rb +30 -0
- data/spec/self_descriptive_spec.rb +19 -0
- data/spec/self_spec.rb +20 -0
- data/spec/semi_perfect_spec.rb +24 -0
- data/spec/semiprime_spec.rb +21 -0
- data/spec/smarandache_wellin_spec.rb +26 -0
- data/spec/smith_spec.rb +19 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/sphenic_spec.rb +20 -0
- data/spec/square_free_spec.rb +19 -0
- data/spec/square_spec.rb +24 -0
- data/spec/triangular_spec.rb +19 -0
- data/spec/trimorphic_spec.rb +25 -0
- data/spec/undulating_spec.rb +20 -0
- data/spec/vampire_spec.rb +19 -0
- data/spec/weird_spec.rb +24 -0
- metadata +216 -0
data/lib/numb.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'backports'
|
5
|
+
|
6
|
+
libs = %w{abundant achilles automorphic carol deficient dihedral_prime dudeney
|
7
|
+
economical emrip equidigital extravagant factorion frugal happy
|
8
|
+
harshad hilbert hyperperfect impolite kaprekar keith kynea mms_pair mobius
|
9
|
+
narcissistic nivenmorphic ordinal parasitic perfect perfect_power polite
|
10
|
+
polydivisible powerful practical self self_descriptive semi_perfect semiprime
|
11
|
+
smarandache_wellin smith sphenic square square_free triangular trimorphic
|
12
|
+
undulating vampire weird
|
13
|
+
}
|
14
|
+
|
15
|
+
class Integer
|
16
|
+
|
17
|
+
def number_of_distinct_prime_factors
|
18
|
+
prime_factors.uniq.size
|
19
|
+
end
|
20
|
+
alias :omega :number_of_distinct_prime_factors
|
21
|
+
|
22
|
+
def number_of_prime_factors
|
23
|
+
prime_factors.size
|
24
|
+
end
|
25
|
+
alias :bigomega :number_of_prime_factors
|
26
|
+
|
27
|
+
def prime_factors
|
28
|
+
return [] if zero?
|
29
|
+
prime_division.map{|pair| [pair.first] * pair.last}.flatten
|
30
|
+
end
|
31
|
+
|
32
|
+
def politeness
|
33
|
+
positive_divisors.select{|d| d > 1}.select{|d| d.odd?}.size
|
34
|
+
end
|
35
|
+
|
36
|
+
def proper_positive_divisors
|
37
|
+
positive_divisors.reject {|d| d == self }
|
38
|
+
end
|
39
|
+
|
40
|
+
def positive_divisors
|
41
|
+
return [] unless self >= 0
|
42
|
+
(1..Math.sqrt(self).floor).select { |n| (self % n).zero? }.
|
43
|
+
map {|n| [n, self/n]}.flatten.uniq
|
44
|
+
end
|
45
|
+
|
46
|
+
def sum_of_divisors
|
47
|
+
positive_divisors.reduce(:+)
|
48
|
+
end
|
49
|
+
|
50
|
+
def digital_root
|
51
|
+
self == 0 ? 0 : 1 + ((self - 1) % 9)
|
52
|
+
end
|
53
|
+
|
54
|
+
def digital_sum
|
55
|
+
digits.reduce(:+)
|
56
|
+
end
|
57
|
+
alias :sum_of_digits :digital_sum
|
58
|
+
alias :sod :digital_sum
|
59
|
+
|
60
|
+
def digits
|
61
|
+
self.to_s.split(//).map{|d| d.to_i}
|
62
|
+
end
|
63
|
+
|
64
|
+
def factor?(n)
|
65
|
+
return false if n == 0
|
66
|
+
(self % n) == 0
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
begin
|
71
|
+
require 'prime'
|
72
|
+
libs << 'ruby1.9'
|
73
|
+
rescue LoadError
|
74
|
+
libs.unshift('ruby1.8','prime')
|
75
|
+
end
|
76
|
+
|
77
|
+
libs.each do |predicate|
|
78
|
+
require_relative "numb/#{predicate}"
|
79
|
+
end
|
80
|
+
|
data/numb.gemspec
ADDED
@@ -0,0 +1,201 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{numb}
|
8
|
+
s.version = "0.3.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Run Paint Run Run"]
|
12
|
+
s.date = %q{2009-12-31}
|
13
|
+
s.email = %q{runrun@runpaint.org}
|
14
|
+
s.extra_rdoc_files = [
|
15
|
+
"LICENSE",
|
16
|
+
"README.rdoc"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
".document",
|
20
|
+
".gitignore",
|
21
|
+
"LICENSE",
|
22
|
+
"README.rdoc",
|
23
|
+
"Rakefile",
|
24
|
+
"VERSION",
|
25
|
+
"lib/numb.rb",
|
26
|
+
"lib/numb/abundant.rb",
|
27
|
+
"lib/numb/achilles.rb",
|
28
|
+
"lib/numb/automorphic.rb",
|
29
|
+
"lib/numb/carol.rb",
|
30
|
+
"lib/numb/deficient.rb",
|
31
|
+
"lib/numb/dihedral_prime.rb",
|
32
|
+
"lib/numb/dudeney.rb",
|
33
|
+
"lib/numb/economical.rb",
|
34
|
+
"lib/numb/emrip.rb",
|
35
|
+
"lib/numb/equidigital.rb",
|
36
|
+
"lib/numb/extravagant.rb",
|
37
|
+
"lib/numb/factorion.rb",
|
38
|
+
"lib/numb/frugal.rb",
|
39
|
+
"lib/numb/happy.rb",
|
40
|
+
"lib/numb/harshad.rb",
|
41
|
+
"lib/numb/hilbert.rb",
|
42
|
+
"lib/numb/hyperperfect.rb",
|
43
|
+
"lib/numb/impolite.rb",
|
44
|
+
"lib/numb/kaprekar.rb",
|
45
|
+
"lib/numb/keith.rb",
|
46
|
+
"lib/numb/kynea.rb",
|
47
|
+
"lib/numb/mms_pair.rb",
|
48
|
+
"lib/numb/mobius.rb",
|
49
|
+
"lib/numb/narcissistic.rb",
|
50
|
+
"lib/numb/nivenmorphic.rb",
|
51
|
+
"lib/numb/ordinal.rb",
|
52
|
+
"lib/numb/parasitic.rb",
|
53
|
+
"lib/numb/perfect.rb",
|
54
|
+
"lib/numb/perfect_power.rb",
|
55
|
+
"lib/numb/polite.rb",
|
56
|
+
"lib/numb/polydivisible.rb",
|
57
|
+
"lib/numb/powerful.rb",
|
58
|
+
"lib/numb/practical.rb",
|
59
|
+
"lib/numb/prime.rb",
|
60
|
+
"lib/numb/ruby1.8.rb",
|
61
|
+
"lib/numb/ruby1.9.rb",
|
62
|
+
"lib/numb/self.rb",
|
63
|
+
"lib/numb/self_descriptive.rb",
|
64
|
+
"lib/numb/semi_perfect.rb",
|
65
|
+
"lib/numb/semiprime.rb",
|
66
|
+
"lib/numb/smarandache_wellin.rb",
|
67
|
+
"lib/numb/smith.rb",
|
68
|
+
"lib/numb/sphenic.rb",
|
69
|
+
"lib/numb/square.rb",
|
70
|
+
"lib/numb/square_free.rb",
|
71
|
+
"lib/numb/triangular.rb",
|
72
|
+
"lib/numb/trimorphic.rb",
|
73
|
+
"lib/numb/undulating.rb",
|
74
|
+
"lib/numb/vampire.rb",
|
75
|
+
"lib/numb/weird.rb",
|
76
|
+
"numb.gemspec",
|
77
|
+
"spec/abundant_spec.rb",
|
78
|
+
"spec/achilles_spec.rb",
|
79
|
+
"spec/automorphic_spec.rb",
|
80
|
+
"spec/carol_spec.rb",
|
81
|
+
"spec/deficient_spec.rb",
|
82
|
+
"spec/digital_sum_spec.rb",
|
83
|
+
"spec/dihedral_prime_spec.rb",
|
84
|
+
"spec/dudeney_spec.rb",
|
85
|
+
"spec/economical_spec.rb",
|
86
|
+
"spec/emrip_spec.rb",
|
87
|
+
"spec/equidigital_spec.rb",
|
88
|
+
"spec/extravagant_spec.rb",
|
89
|
+
"spec/factor_spec.rb",
|
90
|
+
"spec/factorion_spec.rb",
|
91
|
+
"spec/frugal_spec.rb",
|
92
|
+
"spec/happy_spec.rb",
|
93
|
+
"spec/harshad_spec.rb",
|
94
|
+
"spec/hilbert_spec.rb",
|
95
|
+
"spec/hyperperfect_spec.rb",
|
96
|
+
"spec/kaprekar_spec.rb",
|
97
|
+
"spec/keith_spec.rb",
|
98
|
+
"spec/kynea_spec.rb",
|
99
|
+
"spec/maris_mcgwire_sosa_pair_spec.rb",
|
100
|
+
"spec/mobius_spec.rb",
|
101
|
+
"spec/narcissistic_spec.rb",
|
102
|
+
"spec/nivenmorphic_spec.rb",
|
103
|
+
"spec/number_of_distinct_prime_factors_spec.rb",
|
104
|
+
"spec/number_of_prime_factors_spec.rb",
|
105
|
+
"spec/ordinal_spec.rb",
|
106
|
+
"spec/parasitic_spec.rb",
|
107
|
+
"spec/perfect_power_spec.rb",
|
108
|
+
"spec/perfect_spec.rb",
|
109
|
+
"spec/polite_spec.rb",
|
110
|
+
"spec/politeness_spec.rb",
|
111
|
+
"spec/polydivisible_spec.rb",
|
112
|
+
"spec/powerful_spec.rb",
|
113
|
+
"spec/practical_spec.rb",
|
114
|
+
"spec/self_descriptive_spec.rb",
|
115
|
+
"spec/self_spec.rb",
|
116
|
+
"spec/semi_perfect_spec.rb",
|
117
|
+
"spec/semiprime_spec.rb",
|
118
|
+
"spec/smarandache_wellin_spec.rb",
|
119
|
+
"spec/smith_spec.rb",
|
120
|
+
"spec/spec_helper.rb",
|
121
|
+
"spec/sphenic_spec.rb",
|
122
|
+
"spec/square_free_spec.rb",
|
123
|
+
"spec/square_spec.rb",
|
124
|
+
"spec/triangular_spec.rb",
|
125
|
+
"spec/trimorphic_spec.rb",
|
126
|
+
"spec/undulating_spec.rb",
|
127
|
+
"spec/vampire_spec.rb",
|
128
|
+
"spec/weird_spec.rb"
|
129
|
+
]
|
130
|
+
s.homepage = %q{http://github.com/runpaint/numb}
|
131
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
132
|
+
s.require_paths = ["lib"]
|
133
|
+
s.required_ruby_version = Gem::Requirement.new(">= 1.9.1")
|
134
|
+
s.rubygems_version = %q{1.3.5}
|
135
|
+
s.summary = %q{Experiments in number theory with new predicate methods for Integer.}
|
136
|
+
s.test_files = [
|
137
|
+
"spec/economical_spec.rb",
|
138
|
+
"spec/polydivisible_spec.rb",
|
139
|
+
"spec/equidigital_spec.rb",
|
140
|
+
"spec/nivenmorphic_spec.rb",
|
141
|
+
"spec/dudeney_spec.rb",
|
142
|
+
"spec/square_free_spec.rb",
|
143
|
+
"spec/abundant_spec.rb",
|
144
|
+
"spec/self_spec.rb",
|
145
|
+
"spec/square_spec.rb",
|
146
|
+
"spec/ordinal_spec.rb",
|
147
|
+
"spec/perfect_spec.rb",
|
148
|
+
"spec/perfect_power_spec.rb",
|
149
|
+
"spec/polite_spec.rb",
|
150
|
+
"spec/automorphic_spec.rb",
|
151
|
+
"spec/hyperperfect_spec.rb",
|
152
|
+
"spec/spec_helper.rb",
|
153
|
+
"spec/kynea_spec.rb",
|
154
|
+
"spec/factor_spec.rb",
|
155
|
+
"spec/emrip_spec.rb",
|
156
|
+
"spec/smith_spec.rb",
|
157
|
+
"spec/vampire_spec.rb",
|
158
|
+
"spec/dihedral_prime_spec.rb",
|
159
|
+
"spec/sphenic_spec.rb",
|
160
|
+
"spec/practical_spec.rb",
|
161
|
+
"spec/parasitic_spec.rb",
|
162
|
+
"spec/number_of_prime_factors_spec.rb",
|
163
|
+
"spec/frugal_spec.rb",
|
164
|
+
"spec/semiprime_spec.rb",
|
165
|
+
"spec/deficient_spec.rb",
|
166
|
+
"spec/happy_spec.rb",
|
167
|
+
"spec/triangular_spec.rb",
|
168
|
+
"spec/semi_perfect_spec.rb",
|
169
|
+
"spec/smarandache_wellin_spec.rb",
|
170
|
+
"spec/maris_mcgwire_sosa_pair_spec.rb",
|
171
|
+
"spec/trimorphic_spec.rb",
|
172
|
+
"spec/harshad_spec.rb",
|
173
|
+
"spec/carol_spec.rb",
|
174
|
+
"spec/powerful_spec.rb",
|
175
|
+
"spec/weird_spec.rb",
|
176
|
+
"spec/number_of_distinct_prime_factors_spec.rb",
|
177
|
+
"spec/digital_sum_spec.rb",
|
178
|
+
"spec/factorion_spec.rb",
|
179
|
+
"spec/undulating_spec.rb",
|
180
|
+
"spec/extravagant_spec.rb",
|
181
|
+
"spec/self_descriptive_spec.rb",
|
182
|
+
"spec/kaprekar_spec.rb",
|
183
|
+
"spec/hilbert_spec.rb",
|
184
|
+
"spec/keith_spec.rb",
|
185
|
+
"spec/narcissistic_spec.rb",
|
186
|
+
"spec/achilles_spec.rb",
|
187
|
+
"spec/politeness_spec.rb",
|
188
|
+
"spec/mobius_spec.rb"
|
189
|
+
]
|
190
|
+
|
191
|
+
if s.respond_to? :specification_version then
|
192
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
193
|
+
s.specification_version = 3
|
194
|
+
|
195
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
196
|
+
else
|
197
|
+
end
|
198
|
+
else
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
describe Integer, "#abundant?" do
|
2
|
+
ABUNDANT = [12,18,20,24,30,36,40,42,48,54,56,60,66,70,72,78,
|
3
|
+
80,84,88,90,96,100,102,104,108,112,114,120,126,
|
4
|
+
132,138,140,144,150,156,160,162,168,174,176,180,
|
5
|
+
186,192,196,198,200,204,208,210,216,220,222,224,
|
6
|
+
228,234,240,246,252,258,260,264,270]
|
7
|
+
it "returns true if the number is abundant" do
|
8
|
+
ABUNDANT.each do |number|
|
9
|
+
number.should be_abundant
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
it "returns false if the number is not abundant" do
|
14
|
+
((1..270).to_a - ABUNDANT).each do |number|
|
15
|
+
number.should_not be_abundant
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it "returns false if the number is negative" do
|
20
|
+
(1..270).each do |number|
|
21
|
+
(-number).should_not be_abundant
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
describe Integer, "achilles?" do
|
2
|
+
ACHILLES = [72,108,200,288,392,432,500,648,675,800,864,968,
|
3
|
+
972,1125,1152,1323,1352,1372,1568,1800,1944,2000,
|
4
|
+
2312,2592,2700,2888,3087,3200,3267,3456,3528,3872,
|
5
|
+
3888,4000,4232,4500,4563,4608,5000,5292,5324,5400,
|
6
|
+
5408,5488]
|
7
|
+
it "returns true for Achilles numbers" do
|
8
|
+
ACHILLES.each do |number|
|
9
|
+
number.should be_achilles
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
it "returns false for non-Achilles numbers" do
|
14
|
+
((1..5487).to_a - ACHILLES).sample(10).each do |number|
|
15
|
+
number.should_not be_achilles
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it "returns false for negative numbers" do
|
20
|
+
(1..5487).each do |number|
|
21
|
+
(-number).should_not be_achilles
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,208 @@
|
|
1
|
+
describe Integer, "#automorphic?" do
|
2
|
+
|
3
|
+
AUTOMORPHIC = (
|
4
|
+
# http://www.research.att.com/~njas/sequences/A016090
|
5
|
+
[6,76,376,9376,9376,109376,7109376,87109376,
|
6
|
+
787109376,1787109376,81787109376,81787109376,
|
7
|
+
81787109376,40081787109376,740081787109376,
|
8
|
+
3740081787109376,43740081787109376,
|
9
|
+
743740081787109376] +
|
10
|
+
# http://www.research.att.com/~njas/sequences/A007185
|
11
|
+
[5,25,625,625,90625,890625,2890625,12890625,
|
12
|
+
212890625,8212890625,18212890625,918212890625,
|
13
|
+
9918212890625,59918212890625,259918212890625,
|
14
|
+
6259918212890625,56259918212890625,
|
15
|
+
256259918212890625] +
|
16
|
+
# http://www.research.att.com/~njas/sequences/A003226
|
17
|
+
[0,1,5,6,25,76,376,625,9376,90625,109376,890625,
|
18
|
+
2890625,7109376,12890625,87109376,212890625,
|
19
|
+
787109376,1787109376,8212890625,18212890625,
|
20
|
+
81787109376,918212890625,9918212890625,
|
21
|
+
40081787109376,59918212890625]
|
22
|
+
).uniq
|
23
|
+
|
24
|
+
it "returns true for automorphic numbers" do
|
25
|
+
AUTOMORPHIC.each do |n|
|
26
|
+
n.should be_automorphic
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it "returns false for negative automorphic numbers" do
|
31
|
+
(AUTOMORPHIC - [0]).each do |n|
|
32
|
+
(-n).should_not be_automorphic
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
it "returns false for non-automorphic numbers" do
|
37
|
+
[2,4,626, 100228].each do |n|
|
38
|
+
n.should_not be_automorphic
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
it "returns false for negative numbers" do
|
43
|
+
[2,4,626, 100228].each do |n|
|
44
|
+
(-n).should_not be_automorphic
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
it "accepts an optional argument for n" do
|
49
|
+
lambda { 3.automorphic?(2) }.should_not raise_error(ArgumentError)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "returns true if the number is 2-automorphic and 2 is given as an argument" do
|
53
|
+
# http://www.research.att.com/~njas/sequences/A030984
|
54
|
+
[8,88,688,4688,54688,554688,3554688,93554688,
|
55
|
+
893554688,893554688,40893554688,40893554688,
|
56
|
+
40893554688,70040893554688,870040893554688,
|
57
|
+
1870040893554688,71870040893554688,
|
58
|
+
871870040893554688].each do |number|
|
59
|
+
number.automorphic?(2).should be_true
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
it "returns false if the number is not 2-automorphic and 2 is given as an argument" do
|
64
|
+
[6, 13, 93, 552, 5003, 2827220126666].each do |number|
|
65
|
+
number.automorphic?(2).should be_false
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
it "returns true if the number is 3-automorphic and 3 is given as an argument" do
|
70
|
+
(
|
71
|
+
# http://www.research.att.com/~njas/sequences/A030986
|
72
|
+
[5,75,875,6875,96875,296875,4296875,4296875,
|
73
|
+
404296875,9404296875,39404296875,639404296875,
|
74
|
+
6639404296875,86639404296875,86639404296875,
|
75
|
+
2086639404296875,52086639404296875] +
|
76
|
+
# http://www.research.att.com/~njas/sequences/A030985
|
77
|
+
[2,92,792,9792,69792,369792,2369792,62369792,
|
78
|
+
262369792,7262369792,27262369792,27262369792,
|
79
|
+
27262369792,80027262369792,580027262369792,
|
80
|
+
4580027262369792,14580027262369792,
|
81
|
+
914580027262369792]
|
82
|
+
).each do |number|
|
83
|
+
number.automorphic?(3).should be_true
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
it "returns false if the number is not 3-automorphic and 3 is given as an argument" do
|
88
|
+
[6, 13, 93, 55, 5003, 2827220126666].each do |number|
|
89
|
+
number.automorphic?(3).should be_false
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
it "returns true if the number is 4-automorphic and 4 is given as an argument" do
|
94
|
+
# http://www.research.att.com/~njas/sequences/A030987
|
95
|
+
[4,44,344,7344,77344,777344,6777344,46777344,
|
96
|
+
446777344,446777344,20446777344,20446777344,
|
97
|
+
5020446777344,35020446777344,935020446777344,
|
98
|
+
5935020446777344,35935020446777344].each do |number|
|
99
|
+
number.automorphic?(4).should be_true
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
it "returns false if the number is not 4-automorphic and 4 is given as an argument" do
|
104
|
+
[6, 14, 97, 55, 5000, 2827220126666].each do |number|
|
105
|
+
number.automorphic?(4).should be_false
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
it "returns true if the number is 5-automorphic and 5 is given as an argument" do
|
110
|
+
# http://www.research.att.com/~njas/sequences/A030988
|
111
|
+
[5,25,125,8125,78125,578125,2578125,42578125,
|
112
|
+
642578125,3642578125,83642578125,983642578125,
|
113
|
+
1983642578125,51983642578125,251983642578125,
|
114
|
+
1251983642578125,51251983642578125].each do |number|
|
115
|
+
number.automorphic?(5).should be_true
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
it "returns false if the number is not 5-automorphic and 5 is given as an argument" do
|
120
|
+
[6, 97, 55, 5000, 2827220126666].each do |number|
|
121
|
+
number.automorphic?(5).should be_false
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
it "returns true if the number is 6-automorphic and 6 is given as an argument" do
|
126
|
+
# http://www.research.att.com/~njas/sequences/A030989
|
127
|
+
[6,96,896,4896,84896,184896,1184896,31184896,
|
128
|
+
631184896,3631184896,13631184896,13631184896,
|
129
|
+
13631184896,90013631184896,290013631184896,
|
130
|
+
7290013631184896,57290013631184896,
|
131
|
+
957290013631184896].each do |number|
|
132
|
+
number.automorphic?(6).should be_true
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
it "returns false if the number is not 6-automorphic and 6 is given as an argument" do
|
137
|
+
[5, 97, 5000, 2827220126666].each do |number|
|
138
|
+
number.automorphic?(6).should be_false
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
it "returns true if the number is 7-automorphic and 7 is given as an argument" do
|
143
|
+
(
|
144
|
+
# http://www.research.att.com/~njas/sequences/A030993
|
145
|
+
[3,43,143,7143,57143,857143,2857143,42857143,
|
146
|
+
142857143,7142857143,57142857143,857142857143,
|
147
|
+
2857142857143,42857142857143,142857142857143,
|
148
|
+
7142857142857143,57142857142857143] +
|
149
|
+
# http://www.research.att.com/~njas/sequences/A030991
|
150
|
+
[5,75,375,4375,84375,984375,8984375,58984375,
|
151
|
+
458984375,5458984375,45458984375,845458984375,
|
152
|
+
2845458984375,22845458984375,322845458984375,
|
153
|
+
2322845458984375,22322845458984375] +
|
154
|
+
# http://www.research.att.com/~njas/sequences/A030992
|
155
|
+
[8,68,768,2768,72768,872768,3872768,83872768,
|
156
|
+
683872768,1683872768,11683872768,11683872768,
|
157
|
+
11683872768,20011683872768,820011683872768,
|
158
|
+
4820011683872768,34820011683872768,
|
159
|
+
534820011683872768]
|
160
|
+
).each do |number|
|
161
|
+
number.automorphic?(7).should be_true
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
it "returns false if the number is not 7-automorphic and 7 is given as an argument" do
|
166
|
+
[2,71,3263,71526675754123263].each do |number|
|
167
|
+
number.automorphic?(7).should be_false
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
it "returns true if the number is 8-automorphic and 8 is given as an argument" do
|
172
|
+
# http://www.research.att.com/~njas/sequences/A030993
|
173
|
+
[2,72,672,8672,88672,388672,3388672,23388672,
|
174
|
+
223388672,223388672,10223388672,510223388672,
|
175
|
+
7510223388672,67510223388672,967510223388672,
|
176
|
+
7967510223388672,67967510223388672].each do |number|
|
177
|
+
number.automorphic?(8).should be_true
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
it "returns false if the number is not 8-automorphic and 8 is given as an argument" do
|
182
|
+
[3,71,3263,71526675754123263].each do |number|
|
183
|
+
number.automorphic?(8).should be_false
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
it "returns true if the number is 9-automorphic and 9 is given as an argument" do
|
188
|
+
# http://www.research.att.com/~njas/sequences/A030995
|
189
|
+
([5,25,625,5625,65625,765625,4765625,34765625,
|
190
|
+
134765625,3134765625,13134765625,213134765625,
|
191
|
+
2213134765625,62213134765625,362213134765625,
|
192
|
+
7362213134765625,17362213134765625] +
|
193
|
+
# http://www.research.att.com/~njas/sequences/A030994
|
194
|
+
[4,64,264,3264,23264,123264,4123264,54123264,
|
195
|
+
754123264,5754123264,75754123264,675754123264,
|
196
|
+
6675754123264,26675754123264,526675754123264,
|
197
|
+
1526675754123264,71526675754123264]).each do |number|
|
198
|
+
number.automorphic?(9).should be_true
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
it "returns false if the number is not 9-automorphic and 9 is given as an argument" do
|
203
|
+
[6,65,200,3263,71526675754123263].each do |number|
|
204
|
+
number.automorphic?(9).should be_false
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
data/spec/carol_spec.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
describe Integer, "#carol?" do
|
2
|
+
CAROL = [-1,7,47,223,959,3967,16127,65023,261119,1046527,
|
3
|
+
4190207,16769023,67092479,268402687,1073676287,
|
4
|
+
4294836223,17179607039,68718952447,274876858367,
|
5
|
+
1099509530623,4398042316799,17592177655807]
|
6
|
+
|
7
|
+
it "returns true for Carol numbers" do
|
8
|
+
CAROL.each do |number|
|
9
|
+
number.should be_carol
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
it "returns false for non-Carol numbers" do
|
14
|
+
((1..300).to_a - CAROL).each do |number|
|
15
|
+
number.should_not be_carol
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
describe Integer, "#deficient?" do
|
2
|
+
DEFICIENT = [1,2,3,4,5,7,8,9,10,11,13,14,15,16,17,19,21,22,23,
|
3
|
+
25,26,27,29,31,32,33,34,35,37,38,39,41,43,44,45,
|
4
|
+
46,47,49,50,51,52,53,55,57,58,59,61,62,63,64,65,
|
5
|
+
67,68,69,71,73,74,75,76,77,79,81,82,83,85,86]
|
6
|
+
it "returns true for deficient numbers" do
|
7
|
+
DEFICIENT.each do |number|
|
8
|
+
number.should be_deficient
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
it "returns false for non-deficient numbers" do
|
13
|
+
((1..86).to_a - DEFICIENT).each do |number|
|
14
|
+
number.should_not be_deficient
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it "returns false for negative numbers" do
|
19
|
+
(1..86).each do |number|
|
20
|
+
(-number).should_not be_deficient
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
describe Integer, "#dihedral_prime?" do
|
2
|
+
# http://www.research.att.com/~njas/sequences/A038136
|
3
|
+
DIHEDRAL_PRIME = ([2,11,101,181,1181,1811,18181,108881,110881,
|
4
|
+
118081,120121,121021,121151,150151,151051,151121,
|
5
|
+
180181,180811,181081,188011,188801,1008001,
|
6
|
+
1022201,1028011,1055501,1058011,1082801,1085801,
|
7
|
+
1088081] +
|
8
|
+
# http://www.research.att.com/~njas/sequences/A134996
|
9
|
+
[2,5,11,101,181,1181,1811,18181,108881,110881,
|
10
|
+
118081,120121,121021,121151,150151,151051,151121,
|
11
|
+
180181,180811,181081,188011,188801,1008001,
|
12
|
+
1022201,1028011,1055501,1058011,1082801,1085801,
|
13
|
+
1088081]).uniq
|
14
|
+
|
15
|
+
it "returns true for Dihedral primes" do
|
16
|
+
DIHEDRAL_PRIME.each do |number|
|
17
|
+
number.should be_dihedral_prime
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it "returns false for non-Dihedral primes" do
|
22
|
+
[6,12,4827290].each do |number|
|
23
|
+
number.should_not be_dihedral_prime
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it "returns false for primes which aren't Dihedral" do
|
28
|
+
[3,17,19].each do |number|
|
29
|
+
number.should_not be_dihedral_prime
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
it "returns false for non-primes which are Dihedral" do
|
34
|
+
[8, 808, 1101].each do |number|
|
35
|
+
number.should_not be_dihedral_prime
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
describe Integer, "#dudeney?" do
|
2
|
+
it "returns true for Dudeney numbers" do
|
3
|
+
# http://www.research.att.com/~njas/sequences/A061209
|
4
|
+
[1, 512, 4913, 5832, 17576, 19683].each do |number|
|
5
|
+
number.should be_dudeney
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
it "returns false for non-Dudeney numbers" do
|
10
|
+
[2, 511, 444444, 196833, 373627919182666355532718191].each do |number|
|
11
|
+
number.should_not be_dudeney
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
describe Integer, "#economical?" do
|
2
|
+
# http://www.research.att.com/~njas/sequences/A046759
|
3
|
+
FRUGAL = [125,128,243,256,343,512,625,729,1024,1029,1215,
|
4
|
+
1250,1280,1331,1369,1458,1536,1681,1701,1715,1792,
|
5
|
+
1849,1875,2048,2187,2197,2209,2401,2560,2809,3125,
|
6
|
+
3481,3584,3645,3721,4096,4374,4375,4489,4802,
|
7
|
+
4913]
|
8
|
+
# http://www.research.att.com/~njas/sequences/A046758
|
9
|
+
EQUIDIGITAL = [1,2,3,5,7,10,11,13,14,15,16,17,19,21,23,25,27,29,
|
10
|
+
31,32,35,37,41,43,47,49,53,59,61,64,67,71,73,79,
|
11
|
+
81,83,89,97,101,103,105,106,107,109,111,112,113,
|
12
|
+
115,118,119,121,122,123,127,129,131,133,134,135,
|
13
|
+
137,139]
|
14
|
+
|
15
|
+
ECONOMICAL = EQUIDIGITAL + FRUGAL
|
16
|
+
|
17
|
+
it "returns true for economical numbers" do
|
18
|
+
ECONOMICAL.each do |number|
|
19
|
+
number.should be_economical
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it "returns false for non-economical numbers" do
|
24
|
+
(((1..139).to_a - EQUIDIGITAL - FRUGAL)).each do |number|
|
25
|
+
number.should_not be_economical
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|