numb 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.0
1
+ 0.9.0
@@ -0,0 +1,5 @@
1
+ class Integer
2
+ def primitive_pseudoperfect?
3
+ pseudoperfect? and proper_positive_divisors.sort.none?(&:pseudoperfect?)
4
+ end
5
+ end
@@ -0,0 +1,20 @@
1
+ # coding: utf-8
2
+ class Integer
3
+ def semiperfect?
4
+ return false if deficient?
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|
9
+ possibles.keys.each do |possible|
10
+ possibles.delete(possible) if possible + sod < self
11
+ x = possible + divisor
12
+ return true if x == self or x == proper_sod
13
+ possibles[x] = true if x < self
14
+ end
15
+ sod -= divisor
16
+ end
17
+ false
18
+ end
19
+ alias :pseudoperfect? :semiperfect?
20
+ end
data/lib/numb/weird.rb CHANGED
@@ -3,6 +3,6 @@ class Integer
3
3
  def weird?
4
4
  return false unless self > 0
5
5
  return false if odd? && self < (10 ** 17)
6
- not semi_perfect? and abundant?
6
+ not semiperfect? and abundant?
7
7
  end
8
8
  end
data/lib/numb.rb CHANGED
@@ -5,10 +5,10 @@ libs = %w{abundant achilles automorphic balanced_prime carol composite deficient
5
5
  extravagant factorion frugal happy harshad hilbert hyperperfect
6
6
  impolite kaprekar keith kynea lucas lucas_carmichael mms_pair mobius
7
7
  narcissistic nivenmorphic ordinal parasitic perfect perfect_power
8
- polite polydivisible powerful practical pronic self self_descriptive
9
- semi_perfect semiprime smarandache_wellin smith sophie_germain_prime
10
- sphenic square square_free triangular trimorphic undulating vampire
11
- weird
8
+ polite polydivisible powerful practical primitive_pseudoperfect
9
+ pronic self self_descriptive semiperfect semiprime
10
+ smarandache_wellin smith sophie_germain_prime sphenic square
11
+ square_free triangular trimorphic undulating vampire weird
12
12
  }
13
13
 
14
14
  class Integer
@@ -0,0 +1,18 @@
1
+ describe Integer, "#primitive_pseudoperfect" do
2
+ PPP = [6,20,28,88,104,272,304,350,368,464,490,496,550,
3
+ 572,650,748,770,910,945,1184,1190,1312,1330,1376,
4
+ 1430,1504,1575,1610,1696,1870,1888,1952,2002,2030,
5
+ 2090,2170,2205,2210,2470,2530,2584,2590,2870,2990,
6
+ 3010,3128,3190,3230,3290,3410,3465,3496,3710,3770,
7
+ 3944,4070,4095,4130,4216,4270,4288,4408,4510,4544,
8
+ 4672,4690,4712,4730,4970]
9
+ it "returns true for primitive pseudoperfect numbers" do
10
+ PPP.shuffle.first(10).each{|_| _.should be_primitive_pseudoperfect}
11
+ end
12
+
13
+ it "returns true for primitive pseudoperfect numbers" do
14
+ ((1..PPP.max).to_a - PPP).shuffle.
15
+ first(10).
16
+ each{|_| _.should_not be_primitive_pseudoperfect}
17
+ end
18
+ end
@@ -1,4 +1,4 @@
1
- describe Integer, "#semi_perfect?" do
1
+ describe Integer, "#semiperfect?" do
2
2
  SEMI_PERFECT = [6,12,18,20,24,28,30,36,40,42,48,54,56,60,66,72,
3
3
  78,80,84,88,90,96,100,102,104,108,112,114,120,126,
4
4
  132,138,140,144,150,156,160,162,168,174,176,180,
@@ -6,19 +6,45 @@ describe Integer, "#semi_perfect?" do
6
6
  228,234,240,246,252,258,260,264]
7
7
  it "returns true if the number is semi-perfect" do
8
8
  SEMI_PERFECT.each do |number|
