figurate_numbers 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/figurate_numbers.rb +516 -0
  3. metadata +45 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 5db66d95b652260cf17eb02c7cb04ee509e327a736541fa957b3050b68cb0fbd
4
+ data.tar.gz: 3d4e572eb205c255cefa638e7730be18b0115d749b60892cf018aa5e88e94312
5
+ SHA512:
6
+ metadata.gz: c2aaec998a13c0baa7a6251e1926f3bd4a63e0dd48523c6d995d286184f4266bcb3617d5352e7cf27a5197f52e2341419bc68f2097d99d086cd9bf8df218da79
7
+ data.tar.gz: 4b49273eac1939259f938ae07bc1f3c34feb3bd4e868bf8e04a0b734f9ef17f7e448f551907868b4950f8af96cafde568aa3e75a8605e926c629f0d1ce8d31a8
@@ -0,0 +1,516 @@
1
+ # A module based on the book Figurate Numbers(2012) by Elena Deza & Michel Deza
2
+
3
+ module FigurateNumbers
4
+
5
+ # Plane figurate numbers
6
+ def FigurateNumbers.polygonal_numbers(m)
7
+ Enumerator.new do |y|
8
+ (1..Float::INFINITY).each do |delta|
9
+ y << ((m - 2) * delta**2 - (m - 4) * delta) / 2
10
+ end
11
+ end
12
+ end
13
+
14
+ def FigurateNumbers.centered_pol_numbers(k)
15
+ Enumerator.new do |y|
16
+ (1..Float::INFINITY).each do |delta|
17
+ y << (k * delta**2 - k * delta + 2) / 2
18
+ end
19
+ end
20
+ end
21
+
22
+ def FigurateNumbers.pronic_numbers
23
+ (1..Float::INFINITY).lazy.collect { |delta| delta * (delta + 1)}
24
+ end
25
+
26
+ def FigurateNumbers.cross_numbers
27
+ (1..Float::INFINITY).lazy.collect { |delta| 4 * delta - 3}
28
+ end
29
+
30
+ def FigurateNumbers.aztec_diamond_numbers
31
+ (1..Float::INFINITY).lazy.collect { |delta| (2 * delta) * (delta + 1)}
32
+ end
33
+
34
+ def FigurateNumbers.polygram_numbers(m)
35
+ Enumerator.new do |y|
36
+ (1..Float::INFINITY).each do |delta|
37
+ y << m * delta**2 - m * delta + 1
38
+ end
39
+ end
40
+ end
41
+
42
+ def FigurateNumbers.gnomic_numbers
43
+ (1..Float::INFINITY).lazy.collect { |delta| 2 * delta - 1}
44
+ end
45
+
46
+ def FigurateNumbers.truncated_triangular_numbers
47
+ Enumerator.new do |y|
48
+ (1..Float::INFINITY).each do |delta|
49
+ y << (3 * delta**2) - (3 * delta) + 1
50
+ end
51
+ end
52
+ end
53
+
54
+ def FigurateNumbers.truncated_square_numbers
55
+ Enumerator.new do |y|
56
+ (1..Float::INFINITY).each do |delta|
57
+ y << (7 * delta**2) - (10 * delta) + 4
58
+ end
59
+ end
60
+ end
61
+
62
+ def FigurateNumbers.truncated_pronic_numbers
63
+ Enumerator.new do |y|
64
+ (1..Float::INFINITY).each do |delta|
65
+ y << (7 * delta**2) - (7 * delta) + 2
66
+ end
67
+ end
68
+ end
69
+
70
+ def FigurateNumbers.truncated_center_pol_numbers(k)
71
+ Enumerator.new do |y|
72
+ (1..Float::INFINITY).each do |delta|
73
+ y << 1 + (k * (7 * delta**2 - 11 * delta + 4)) / 2
74
+ end
75
+ end
76
+ end
77
+
78
+ ## Space figurate numbers
79
+ def FigurateNumbers.r_pyramidal_numbers(r = 3)
80
+ Enumerator.new do |y|
81
+ (1..Float::INFINITY).each do |delta|
82
+ y << (3 * delta**2 + delta**3 * (r - 2) - delta * (r - 5)) / 6
83
+ end
84
+ end
85
+ end
86
+
87
+ def FigurateNumbers.cubic_numbers
88
+ Enumerator.new do |y|
89
+ (1..Float::INFINITY).each do |delta|
90
+ y << delta**3
91
+ end
92
+ end
93
+ end
94
+
95
+ def FigurateNumbers.tetrahedral_numbers
96
+ Enumerator.new do |y|
97
+ (1..Float::INFINITY).each do |delta|
98
+ y << (delta * (delta + 1) * (delta + 2)) / 6
99
+ end
100
+ end
101
+ end
102
+
103
+ def FigurateNumbers.octahedral_numbers
104
+ Enumerator.new do |y|
105
+ (1..Float::INFINITY).each do |delta|
106
+ y << (delta * (2 * delta**2 + 1)) / 3
107
+ end
108
+ end
109
+ end
110
+
111
+ def FigurateNumbers.dodecahedral_numbers
112
+ Enumerator.new do |y|
113
+ (1..Float::INFINITY).each do |delta|
114
+ y << (delta * (3 * delta -1) * (3 * delta - 2)) / 2
115
+ end
116
+ end
117
+ end
118
+
119
+ def FigurateNumbers.icosahedral_numbers
120
+ Enumerator.new do |y|
121
+ (1..Float::INFINITY).each do |delta|
122
+ y << (delta * (5 * delta**2 - 5 * delta + 2)) / 2
123
+ end
124
+ end
125
+ end
126
+
127
+ def FigurateNumbers.truncated_tetrahedral_numbers
128
+ Enumerator.new do |y|
129
+ (1..Float::INFINITY).each do |delta|
130
+ y << (23 * delta**2 - 27 * delta + 10) * delta / 6
131
+ end
132
+ end
133
+ end
134
+
135
+ def FigurateNumbers.truncated_cubic_numbers
136
+ Enumerator.new do |y|
137
+ (1..Float::INFINITY).each do |delta|
138
+ y << (3 * delta - 2)**3 - ((8 * (delta - 1) * delta * (delta + 1)) / 6)
139
+ end
140
+ end
141
+ end
142
+
143
+ def FigurateNumbers.truncated_octahedral_numbers
144
+ Enumerator.new do |y|
145
+ (1..Float::INFINITY).each do |delta|
146
+ y << (16 * delta**3 - 33 * delta**2 + 24 * delta - 6)
147
+ end
148
+ end
149
+ end
150
+
151
+ def FigurateNumbers.stella_octangula_numbers
152
+ Enumerator.new do |y|
153
+ (1..Float::INFINITY).each do |delta|
154
+ y << delta * (2 * delta**2 - 1)
155
+ end
156
+ end
157
+ end
158
+
159
+ def FigurateNumbers.centered_cube_numbers
160
+ Enumerator.new do |y|
161
+ (1..Float::INFINITY).each do |delta|
162
+ y << (2 * delta - 1) * (delta**2 - delta + 1)
163
+ end
164
+ end
165
+ end
166
+
167
+ def FigurateNumbers.rhombic_dodecahedral_numbers
168
+ Enumerator.new do |y|
169
+ (1..Float::INFINITY).each do |delta|
170
+ y << (2 * delta - 1) * (2 * delta**2 - 2 * delta + 1)
171
+ end
172
+ end
173
+ end
174
+
175
+ def FigurateNumbers.hauy_rhombic_dodecahedral_numbers
176
+ Enumerator.new do |y|
177
+ (1..Float::INFINITY).each do |delta|
178
+ y << (2 * delta - 1) * (8 * delta**2 - 14 * delta + 7)
179
+ end
180
+ end
181
+ end
182
+
183
+ def FigurateNumbers.centered_tetrahedral_numbers
184
+ Enumerator.new do |y|
185
+ (1..Float::INFINITY).each do |delta|
186
+ y << (2 * delta - 1) * ((delta**2 - delta + 3)) / 3
187
+ end
188
+ end
189
+ end
190
+
191
+ def FigurateNumbers.centered_square_pyramid_numbers
192
+ Enumerator.new do |y|
193
+ (1..Float::INFINITY).each do |delta|
194
+ y << (2 * delta - 1) * ((delta**2 - delta + 2)) / 2
195
+ end
196
+ end
197
+ end
198
+
199
+ def FigurateNumbers.centered_pentagonal_pyramid_numbers
200
+ Enumerator.new do |y|
201
+ (1..Float::INFINITY).each do |delta|
202
+ y << (2 * delta - 1) * ( 2 * delta**2 - 2 * delta + 3) / 3
203
+ end
204
+ end
205
+ end
206
+
207
+ def FigurateNumbers.centered_hexagonal_pyramid_numbers
208
+ Enumerator.new do |y|
209
+ (1..Float::INFINITY).each do |delta|
210
+ y << (2 * delta - 1) * (5 * delta**2 - 5 * delta + 6) / 6
211
+ end
212
+ end
213
+ end
214
+
215
+ def FigurateNumbers.centered_heptagonal_pyramid_numbers
216
+ Enumerator.new do |y|
217
+ (1..Float::INFINITY).each do |delta|
218
+ y << (2 * delta - 1) * (delta**2 - delta + 1)
219
+ end
220
+ end
221
+ end
222
+
223
+ def FigurateNumbers.centered_octagonal_pyramid_numbers
224
+ Enumerator.new do |y|
225
+ (1..Float::INFINITY).each do |delta|
226
+ y << (2 * delta - 1) * (7 * delta**2 - 7 * delta + 6) / 6
227
+ end
228
+ end
229
+ end
230
+
231
+ def FigurateNumbers.centered_icosahedron_numbers
232
+ Enumerator.new do |y|
233
+ (1..Float::INFINITY).each do |delta|
234
+ y << (2 * delta - 1) * (5 * delta**2 - 5 * delta + 3) / 3
235
+ end
236
+ end
237
+ end
238
+
239
+ def FigurateNumbers.centered_dodecahedron_numbers
240
+ Enumerator.new do |y|
241
+ (1..Float::INFINITY).each do |delta|
242
+ y << (2 * delta - 1) * (3 * delta**2 - 3 * delta + 1)
243
+ end
244
+ end
245
+ end
246
+
247
+ def FigurateNumbers.centered_mgonal_pyramid_numbers(m)
248
+ Enumerator.new do |y|
249
+ (1..Float::INFINITY).each do |delta|
250
+ y << (m - 1) * ((delta - 1) * delta * (2 * delta - 1)) / 6 + (2 * delta - 1)
251
+ end
252
+ end
253
+ end
254
+
255
+ def FigurateNumbers.centered_mgonal_pyramidal_numbers(m)
256
+ Enumerator.new do |y|
257
+ (1..Float::INFINITY).each do |delta|
258
+ y << (m * delta**3 + delta * (6 - m)) / 6
259
+ end
260
+ end
261
+ end
262
+
263
+ def FigurateNumbers.hexagonal_prism_numbers
264
+ Enumerator.new do |y|
265
+ (1..Float::INFINITY).each do |delta|
266
+ y << delta * ( 3 * delta**2 - 3 * delta + 1)
267
+ end
268
+ end
269
+ end
270
+
271
+ def FigurateNumbers.generalized_mgonal_pyramidal_numbers(m, left_index = 0)
272
+ Enumerator.new do |y|
273
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
274
+ y << (delta * (delta + 1) * ((m - 2) * delta - m + 5 )) / 6
275
+ end
276
+ end
277
+ end
278
+
279
+ def FigurateNumbers.generalized_icosahedral_numbers(left_index = 0)
280
+ Enumerator.new do |y|
281
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
282
+ y << ( 5 * delta**2 - 5 * delta + 2 ) * delta / 2
283
+ end
284
+ end
285
+ end
286
+
287
+ def FigurateNumbers.generalized_dodecahedral_numbers(left_index = 0)
288
+ Enumerator.new do |y|
289
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
290
+ y << (9 * delta**2 - 9 * delta + 2) * delta / 2
291
+ end
292
+ end
293
+ end
294
+
295
+ def FigurateNumbers.generalized_hexagonal_prism_numbers(left_index = 0)
296
+ Enumerator.new do |y|
297
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
298
+ y << delta * (3 * delta**2 - 3 * delta + 1)
299
+ end
300
+ end
301
+ end
302
+
303
+ ## Multidimensional figurate numbers
304
+ def FigurateNumbers.factorial_iter(num)
305
+ t = 1
306
+ (1..num).each do |i|
307
+ t = t * i
308
+ end
309
+ t
310
+ end
311
+
312
+ def FigurateNumbers.binomial_coefficient(n, k)
313
+ factorial_iter(n) / (factorial_iter(k) * factorial_iter(n - k))
314
+ end
315
+
316
+ private_class_method :factorial_iter
317
+ private_class_method :binomial_coefficient
318
+
319
+ def FigurateNumbers.pentatope_numbers
320
+ Enumerator.new do |y|
321
+ (1..Float::INFINITY).each do |delta|
322
+ y << (delta * (delta + 1) * (delta + 2) * (delta + 3)) / 24
323
+ end
324
+ end
325
+ end
326
+
327
+ def FigurateNumbers.k_dimensional_hypertetrahedron_numbers(k)
328
+ Enumerator.new do |y|
329
+ (1..Float::INFINITY).each do |delta|
330
+ y << binomial_coefficient(delta + (k - 1), k)
331
+ end
332
+ end
333
+ end
334
+
335
+ def FigurateNumbers.biquadratic_numbers
336
+ Enumerator.new do |y|
337
+ (1..Float::INFINITY).each do |delta|
338
+ y << delta**4
339
+ end
340
+ end
341
+ end
342
+
343
+ def FigurateNumbers.k_dimensional_hypercube_numbers(k)
344
+ Enumerator.new do |y|
345
+ (1..Float::INFINITY).each do |delta|
346
+ y << delta**k
347
+ end
348
+ end
349
+ end
350
+
351
+ def FigurateNumbers.hyperoctahedral_numbers
352
+ Enumerator.new do |y|
353
+ (1..Float::INFINITY).each do |delta|
354
+ y << (delta**2 * (delta**2 + 2)) / 3
355
+ end
356
+ end
357
+ end
358
+
359
+ def FigurateNumbers.hypericosahedral_numbers
360
+ Enumerator.new do |y|
361
+ (1..Float::INFINITY).each do |delta|
362
+ y << (delta * (145 * delta ** 3 - 280 * delta**2 + 179 * delta - 38)) / 6
363
+ end
364
+ end
365
+ end
366
+
367
+ def FigurateNumbers.hyperdodecahedral_numbers
368
+ Enumerator.new do |y|
369
+ (1..Float::INFINITY).each do |delta|
370
+ y << (delta * (261 * delta**3 - 504 * delta**2 + 283 * delta - 38)) / 2
371
+ end
372
+ end
373
+ end
374
+
375
+ def FigurateNumbers.polyoctahedral_numbers
376
+ Enumerator.new do |y|
377
+ (1..Float::INFINITY).each do |delta|
378
+ y << delta**2 * (3 * delta**2 - 4 * delta + 2)
379
+ end
380
+ end
381
+ end
382
+
383
+ def FigurateNumbers.four_dimensional_pyramidal_numbers(m)
384
+ Enumerator.new do |y|
385
+ (1..Float::INFINITY).each do |delta|
386
+ y << (delta * (delta + 1) * (delta + 2) * ((m - 2) * delta - m + 6)) / 24
387
+ end
388
+ end
389
+ end
390
+
391
+ def FigurateNumbers.five_dimensional_pyramidal_numbers(m)
392
+ Enumerator.new do |y|
393
+ (1..Float::INFINITY).each do |delta|
394
+ y << (delta * (delta + 1) * (delta + 2) * (delta + 3) * ((m - 2) * delta - m + 7)) / 120
395
+ end
396
+ end
397
+ end
398
+
399
+ def FigurateNumbers.six_dimensional_pyramidal_numbers(m)
400
+ Enumerator.new do |y|
401
+ (1..Float::INFINITY).each do |delta|
402
+ y << (delta * (delta + 1) * (delta + 2) * (delta + 3) * (delta + 4) * ((m - 2) * delta - m + 8)) / 720
403
+ end
404
+ end
405
+ end
406
+
407
+ def FigurateNumbers.pseudo_rising_factorial(n, k)
408
+ t = 1
409
+ (n..(n + k - 2)).each do |i|
410
+ t *= i
411
+ end
412
+ t
413
+ end
414
+
415
+ def FigurateNumbers.pseudo_pochhammer_function(n, k)
416
+ (n..(n + k - 2)).reduce(:*)
417
+ end
418
+
419
+ private_class_method :pseudo_rising_factorial
420
+ private_class_method :pseudo_pochhammer_function
421
+
422
+ def FigurateNumbers.k_dimensional_pyramidal_numbers(k, m)
423
+ Enumerator.new do |y|
424
+ (1..Float::INFINITY).each do |n|
425
+ y << (pseudo_pochhammer_function(n, k) * ((m - 2) * n - m + k + 2)) /
426
+ factorial_iter(k)
427
+ end
428
+ end
429
+ end
430
+
431
+ def FigurateNumbers.k_dimensional_centered_hypercube_numbers(k)
432
+ Enumerator.new do |y|
433
+ (1..Float::INFINITY).each do |delta|
434
+ y << delta**k + (delta - 1)**k
435
+ end
436
+ end
437
+ end
438
+
439
+ def FigurateNumbers.centered_polytope_numbers
440
+ Enumerator.new do |y|
441
+ (1..Float::INFINITY).each do |delta|
442
+ y << (5 * delta**4 - 10 * delta**3 + 55 * delta**2 - 50 * delta + 24) / 24
443
+ end
444
+ end
445
+ end
446
+
447
+ def FigurateNumbers.helper_centered_hypertetrahedron(k, n)
448
+ return 1 if n == 1
449
+ t = binomial_coefficient(k + 1, k)
450
+ return t if n == 2
451
+ tau = 0
452
+ (0..k-1).each do |i|
453
+ tau += binomial_coefficient(k + 1, k - i) * binomial_coefficient(n - 2, i)
454
+ end
455
+ tau
456
+ end
457
+
458
+ def FigurateNumbers.acc_helper_centered_hypertetrahedron(k, n)
459
+ a = 0
460
+ (1..n).each do |j|
461
+ a += helper_centered_hypertetrahedron(k, j)
462
+ end
463
+ a
464
+ end
465
+
466
+ private_class_method :helper_centered_hypertetrahedron
467
+ private_class_method :acc_helper_centered_hypertetrahedron
468
+
469
+ def FigurateNumbers.k_dimensional_centered_hypertetrahedron_numbers(k)
470
+ Enumerator.new do |y|
471
+ (1..Float::INFINITY).each do |n|
472
+ y << acc_helper_centered_hypertetrahedron(k, n)
473
+ end
474
+ end
475
+ end
476
+
477
+ def FigurateNumbers.centered_hyperotahedral_numbers
478
+ Enumerator.new do |y|
479
+ (1..Float::INFINITY).each do |delta|
480
+ y << (2 * delta**4 - 4 * delta**3 + 10 * delta**2 - 8 * delta + 3) / 3
481
+ end
482
+ end
483
+ end
484
+
485
+ def FigurateNumbers.nexus_numbers(k)
486
+ Enumerator.new do |y|
487
+ (0..Float::INFINITY).each do |n|
488
+ y << (n + 1)**(k + 1) - (n**(k + 1))
489
+ end
490
+ end
491
+ end
492
+
493
+ def FigurateNumbers.ext_int_double_summation(k, n)
494
+ t = ((2**(1)) * binomial_coefficient(k, 1) * binomial_coefficient(1, 0))
495
+ return (t + 1) if n == 1
496
+ a = 0
497
+ (1..(n - 1)).each do |j|
498
+ (0..(k - 1)).each do |i|
499
+ a += (2**(1 + i)) * binomial_coefficient(k, 1 + i) * binomial_coefficient(j, i)
500
+ end
501
+ end
502
+ (1 + t + a)
503
+ end
504
+
505
+ private_class_method :ext_int_double_summation
506
+
507
+ def FigurateNumbers.k_dimensional_centered_hyperoctahedron_numbers(k)
508
+ Enumerator.new do |y|
509
+ y << 1
510
+ (1..Float::INFINITY).each do |n|
511
+ y << ext_int_double_summation(k, n)
512
+ end
513
+ end
514
+ end
515
+
516
+ end
metadata ADDED
@@ -0,0 +1,45 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: figurate_numbers
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.9
5
+ platform: ruby
6
+ authors:
7
+ - Edgar Armando Delgado Vega
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-06-15 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Implementation of sequences of figurate numbers in the plane, space and
14
+ multidimensional using the enumerator class. Intended for use in Sonic Pi.
15
+ email: edelve91@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/figurate_numbers.rb
21
+ homepage: https://rubygems.org/gems/figurate_numbers
22
+ licenses:
23
+ - MIT
24
+ metadata: {}
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubygems_version: 3.3.7
41
+ signing_key:
42
+ specification_version: 4
43
+ summary: Generates sequences of figurative numbers based on the book Figurate Numbers(2012)
44
+ by Elena Deza and Michel Deza
45
+ test_files: []