abst 0.2.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.
@@ -0,0 +1,10 @@
1
+ require 'minitest/unit'
2
+ require 'minitest/autorun'
3
+ require 'abst'
4
+
5
+ class TC_Group < MiniTest::Unit::TestCase
6
+ def test_element_order
7
+ f_7 = Abst.residue_class_field(7 * Integer)
8
+ assert_equal(6, Abst.element_order(f_7.new(3), 6))
9
+ end
10
+ end
@@ -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
@@ -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
@@ -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