numb 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. data/.document +5 -0
  2. data/.gitignore +5 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +10 -0
  5. data/Rakefile +52 -0
  6. data/VERSION +1 -0
  7. data/lib/numb/abundant.rb +20 -0
  8. data/lib/numb/achilles.rb +15 -0
  9. data/lib/numb/automorphic.rb +24 -0
  10. data/lib/numb/carol.rb +21 -0
  11. data/lib/numb/deficient.rb +19 -0
  12. data/lib/numb/dihedral_prime.rb +25 -0
  13. data/lib/numb/dudeney.rb +15 -0
  14. data/lib/numb/economical.rb +16 -0
  15. data/lib/numb/emrip.rb +17 -0
  16. data/lib/numb/equidigital.rb +18 -0
  17. data/lib/numb/extravagant.rb +18 -0
  18. data/lib/numb/factorion.rb +15 -0
  19. data/lib/numb/frugal.rb +16 -0
  20. data/lib/numb/happy.rb +15 -0
  21. data/lib/numb/harshad.rb +8 -0
  22. data/lib/numb/hilbert.rb +7 -0
  23. data/lib/numb/hyperperfect.rb +7 -0
  24. data/lib/numb/impolite.rb +6 -0
  25. data/lib/numb/kaprekar.rb +14 -0
  26. data/lib/numb/keith.rb +15 -0
  27. data/lib/numb/kynea.rb +9 -0
  28. data/lib/numb/mms_pair.rb +11 -0
  29. data/lib/numb/mobius.rb +11 -0
  30. data/lib/numb/narcissistic.rb +8 -0
  31. data/lib/numb/nivenmorphic.rb +9 -0
  32. data/lib/numb/ordinal.rb +11 -0
  33. data/lib/numb/parasitic.rb +10 -0
  34. data/lib/numb/perfect.rb +10 -0
  35. data/lib/numb/perfect_power.rb +9 -0
  36. data/lib/numb/polite.rb +7 -0
  37. data/lib/numb/polydivisible.rb +10 -0
  38. data/lib/numb/powerful.rb +8 -0
  39. data/lib/numb/practical.rb +26 -0
  40. data/lib/numb/prime.rb +495 -0
  41. data/lib/numb/ruby1.8.rb +9 -0
  42. data/lib/numb/ruby1.9.rb +8 -0
  43. data/lib/numb/self.rb +13 -0
  44. data/lib/numb/self_descriptive.rb +9 -0
  45. data/lib/numb/semi_perfect.rb +15 -0
  46. data/lib/numb/semiprime.rb +6 -0
  47. data/lib/numb/smarandache_wellin.rb +11 -0
  48. data/lib/numb/smith.rb +7 -0
  49. data/lib/numb/sphenic.rb +8 -0
  50. data/lib/numb/square.rb +8 -0
  51. data/lib/numb/square_free.rb +6 -0
  52. data/lib/numb/triangular.rb +8 -0
  53. data/lib/numb/trimorphic.rb +6 -0
  54. data/lib/numb/undulating.rb +11 -0
  55. data/lib/numb/vampire.rb +11 -0
  56. data/lib/numb/weird.rb +8 -0
  57. data/lib/numb.rb +80 -0
  58. data/numb.gemspec +201 -0
  59. data/spec/abundant_spec.rb +24 -0
  60. data/spec/achilles_spec.rb +24 -0
  61. data/spec/automorphic_spec.rb +208 -0
  62. data/spec/carol_spec.rb +18 -0
  63. data/spec/deficient_spec.rb +23 -0
  64. data/spec/digital_sum_spec.rb +8 -0
  65. data/spec/dihedral_prime_spec.rb +38 -0
  66. data/spec/dudeney_spec.rb +14 -0
  67. data/spec/economical_spec.rb +28 -0
  68. data/spec/emrip_spec.rb +26 -0
  69. data/spec/equidigital_spec.rb +27 -0
  70. data/spec/extravagant_spec.rb +20 -0
  71. data/spec/factor_spec.rb +22 -0
  72. data/spec/factorion_spec.rb +13 -0
  73. data/spec/frugal_spec.rb +20 -0
  74. data/spec/happy_spec.rb +24 -0
  75. data/spec/harshad_spec.rb +25 -0
  76. data/spec/hilbert_spec.rb +24 -0
  77. data/spec/hyperperfect_spec.rb +59 -0
  78. data/spec/kaprekar_spec.rb +25 -0
  79. data/spec/keith_spec.rb +21 -0
  80. data/spec/kynea_spec.rb +19 -0
  81. data/spec/maris_mcgwire_sosa_pair_spec.rb +20 -0
  82. data/spec/mobius_spec.rb +52 -0
  83. data/spec/narcissistic_spec.rb +18 -0
  84. data/spec/nivenmorphic_spec.rb +24 -0
  85. data/spec/number_of_distinct_prime_factors_spec.rb +35 -0
  86. data/spec/number_of_prime_factors_spec.rb +32 -0
  87. data/spec/ordinal_spec.rb +64 -0
  88. data/spec/parasitic_spec.rb +29 -0
  89. data/spec/perfect_power_spec.rb +24 -0
  90. data/spec/perfect_spec.rb +103 -0
  91. data/spec/polite_spec.rb +14 -0
  92. data/spec/politeness_spec.rb +11 -0
  93. data/spec/polydivisible_spec.rb +19 -0
  94. data/spec/powerful_spec.rb +25 -0
  95. data/spec/practical_spec.rb +30 -0
  96. data/spec/self_descriptive_spec.rb +19 -0
  97. data/spec/self_spec.rb +20 -0
  98. data/spec/semi_perfect_spec.rb +24 -0
  99. data/spec/semiprime_spec.rb +21 -0
  100. data/spec/smarandache_wellin_spec.rb +26 -0
  101. data/spec/smith_spec.rb +19 -0
  102. data/spec/spec_helper.rb +9 -0
  103. data/spec/sphenic_spec.rb +20 -0
  104. data/spec/square_free_spec.rb +19 -0
  105. data/spec/square_spec.rb +24 -0
  106. data/spec/triangular_spec.rb +19 -0
  107. data/spec/trimorphic_spec.rb +25 -0
  108. data/spec/undulating_spec.rb +20 -0
  109. data/spec/vampire_spec.rb +19 -0
  110. data/spec/weird_spec.rb +24 -0
  111. metadata +216 -0
