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,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
@@ -0,0 +1,6 @@
1
+ require 'minitest/unit'
2
+ require 'minitest/autorun'
3
+ require 'abst'
4
+
5
+ class TC_Combination < MiniTest::Unit::TestCase
6
+ end
@@ -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