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_bisect.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'minitest/unit'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'abst'
|
4
|
+
|
5
|
+
class TC_Bisect < MiniTest::Unit::TestCase
|
6
|
+
def test_bisect_left
|
7
|
+
list = [1, 2, 3, 3, 4, 6]
|
8
|
+
assert_equal(1, Bisect.bisect_left(list, 2))
|
9
|
+
assert_equal(2, Bisect.bisect_left(list, 3))
|
10
|
+
assert_equal(4, Bisect.bisect_left(list, 4))
|
11
|
+
assert_equal(5, Bisect.bisect_left(list, 5))
|
12
|
+
assert_equal(5, Bisect.bisect_left(list, 6))
|
13
|
+
|
14
|
+
list = [[1, 2], [2, 3], [3, 5], [4, 7], [5, 11]]
|
15
|
+
assert_equal(1, Bisect.bisect_left(list, 3){|a, b| a[1] <=> b})
|
16
|
+
assert_equal(2, Bisect.bisect_left(list, 4){|a, b| a[1] <=> b})
|
17
|
+
assert_equal(2, Bisect.bisect_left(list, 5){|a, b| a[1] <=> b})
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_bisect_right
|
21
|
+
list = [1, 2, 3, 3, 4, 6]
|
22
|
+
assert_equal(2, Bisect.bisect_right(list, 2))
|
23
|
+
assert_equal(4, Bisect.bisect_right(list, 3))
|
24
|
+
assert_equal(5, Bisect.bisect_right(list, 4))
|
25
|
+
assert_equal(5, Bisect.bisect_right(list, 5))
|
26
|
+
assert_equal(6, Bisect.bisect_right(list, 6))
|
27
|
+
|
28
|
+
list = [[1, 2], [2, 3], [3, 5], [4, 7], [5, 11]]
|
29
|
+
assert_equal(2, Bisect.bisect_right(list, 3){|a, b| a[1] <=> b})
|
30
|
+
assert_equal(2, Bisect.bisect_right(list, 4){|a, b| a[1] <=> b})
|
31
|
+
assert_equal(3, Bisect.bisect_right(list, 5){|a, b| a[1] <=> b})
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_insert_left
|
35
|
+
list = [1, 2, 3, 3]
|
36
|
+
assert_equal([1, 2, 2, 3, 3], Bisect.insert_left(list, 2))
|
37
|
+
|
38
|
+
list = [[1, 2], [2, 3]].freeze
|
39
|
+
assert_equal([['a', 2], [1, 2], [2, 3]], Bisect.insert_left(list.dup, ['a', 2]){|a, b| a[1] <=> b[1]})
|
40
|
+
assert_equal([[1, 2], ['a', 3], [2, 3]], Bisect.insert_left(list.dup, ['a', 3]){|a, b| a[1] <=> b[1]})
|
41
|
+
assert_equal([[1, 2], [2, 3], ['a', 4]], Bisect.insert_left(list.dup, ['a', 4]){|a, b| a[1] <=> b[1]})
|
42
|
+
end
|
43
|
+
end
|
data/test/test_float.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'minitest/unit'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'abst'
|
4
|
+
|
5
|
+
class TC_Float < MiniTest::Unit::TestCase
|
6
|
+
def test_to_fs
|
7
|
+
assert_equal('0.0', 0.to_f.to_fs)
|
8
|
+
assert_equal('0.123456789', (0.123456789).to_fs)
|
9
|
+
assert_equal('1.0', 1.to_f.to_fs)
|
10
|
+
assert_equal('123 456 789.0', 123456789.to_f.to_fs)
|
11
|
+
assert_equal('1 234 567 890.0', 1234567890.to_f.to_fs)
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,406 @@
|
|
1
|
+
require 'minitest/unit'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'abst'
|
4
|
+
|
5
|
+
class TC_Fundamental < MiniTest::Unit::TestCase
|
6
|
+
def test_right_left_power
|
7
|
+
assert_equal(1, Abst.right_left_power(5, 0))
|
8
|
+
assert_equal(1024, Abst.right_left_power(2, 10))
|
9
|
+
assert_equal(24, Abst.right_left_power(2, 10, 100))
|
10
|
+
# Float
|
11
|
+
assert_equal(1.0 / 1024, Abst.right_left_power(2.0, -10))
|
12
|
+
# Rational
|
13
|
+
assert_equal(Rational(1024, 59049), Abst.right_left_power(Rational(2, 3), 10))
|
14
|
+
assert_equal(Rational(59049, 1024), Abst.right_left_power(Rational(2, 3), -10))
|
15
|
+
# Complex
|
16
|
+
assert_equal(Complex('1/32i'), Abst.right_left_power(Complex('1/2+1/2i'), 10))
|
17
|
+
assert_equal(Complex('-32i'), Abst.right_left_power(Complex('1/2+1/2i'), -10))
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_left_right_power
|
21
|
+
assert_equal(1, Abst.left_right_power(5, 0))
|
22
|
+
assert_equal(1024, Abst.left_right_power(2, 10))
|
23
|
+
assert_equal(24, Abst.left_right_power(2, 10, 100))
|
24
|
+
# Float
|
25
|
+
assert_equal(1.0 / 1024, Abst.left_right_power(2.0, -10))
|
26
|
+
# Rational
|
27
|
+
assert_equal(Rational(1024, 59049), Abst.left_right_power(Rational(2, 3), 10))
|
28
|
+
assert_equal(Rational(59049, 1024), Abst.left_right_power(Rational(2, 3), -10))
|
29
|
+
# Complex
|
30
|
+
assert_equal(Complex('1/32i'), Abst.left_right_power(Complex('1/2+1/2i'), 10))
|
31
|
+
assert_equal(Complex('-32i'), Abst.left_right_power(Complex('1/2+1/2i'), -10))
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_left_right_base2k_power
|
35
|
+
assert_equal(1, Abst.left_right_base2k_power(5, 0))
|
36
|
+
assert_equal(1024, Abst.left_right_base2k_power(2, 10))
|
37
|
+
assert_equal(24, Abst.left_right_base2k_power(2, 10, 100))
|
38
|
+
assert_equal(24, Abst.left_right_base2k_power(2, 10, 100, 1))
|
39
|
+
assert_equal(8212890625, Abst.left_right_base2k_power(5, 2 ** 100, 10 ** 10))
|
40
|
+
# Float
|
41
|
+
assert_equal(1.0 / 1024, Abst.left_right_base2k_power(2.0, -10))
|
42
|
+
assert_equal(1.0 / 1024, Abst.left_right_base2k_power(2.0, -10, nil, 2))
|
43
|
+
# Rational
|
44
|
+
assert_equal(Rational(1024, 59049), Abst.left_right_base2k_power(Rational(2, 3), 10))
|
45
|
+
assert_equal(Rational(59049, 1024), Abst.left_right_base2k_power(Rational(2, 3), -10))
|
46
|
+
# Complex
|
47
|
+
assert_equal(Complex('1/32i'), Abst.left_right_base2k_power(Complex('1/2+1/2i'), 10))
|
48
|
+
assert_equal(Complex('-32i'), Abst.left_right_base2k_power(Complex('1/2+1/2i'), -10))
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_gcd
|
52
|
+
assert_equal(1, Abst.gcd(3, 4))
|
53
|
+
assert_equal(7, Abst.gcd(14, 21))
|
54
|
+
assert_equal(2, Abst.gcd(150, 376))
|
55
|
+
assert_equal(32, Abst.gcd(1024, 32))
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_lehmer_gcd
|
59
|
+
assert_equal(7, Abst.lehmer_gcd(14, 21))
|
60
|
+
assert_equal(4294967311, Abst.lehmer_gcd(4294967311 * 2, 4294967311 * 3))
|
61
|
+
|
62
|
+
10.times do
|
63
|
+
a = rand(1 << (Abst::BASE_BYTE << 5))
|
64
|
+
b = rand(1 << (Abst::BASE_BYTE << 5))
|
65
|
+
assert_equal(Abst.gcd(a, b), Abst.lehmer_gcd(a, b))
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_binary_gcd
|
70
|
+
assert_equal(1, Abst.binary_gcd(3, 4))
|
71
|
+
assert_equal(7, Abst.binary_gcd(14, 21))
|
72
|
+
assert_equal(2, Abst.binary_gcd(150, 376))
|
73
|
+
assert_equal(32, Abst.binary_gcd(1024, 32))
|
74
|
+
|
75
|
+
10.times do
|
76
|
+
a = rand(1 << (Abst::BASE_BYTE << 5))
|
77
|
+
b = rand(1 << (Abst::BASE_BYTE << 5))
|
78
|
+
assert_equal(Abst.gcd(a, b), Abst.binary_gcd(a, b))
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_extended_gcd
|
83
|
+
assert_equal([-1, 1, 1], Abst.extended_gcd(3, 4))
|
84
|
+
assert_equal([-1, 1, 7], Abst.extended_gcd(14, 21))
|
85
|
+
assert_equal([-5, 2, 2], Abst.extended_gcd(150, 376))
|
86
|
+
assert_equal([0, 1, 32], Abst.extended_gcd(1024, 32))
|
87
|
+
|
88
|
+
10.times do
|
89
|
+
a = rand(10 ** 15)
|
90
|
+
b = rand(10 ** 15)
|
91
|
+
|
92
|
+
u, v, d = Abst.extended_gcd(a, b)
|
93
|
+
assert_equal(Abst.gcd(a, b), d)
|
94
|
+
assert_equal(d, a * u + b * v)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_extended_lehmer_gcd
|
99
|
+
assert_equal([-1, 1, 1], Abst.extended_lehmer_gcd(3, 4))
|
100
|
+
assert_equal([-1, 1, 7], Abst.extended_lehmer_gcd(14, 21))
|
101
|
+
assert_equal([-5, 2, 2], Abst.extended_lehmer_gcd(150, 376))
|
102
|
+
assert_equal([0, 1, 32], Abst.extended_lehmer_gcd(1024, 32))
|
103
|
+
|
104
|
+
10.times do
|
105
|
+
a = rand(1 << (Abst::BASE_BYTE << 5))
|
106
|
+
b = rand(1 << (Abst::BASE_BYTE << 5))
|
107
|
+
|
108
|
+
u, v, d = Abst.extended_lehmer_gcd(a, b)
|
109
|
+
assert_equal(Abst.gcd(a, b), d)
|
110
|
+
assert_equal(d, a * u + b * v)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_extended_binary_gcd
|
115
|
+
test_cases = [[3, 4, 1], [14, 21, 7], [150, 376, 2], [1024, 32, 32]]
|
116
|
+
|
117
|
+
test_cases.each do |a, b, gcd|
|
118
|
+
u, v, d = Abst.extended_binary_gcd(a, b)
|
119
|
+
assert_equal(gcd, d)
|
120
|
+
assert_equal(d, a * u + b * v)
|
121
|
+
end
|
122
|
+
|
123
|
+
10.times do
|
124
|
+
a = rand(1 << (Abst::BASE_BYTE << 5))
|
125
|
+
b = rand(1 << (Abst::BASE_BYTE << 5))
|
126
|
+
|
127
|
+
u, v, d = Abst.extended_binary_gcd(a, b)
|
128
|
+
assert_equal(Abst.gcd(a, b), d)
|
129
|
+
assert_equal(d, a * u + b * v)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_inverse
|
134
|
+
assert_equal(1, Abst.inverse(1, 3))
|
135
|
+
assert_equal(2, Abst.inverse(2, 3))
|
136
|
+
assert_equal(4, Abst.inverse(2, 7))
|
137
|
+
assert_equal(14, Abst.inverse(11, 17))
|
138
|
+
assert_equal(14, Abst.inverse(-6, 17))
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_chinese_remainder_theorem
|
142
|
+
assert_equal(23, Abst.chinese_remainder_theorem([[1, 2], [2, 3], [3, 5]]))
|
143
|
+
assert_equal(48, Abst.chinese_remainder_theorem([[6, 7], [3, 9]]))
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_continued_fraction
|
147
|
+
assert_equal([[0, 2], []], Abst.continued_fraction(1, 2, 1, 2))
|
148
|
+
assert_equal([[0], [2, 3]], Abst.continued_fraction(1, 2, 1, 3))
|
149
|
+
assert_equal([[0, 1], [5, 12]], Abst.continued_fraction(5, 6, 12, 13))
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_primitive_root
|
153
|
+
assert_equal(2, Abst.primitive_root(3))
|
154
|
+
assert_equal(2, Abst.primitive_root(5))
|
155
|
+
assert_equal(3, Abst.primitive_root(7))
|
156
|
+
assert_equal(2, Abst.primitive_root(11))
|
157
|
+
assert_equal(2, Abst.primitive_root(13))
|
158
|
+
assert_equal(3, Abst.primitive_root(17))
|
159
|
+
assert_equal(2, Abst.primitive_root(19))
|
160
|
+
assert_equal(5, Abst.primitive_root(23))
|
161
|
+
assert_equal(2, Abst.primitive_root(29))
|
162
|
+
assert_equal(3, Abst.primitive_root(31))
|
163
|
+
assert_equal(2, Abst.primitive_root(37))
|
164
|
+
assert_equal(6, Abst.primitive_root(41))
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_kronecker_symbol
|
168
|
+
assert_equal(1, Abst.kronecker_symbol(-1, 0))
|
169
|
+
assert_equal(1, Abst.kronecker_symbol(1, 0))
|
170
|
+
assert_equal(0, Abst.kronecker_symbol(2, 0))
|
171
|
+
assert_equal(0, Abst.kronecker_symbol(8, 0))
|
172
|
+
assert_equal(0, Abst.kronecker_symbol(13, 0))
|
173
|
+
assert_equal(0, Abst.kronecker_symbol(8, 12))
|
174
|
+
assert_equal(-1, Abst.kronecker_symbol(13, 2))
|
175
|
+
assert_equal(1, Abst.kronecker_symbol(15, 2))
|
176
|
+
assert_equal(-1, Abst.kronecker_symbol(2, 3))
|
177
|
+
assert_equal(1, Abst.kronecker_symbol(2, 7))
|
178
|
+
assert_equal(-1, Abst.kronecker_symbol(3, 7))
|
179
|
+
assert_equal(-1, Abst.kronecker_symbol(5, 7))
|
180
|
+
assert_equal(1, Abst.kronecker_symbol(13, 12))
|
181
|
+
assert_equal(-1, Abst.kronecker_symbol(13, 24))
|
182
|
+
assert_equal(1, Abst.kronecker_symbol(4, 13))
|
183
|
+
assert_equal(1, Abst.kronecker_symbol(724, -1))
|
184
|
+
assert_equal(-1, Abst.kronecker_symbol(-724, -1))
|
185
|
+
assert_equal(0, Abst.kronecker_symbol(548, 312))
|
186
|
+
assert_equal(-1, Abst.kronecker_symbol(12345, 331))
|
187
|
+
assert_equal(-1, Abst.kronecker_symbol(1001, 9907))
|
188
|
+
assert_equal(1, Abst.kronecker_symbol(52341889, 31234212))
|
189
|
+
|
190
|
+
a = 99643729781594451042868396167846501500230472387591107578143790780742788645801332383676638714231004135318519027831692615782047224443109967659091408007855678348418498337714611173177406989254270181688716945565274032789703
|
191
|
+
b = 31267693914367505876627950752402860790982923001346570977067972147547243618434775100948874049098069122150588347330506599648051934242427953832849754314645299350774689759824194221025163955934019353362115252842755189364025771509757431
|
192
|
+
assert_equal(-1, Abst.kronecker_symbol(a, b))
|
193
|
+
|
194
|
+
a = 7187008801553024317502507584680801045947513443501530090606525215123945391329031252162272007600667345682610936718616699859719659137624739633380523384569660677495816031070163549368448824130188486965172598282867020003609075202255299904512333540079873642504661763660475
|
195
|
+
b = 9390890125406356897547325530524014170880665334953972291198413925482476004521494203423987990880877752271210934990828148043157880469054299133817519741865133360375031870740979505090858933993543064540721325460139539342114216062420
|
196
|
+
assert_equal(0, Abst.kronecker_symbol(a, b))
|
197
|
+
end
|
198
|
+
|
199
|
+
def test_mod_sqrt
|
200
|
+
test = proc do |n, p, exp|
|
201
|
+
rslt = exp ? Abst.mod_sqrt(n, p, exp) : Abst.mod_sqrt(n, p)
|
202
|
+
if Abst.kronecker_symbol(n, p) == -1
|
203
|
+
assert_equal(nil, rslt)
|
204
|
+
elsif exp
|
205
|
+
assert_equal(n % (p ** exp), rslt ** 2 % (p ** exp))
|
206
|
+
else
|
207
|
+
assert_equal(n % p, rslt ** 2 % p)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
test.call(2, 5)
|
212
|
+
test.call(2, 7)
|
213
|
+
test.call(21, 7)
|
214
|
+
test.call(2, 11)
|
215
|
+
test.call(3, 11)
|
216
|
+
test.call(2, 13)
|
217
|
+
test.call(3, 13)
|
218
|
+
test.call(2, 17)
|
219
|
+
test.call(17 * 3, 17)
|
220
|
+
|
221
|
+
test.call(2, 7, 2)
|
222
|
+
test.call(12, 97, 3)
|
223
|
+
end
|
224
|
+
|
225
|
+
def test_cornacchia
|
226
|
+
test = lambda do |d, p, expect|
|
227
|
+
rslt = Abst.cornacchia(d, p)
|
228
|
+
if expect
|
229
|
+
assert(rslt)
|
230
|
+
x, y = rslt
|
231
|
+
assert_equal(p, x ** 2 + d * y ** 2)
|
232
|
+
else
|
233
|
+
assert(nil == rslt)
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
test.call(1, 5, true)
|
238
|
+
test.call(1, 13, true)
|
239
|
+
test.call(1, 17, true)
|
240
|
+
test.call(1, 29, true)
|
241
|
+
test.call(1, 53, true)
|
242
|
+
test.call(7, 53, true)
|
243
|
+
test.call(1, 19, false)
|
244
|
+
end
|
245
|
+
|
246
|
+
def test_modified_cornacchia
|
247
|
+
test = lambda do |d, p, expect|
|
248
|
+
rslt = Abst.modified_cornacchia(d, p)
|
249
|
+
if expect
|
250
|
+
assert(rslt)
|
251
|
+
x, y = rslt
|
252
|
+
assert_equal(p << 2, x ** 2 - d * y ** 2)
|
253
|
+
else
|
254
|
+
assert(nil == rslt)
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
test.call(-7, 2, true)
|
259
|
+
test.call(-4, 2, true)
|
260
|
+
test.call(-3, 2, false)
|
261
|
+
test.call(-7, 3, false)
|
262
|
+
test.call(-4, 5, true)
|
263
|
+
end
|
264
|
+
|
265
|
+
def test_isqrt
|
266
|
+
assert_equal(1, Abst.isqrt(1))
|
267
|
+
assert_equal(1, Abst.isqrt(2))
|
268
|
+
assert_equal(1, Abst.isqrt(3))
|
269
|
+
assert_equal(2, Abst.isqrt(4))
|
270
|
+
assert_equal(3, Abst.isqrt(15))
|
271
|
+
assert_equal(4, Abst.isqrt(16))
|
272
|
+
assert_equal(5, Abst.isqrt(25))
|
273
|
+
assert_equal(7, Abst.isqrt(50))
|
274
|
+
assert_equal(9, Abst.isqrt(97))
|
275
|
+
assert_equal(10, Abst.isqrt(100))
|
276
|
+
assert_equal(1553171, Abst.isqrt(2412342342347))
|
277
|
+
|
278
|
+
10.times do
|
279
|
+
n = rand(10 ** 20) + 1
|
280
|
+
sroot = Abst.isqrt(n)
|
281
|
+
assert(sroot ** 2 <= n && n < (sroot + 1) ** 2)
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
def test_iroot
|
286
|
+
assert_equal(1, Abst.iroot(1, 2))
|
287
|
+
assert_equal(1, Abst.iroot(2, 2))
|
288
|
+
assert_equal(1, Abst.iroot(3, 2))
|
289
|
+
assert_equal(2, Abst.iroot(4, 2))
|
290
|
+
|
291
|
+
assert_equal(1, Abst.iroot(1, 3))
|
292
|
+
assert_equal(1, Abst.iroot(2, 3))
|
293
|
+
assert_equal(1, Abst.iroot(7, 3))
|
294
|
+
assert_equal(2, Abst.iroot(8, 3))
|
295
|
+
assert_equal(2, Abst.iroot(26, 3))
|
296
|
+
assert_equal(3, Abst.iroot(27, 3))
|
297
|
+
|
298
|
+
assert_equal([1, 1], Abst.iroot(1, 4, true))
|
299
|
+
assert_equal([1, 1], Abst.iroot(15, 4, true))
|
300
|
+
assert_equal([2, 16], Abst.iroot(16, 4, true))
|
301
|
+
assert_equal([2, 16], Abst.iroot(80, 4, true))
|
302
|
+
assert_equal(3, Abst.iroot(81, 4))
|
303
|
+
|
304
|
+
10.times do
|
305
|
+
n = rand(10 ** 20) + 1
|
306
|
+
pow = rand(40) + 1
|
307
|
+
proot = Abst.iroot(n, pow)
|
308
|
+
assert(proot ** pow <= n && n < (proot + 1) ** pow)
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
def test_prime_power?
|
313
|
+
assert_equal(2, Abst.prime_power?(2))
|
314
|
+
assert_equal(3, Abst.prime_power?(3))
|
315
|
+
assert_equal(2, Abst.prime_power?(4))
|
316
|
+
assert_equal(false, Abst.prime_power?(6))
|
317
|
+
assert_equal(2, Abst.prime_power?(8))
|
318
|
+
assert_equal(17, Abst.prime_power?(17))
|
319
|
+
assert_equal(false, Abst.prime_power?(94))
|
320
|
+
assert_equal(13, Abst.prime_power?(169))
|
321
|
+
assert_equal(3, Abst.prime_power?(243))
|
322
|
+
end
|
323
|
+
|
324
|
+
def test_power_detection
|
325
|
+
assert_equal([1, 1], Abst.power_detection(1))
|
326
|
+
assert_equal([2, 1], Abst.power_detection(2))
|
327
|
+
assert_equal([3, 1], Abst.power_detection(3))
|
328
|
+
assert_equal([2, 2], Abst.power_detection(4))
|
329
|
+
assert_equal([5, 1], Abst.power_detection(5))
|
330
|
+
assert_equal([2, 3], Abst.power_detection(8))
|
331
|
+
assert_equal([4, 2], Abst.power_detection(16, false))
|
332
|
+
assert_equal([2, 4], Abst.power_detection(16, true))
|
333
|
+
assert_equal([2 ** 21, 3], Abst.power_detection(2 ** 63, false))
|
334
|
+
assert_equal([2, 63], Abst.power_detection(2 ** 63, true))
|
335
|
+
assert_equal([9, 2], Abst.power_detection(81, false))
|
336
|
+
assert_equal([3, 4], Abst.power_detection(81, true))
|
337
|
+
end
|
338
|
+
|
339
|
+
def test_ilog2
|
340
|
+
assert_equal(0, Abst.ilog2(1))
|
341
|
+
assert_equal(1, Abst.ilog2(2))
|
342
|
+
assert_equal(1, Abst.ilog2(3))
|
343
|
+
assert_equal(2, Abst.ilog2(4))
|
344
|
+
assert_equal(2, Abst.ilog2(5))
|
345
|
+
assert_equal(7, Abst.ilog2(2 ** 8 - 1))
|
346
|
+
assert_equal(8, Abst.ilog2(2 ** 8))
|
347
|
+
assert_equal(31, Abst.ilog2(2 ** 32 - 1))
|
348
|
+
assert_equal(32, Abst.ilog2(2 ** 32))
|
349
|
+
assert_equal(63, Abst.ilog2(2 ** 64 - 1))
|
350
|
+
assert_equal(64, Abst.ilog2(2 ** 64))
|
351
|
+
end
|
352
|
+
|
353
|
+
def test_powers_of_2
|
354
|
+
list = [1, 2, 4, 8, 16, 32, 64, 128, 256]
|
355
|
+
|
356
|
+
assert_equal(list, Abst.powers_of_2[0..8])
|
357
|
+
assert_equal(Abst::BASE_BYTE * 8, Abst.powers_of_2.size)
|
358
|
+
end
|
359
|
+
|
360
|
+
def test_continued_fraction_of_sqrt
|
361
|
+
assert_equal([1, []], Abst.continued_fraction_of_sqrt(1))
|
362
|
+
assert_equal([1, [2]], Abst.continued_fraction_of_sqrt(2))
|
363
|
+
assert_equal([1, [1, 2]], Abst.continued_fraction_of_sqrt(3))
|
364
|
+
assert_equal([2, []], Abst.continued_fraction_of_sqrt(4))
|
365
|
+
assert_equal([2, [4]], Abst.continued_fraction_of_sqrt(5))
|
366
|
+
assert_equal([2, [2, 4]], Abst.continued_fraction_of_sqrt(6))
|
367
|
+
assert_equal([2, [1, 1, 1, 4]], Abst.continued_fraction_of_sqrt(7))
|
368
|
+
assert_equal([2, [1, 4]], Abst.continued_fraction_of_sqrt(8))
|
369
|
+
assert_equal([3, []], Abst.continued_fraction_of_sqrt(9))
|
370
|
+
assert_equal([3, [6]], Abst.continued_fraction_of_sqrt(10))
|
371
|
+
assert_equal([3, [3, 6]], Abst.continued_fraction_of_sqrt(11))
|
372
|
+
assert_equal([3, [2, 6]], Abst.continued_fraction_of_sqrt(12))
|
373
|
+
assert_equal([3, [1, 1, 1, 1, 6]], Abst.continued_fraction_of_sqrt(13))
|
374
|
+
end
|
375
|
+
|
376
|
+
def test_bhaskara_brouncker
|
377
|
+
assert_equal([1, 1], Abst.bhaskara_brouncker(2))
|
378
|
+
assert_equal([2, 1], Abst.bhaskara_brouncker(3))
|
379
|
+
assert_equal([2, 1], Abst.bhaskara_brouncker(5))
|
380
|
+
assert_equal([5, 2], Abst.bhaskara_brouncker(6))
|
381
|
+
assert_equal([8, 3], Abst.bhaskara_brouncker(7))
|
382
|
+
assert_equal([29718, 3805], Abst.bhaskara_brouncker(61))
|
383
|
+
assert_equal([8890182, 851525], Abst.bhaskara_brouncker(109))
|
384
|
+
end
|
385
|
+
|
386
|
+
def test_pythagorean
|
387
|
+
assert_equal(0, Abst.pythagorean(-1).to_a.size)
|
388
|
+
assert_equal(0, Abst.pythagorean(0).to_a.size)
|
389
|
+
assert_equal(0, Abst.pythagorean(1).to_a.size)
|
390
|
+
assert_equal(0, Abst.pythagorean(4).to_a.size)
|
391
|
+
assert_equal(1, Abst.pythagorean(5).to_a.size)
|
392
|
+
assert_equal(16, Abst.pythagorean(100).to_a.size)
|
393
|
+
assert_equal(1593, Abst.pythagorean(10000).to_a.size)
|
394
|
+
|
395
|
+
10.times do
|
396
|
+
max_c = rand(10 ** 4)
|
397
|
+
rslt = Abst.pythagorean(max_c).to_a
|
398
|
+
if rslt.empty?
|
399
|
+
assert(max_c <= 4)
|
400
|
+
else
|
401
|
+
a, b, c = rslt.sample
|
402
|
+
assert(a ** 2 + b ** 2 == c ** 2)
|
403
|
+
end
|
404
|
+
end
|
405
|
+
end
|
406
|
+
end
|