@@ -0,0 +1,26 @@
1
+ describe Integer, "emrip?" do
2
+ # http://www.research.att.com/~njas/sequences/A006567
3
+ EMRIP = [13,17,31,37,71,73,79,97,107,113,149,157,167,179,
4
+ 199,311,337,347,359,389,701,709,733,739,743,751,
5
+ 761,769,907,937,941,953,967,971,983,991,1009,1021,
6
+ 1031,1033,1061,1069,1091,1097,1103,1109,1151,1153,
7
+ 1181,1193]
8
+
9
+ it "returns true for primes that give a different prime when reversed" do
10
+ EMRIP.each do |number|
11
+ number.should be_emrip
12
+ end
13
+ end
14
+
15
+ it "returns false for non-emrips" do
16
+ ((1..1193).to_a - EMRIP).each do |number|
17
+ number.should_not be_emrip
18
+ end
19
+ end
20
+
21
+ it "returns false for palindromic primes" do
22
+ [11,151].each do |number|
23
+ number.should_not be_emrip
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,27 @@
1
+ describe Integer, "#equidigital?" do
2
+ # http://www.research.att.com/~njas/sequences/A046758
3
+ EQUIDIGITAL = [1,2,3,5,7,10,11,13,14,15,16,17,19,21,23,25,27,29,
4
+ 31,32,35,37,41,43,47,49,53,59,61,64,67,71,73,79,
5
+ 81,83,89,97,101,103,105,106,107,109,111,112,113,
6
+ 115,118,119,121,122,123,127,129,131,133,134,135,
7
+ 137,139]
8
+
9
+ it "returns true for equidigital numbers" do
10
+ EQUIDIGITAL.each do |number|
11
+ number.should be_equidigital
12
+ end
13
+ end
14
+
15
+ it "returns true for prime numbers" do
16
+ [193, 197, 199].each do |number|
17
+ number.should be_equidigital
18
+ end
19
+ end
20
+
21
+ it "returns false for non-equidigital numbers" do
22
+ ((1..139).to_a - EQUIDIGITAL).each do |number|
23
+ number.should_not be_equidigital
24
+ end
25
+ end
26
+ end
27
+
@@ -0,0 +1,20 @@
1
+ describe Integer, "#extravagant?" do
2
+ # http://www.research.att.com/~njas/sequences/A046760
3
+ EXTRAVAGANT = [4,6,8,9,12,18,20,22,24,26,28,30,33,34,36,38,39,
4
+ 40,42,44,45,46,48,50,51,52,54,55,56,57,58,60,62,
5
+ 63,65,66,68,69,70,72,74,75,76,77,78,80,82,84,85,
6
+ 86,87,88,90,91,92,93,94,95,96,98,99,100,102,104,
7
+ 108,110,114]
8
+
9
+ it "returns true for extravagant numbers" do
10
+ EXTRAVAGANT.each do |number|
11
+ number.should be_extravagant
12
+ end
13
+ end
14
+
15
+ it "returns false for non-extravagant numbers" do
16
+ ((1..114).to_a - EXTRAVAGANT).each do |number|
17
+ number.should_not be_extravagant
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,22 @@
1
+ describe Integer, "#factor?" do
2
+ it "returns true if self divided by other leaves no remainder" do
3
+ 100.factor?(10).should be_true
4
+ 9.factor?(3).should be_true
5
+ end
6
+
7
+ it "returns false if other is bigger than self" do
8
+ 50.factor?(500).should be_false
9
+ end
10
+
11
+ it "returns false if self divided by other leaves a remainder" do
12
+ 10.factor?(3).should be_false
13
+ end
14
+
15
+ it "returns false if other is 0" do
16
+ 44.factor?(0).should be_false
17
+ end
18
+
19
+ it "works with negative numbers" do
20
+ 20.factor?(-5).should be_true
21
+ end
22
+ end
@@ -0,0 +1,13 @@
1
+ describe Integer, "#factorion?" do
2
+ it "returns true for factorions" do
3
+ [1, 2, 145, 40585].each do |number|
4
+ number.should be_factorion
5
+ end
6
+ end
7
+
8
+ it "returns false for non-factorions" do
9
+ [3, 146, 4828291001].each do |number|
10
+ number.should_not be_factorion
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ describe Integer, "#frugal?" 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
+
9
+ it "returns true for frugal numbers" do
10
+ FRUGAL.each do |number|
11
+ number.should be_frugal
12
+ end
13
+ end
14
+
15
+ it "returns false for non-frugal numbers" do
16
+ ((126..4912).to_a - FRUGAL).each do |number|
17
+ number.should_not be_frugal
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,24 @@
1
+ describe Integer, "#happy?" do
2
+ HAPPY = [1,7,10,13,19,23,28,31,32,44,49,68,70,79,82,86,91,
3
+ 94,97,100,103,109,129,130,133,139,167,176,188,190,
4
+ 192,193,203,208,219,226,230,236,239,262,263,280,
5
+ 291,293,301,302,310,313,319,320,326,329,331,338]
6
+ it "returns true for happy numbers" do
7
+ HAPPY.each do |number|
8
+ number.should be_happy
9
+ end
10
+ end
11
+
12
+ it "returns false for unhappy numbers" do
13
+ ((1..338).to_a - HAPPY).each do |number|
14
+ number.should_not be_happy
15
+ end
16
+ end
17
+
18
+ it "returns false for negative numbers" do
19
+ (1..338).each do |number|
20
+ (-number).should_not be_happy
21
+ end
22
+ end
23
+ end
24
+
@@ -0,0 +1,25 @@
1
+ describe Integer, "#harshad?" do
2
+ # http://www.research.att.com/~njas/sequences/A005349
3
+ HARSHAD = [1,2,3,4,5,6,7,8,9,10,12,18,20,21,24,27,30,36,40,
4
+ 42,45,48,50,54,60,63,70,72,80,81,84,90,100,102,
5
+ 108,110,111,112,114,117,120,126,132,133,135,140,
6
+ 144,150,152,153,156,162,171,180,190,192,195,198,
7
+ 200,201,204]
8
+ it "returns true for Harshad (Niven) numbers" do
9
+ HARSHAD.each do |number|
10
+ number.should be_harshad
11
+ end
12
+ end
13
+
14
+ it "returns false for non-Harshad/Niven numbers" do
15
+ ((1..204).to_a - HARSHAD).each do |number|
16
+ number.should_not be_harshad
17
+ end
18
+ end
19
+
20
+ it "returns false for negative numbers" do
21
+ (1..204).each do |number|
22
+ (-number).should_not be_harshad
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,24 @@
1
+ describe Integer, "#hilbert?" do
2
+ HILBERT = [1,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61,65,
3
+ 69,73,77,81,85,89,93,97,101,105,109,113,117,121,
4
+ 125,129,133,137,141,145,149,153,157,161,165,169,
5
+ 173,177,181,185,189]
6
+ it "returns true for a Hilbert number" do
7
+ HILBERT.each do |number|
8
+ number.should be_hilbert
9
+ end
10
+ end
11
+
12
+ it "returns false for a non-Hilbert number" do
13
+ ((1..188).to_a - HILBERT).each do |number|
14
+ number.should_not be_hilbert
15
+ end
16
+ end
17
+
18
+ it "returns false for a negative number" do
19
+ (1..189).each do |number|
20
+ (-number).should_not be_hilbert
21
+ end
22
+ end
23
+ end
24
+
@@ -0,0 +1,59 @@
1
+ describe Integer, "#hyperperfect?" do
2
+ # http://www.research.att.com/~njas/sequences/A000396
3
+ PERFECT = [6,28,496,8128,33550336,8589869056,137438691328,
4
+ 2305843008139952128,
5
+ 2658455991569831744654692615953842176,
6
+ 191561942608236107294793378084303638130997321548169216]
7
+
8
+
9
+ it "returns true for a 1-hyperperfect (perfect) number" do
10
+ PERFECT.first(5).each do |number|
11
+ number.should be_hyperperfect
12
+ end
13
+ end
14
+
15
+ it "returns false for a non-1-hyperperfect (non-perfect) number" do
16
+ ((1..2000).to_a - PERFECT).sample(5).each do |number|
17
+ number.should_not be_hyperperfect
18
+ end
19
+ end
20
+
21
+ it "returns true for 6-hyperperfect numbers with an argument of 6" do
22
+ # http://www.research.att.com/~njas/sequences/A028499
23
+ [301,16513,60110701,1977225901].each do |number|
24
+ number.hyperperfect?(6).should be_true
25
+ end
26
+ end
27
+
28
+ it "returns false for non-6-hyperperfect numbers with an argument of 6" do
29
+ [302,6].each do |number|
30
+ number.hyperperfect?(6).should be_false
31
+ end
32
+ end
33
+
34
+ it "returns true for 18-hyperperfect numbers with an argument of 18" do
35
+ # http://www.research.att.com/~njas/sequences/A028501
36
+ [1333,1909,2469601,893748277].each do |number|
37
+ number.hyperperfect?(18).should be_true
38
+ end
39
+ end
40
+
41
+ it "returns false for non-18-hyperperfect numbers with an argument of 18" do
42
+ [6,1334].each do |number|
43
+ number.hyperperfect?(18).should be_false
44
+ end
45
+ end
46
+
47
+ it "returns true for 2772-hyperperfect numbers with an argument of 2772" do
48
+ # http://www.research.att.com/~njas/sequences/A028502
49
+ [95295817,124035913,749931337,4275383113].each do |number|
50
+ number.hyperperfect?(2772).should be_true
51
+ end
52
+ end
53
+
54
+ it "returns false for non-2722-hyperperfect numbers with an argument of 2722" do
55
+ [6,95295816].each do |number|
56
+ number.hyperperfect?(2772).should be_false
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,25 @@
1
+ describe Integer, "#kaprekar?" do
2
+ KAPREKAR = [1,9,45,55,99,297,703,999,2223,2728,4879,4950,
3
+ 5050,5292,7272,7777,9999,17344,22222,38962,77778,
4
+ 82656,95121,99999,142857,148149,181819,187110,
5
+ 208495,318682,329967,351352,356643,390313,461539,
6
+ 466830,499500,500500,533170]
7
+
8
+ it "returns true for Kaprekar numbers" do
9
+ KAPREKAR.each do |number|
10
+ number.should be_kaprekar
11
+ end
12
+ end
13
+
14
+ it "returns false for non-Kaprekar numbers" do
15
+ ((1..300).to_a - KAPREKAR).each do |number|
16
+ number.should_not be_kaprekar
17
+ end
18
+ end
19
+
20
+ it "returns false for negative numbers" do
21
+ [-5, -9, -297, -345].each do |number|
22
+ number.should_not be_kaprekar
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,21 @@
1
+ describe Integer, "#keith?" do
2
+ # http://www.research.att.com/~njas/sequences/A007629
3
+ KEITH = [14,19,28,47,61,75,197,742,1104,1537,2208,2580,
4
+ 3684,4788,7385,7647,7909,31331,34285,34348,55604,
5
+ 62662,86935,93993,120284,129106,147640,156146,
6
+ 174680,183186,298320,355419,694280,925993,1084051,
7
+ 7913837,11436171,33445755,44121607]
8
+
9
+ it "returns true for Keith numbers" do
10
+ KEITH.each do |number|
11
+ number.should be_keith
12
+ end
13
+ end
14
+
15
+ it "returns false for non-Keith numbers" do
16
+ ((1..200).to_a - KEITH).each do |number|
17
+ number.should_not be_keith
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,19 @@
1
+ describe Integer, "#kynea?" do
2
+ # http://www.research.att.com/~njas/sequences/A093069
3
+ KYNEA = [7,23,79,287,1087,4223,16639,66047,263167,1050623,
4
+ 4198399,16785407,67125247,268468223,1073807359,
5
+ 4295098367,17180131327,68720001023,274878955519,
6
+ 1099513724927,4398050705407,17592194433023]
7
+
8
+ it "returns true for Kynea numbers" do
9
+ KYNEA.each do |number|
10
+ number.should be_kynea
11
+ end
12
+ end
13
+
14
+ it "returns false for non-Kynea numbers" do
15
+ ((1..300).to_a - KYNEA).each do |number|
16
+ number.should_not be_kynea
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ describe Integer, "#maris_mcgwire_sosa_pair?" do
2
+
3
+ MMS = [7,14,43,50,61,63,67,80,84,118,122,134,137,163,
4
+ 196,212,213,224,241,273,274,277,279,283,351,352,
5
+ 373,375,390,398,421,457,462,474,475,489,495,510,
6
+ 516,523,526,537,547,555,558,577,584,590,592,616,
7
+ 638,644,660,673,687,691]
8
+
9
+ it "returns true for Maris-McGwire-Sosa pairs" do
10
+ MMS.each do |number|
11
+ number.maris_mcgwire_sosa_pair?(number+1).should be_true
12
+ end
13
+ end
14
+
15
+ it "returns false for non-Maris-McGwire-Sosa pairs" do
16
+ ((1..200).to_a - MMS).each do |number|
17
+ number.maris_mcgwire_sosa_pair?(number+1).should be_false
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,52 @@
1
+ # coding: utf-8
2
+ describe Integer, "#mobius" do
3
+ # http://www.research.att.com/~njas/sequences/A008683
4
+ MOBIUS = [1,-1,-1,0,-1,1,-1,0,0,1,-1,0,-1,1,1,0,-1,0,-1,0,
5
+ 1,1,-1,0,0,1,0,0,-1,-1,-1,0,1,1,1,0,-1,1,1,0,-1,
6
+ -1,-1,0,0,1,-1,0,0,0,1,0,-1,0,1,0,1,1,-1,0,-1,1,0,
7
+ 0,1,-1,-1,0,1,-1,-1,0,-1,1,0,0,1]
8
+
9
+ it "returns 1 if n is a square-free positive integer with an even number of distinct prime factors" do
10
+ MOBIUS.each_with_index do |value, idx|
11
+ next unless value == 1
12
+ (idx + 1).mobius.should == 1
13
+ end
14
+ end
15
+
16
+ it "returns −1 if n is a square-free positive integer with an odd number of distinct prime factors" do
17
+ MOBIUS.each_with_index do |value, idx|
18
+ next unless value == -1
19
+ (idx + 1).mobius.should == -1
20
+ end
21
+ end
22
+
23
+ it "returns −1 if n is prime" do
24
+ Prime.each(200).each do |prime|
25
+ next if MOBIUS.size < prime
26
+ prime.mobius.should == -1
27
+ end
28
+ end
29
+
30
+ it "returns 0 iff n is not square-free." do
31
+ MOBIUS.each_with_index do |value, idx|
32
+ next unless value == 0
33
+ (idx + 1).mobius.should == 0
34
+ end
35
+
36
+ # http://www.research.att.com/~njas/sequences/A013929
37
+ [4,8,9,12,16,18,20,24,25,27,28,32,36,40,44,45,48,
38
+ 49,50,52,54,56,60,63,64,68,72,75,76,80,81,84,88,
39
+ 90,92,96,98,99,100,104,108,112,116,117,120,121,
40
+ 124,125,126,128,132,135,136,140,144,147,148,150,
41
+ 152,153,156,160].each do |number|
42
+ next if MOBIUS.size < number
43
+ number.mobius.should == 0
44
+ end
45
+ end
46
+
47
+ it "returns nil if n is not a positive integer" do
48
+ (0..25).each do |number|
49
+ (-number).mobius.should be_nil
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,18 @@
1
+ describe Integer, "#narcissistic?" do
2
+ NARCISSISTIC = [1,2,3,4,5,6,7,8,9,153,370,371,407,1634,8208,9474,
3
+ 54748,92727,93084,548834,1741725,4210818,9800817,
4
+ 9926315,24678050,24678051,88593477,146511208,
5
+ 472335975,534494836,912985153,4679307774,
6
+ 32164049650,32164049651]
7
+ it "returns true for narcissistic numbers" do
8
+ NARCISSISTIC.each do |number|
9
+ number.should be_narcissistic
10
+ end
11
+ end
12
+
13
+ it "returns false for non-narcissistic numbers" do
14
+ [10,30,100,178762628].each do |number|
15
+ number.should_not be_narcissistic
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,24 @@
1
+ describe Integer, "#nivenmorphic?" do
2
+ NIVENMORPHIC = [1,2,3,4,5,6,7,8,9,910,0,912,11713,6314,915,3616,
3
+ 15317,918,17119,9920,18921,9922,82823,19824,9925,
4
+ 46826,18927,18928,78329,99930,585931,388832,
5
+ 1098933,198934,289835,99936,99937,478838,198939,
6
+ 1999840]
7
+ it "returns true for Nivenmorphic numbers" do
8
+ NIVENMORPHIC.each do |number|
9
+ number.should be_nivenmorphic
10
+ end
11
+ end
12
+
13
+ it "returns false for non-Nivenmorphic numbers" do
14
+ ((1..300).to_a - NIVENMORPHIC).each do |number|
15
+ number.should_not be_nivenmorphic
16
+ end
17
+ end
18
+
19
+ it "returns false for negative numbers" do
20
+ (1..300).each do |number|
21
+ (-number).should_not be_nivenmorphic
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,35 @@
1
+ # coding: utf-8
2
+ describe Integer, "#number_of_distinct_prime_factors" do
3
+ # http://www.research.att.com/~njas/sequences/A001221
4
+ OMEGA = [0,1,1,1,1,2,1,1,1,2,1,2,1,2,2,1,1,2,1,2,2,2,1,2,
5
+ 1,2,1,2,1,3,1,1,2,2,2,2,1,2,2,2,1,3,1,2,2,2,1,2,1,
6
+ 2,2,2,1,2,2,2,2,2,1,3,1,2,2,1,2,3,1,2,2,3,1,2,1,2,
7
+ 2,2,2,3,1,2,1,2,1,3,2,2,2,2,1,3,2,2,2,2,2,2,1,2,2,
8
+ 2,1,3,1,2,3,2,1,2,1,3,2]
9
+
10
+ it "returns the number of distinct prime factors of self" do
11
+ OMEGA.each_with_index do |omega, number|
12
+ (number + 1).number_of_distinct_prime_factors.should == omega
13
+ end
14
+
15
+ # http://www.research.att.com/~njas/sequences/A046386
16
+ [210,330,390,462,510,546,570,690,714,770,798,858,
17
+ 870,910,930,966,1110,1122,1155,1190,1218,1230,
18
+ 1254,1290,1302,1326,1330,1365,1410,1430,1482,1518,
19
+ 1554,1590,1610,1722,1770,1785,1794,1806,1830,1870,
20
+ 1914,1938,1974].each do |number|
21
+ number.number_of_distinct_prime_factors.should == 4
22
+ end
23
+ end
24
+
25
+ it "does not count any factor more than once" do
26
+ [4, 8, 9, 12, 16, 18, 20, 24, 25, 27, 28, 32, 36, 40, 44, 45, 48, 49,
27
+ 50, 52, 54, 56, 60, 63, 64, 68, 72, 75, 76, 80, 81, 84, 88, 90, 92,
28
+ 96, 98, 99, 100, 104, 108, 112, 116, 117, 120, 121, 124, 125, 126, 128,
29
+ 132, 135, 136, 140, 144, 147, 148, 150].each do |number|
30
+ number.prime_factors.size.should >= 2
31
+ number.prime_factors.uniq.should_not == number.prime_factors
32
+ number.number_of_distinct_prime_factors.should == number.prime_factors.uniq.size
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ describe Integer, "#number_of_prime_factors" do
3
+ # http://www.research.att.com/~njas/sequences/A001222
4
+ BIGOMEGA = [0,1,1,2,1,2,1,3,2,2,1,3,1,2,2,4,1,3,1,3,2,2,1,4,
5
+ 2,2,3,3,1,3,1,5,2,2,2,4,1,2,2,4,1,3,1,3,3,2,1,5,2,
6
+ 3,2,3,1,4,2,4,2,2,1,4,1,2,3,6,2,3,1,3,2,3,1,5,1,2,
7
+ 3,3,2,3,1,5,4,2,1,4,2,2,2,4,1,4,2,3,2,2,2,6,1,3,3,
8
+ 4,1,3,1,4,3,2,1,5,1,3,2]
9
+
10
+ it "returns the number of prime factors (counted with multiplicity) of self" do
11
+ BIGOMEGA.each_with_index do |bigomega, number|
12
+ (number + 1).number_of_prime_factors.should == bigomega
13
+ end
14
+ end
15
+
16
+ it "is >= ω" do
17
+ BIGOMEGA.each_with_index do |bigomega, number|
18
+ (number + 1).number_of_prime_factors.should >= (number + 1).number_of_distinct_prime_factors
19
+ end
20
+ end
21
+
22
+ it "counts factors more than once" do
23
+ [4, 8, 9, 12, 16, 18, 20, 24, 25, 27, 28, 32, 36, 40, 44, 45, 48, 49,
24
+ 50, 52, 54, 56, 60, 63, 64, 68, 72, 75, 76, 80, 81, 84, 88, 90, 92,
25
+ 96, 98, 99, 100, 104, 108, 112, 116, 117, 120, 121, 124, 125, 126, 128,
26
+ 132, 135, 136, 140, 144, 147, 148, 150].each do |number|
27
+ number.prime_factors.size.should >= 2
28
+ number.prime_factors.uniq.should_not == number.prime_factors
29
+ number.number_of_prime_factors.should == number.prime_factors.size
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,64 @@
1
+ describe Integer, "#ordinal" do
2
+ it "returns 'th' for numbers ending in 0" do
3
+ 0.ordinal.should == 'th'
4
+ 20.ordinal.should == 'th'
5
+ end
6
+
7
+ it "returns 'st' for numbers ending in 1" do
8
+ 1.ordinal.should == 'st'
9
+ 201.ordinal.should == 'st'
10
+ 111.ordinal.should == 'st'
11
+ end
12
+
13
+ it "returns 'nd' for numbers ending in 2" do
14
+ 2.ordinal.should == 'nd'
15
+ 202.ordinal.should == 'nd'
16
+ 222.ordinal.should == 'nd'
17
+ end
18
+
19
+ it "returns 'rd' for numbers ending in 3" do
20
+ 3.ordinal.should == 'rd'
21
+ 203.ordinal.should == 'rd'
22
+ 333.ordinal.should == 'rd'
23
+ end
24
+
25
+ it "returns 'th' for numbers ending in 4" do
26
+ 4.ordinal.should == 'th'
27
+ 204.ordinal.should == 'th'
28
+ 444.ordinal.should == 'th'
29
+ end
30
+
31
+ it "returns 'th' for numbers ending in 5" do
32
+ 5.ordinal.should == 'th'
33
+ 205.ordinal.should == 'th'
34
+ 555.ordinal.should == 'th'
35
+ end
36
+
37
+ it "returns 'th' for numbers ending in 6" do
38
+ 6.ordinal.should == 'th'
39
+ 206.ordinal.should == 'th'
40
+ 666.ordinal.should == 'th'
41
+ end
42
+
43
+ it "returns 'th' for numbers ending in 7" do
44
+ 7.ordinal.should == 'th'
45
+ 207.ordinal.should == 'th'
46
+ 777.ordinal.should == 'th'
47
+ end
48
+
49
+ it "returns 'th' for numbers ending in 8" do
50
+ 8.ordinal.should == 'th'
51
+ 208.ordinal.should == 'th'
52
+ 888.ordinal.should == 'th'
53
+ end
54
+
55
+ it "returns 'th' for numbers ending in 9" do
56
+ 9.ordinal.should == 'th'
57
+ 209.ordinal.should == 'th'
58
+ 999.ordinal.should == 'th'
59
+ end
60
+
61
+ it "returns 'th' for 10..19" do
62
+ (10..19).each{|n| n.ordinal.should == 'th'}
63
+ end
64
+ end
@@ -0,0 +1,29 @@
1
+ describe Integer, "#parasitic?" do
2
+ # http://www.research.att.com/~njas/sequences/A092697
3
+ PARASITIC = [1,105263157894736842,
4
+ 1034482758620689655172413793,102564,
5
+ 102040816326530612244897959183673469387755,
6
+ 1016949152542372881355932203389830508474576271186440677966,
7
+ 1014492753623188405797,1012658227848,
8
+ 10112359550561797752808988764044943820224719]
9
+
10
+
11
+ it "returns true for parasitic numbers" do
12
+ PARASITIC.each do |number|
13
+ number.should be_parasitic
14
+ end
15
+ end
16
+
17
+ PARASITIC.each_with_index do |number,n|
18
+ n += 1
19
+ it "returns true for #{n}-parasitic numbers when #{n} is the argument" do
20
+ number.parasitic?(n).should be_true
21
+ end
22
+ end
23
+
24
+ it "returns false for non-parasitic numbers" do
25
+ [2, 8, 105263157894736843].each do |number|
26
+ number.should_not be_parasitic
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,24 @@
1
+ describe Integer, "#perfect_power?" do
2
+ PERFECT_POWERS = [1, 4,8,9,16,25,27,32,36,49,64,81,100,121,125,128,
3
+ 144,169,196,216,225,243,256,289,324,343,361,400,
4
+ 441,484,512,529,576,625,676,729,784,841,900,961,
5
+ 1000,1024,1089,1156,1225,1296,1331,1369,1444,1521,
6
+ 1600,1681,1728,1764]
7
+ it "returns true for perfect powers" do
8
+ PERFECT_POWERS.each do |power|
9
+ power.should be_perfect_power
10
+ end
11
+ end
12
+
13
+ it "returns false for imperfect powers" do
14
+ ((1..1764).to_a - PERFECT_POWERS).each do |power|
15
+ power.should_not be_perfect_power
16
+ end
17
+ end
18
+
19
+ it "returns false for negative numbers" do
20
+ (1..1764).each do |power|
21
+ (-power).should_not be_perfect_power
22
+ end
23
+ end
24
+ end