abst 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/abst.rb +38 -0
- data/lib/config.rb +21 -0
- data/lib/include/array.rb +45 -0
- data/lib/include/bisect.rb +95 -0
- data/lib/include/cache.rb +60 -0
- data/lib/include/compatibility.rb +3 -0
- data/lib/include/complex.rb +10 -0
- data/lib/include/float.rb +19 -0
- data/lib/include/fundamental.rb +903 -0
- data/lib/include/graph.rb +11 -0
- data/lib/include/group.rb +35 -0
- data/lib/include/integer.rb +385 -0
- data/lib/include/matrix.rb +143 -0
- data/lib/include/polynomial.rb +137 -0
- data/lib/include/prime.rb +556 -0
- data/lib/include/prime_mpqs.rb +483 -0
- data/lib/include/rational.rb +155 -0
- data/lib/include/residue.rb +27 -0
- data/lib/include/ring.rb +21 -0
- data/lib/include/sequence.rb +54 -0
- data/lib/include/set.rb +67 -0
- data/lib/include/vector.rb +90 -0
- data/test/test_all.rb +15 -0
- data/test/test_array.rb +10 -0
- data/test/test_bisect.rb +43 -0
- data/test/test_combination.rb +6 -0
- data/test/test_float.rb +13 -0
- data/test/test_fundamental.rb +406 -0
- data/test/test_group.rb +10 -0
- data/test/test_integer.rb +161 -0
- data/test/test_matrix.rb +54 -0
- data/test/test_polynomial.rb +107 -0
- data/test/test_prime.rb +153 -0
- data/test/test_prime_mpqs.rb +24 -0
- data/test/test_rational.rb +33 -0
- data/test/test_sequence.rb +55 -0
- data/test/test_set.rb +36 -0
- data/test/test_vector.rb +37 -0
- metadata +98 -0
data/test/test_group.rb
ADDED
@@ -0,0 +1,161 @@
|
|
1
|
+
require 'minitest/unit'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'abst'
|
4
|
+
|
5
|
+
class TC_Fundamental < MiniTest::Unit::TestCase
|
6
|
+
def test_to_fs
|
7
|
+
assert_equal('0', 0.to_fs)
|
8
|
+
assert_equal('1', 1.to_fs)
|
9
|
+
assert_equal('123 456 789', 123456789.to_fs)
|
10
|
+
assert_equal('1 234 567 890', 1234567890.to_fs)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_bit_size
|
14
|
+
assert_equal(0, 0.bit_size)
|
15
|
+
assert_equal(1, 1.bit_size)
|
16
|
+
assert_equal(2, 2.bit_size)
|
17
|
+
assert_equal(2, 3.bit_size)
|
18
|
+
assert_equal(3, 4.bit_size)
|
19
|
+
assert_equal(3, 5.bit_size)
|
20
|
+
assert_equal(10, 1023.bit_size)
|
21
|
+
assert_equal(11, 1024.bit_size)
|
22
|
+
assert_equal(11, 1025.bit_size)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_factorial
|
26
|
+
assert_equal(1, 0.factorial)
|
27
|
+
assert_equal(1, 1.factorial)
|
28
|
+
assert_equal(2, 2.factorial)
|
29
|
+
assert_equal(6, 3.factorial)
|
30
|
+
assert_equal(24, 4.factorial)
|
31
|
+
assert_equal(120, 5.factorial)
|
32
|
+
assert_equal(720, 6.factorial)
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_pmod_factorial
|
36
|
+
assert_equal(1, 0.pmod_factorial(5))
|
37
|
+
assert_equal(1, 1.pmod_factorial(5))
|
38
|
+
assert_equal(0, 2.pmod_factorial(2))
|
39
|
+
assert_equal(1, 3.pmod_factorial(5))
|
40
|
+
assert_equal(7, 4.pmod_factorial(17))
|
41
|
+
assert_equal(27, 5.pmod_factorial(31))
|
42
|
+
assert_equal(0, 6.pmod_factorial(5))
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_extended_pmod_factorial
|
46
|
+
assert_equal([1, 0], 0.extended_pmod_factorial(5))
|
47
|
+
assert_equal([1, 0], 1.extended_pmod_factorial(5))
|
48
|
+
assert_equal([1, 1], 2.extended_pmod_factorial(2))
|
49
|
+
assert_equal([2, 1], 3.extended_pmod_factorial(3))
|
50
|
+
assert_equal([7, 0], 4.extended_pmod_factorial(17))
|
51
|
+
assert_equal([1, 3], 5.extended_pmod_factorial(2))
|
52
|
+
assert_equal([4, 1], 6.extended_pmod_factorial(5))
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_combination
|
56
|
+
assert_equal(1, 1.combination(1))
|
57
|
+
assert_equal(1, 1.combination(0))
|
58
|
+
assert_equal(45, 10.combination(2))
|
59
|
+
assert_equal(120, 10.combination(7))
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_pmod_combination
|
63
|
+
assert_equal(1, 1.pmod_combination(1, 2))
|
64
|
+
assert_equal(1, 1.pmod_combination(0, 3))
|
65
|
+
assert_equal(0, 10.pmod_combination(2, 3))
|
66
|
+
assert_equal(3, 10.pmod_combination(7, 13))
|
67
|
+
assert_equal(0, (10 ** 18).pmod_combination(10 ** 9, 2437))
|
68
|
+
assert_equal(673, (10 ** 18).pmod_combination(10 ** 9, 3389))
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_power_of?
|
72
|
+
assert_equal(true, 2.power_of?(2))
|
73
|
+
assert_equal(false, 3.power_of?(2))
|
74
|
+
assert_equal(true, 36.power_of?(6))
|
75
|
+
assert_equal(false, 100.power_of?(11))
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_square?
|
79
|
+
assert_equal(1, 1.square?)
|
80
|
+
assert_equal(false, 2.square?)
|
81
|
+
assert_equal(false, 3.square?)
|
82
|
+
assert_equal(2, 4.square?)
|
83
|
+
assert_equal(false, 5.square?)
|
84
|
+
assert_equal(13, 169.square?)
|
85
|
+
assert_equal(false, 42342341.square?)
|
86
|
+
|
87
|
+
10.times do
|
88
|
+
n = rand(10 ** 10) + 1
|
89
|
+
square = n ** 2
|
90
|
+
assert_equal(n, square.square?)
|
91
|
+
assert_equal(false, (square + 1).square?)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_squarefree?
|
96
|
+
assert_equal(true, 1.squarefree?)
|
97
|
+
assert_equal(true, 2.squarefree?)
|
98
|
+
assert_equal(true, 3.squarefree?)
|
99
|
+
assert_equal(false, 4.squarefree?)
|
100
|
+
assert_equal(true, 5.squarefree?)
|
101
|
+
assert_equal(true, 6.squarefree?)
|
102
|
+
assert_equal(true, 7.squarefree?)
|
103
|
+
assert_equal(false, 8.squarefree?)
|
104
|
+
assert_equal(true, (7 * 13).squarefree?)
|
105
|
+
assert_equal(false, (5 * 13 * 13).squarefree?)
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_triangle?
|
109
|
+
assert_equal(1, 1.triangle?)
|
110
|
+
assert_equal(false, 2.triangle?)
|
111
|
+
assert_equal(2, 3.triangle?)
|
112
|
+
assert_equal(false, 4.triangle?)
|
113
|
+
assert_equal(false, 5.triangle?)
|
114
|
+
assert_equal(3, 6.triangle?)
|
115
|
+
assert_equal(false, 7.triangle?)
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_pentagonal?
|
119
|
+
assert_equal(1, 1.pentagonal?)
|
120
|
+
assert_equal(false, 2.pentagonal?)
|
121
|
+
assert_equal(false, 3.pentagonal?)
|
122
|
+
assert_equal(false, 4.pentagonal?)
|
123
|
+
assert_equal(2, 5.pentagonal?)
|
124
|
+
assert_equal(false, 6.pentagonal?)
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_hexagonal?
|
128
|
+
assert_equal(1, 1.hexagonal?)
|
129
|
+
assert_equal(false, 2.hexagonal?)
|
130
|
+
assert_equal(false, 3.hexagonal?)
|
131
|
+
assert_equal(false, 4.hexagonal?)
|
132
|
+
assert_equal(false, 5.hexagonal?)
|
133
|
+
assert_equal(2, 6.hexagonal?)
|
134
|
+
assert_equal(false, 7.hexagonal?)
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_heptagonal?
|
138
|
+
assert_equal(1, 1.heptagonal?)
|
139
|
+
assert_equal(false, 2.heptagonal?)
|
140
|
+
assert_equal(false, 3.heptagonal?)
|
141
|
+
assert_equal(false, 4.heptagonal?)
|
142
|
+
assert_equal(false, 5.heptagonal?)
|
143
|
+
assert_equal(false, 6.heptagonal?)
|
144
|
+
assert_equal(2, 7.heptagonal?)
|
145
|
+
assert_equal(false, 8.heptagonal?)
|
146
|
+
assert_equal(3, 18.heptagonal?)
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_octagonal?
|
150
|
+
assert_equal(1, 1.octagonal?)
|
151
|
+
assert_equal(false, 2.octagonal?)
|
152
|
+
assert_equal(false, 3.octagonal?)
|
153
|
+
assert_equal(false, 4.octagonal?)
|
154
|
+
assert_equal(false, 5.octagonal?)
|
155
|
+
assert_equal(false, 6.octagonal?)
|
156
|
+
assert_equal(false, 7.octagonal?)
|
157
|
+
assert_equal(2, 8.octagonal?)
|
158
|
+
assert_equal(false, 9.octagonal?)
|
159
|
+
assert_equal(3, 21.octagonal?)
|
160
|
+
end
|
161
|
+
end
|
data/test/test_matrix.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'minitest/unit'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'abst'
|
4
|
+
|
5
|
+
class TC_Matrix < MiniTest::Unit::TestCase
|
6
|
+
def test_Matrix
|
7
|
+
matrix = Abst::Matrix(Rational, 2, 3)
|
8
|
+
assert_equal("Rational", matrix.coef_class.name)
|
9
|
+
assert_equal(2, matrix.height)
|
10
|
+
assert_equal(3, matrix.width)
|
11
|
+
|
12
|
+
m = [[3, 5, 1], [9, 2, 3]]
|
13
|
+
assert_equal(m, Abst::Matrix(Rational, m).to_a)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_each
|
17
|
+
matrix = Abst::Matrix(Rational, 2, 2)
|
18
|
+
m = matrix.new([[3, 5], [1, 2]])
|
19
|
+
assert_equal([3, 5, 1, 2], m.each.to_a)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_add
|
23
|
+
matrix = Abst::Matrix(Rational, 2, 3)
|
24
|
+
m1 = matrix.new([[2, 3, 2], [4, 5, -7]])
|
25
|
+
m2 = matrix.new([[3, 1, 4], [2, -3, 1]])
|
26
|
+
|
27
|
+
assert_equal([[5, 4, 6], [6, 2, -6]], (m1 + m2).to_a)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_sub
|
31
|
+
matrix = Abst::Matrix(Rational, 2, 3)
|
32
|
+
m1 = matrix.new([[2, 3, 2], [4, 5, -7]])
|
33
|
+
m2 = matrix.new([[3, 1, 4], [2, -3, 1]])
|
34
|
+
|
35
|
+
assert_equal([[-1, 2, -2], [2, 8, -8]], (m1 - m2).to_a)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_solve
|
39
|
+
assert_equal([2].to_v, [[2, 4]].to_m.solve)
|
40
|
+
assert_equal([-5.5, 6.0].to_v, [[2, 3, 7], [4, 5, 8]].to_m.solve)
|
41
|
+
assert_equal([-22, 20].to_v, [[4, 5, 12], [2, 3, 16]].to_m.solve)
|
42
|
+
assert_equal([-2, 2, 1].to_v, [[1, 1, 1, 1], [1, 2, 3, 5], [2, 4, 8, 12]].to_m.solve)
|
43
|
+
assert_equal(nil, [[1, 2, 3, 12], [4, 5, 6, 13], [7, 8, 9, 14]].to_m.solve)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class TC_SquareMatrix < MiniTest::Unit::TestCase
|
48
|
+
def test_trace
|
49
|
+
matrix = Abst::Matrix(Rational, 2, 2)
|
50
|
+
m = matrix.new([[2, 3], [4, 5]])
|
51
|
+
|
52
|
+
assert_equal(7, m.trace)
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'minitest/unit'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'abst'
|
4
|
+
|
5
|
+
class TC_Polynomial < MiniTest::Unit::TestCase
|
6
|
+
def test_Polynomial
|
7
|
+
polynomial = Abst::Polynomial(Rational)
|
8
|
+
assert_equal("Rational", polynomial.coef_class.name)
|
9
|
+
|
10
|
+
poly = polynomial.new([1, Rational(2, 7), 3])
|
11
|
+
assert_equal([1, Rational(2, 7), 3], poly.to_a)
|
12
|
+
|
13
|
+
poly = Abst::Polynomial(Rational, [3, 5])
|
14
|
+
assert_equal([3, 5], poly.to_a)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_zero
|
18
|
+
polynomial = Abst::Polynomial(Rational)
|
19
|
+
assert_equal([0], polynomial.zero.to_a)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_one
|
23
|
+
polynomial = Abst::Polynomial(Rational)
|
24
|
+
assert_equal(polynomial.new([1]), polynomial.one)
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_add
|
28
|
+
polynomial = Abst::Polynomial(Integer)
|
29
|
+
poly1 = polynomial.new([2, 3, 4])
|
30
|
+
poly2 = polynomial.new([-3, 12, -4])
|
31
|
+
poly3 = polynomial.new([-3, 12])
|
32
|
+
assert_equal([-1, 15], (poly1 + poly2).to_a)
|
33
|
+
assert_equal([-1, 15, 4], (poly1 + poly3).to_a)
|
34
|
+
assert_equal([4, 3, 4], (poly1 + 2).to_a)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_sub
|
38
|
+
polynomial = Abst::Polynomial(Integer)
|
39
|
+
|
40
|
+
poly1 = polynomial.new([2, 3, 4])
|
41
|
+
poly2 = polynomial.new([-3, 12, 4])
|
42
|
+
poly3 = polynomial.new([-3, 12])
|
43
|
+
assert_equal([5, -9], (poly1 - poly2).to_a)
|
44
|
+
assert_equal([5, -9, 4], (poly1 - poly3).to_a)
|
45
|
+
assert_equal([0, 3, 4], (poly1 - 2).to_a)
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_mul
|
49
|
+
polynomial = Abst::Polynomial(Integer)
|
50
|
+
poly1 = polynomial.new([2, 3, 4])
|
51
|
+
poly2 = polynomial.new([-3, 12, -4])
|
52
|
+
expect = polynomial.new([-6, 15, 16, 36, -16])
|
53
|
+
|
54
|
+
assert_equal(expect, (poly1 * poly2))
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_divmod
|
58
|
+
polynomial = Abst::Polynomial(Integer)
|
59
|
+
|
60
|
+
poly1 = polynomial.new([1, 2, 3])
|
61
|
+
poly2 = polynomial.new([1])
|
62
|
+
q, r = poly1.divmod(poly2)
|
63
|
+
assert_equal(poly1, q)
|
64
|
+
assert_equal(polynomial.zero, r)
|
65
|
+
|
66
|
+
poly3 = polynomial.new([4, 5, 0, 1])
|
67
|
+
poly4 = polynomial.new([3, 3, 1])
|
68
|
+
q, r = poly3.divmod(poly4)
|
69
|
+
assert_equal(polynomial.new([-3, 1]), q)
|
70
|
+
assert_equal(polynomial.new([13, 11]), r)
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_eq
|
74
|
+
polynomial = Abst::Polynomial(Integer)
|
75
|
+
poly1 = polynomial.new([2, 3, 4])
|
76
|
+
poly2 = polynomial.new([2, 3, 4])
|
77
|
+
poly3 = polynomial.new([-3, 12, -4])
|
78
|
+
|
79
|
+
assert_equal(true, poly1 == poly2)
|
80
|
+
assert_equal(false, poly1 == poly3)
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_degree
|
84
|
+
polynomial = Abst::Polynomial(Integer)
|
85
|
+
poly = polynomial.new([2, 3, 4, 0])
|
86
|
+
assert_equal(2, poly.degree)
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_lc
|
90
|
+
polynomial = Abst::Polynomial(Integer)
|
91
|
+
poly = polynomial.new([2, 3, 4])
|
92
|
+
assert_equal(4, poly.lc)
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_eval
|
96
|
+
polynomial = Abst::Polynomial(Integer)
|
97
|
+
poly = polynomial.new([2, -3, 4])
|
98
|
+
assert_equal(3, poly.eval(1))
|
99
|
+
assert_equal(12, poly.eval(2))
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_to_a
|
103
|
+
polynomial = Abst::Polynomial(Integer)
|
104
|
+
poly = polynomial.new([2, -3, 4])
|
105
|
+
assert_equal([2, -3, 4], poly.to_a)
|
106
|
+
end
|
107
|
+
end
|
data/test/test_prime.rb
ADDED
@@ -0,0 +1,153 @@
|
|
1
|
+
require 'minitest/unit'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'abst'
|
4
|
+
|
5
|
+
class TC_Prime < MiniTest::Unit::TestCase
|
6
|
+
def test_primes_list
|
7
|
+
list = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
|
8
|
+
assert_equal(list, Abst.primes_list[0...10])
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_pseudoprime_test
|
12
|
+
assert_equal(true, Abst.pseudoprime_test(3, 2))
|
13
|
+
assert_equal(true, Abst.pseudoprime_test(5, 3))
|
14
|
+
assert_equal(true, Abst.pseudoprime_test(7, 4))
|
15
|
+
assert_equal(false, Abst.pseudoprime_test(4, 3))
|
16
|
+
assert_equal(false, Abst.pseudoprime_test(15, 8))
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_strong_pseudoprime_test
|
20
|
+
assert_equal(true, Abst.strong_pseudoprime_test(3, 2))
|
21
|
+
assert_equal(true, Abst.strong_pseudoprime_test(5, 3))
|
22
|
+
assert_equal(true, Abst.strong_pseudoprime_test(7, 4))
|
23
|
+
assert_equal(false, Abst.strong_pseudoprime_test(12, 5))
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_miller_rabin
|
27
|
+
assert_equal(true, Abst.miller_rabin(3))
|
28
|
+
assert_equal(false, Abst.miller_rabin(4))
|
29
|
+
assert_equal(true, Abst.miller_rabin(5))
|
30
|
+
assert_equal(false, Abst.miller_rabin(6))
|
31
|
+
assert_equal(true, Abst.miller_rabin(11))
|
32
|
+
assert_equal(false, Abst.miller_rabin(169))
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_n_minus_1
|
36
|
+
assert_equal(true, Abst.n_minus_1(3))
|
37
|
+
assert_equal(false, Abst.n_minus_1(4))
|
38
|
+
assert_equal(true, Abst.n_minus_1(5))
|
39
|
+
assert_equal(false, Abst.n_minus_1(6))
|
40
|
+
assert_equal(true, Abst.n_minus_1(7))
|
41
|
+
assert_equal(false, Abst.n_minus_1(561))
|
42
|
+
assert_equal(true, Abst.n_minus_1(507526619771207))
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_prime?
|
46
|
+
assert_equal(false, Abst.prime?(1))
|
47
|
+
assert_equal(true, Abst.prime?(2))
|
48
|
+
assert_equal(true, Abst.prime?(3))
|
49
|
+
assert_equal(false, Abst.prime?(4))
|
50
|
+
assert_equal(true, Abst.prime?(5))
|
51
|
+
assert_equal(false, Abst.prime?(6))
|
52
|
+
assert_equal(true, Abst.prime?(7))
|
53
|
+
assert_equal(false, Abst.prime?(8))
|
54
|
+
assert_equal(false, Abst.prime?(9))
|
55
|
+
assert_equal(false, Abst.prime?(10))
|
56
|
+
assert_equal(true, Abst.prime?(11))
|
57
|
+
assert_equal(false, Abst.prime?(12))
|
58
|
+
assert_equal(true, Abst.prime?(13))
|
59
|
+
assert_equal(true, Abst.prime?(17))
|
60
|
+
assert_equal(false, Abst.prime?(1_373_653))
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_trial_division
|
64
|
+
assert_equal([[[2, 1]], 1], Abst.trial_division(2))
|
65
|
+
assert_equal([[[3, 1]], 1], Abst.trial_division(3))
|
66
|
+
assert_equal([[[2, 2]], 1], Abst.trial_division(4))
|
67
|
+
assert_equal([[[5, 1]], 1], Abst.trial_division(5))
|
68
|
+
assert_equal([[[2, 1], [3, 1]], 1], Abst.trial_division(6))
|
69
|
+
assert_equal([[[11, 1]], 1], Abst.trial_division(11))
|
70
|
+
assert_equal([[[13, 2]], 1], Abst.trial_division(169))
|
71
|
+
assert_equal([[[2, 2], [231053, 1], [415039, 1]], 708806692316951],
|
72
|
+
Abst.trial_division(4 * 231053 * 415039 * 70_880_669_231_6951, 500_000))
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_differences_of_squares
|
76
|
+
assert_equal([985109, 2993579], Abst.differences_of_squares(2949001615111))
|
77
|
+
assert_equal([6576439, 8192167], Abst.differences_of_squares(53875286553313))
|
78
|
+
assert_equal([4121987, 9553081], Abst.differences_of_squares(39377675691947))
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_pollard_rho
|
82
|
+
assert_equal(155240783, Abst.pollard_rho(3876131431000528283))
|
83
|
+
assert_equal(2252849497, Abst.pollard_rho(5409492426475365797, 1, 2, 100_000))
|
84
|
+
assert_equal(1264621003, Abst.pollard_rho(11781814522941624827, 1, 2, 100_000))
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_p_minus_1
|
88
|
+
assert_equal(3, Abst.p_minus_1(6, 10_000, 2))
|
89
|
+
assert_equal(3292218043, Abst.p_minus_1(9530738504299322287, 10_000, 2))
|
90
|
+
assert_equal(6042787811, Abst.p_minus_1(23916353875143281737, 10_000, 2))
|
91
|
+
assert_equal(8228369521, Abst.p_minus_1(24559500716705748943, 10_000, 2))
|
92
|
+
assert_equal(7046628167, Abst.p_minus_1(43381522922949440477, 10_000, 2))
|
93
|
+
assert_equal(9571252001, Abst.p_minus_1(79670656009259581439, 10_000, 2))
|
94
|
+
assert_equal(6135173419, Abst.p_minus_1(19256936255213267029, 10_000, 2))
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_factorize
|
98
|
+
assert_equal([[-1, 1]], Abst.factorize(-1))
|
99
|
+
assert_equal([[0, 1]], Abst.factorize(0))
|
100
|
+
assert_equal([[1, 1]], Abst.factorize(1))
|
101
|
+
assert_equal([[2, 1]], Abst.factorize(2))
|
102
|
+
assert_equal([[3, 1]], Abst.factorize(3))
|
103
|
+
assert_equal([[2, 2]], Abst.factorize(4))
|
104
|
+
assert_equal([[5, 1]], Abst.factorize(5))
|
105
|
+
assert_equal([[2, 2], [3, 1]], Abst.factorize(12))
|
106
|
+
assert_equal([[3, 4]], Abst.factorize(81))
|
107
|
+
assert_equal([[2, 10]], Abst.factorize(1024))
|
108
|
+
assert_equal([[-1, 1], [3, 1], [5, 3]], Abst.factorize(-375))
|
109
|
+
assert_equal([[3, 1], [224743, 2]], Abst.factorize(151528248147))
|
110
|
+
assert_equal([[1658414587, 1], [5856287651, 1]], Abst.factorize(5856287651 * 1658414587))
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_eratosthenes_sieve
|
114
|
+
assert_equal([2, 3, 5, 7], Abst.eratosthenes_sieve(10).to_a)
|
115
|
+
assert_equal([2, 3, 5, 7, 11], Abst.eratosthenes_sieve(11).to_a)
|
116
|
+
assert_equal([2, 3, 5, 7, 11], Abst.eratosthenes_sieve(12).to_a)
|
117
|
+
assert_equal([2, 3, 5, 7, 11, 13, 17, 19], Abst.eratosthenes_sieve(20).to_a)
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_next_prime
|
121
|
+
assert_equal(2, Abst.next_prime(-5))
|
122
|
+
assert_equal(2, Abst.next_prime(0))
|
123
|
+
assert_equal(2, Abst.next_prime(1))
|
124
|
+
assert_equal(3, Abst.next_prime(2))
|
125
|
+
assert_equal(5, Abst.next_prime(3))
|
126
|
+
assert_equal(5, Abst.next_prime(4))
|
127
|
+
assert_equal(7, Abst.next_prime(5))
|
128
|
+
assert_equal(7, Abst.next_prime(6))
|
129
|
+
assert_equal(11, Abst.next_prime(7))
|
130
|
+
assert_equal(29, Abst.next_prime(23))
|
131
|
+
assert_equal(101, Abst.next_prime(100))
|
132
|
+
assert_equal(599993, Abst.next_prime(599983))
|
133
|
+
assert_equal(900001, Abst.next_prime(899981))
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_each_prime
|
137
|
+
assert_equal([2, 3, 5, 7], (0..10).each_prime.to_a)
|
138
|
+
assert_equal([11, 13, 17, 19], (11..20).each_prime.to_a)
|
139
|
+
assert_equal([23, 29, 31, 37], (21...41).each_prime.to_a)
|
140
|
+
assert_equal([23, 29, 31, 37, 41], (21..41).each_prime.to_a)
|
141
|
+
end
|
142
|
+
|
143
|
+
def test_phi
|
144
|
+
assert_equal(1, Abst.phi(1))
|
145
|
+
assert_equal(1, Abst.phi(2))
|
146
|
+
assert_equal(2, Abst.phi(3))
|
147
|
+
assert_equal(2, Abst.phi(4))
|
148
|
+
assert_equal(4, Abst.phi(5))
|
149
|
+
assert_equal(2, Abst.phi(6))
|
150
|
+
assert_equal(6, Abst.phi(7))
|
151
|
+
assert_equal(4, Abst.phi(8))
|
152
|
+
end
|
153
|
+
end
|