figurate_numbers 0.0.9

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.
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: []