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