numb 0.114.0 → 0.125.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/numb/aliquot_sequence.rb +1 -1
- data/lib/numb/carmichael.rb +14 -0
- data/lib/numb/centered_pentagonal.rb +6 -0
- data/lib/numb/cube.rb +1 -4
- data/lib/numb/cullen.rb +7 -0
- data/lib/numb/cyclic.rb +12 -0
- data/lib/numb/delannoy.rb +25 -0
- data/lib/numb/demlo.rb +9 -0
- data/lib/numb/full_reptend_prime.rb +5 -0
- data/lib/numb/integer_p.rb +1 -1
- data/lib/numb/leyland.rb +2 -2
- data/lib/numb/modulo_order.rb +12 -0
- data/lib/numb/noncototient.rb +1 -1
- data/lib/numb/number_of_divisors.rb +2 -3
- data/lib/numb/primitive_root.rb +15 -0
- data/lib/numb/primitive_roots.rb +6 -0
- data/lib/numb/pronic.rb +1 -1
- data/lib/numb/repunit.rb +4 -0
- data/lib/numb/square.rb +1 -1
- data/lib/numb/squared_triangular.rb +1 -1
- data/lib/numb/strictly_non_palindromic.rb +1 -1
- data/lib/numb/unusual.rb +1 -1
- data/lib/numb.rb +14 -2
- data/spec/numb/carmichael_spec.rb +15 -0
- data/spec/numb/centered_pentagonal_spec.rb +20 -0
- data/spec/numb/cullen_spec.rb +20 -0
- data/spec/numb/cyclic_spec.rb +19 -0
- data/spec/numb/delannoy_spec.rb +40 -0
- data/spec/numb/demlo_spec.rb +28 -0
- data/spec/numb/full_reptend_prime_spec.rb +20 -0
- data/spec/numb/integer_p_spec.rb +6 -0
- data/spec/numb/isqrt_spec.rb +14 -0
- data/spec/numb/modulo_order_spec.rb +67 -0
- data/spec/numb/primitive_root_spec.rb +74 -0
- data/spec/numb/primitive_roots_spec.rb +34 -0
- data/spec/numb/repunit_spec.rb +16 -0
- metadata +31 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.125.0
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
class Integer
|
3
|
-
def aliquot_sequence(max_iterations=(self > 100 ? 10 :
|
3
|
+
def aliquot_sequence(max_iterations=(self > 100 ? 10 : sqrt),
|
4
4
|
summatory_function=->(n){ n.aliquot_sum })
|
5
5
|
sequence = [self]
|
6
6
|
max_iterations.floor.times do |limit|
|
data/lib/numb/carmichael.rb
CHANGED
@@ -5,4 +5,18 @@ class Integer
|
|
5
5
|
(self - 1).remainder(p - 1) == 0
|
6
6
|
end
|
7
7
|
end
|
8
|
+
|
9
|
+
def carmichael
|
10
|
+
case self
|
11
|
+
when 1, 2 then 1
|
12
|
+
when 4 then 2
|
13
|
+
else
|
14
|
+
if primaries.size == 1
|
15
|
+
p, a = primaries.first
|
16
|
+
return totient if p.odd?
|
17
|
+
return totient/2 if p == 2 and a >= 3
|
18
|
+
end
|
19
|
+
primaries.map{|p| p.reduce(:**)}.map(&:carmichael).reduce(&:lcm)
|
20
|
+
end
|
21
|
+
end
|
8
22
|
end
|
data/lib/numb/cube.rb
CHANGED
data/lib/numb/cullen.rb
ADDED
data/lib/numb/cyclic.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
class Integer
|
2
|
+
def delannoy?
|
3
|
+
return true if self == 1
|
4
|
+
max_a, max_b = self/2, self/2
|
5
|
+
(1..max_a).each do |a|
|
6
|
+
(1..max_b).each do |b|
|
7
|
+
d = a.delannoy(b)
|
8
|
+
return true if d == self
|
9
|
+
if d > self
|
10
|
+
max_b = b
|
11
|
+
max_a = a
|
12
|
+
break
|
13
|
+
end
|
14
|
+
end
|
15
|
+
break if a > max_a
|
16
|
+
end
|
17
|
+
false
|
18
|
+
end
|
19
|
+
|
20
|
+
def delannoy(b)
|
21
|
+
a = self
|
22
|
+
return 1 if b.zero? or a.zero?
|
23
|
+
[(a - 1).delannoy(b), a.delannoy(b - 1), (a - 1).delannoy(b - 1)].reduce(:+)
|
24
|
+
end
|
25
|
+
end
|
data/lib/numb/demlo.rb
ADDED
data/lib/numb/integer_p.rb
CHANGED
data/lib/numb/leyland.rb
CHANGED
@@ -0,0 +1,12 @@
|
|
1
|
+
class Integer
|
2
|
+
def modulo_order(n)
|
3
|
+
return 0 if n < 1
|
4
|
+
return 1 if self == 2 and n == 1
|
5
|
+
(1..n.totient).each{|e| return e if (self**e).modulo(n) == 1}
|
6
|
+
0
|
7
|
+
end
|
8
|
+
alias :haupt_exponent :modulo_order
|
9
|
+
alias :multiplicative_order :modulo_order
|
10
|
+
# TODO: Add Rational#period for calculating the period of the decimal
|
11
|
+
# expansion of the rational in terms the multiplicative order of 10
|
12
|
+
end
|
data/lib/numb/noncototient.rb
CHANGED
@@ -7,11 +7,10 @@ class Integer
|
|
7
7
|
def τ
|
8
8
|
n = self
|
9
9
|
return @nod if defined?(@nod)
|
10
|
-
|
11
|
-
@nod = (1..square_root.floor).
|
10
|
+
@nod = (1..isqrt).
|
12
11
|
map {|i| n.quo(i).to_i - (n - 1).quo(i).to_i }.
|
13
12
|
reduce(:+) * 2
|
14
|
-
@nod -= 1 if
|
13
|
+
@nod -= 1 if square?
|
15
14
|
@nod
|
16
15
|
end
|
17
16
|
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class Integer
|
2
|
+
def primitive_root?(g=nil)
|
3
|
+
if g
|
4
|
+
return true if g.zero? and self == 1
|
5
|
+
coprime?(g) and g.modulo_order(self) == totient
|
6
|
+
else
|
7
|
+
return true if [1, 2, 4].include?(self)
|
8
|
+
prime_factors.select(&:odd?).any? do |p|
|
9
|
+
[1,2].any? do |x|
|
10
|
+
Math.log(self / x, p).integer?
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/numb/pronic.rb
CHANGED
data/lib/numb/repunit.rb
CHANGED
data/lib/numb/square.rb
CHANGED
data/lib/numb/unusual.rb
CHANGED
data/lib/numb.rb
CHANGED
@@ -22,6 +22,14 @@ class Integer
|
|
22
22
|
divisors.select{|d| d > 1}.select{|d| d.odd?}.size
|
23
23
|
end
|
24
24
|
|
25
|
+
def sqrt
|
26
|
+
Math.sqrt(self)
|
27
|
+
end
|
28
|
+
|
29
|
+
def isqrt
|
30
|
+
sqrt.floor
|
31
|
+
end
|
32
|
+
|
25
33
|
def proper_divisors
|
26
34
|
divisors.reject {|d| d == self }
|
27
35
|
end
|
@@ -29,8 +37,8 @@ class Integer
|
|
29
37
|
def divisors
|
30
38
|
return [] unless positive?
|
31
39
|
return [1, self] if prime?
|
32
|
-
(1..
|
33
|
-
|
40
|
+
(1..isqrt).select { |n| (self % n).zero? }.
|
41
|
+
map {|n| [n, self/n]}.flatten.uniq
|
34
42
|
end
|
35
43
|
|
36
44
|
def sum_of_divisors
|
@@ -64,4 +72,8 @@ end
|
|
64
72
|
|
65
73
|
require 'prime'
|
66
74
|
|
75
|
+
class Integer
|
76
|
+
alias :primaries :prime_division
|
77
|
+
end
|
78
|
+
|
67
79
|
Dir.glob(File.dirname(__FILE__) + '/numb/*.rb').each {|file| require file}
|
@@ -18,3 +18,18 @@ describe Integer, "#carmichael?" do
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
21
|
+
|
22
|
+
describe Integer, "#carmichael" do
|
23
|
+
# A002322
|
24
|
+
@seq = [1,1,2,2,4,2,6,2,6,4,10,2,12,6,4,4,16,6,18,4,6,10,
|
25
|
+
22,2,20,12,18,6,28,4,30,8,10,16,12,6,36,18,12,4,
|
26
|
+
40,6,42,10,12,22,46,4,42,20,16,12,52,18,20,6,18,
|
27
|
+
28,58,4,60,30,6,16,12,10,66,16,22,12,70,6,72,36,
|
28
|
+
20,18,30,12,78,4,54]
|
29
|
+
|
30
|
+
@seq.to_enum.with_index(1).each do |c,n|
|
31
|
+
it "returns #{c} for #{n}" do
|
32
|
+
n.carmichael.should == c
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
describe Integer, "#centered_pentagonal?" do
|
2
|
+
# A005891
|
3
|
+
@seq = [1,6,16,31,51,76,106,141,181,226,276,331,391,456,
|
4
|
+
526,601,681,766,856,951,1051,1156,1266,1381,1501,
|
5
|
+
1626,1756,1891,2031,2176,2326,2481,2641,2806,2976,
|
6
|
+
3151,3331,3516,3706,3901,4101,4306,4516,4731,4951,
|
7
|
+
5176,5406]
|
8
|
+
|
9
|
+
@seq.each do |n|
|
10
|
+
it "returns true for centered pentagonal #{n}" do
|
11
|
+
n.should be_centered_pentagonal
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
@seq.to_seq.invert.sample(100).each do |n|
|
16
|
+
it "returns false for non-centered-pentagonal #{n}" do
|
17
|
+
n.should_not be_centered_pentagonal
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
describe Integer, "#cullen?" do
|
2
|
+
# A002064
|
3
|
+
@seq = [1,3,9,25,65,161,385,897,2049,4609,10241,22529,
|
4
|
+
49153,106497,229377,491521,1048577,2228225,
|
5
|
+
4718593,9961473,20971521,44040193,92274689,
|
6
|
+
192937985,402653185,838860801,1744830465,
|
7
|
+
3623878657,7516192769]
|
8
|
+
|
9
|
+
@seq.sample(10).each do |n|
|
10
|
+
it "returns true for Cullen number #{n}" do
|
11
|
+
n.should be_cullen
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
@seq.to_seq.invert.sample(10).each do |n|
|
16
|
+
it "returns false for non-Cullen number #{n}" do
|
17
|
+
n.should_not be_cullen
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
describe Integer, "#cyclic?" do
|
2
|
+
# A004042
|
3
|
+
@seq = [0,142857,5882352941176470,526315789473684210,
|
4
|
+
4347826086956521739130,
|
5
|
+
3448275862068965517241379310,
|
6
|
+
2127659574468085106382978723404255319148936170]
|
7
|
+
|
8
|
+
@seq.each do |n|
|
9
|
+
it "returns true for cyclic number #{n}" do
|
10
|
+
n.should be_cyclic
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
@seq.to_seq.invert.sample(100).each do |n|
|
15
|
+
it "returns false for non-cyclic number #{n}" do
|
16
|
+
n.should_not be_cyclic
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
describe Integer, "#delannoy" do
|
2
|
+
# A008288 / http://mathworld.wolfram.com/DelannoyNumber.html
|
3
|
+
@seq = [
|
4
|
+
[1, 1, 1, 1, 1, 1, 1, 1, 1],
|
5
|
+
[1, 3, 5, 7, 9, 11, 13, 15, 17],
|
6
|
+
[1, 5, 13, 25, 41, 61, 85, 113, 145],
|
7
|
+
[1, 7, 25, 63, 129, 231, 377, 575, 833],
|
8
|
+
[1, 9, 41, 129, 321, 681, 1289, 2241, 3649],
|
9
|
+
[1, 11, 61, 231, 681, 1683, 3653, 7183, 13073],
|
10
|
+
]
|
11
|
+
|
12
|
+
@seq.each_with_index do |row, a|
|
13
|
+
row.each_with_index do |d, b|
|
14
|
+
it "returns #{d} for Delannoy(#{a}, #{b})" do
|
15
|
+
a.delannoy(b).should == d
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe Integer, "#delannoy?" do
|
22
|
+
# A008288
|
23
|
+
@seq = [1,1,1,1,3,1,1,5,5,1,1,7,13,7,1,1,9,25,25,9,1,1,
|
24
|
+
11,41,63,41,11,1,1,13,61,129,129,61,13,1,1,15,85,
|
25
|
+
231,321,231,85,15,1,1,17,113,377,681,681,377,113,
|
26
|
+
17,1,1,19,145,575,1289,1683,1289,575,145,19,1,1,
|
27
|
+
21,181,833,2241,3653,3653].uniq
|
28
|
+
|
29
|
+
@seq.each do |n|
|
30
|
+
it "returns true for Delannoy number #{n}" do
|
31
|
+
n.should be_delannoy
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
[2, 10, 50, 26, 80].each do |n|
|
36
|
+
it "returns false for non-Delannoy number #{n}" do
|
37
|
+
n.should_not be_delannoy
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# A002477
|
2
|
+
DEMLO = [1,121,12321,1234321,123454321,12345654321,
|
3
|
+
1234567654321,123456787654321,12345678987654321,
|
4
|
+
1234567900987654321,123456790120987654321,
|
5
|
+
12345679012320987654321,
|
6
|
+
1234567901234320987654321]
|
7
|
+
|
8
|
+
describe Integer, "#demlo" do
|
9
|
+
DEMLO.to_enum.with_index(1).each do |demlo, n|
|
10
|
+
it "returns #{demlo} for #{n}" do
|
11
|
+
n.demlo.should == demlo
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe Integer, "#demlo?" do
|
17
|
+
DEMLO.each do |n|
|
18
|
+
it "returns true for Demlo number #{n}" do
|
19
|
+
n.should be_demlo
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
DEMLO.to_seq.invert.sample(500).each do |n|
|
24
|
+
it "returns false for non-Demlo number #{n}" do
|
25
|
+
n.should_not be_demlo
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
describe Integer, "#full_reptend_prime?" do
|
2
|
+
# A001913
|
3
|
+
@seq = [7,17,19,23,29,47,59,61,97,109,113,131,149,167,
|
4
|
+
179,181,193,223,229,233,257,263,269,313,337,367,
|
5
|
+
379,383,389,419,433,461,487,491,499,503,509,541,
|
6
|
+
571,577,593,619,647,659,701,709,727,743,811,821,
|
7
|
+
823,857,863,887,937,941]
|
8
|
+
|
9
|
+
@seq.each do |n|
|
10
|
+
it "returns true for full-reptend prime #{n}" do
|
11
|
+
n.should be_full_reptend_prime
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
@seq.to_seq.invert.sample(100).each do |n|
|
16
|
+
it "returns false for non-full-reptend-prime #{n}" do
|
17
|
+
n.should_not be_full_reptend_prime
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/spec/numb/integer_p_spec.rb
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
describe Integer, "#isqrt" do
|
2
|
+
# A000196
|
3
|
+
@seq = [0,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,
|
4
|
+
4,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,
|
5
|
+
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,
|
6
|
+
8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
|
7
|
+
9,10,10]
|
8
|
+
|
9
|
+
@seq.each_with_index do |isqrt, n|
|
10
|
+
it "returns #{isqrt} for #{n}" do
|
11
|
+
n.isqrt.should == isqrt
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
describe Integer, "#modulo_order" do
|
2
|
+
@seq = {
|
3
|
+
# A002326
|
4
|
+
2 => [1,2,4,3,6,10,12,4,8,18,6,11,20,18,28,5,10,12,36,
|
5
|
+
12,20,14,12,23,21,8,52,20,18,58,60,6,12,66,22,35,
|
6
|
+
9,20,30,39,54,82,8,28,11,12,10,36,48,30,100,51,12,
|
7
|
+
106,36,36,28,44,12,24,110,20,100,7,14,130,18,36,
|
8
|
+
68,138,46,60,28],
|
9
|
+
# A050975
|
10
|
+
3 => [1,2,4,6,2,4,5,3,6,4,16,18,4,5,11,20,3,6,28,30,8,
|
11
|
+
16,12,18,18,4,8,42,10,11,23,42,20,6,52,20,6,28,29,
|
12
|
+
10,30,16,12,22,16,12,35,12,18,18,30,78,4,8,41,16,
|
13
|
+
42,10,88,6,22,23,36,48,42,20,100,34,6,52,53,27,20,
|
14
|
+
12],
|
15
|
+
# A050976
|
16
|
+
4 => [1,2,3,3,5,6,2,4,9,3,11,10,9,14,5,5,6,18,6,10,7,6,
|
17
|
+
23,21,4,26,10,9,29,30,3,6,33,11,35,9,10,15,39,27,
|
18
|
+
41,4,14,11,6,5,18,24,15,50,51,6,53,18,18,14,22,6,
|
19
|
+
12,55,10,50,7,7,65,9,18,34,69,23,30,14,21,74,15,
|
20
|
+
12,10,26],
|
21
|
+
# A050977
|
22
|
+
5 => [1,2,1,2,6,2,6,5,2,4,6,4,16,6,9,6,5,22,2,4,18,6,
|
23
|
+
14,3,8,10,16,6,36,9,4,20,6,42,5,22,46,4,42,16,4,
|
24
|
+
52,18,6,18,14,29,30,3,6,16,10,22,16,22,5,6,72,36,
|
25
|
+
9,30,4,39,54,20,82,6,42,14,10,44,12,22,6,46,8,96,
|
26
|
+
42,30,25,16],
|
27
|
+
# A050978
|
28
|
+
6 => [1,2,10,12,16,9,11,5,14,6,2,4,40,3,23,14,26,10,58,
|
29
|
+
60,12,33,35,36,10,78,82,16,88,12,9,12,10,102,106,
|
30
|
+
108,112,11,16,110,25,126,130,18,136,23,60,14,37,
|
31
|
+
150,6,156,22,27,83,156,43,10,178,60,4,80,19,96,14,
|
32
|
+
198,14],
|
33
|
+
# A050979
|
34
|
+
7 => [1,1,2,4,1,2,3,4,10,2,12,4,2,16,3,3,4,10,22,2,4,
|
35
|
+
12,9,7,4,15,4,10,16,6,9,3,12,4,40,6,10,12,22,23,2,
|
36
|
+
4,16,12,26,9,20,3,7,29,4,60,15,8,12,10,66,16,22,
|
37
|
+
70,6,24,9,4,6,12,78,4,27,40,41,16,6,7,10,88,12,22,
|
38
|
+
15,23,12],
|
39
|
+
# A050980
|
40
|
+
8 => [2,4,1,2,10,4,4,8,6,2,11,20,6,28,5,10,4,12,4,20,
|
41
|
+
14,4,23,7,8,52,20,6,58,20,2,4,22,22,35,3,20,10,13,
|
42
|
+
18,82,8,28,11,4,10,12,16,10,100,17,4,106,12,12,28,
|
43
|
+
44,4,8,110,20,100,7,14,130,6,12,68,46,46,20,28,14,
|
44
|
+
148,5],
|
45
|
+
# A050981
|
46
|
+
9 => [1,1,2,3,1,2,5,3,3,2,8,9,2,5,11,10,3,3,14,15,4,8,
|
47
|
+
6,9,9,2,4,21,5,11,23,21,10,3,26,10,3,14,29,5,15,8,
|
48
|
+
6,11,8,6,35,6,9,9,15,39,2,4,41,8,21,5,44,3,11,23,
|
49
|
+
18,24,21,10,50,17,3,26,53,27,10,6,56,22,14,29,24,
|
50
|
+
5,5,15],
|
51
|
+
# A002329
|
52
|
+
10 =>[1,6,1,2,6,16,18,6,22,3,28,15,2,3,6,5,21,46,42,16,
|
53
|
+
13,18,58,60,6,33,22,35,8,6,13,9,41,28,44,6,15,96,
|
54
|
+
2,4,34,53,108,3,112,6,48,22,5,42,21,130],
|
55
|
+
}
|
56
|
+
|
57
|
+
@seq.each do |base, values|
|
58
|
+
1.upto(100) do |n|
|
59
|
+
mo = base.modulo_order(n)
|
60
|
+
value = mo.zero? ? 0 : values.shift
|
61
|
+
it "returns #{value} for the multiplicative order of base #{base} (mod #{n})" do
|
62
|
+
mo.should == value
|
63
|
+
end
|
64
|
+
break if values.empty?
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
describe Integer, "#primitive_root?" do
|
2
|
+
# A033948
|
3
|
+
@seq = [1,2,3,4,5,6,7,9,10,11,13,14,17,18,19,22,23,25,26,
|
4
|
+
27,29,31,34,37,38,41,43,46,47,49,50,53,54,58,59,61,62,
|
5
|
+
67,71,73,74,79,81,82,83,86,89,94,97,98,101,103,106,107,
|
6
|
+
109,113,118,121,122,125,127,131,134,137,139]
|
7
|
+
|
8
|
+
@seq.sample(10).each do |n|
|
9
|
+
it "returns true for #{n} which has a primitive root" do
|
10
|
+
n.should be_primitive_root
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
@seq.to_seq.invert.sample(10).each do |n|
|
15
|
+
it "returns false for #{n} which doesn't have a primitive root" do
|
16
|
+
n.should_not be_primitive_root
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe Integer, "#primitive_root? (with argument)" do
|
22
|
+
# A046145
|
23
|
+
@seq = [0,0,1,2,3,2,5,3,0,2,3,2,0,2,3,0,0,3,5,2,0,0,7,5,
|
24
|
+
0,2,7,2,0,2,0,3,0,0,3,0,0,2,3,0,0,6,0,3,0,0,5,5,0,
|
25
|
+
3,3,0,0,2,5,0,0,0,3,2,0,2,3,0,0,0,0,2,0,0,0,7,0,5,
|
26
|
+
5,0,0,0,0,3,0,2,7,2,0,0,3,0,0,3,0,0,0,0,5,0,0,5,3,
|
27
|
+
0,0]
|
28
|
+
|
29
|
+
@seq.each_with_index.to_a.sample(5).each do |root,n|
|
30
|
+
next if root.zero?
|
31
|
+
(1...root).each do |non_root|
|
32
|
+
it "returns false for #{n} when given a root of #{non_root}" do
|
33
|
+
n.should_not be_primitive_root(non_root)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
it "returns true for #{n} when given a root of #{root}" do
|
38
|
+
n.should be_primitive_root(root)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# A001122
|
43
|
+
[3,5,11,13,19,29,37,53,59,61,67,83,101,107,131,
|
44
|
+
139,149,163,173,179,181,197,211,227,269,293,317,
|
45
|
+
347,349,373,379,389,419,421,443,461,467,491,509,
|
46
|
+
523,541,547,557,563,587,613,619,653,659,661,677,
|
47
|
+
701,709,757,773,787,797].sample(5).each do |n|
|
48
|
+
|
49
|
+
it "returns true for #{n} when given a root of 2" do
|
50
|
+
n.should be_primitive_root(2)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
[71,239,241,359,431,499,599,601,919,997,1051,1181,
|
55
|
+
1249,1439,1609,1753,2039,2089,2111,2179,2251,2281,
|
56
|
+
2341,2591,2593,2671,2711,2879,3119,3121,3169,3181,
|
57
|
+
3457,3511,3541,3719,3739,3769,4271,4513,4799,4801,
|
58
|
+
4943,5197].first(10).sample(5).each do |n|
|
59
|
+
(1...7).to_a.sample(1).each do |root|
|
60
|
+
|
61
|
+
it "returns false for #{n} when given a root of #{root}" do
|
62
|
+
n.should_not be_primitive_root(root)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
it "returns true for #{n} when given a root of 7" do
|
67
|
+
n.should be_primitive_root(7)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
it "returns true when asked whether 0 is a primitive root of unity" do
|
72
|
+
1.should be_primitive_root(0)
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
describe Integer, "#primitive_roots" do
|
2
|
+
# A046144
|
3
|
+
@seq = [1,1,1,1,2,1,2,0,2,2,4,0,4,2,0,0,8,2,6,0,0,4,10,0,
|
4
|
+
8,4,6,0,12,0,8,0,0,8,0,0,12,6,0,0,16,0,12,0,0,10,
|
5
|
+
22,0,12,8,0,0,24,6,0,0,0,12,28,0,16,8,0,0,0,0,20,
|
6
|
+
0,0,0,24,0,24,12,0,0,0,0,24,0,18,16,40,0,0,12,0,0,
|
7
|
+
40,0,0]
|
8
|
+
|
9
|
+
@seq.to_enum.with_index(1).each do |count,n|
|
10
|
+
pr = n.primitive_roots
|
11
|
+
it "returns #{count} primitive roots for #{n}" do
|
12
|
+
pr.size.should == count
|
13
|
+
pr.uniq.size.should == pr.size
|
14
|
+
end
|
15
|
+
|
16
|
+
pr.sample(2).each do |root|
|
17
|
+
it "returns actual primitive roots, e.g. #{root} for #{n}" do
|
18
|
+
n.primitive_root?(root)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# A046146
|
24
|
+
@seq = [0,0,1,2,3,3,5,5,0,5,7,8,0,11,5,0,0,14,11,15,0,0,
|
25
|
+
19,21,0,23,19,23,0,27,0,24,0,0,31,0,0,35,33,0,0,
|
26
|
+
35,0,34,0,0,43,45,0,47,47,0,0,51,47,0,0,0,55,56,0,
|
27
|
+
59,55,0,0,0,0,63,0,0,0,69,0,68,69,0,0,0,0,77,0,77,
|
28
|
+
75,80,0,0].each_with_index.to_a.sample(15).each do |largest, n|
|
29
|
+
next if largest.zero?
|
30
|
+
it "returns #{largest} as the largest primitive root of #{n}" do
|
31
|
+
n.primitive_roots.max.should == largest
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/spec/numb/repunit_spec.rb
CHANGED
@@ -23,3 +23,19 @@ describe Integer, "#repunit?" do
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
26
|
+
|
27
|
+
describe Integer, "#repunit" do
|
28
|
+
# A002275
|
29
|
+
@seq = [0,1,11,111,1111,11111,111111,1111111,11111111,
|
30
|
+
111111111,1111111111,11111111111,111111111111,
|
31
|
+
1111111111111,11111111111111,111111111111111,
|
32
|
+
1111111111111111,11111111111111111,
|
33
|
+
111111111111111111,1111111111111111111,
|
34
|
+
11111111111111111111]
|
35
|
+
|
36
|
+
@seq.each_with_index do |repunit, n|
|
37
|
+
it "returns #{repunit} for #{n}" do
|
38
|
+
n.repunit.should == repunit
|
39
|
+
end
|
40
|
+
end
|
41
|
+
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.
|
4
|
+
version: 0.125.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Run Paint Run Run
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-03-
|
12
|
+
date: 2010-03-15 00:00:00 +00:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -68,6 +68,7 @@ files:
|
|
68
68
|
- lib/numb/centered_cube.rb
|
69
69
|
- lib/numb/centered_hexagonal.rb
|
70
70
|
- lib/numb/centered_n_gonal.rb
|
71
|
+
- lib/numb/centered_pentagonal.rb
|
71
72
|
- lib/numb/centered_triangular.rb
|
72
73
|
- lib/numb/composite.rb
|
73
74
|
- lib/numb/congruum.rb
|
@@ -76,9 +77,13 @@ files:
|
|
76
77
|
- lib/numb/core.rb
|
77
78
|
- lib/numb/cototient.rb
|
78
79
|
- lib/numb/cube.rb
|
80
|
+
- lib/numb/cullen.rb
|
81
|
+
- lib/numb/cyclic.rb
|
79
82
|
- lib/numb/d.rb
|
80
83
|
- lib/numb/decagonal.rb
|
81
84
|
- lib/numb/deficient.rb
|
85
|
+
- lib/numb/delannoy.rb
|
86
|
+
- lib/numb/demlo.rb
|
82
87
|
- lib/numb/dihedral_prime.rb
|
83
88
|
- lib/numb/dodecagonal.rb
|
84
89
|
- lib/numb/doubly_even.rb
|
@@ -96,6 +101,7 @@ files:
|
|
96
101
|
- lib/numb/fibonacci.rb
|
97
102
|
- lib/numb/friendly.rb
|
98
103
|
- lib/numb/frugal.rb
|
104
|
+
- lib/numb/full_reptend_prime.rb
|
99
105
|
- lib/numb/giuga.rb
|
100
106
|
- lib/numb/goldbach.rb
|
101
107
|
- lib/numb/hamming.rb
|
@@ -127,6 +133,7 @@ files:
|
|
127
133
|
- lib/numb/minimal.rb
|
128
134
|
- lib/numb/mms_pair.rb
|
129
135
|
- lib/numb/mobius.rb
|
136
|
+
- lib/numb/modulo_order.rb
|
130
137
|
- lib/numb/myriagonal.rb
|
131
138
|
- lib/numb/n_gonal.rb
|
132
139
|
- lib/numb/narcissistic.rb
|
@@ -155,6 +162,8 @@ files:
|
|
155
162
|
- lib/numb/prime_count.rb
|
156
163
|
- lib/numb/prime_signature.rb
|
157
164
|
- lib/numb/primitive_pseudoperfect.rb
|
165
|
+
- lib/numb/primitive_root.rb
|
166
|
+
- lib/numb/primitive_roots.rb
|
158
167
|
- lib/numb/primorial.rb
|
159
168
|
- lib/numb/pronic.rb
|
160
169
|
- lib/numb/properties.rb
|
@@ -237,15 +246,20 @@ files:
|
|
237
246
|
- spec/numb/centered_cube_spec.rb
|
238
247
|
- spec/numb/centered_hexagonal_spec.rb
|
239
248
|
- spec/numb/centered_n_gonal_spec.rb
|
249
|
+
- spec/numb/centered_pentagonal_spec.rb
|
240
250
|
- spec/numb/centered_triangular_spec.rb
|
241
251
|
- spec/numb/composite_spec.rb
|
242
252
|
- spec/numb/congruum_spec.rb
|
243
253
|
- spec/numb/coprime_spec.rb
|
244
254
|
- spec/numb/core_spec.rb
|
245
255
|
- spec/numb/cube_spec.rb
|
256
|
+
- spec/numb/cullen_spec.rb
|
257
|
+
- spec/numb/cyclic_spec.rb
|
246
258
|
- spec/numb/d_spec.rb
|
247
259
|
- spec/numb/decagonal_spec.rb
|
248
260
|
- spec/numb/deficient_spec.rb
|
261
|
+
- spec/numb/delannoy_spec.rb
|
262
|
+
- spec/numb/demlo_spec.rb
|
249
263
|
- spec/numb/digital_sum_spec.rb
|
250
264
|
- spec/numb/dihedral_prime_spec.rb
|
251
265
|
- spec/numb/divides_spec.rb
|
@@ -265,6 +279,7 @@ files:
|
|
265
279
|
- spec/numb/fibonacci_spec.rb
|
266
280
|
- spec/numb/friendly_spec.rb
|
267
281
|
- spec/numb/frugal_spec.rb
|
282
|
+
- spec/numb/full_reptend_prime_spec.rb
|
268
283
|
- spec/numb/giuga_spec.rb
|
269
284
|
- spec/numb/goldbach_spec.rb
|
270
285
|
- spec/numb/hamming_spec.rb
|
@@ -280,6 +295,7 @@ files:
|
|
280
295
|
- spec/numb/idoneal_spec.rb
|
281
296
|
- spec/numb/integer_p_spec.rb
|
282
297
|
- spec/numb/interprime_spec.rb
|
298
|
+
- spec/numb/isqrt_spec.rb
|
283
299
|
- spec/numb/jacobsthal_lucas_spec.rb
|
284
300
|
- spec/numb/k_perfect_spec.rb
|
285
301
|
- spec/numb/kaprekar_spec.rb
|
@@ -295,6 +311,7 @@ files:
|
|
295
311
|
- spec/numb/mersenne_prime_spec.rb
|
296
312
|
- spec/numb/minimal_spec.rb
|
297
313
|
- spec/numb/mobius_spec.rb
|
314
|
+
- spec/numb/modulo_order_spec.rb
|
298
315
|
- spec/numb/myriagonal_spec.rb
|
299
316
|
- spec/numb/narcissistic_spec.rb
|
300
317
|
- spec/numb/nivenmorphic_spec.rb
|
@@ -323,6 +340,8 @@ files:
|
|
323
340
|
- spec/numb/prime_count_spec.rb
|
324
341
|
- spec/numb/prime_signature_spec.rb
|
325
342
|
- spec/numb/primitive_pseudoperfect_spec.rb
|
343
|
+
- spec/numb/primitive_root_spec.rb
|
344
|
+
- spec/numb/primitive_roots_spec.rb
|
326
345
|
- spec/numb/primorial_spec.rb
|
327
346
|
- spec/numb/pronic_spec.rb
|
328
347
|
- spec/numb/proth_spec.rb
|
@@ -416,10 +435,12 @@ test_files:
|
|
416
435
|
- spec/numb/primitive_pseudoperfect_spec.rb
|
417
436
|
- spec/numb/polydivisible_spec.rb
|
418
437
|
- spec/numb/strictly_non_palindromic_spec.rb
|
438
|
+
- spec/numb/cyclic_spec.rb
|
419
439
|
- spec/numb/iban_spec.rb
|
420
440
|
- spec/numb/equidigital_spec.rb
|
421
441
|
- spec/numb/primorial_spec.rb
|
422
442
|
- spec/numb/superabundant_spec.rb
|
443
|
+
- spec/numb/modulo_order_spec.rb
|
423
444
|
- spec/numb/sociable_spec.rb
|
424
445
|
- spec/numb/unitary_perfect_spec.rb
|
425
446
|
- spec/numb/nivenmorphic_spec.rb
|
@@ -447,6 +468,7 @@ test_files:
|
|
447
468
|
- spec/numb/polite_spec.rb
|
448
469
|
- spec/numb/unitary_amicable_spec.rb
|
449
470
|
- spec/numb/squared_triangular_spec.rb
|
471
|
+
- spec/numb/cullen_spec.rb
|
450
472
|
- spec/numb/zerofree_spec.rb
|
451
473
|
- spec/numb/eban_spec.rb
|
452
474
|
- spec/numb/automorphic_spec.rb
|
@@ -456,6 +478,7 @@ test_files:
|
|
456
478
|
- spec/numb/hyperperfect_spec.rb
|
457
479
|
- spec/numb/uban_spec.rb
|
458
480
|
- spec/numb/zeisel_spec.rb
|
481
|
+
- spec/numb/primitive_roots_spec.rb
|
459
482
|
- spec/numb/smooth_spec.rb
|
460
483
|
- spec/numb/d_spec.rb
|
461
484
|
- spec/numb/heptagonal_spec.rb
|
@@ -482,6 +505,7 @@ test_files:
|
|
482
505
|
- spec/numb/unusual_spec.rb
|
483
506
|
- spec/numb/octagonal_spec.rb
|
484
507
|
- spec/numb/unitary_sociable_spec.rb
|
508
|
+
- spec/numb/full_reptend_prime_spec.rb
|
485
509
|
- spec/numb/vampire_spec.rb
|
486
510
|
- spec/numb/dodecagonal_spec.rb
|
487
511
|
- spec/numb/dihedral_prime_spec.rb
|
@@ -512,6 +536,7 @@ test_files:
|
|
512
536
|
- spec/numb/euclid_spec.rb
|
513
537
|
- spec/numb/semiprime_spec.rb
|
514
538
|
- spec/numb/deficient_spec.rb
|
539
|
+
- spec/numb/centered_pentagonal_spec.rb
|
515
540
|
- spec/numb/almost_perfect_spec.rb
|
516
541
|
- spec/numb/amicable_spec.rb
|
517
542
|
- spec/numb/amenable_spec.rb
|
@@ -525,6 +550,7 @@ test_files:
|
|
525
550
|
- spec/numb/semi_perfect_spec.rb
|
526
551
|
- spec/numb/pentagonal_spec.rb
|
527
552
|
- spec/numb/blum_spec.rb
|
553
|
+
- spec/numb/demlo_spec.rb
|
528
554
|
- spec/numb/smarandache_wellin_spec.rb
|
529
555
|
- spec/numb/maris_mcgwire_sosa_pair_spec.rb
|
530
556
|
- spec/numb/core_spec.rb
|
@@ -535,9 +561,11 @@ test_files:
|
|
535
561
|
- spec/numb/harshad_spec.rb
|
536
562
|
- spec/numb/cube_spec.rb
|
537
563
|
- spec/numb/ore_spec.rb
|
564
|
+
- spec/numb/delannoy_spec.rb
|
538
565
|
- spec/numb/carol_spec.rb
|
539
566
|
- spec/numb/powerful_spec.rb
|
540
567
|
- spec/numb/prime_count_spec.rb
|
568
|
+
- spec/numb/primitive_root_spec.rb
|
541
569
|
- spec/numb/weird_spec.rb
|
542
570
|
- spec/numb/interprime_spec.rb
|
543
571
|
- spec/numb/number_of_distinct_prime_factors_spec.rb
|
@@ -557,6 +585,7 @@ test_files:
|
|
557
585
|
- spec/numb/decagonal_spec.rb
|
558
586
|
- spec/numb/apocalyptic_spec.rb
|
559
587
|
- spec/numb/kaprekar_spec.rb
|
588
|
+
- spec/numb/isqrt_spec.rb
|
560
589
|
- spec/numb/hilbert_spec.rb
|
561
590
|
- "spec/numb/st\xC3\xB8rmer_spec.rb"
|
562
591
|
- spec/numb/keith_spec.rb
|