9
- number.should be_semi_perfect
9
+ number.should be_semiperfect
10
+ end
11
+ end
12
+
13
+ it "returns true if the number is a multiple of a known semi-perfect" do
14
+ (SEMI_PERFECT.combination(2).map{|_| _.reduce(:*)}.uniq - SEMI_PERFECT).
15
+ shuffle.first(15).each do |number|
16
+ number.should be_semiperfect
17
+ end
18
+ end
19
+
20
+ # Guy, R. K.
21
+ # "Almost Perfect, Quasi-Perfect, Pseudoperfect, Harmonic, Weird, Multiperfect and Hyperperfect Numbers."
22
+ # §B2 in Unsolved Problems in Number Theory, 2nd ed. New York: Springer-Verlag, pp. 45-53, 1994
23
+ it "returns true for 2**m * p (where m >= 1 && p.prime? && (p < 2**(m+1) && p > 2**m)" do
24
+ [[4, 17], [4, 19], [4, 23], [4, 29], [4, 31],
25
+ [5, 37], [5, 41], [5, 43], [5, 47], [5, 53], [5, 59], [5, 61],
26
+ [6, 67], [6, 71], [6, 73], [6, 79], [6, 83], [6, 89], [6, 97],
27
+ [6, 101],[6, 103],[6, 107],[6, 109],[6, 113],[6, 127]].shuffle.first(10).each do |m,p|
28
+ (2**m * p).should be_semiperfect
10
29
  end
11
30
  end
12
31
 
13
32
  it "returns false if the number is not semi-perfect" do
14
33
  ((1..263).to_a - SEMI_PERFECT).each do |number|
15
- number.should_not be_semi_perfect
34
+ number.should_not be_semiperfect
16
35
  end
17
36
  end
18
37
 
19
38
  it "returns false if the number is negative" do
20
39
  (1..263).each do |number|
21
- (-number).should_not be_semi_perfect
40
+ (-number).should_not be_semiperfect
22
41
  end
23
42
  end
43
+
44
+ it "handles large input quickly and without raising a RangeError" do
45
+ require 'timeout'
46
+ lambda do
47
+ Timeout.timeout(5) { 19305.semiperfect? }
48
+ end.should_not raise_error
49
+ end
24
50
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: numb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Run Paint Run Run
@@ -77,12 +77,13 @@ files:
77
77
  - lib/numb/powerful.rb
78
78
  - lib/numb/practical.rb
79
79
  - lib/numb/prime.rb
80
+ - lib/numb/primitive_pseudoperfect.rb
80
81
  - lib/numb/pronic.rb
81
82
  - lib/numb/ruby1.8.rb
82
83
  - lib/numb/ruby1.9.rb
83
84
  - lib/numb/self.rb
84
85
  - lib/numb/self_descriptive.rb
85
- - lib/numb/semi_perfect.rb
86
+ - lib/numb/semiperfect.rb
86
87
  - lib/numb/semiprime.rb
87
88
  - lib/numb/smarandache_wellin.rb
88
89
  - lib/numb/smith.rb
@@ -136,6 +137,7 @@ files:
136
137
  - spec/polydivisible_spec.rb
137
138
  - spec/powerful_spec.rb
138
139
  - spec/practical_spec.rb
140
+ - spec/primitive_pseudoperfect_spec.rb
139
141
  - spec/pronic_spec.rb
140
142
  - spec/self_descriptive_spec.rb
141
143
  - spec/self_spec.rb
@@ -184,6 +186,7 @@ specification_version: 3
184
186
  summary: Experiments in number theory with new predicate methods for Integer.
185
187
  test_files:
186
188
  - spec/economical_spec.rb
189
+ - spec/primitive_pseudoperfect_spec.rb
187
190
  - spec/polydivisible_spec.rb
188
191
  - spec/equidigital_spec.rb
189
192
  - spec/nivenmorphic_spec.rb
@@ -1,15 +0,0 @@
1
- # coding: utf-8
2
- class Integer
3
- def semi_perfect?
4
- return false if deficient?
5
- return true if perfect?
6
- divisors = proper_positive_divisors
7
- 1.upto(divisors.size-1) do |size|
8
- divisors.combination(size) do |comb|
9
- return true if Array(comb).reduce(:+) == self
10
- end
11
- end
12
- false
13
- end
14
- alias :pseudo_perfect? :semi_perfect?
15
- end