abst 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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