figurate_numbers 1.3.0 → 1.4.1

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,712 @@
1
+ module FigurateNumbers
2
+ # Module containing methods for generating 3D figurate number sequences.
3
+ module SpaceFigurateNumbers # rubocop:disable Metrics/ModuleLength
4
+ extend self
5
+
6
+ def r_pyramidal(r = 3)
7
+ Enumerator.new do |y|
8
+ (1..Float::INFINITY).each do |delta|
9
+ y << (3 * delta**2 + delta**3 * (r - 2) - delta * (r - 5)) / 6
10
+ end
11
+ end
12
+ end
13
+
14
+ def square_pyramidal
15
+ Enumerator.new do |y|
16
+ (1..Float::INFINITY).each do |delta|
17
+ y << (delta * (delta + 1) * (2 * delta + 1)) / 6
18
+ end
19
+ end
20
+ end
21
+
22
+ alias pyramidal square_pyramidal
23
+
24
+ def pentagonal_pyramidal
25
+ Enumerator.new do |y|
26
+ (1..Float::INFINITY).each do |delta|
27
+ y << delta**2 * (delta + 1) / 2
28
+ end
29
+ end
30
+ end
31
+
32
+ def hexagonal_pyramidal
33
+ Enumerator.new do |y|
34
+ (1..Float::INFINITY).each do |delta|
35
+ y << delta * (delta + 1) * (4 * delta - 1) / 6
36
+ end
37
+ end
38
+ end
39
+
40
+ def heptagonal_pyramidal
41
+ Enumerator.new do |y|
42
+ (1..Float::INFINITY).each do |delta|
43
+ y << delta * (delta + 1) * (5 * delta - 2) / 6
44
+ end
45
+ end
46
+ end
47
+
48
+ def octagonal_pyramidal
49
+ Enumerator.new do |y|
50
+ (1..Float::INFINITY).each do |delta|
51
+ y << delta * (delta + 1) * (6 * delta - 3) / 6
52
+ end
53
+ end
54
+ end
55
+
56
+ def nonagonal_pyramidal
57
+ Enumerator.new do |y|
58
+ (1..Float::INFINITY).each do |delta|
59
+ y << delta * (delta + 1) * (7 * delta - 4) / 6
60
+ end
61
+ end
62
+ end
63
+
64
+ def decagonal_pyramidal
65
+ Enumerator.new do |y|
66
+ (1..Float::INFINITY).each do |delta|
67
+ y << delta * (delta + 1) * (8 * delta - 5) / 6
68
+ end
69
+ end
70
+ end
71
+
72
+ def hendecagonal_pyramidal
73
+ Enumerator.new do |y|
74
+ (1..Float::INFINITY).each do |delta|
75
+ y << delta * (delta + 1) * (9 * delta - 6) / 6
76
+ end
77
+ end
78
+ end
79
+
80
+ def dodecagonal_pyramidal
81
+ Enumerator.new do |y|
82
+ (1..Float::INFINITY).each do |delta|
83
+ y << delta * (delta + 1) * (10 * delta - 7) / 6
84
+ end
85
+ end
86
+ end
87
+
88
+ def tridecagonal_pyramidal
89
+ Enumerator.new do |y|
90
+ (1..Float::INFINITY).each do |delta|
91
+ y << delta * (delta + 1) * (11 * delta - 8) / 6
92
+ end
93
+ end
94
+ end
95
+
96
+ def tetradecagonal_pyramidal
97
+ Enumerator.new do |y|
98
+ (1..Float::INFINITY).each do |delta|
99
+ y << delta * (delta + 1) * (12 * delta - 9) / 6
100
+ end
101
+ end
102
+ end
103
+
104
+ def pentadecagonal_pyramidal
105
+ Enumerator.new do |y|
106
+ (1..Float::INFINITY).each do |delta|
107
+ y << delta * (delta + 1) * (13 * delta - 10) / 6
108
+ end
109
+ end
110
+ end
111
+
112
+ def hexadecagonal_pyramidal
113
+ Enumerator.new do |y|
114
+ (1..Float::INFINITY).each do |delta|
115
+ y << delta * (delta + 1) * (14 * delta - 11) / 6
116
+ end
117
+ end
118
+ end
119
+
120
+ def heptadecagonal_pyramidal
121
+ Enumerator.new do |y|
122
+ (1..Float::INFINITY).each do |delta|
123
+ y << delta * (delta + 1) * (15 * delta - 12) / 6
124
+ end
125
+ end
126
+ end
127
+
128
+ def octadecagonal_pyramidal
129
+ Enumerator.new do |y|
130
+ (1..Float::INFINITY).each do |delta|
131
+ y << delta * (delta + 1) * (16 * delta - 13) / 6
132
+ end
133
+ end
134
+ end
135
+
136
+ def nonadecagonal_pyramidal
137
+ Enumerator.new do |y|
138
+ (1..Float::INFINITY).each do |delta|
139
+ y << delta * (delta + 1) * (17 * delta - 14) / 6
140
+ end
141
+ end
142
+ end
143
+
144
+ def icosagonal_pyramidal
145
+ Enumerator.new do |y|
146
+ (1..Float::INFINITY).each do |delta|
147
+ y << delta * (delta + 1) * (18 * delta - 15) / 6
148
+ end
149
+ end
150
+ end
151
+
152
+ def icosihenagonal_pyramidal
153
+ Enumerator.new do |y|
154
+ (1..Float::INFINITY).each do |delta|
155
+ y << delta * (delta + 1) * (19 * delta - 16) / 6
156
+ end
157
+ end
158
+ end
159
+
160
+ def icosidigonal_pyramidal
161
+ Enumerator.new do |y|
162
+ (1..Float::INFINITY).each do |delta|
163
+ y << delta * (delta + 1) * (20 * delta - 17) / 6
164
+ end
165
+ end
166
+ end
167
+
168
+ def icositrigonal_pyramidal
169
+ Enumerator.new do |y|
170
+ (1..Float::INFINITY).each do |delta|
171
+ y << delta * (delta + 1) * (21 * delta - 18) / 6
172
+ end
173
+ end
174
+ end
175
+
176
+ def icositetragonal_pyramidal
177
+ Enumerator.new do |y|
178
+ (1..Float::INFINITY).each do |delta|
179
+ y << delta * (delta + 1) * (22 * delta - 19) / 6
180
+ end
181
+ end
182
+ end
183
+
184
+ def icosipentagonal_pyramidal
185
+ Enumerator.new do |y|
186
+ (1..Float::INFINITY).each do |delta|
187
+ y << delta * (delta + 1) * (23 * delta - 20) / 6
188
+ end
189
+ end
190
+ end
191
+
192
+ def icosihexagonal_pyramidal
193
+ Enumerator.new do |y|
194
+ (1..Float::INFINITY).each do |delta|
195
+ y << delta * (delta + 1) * (24 * delta - 21) / 6
196
+ end
197
+ end
198
+ end
199
+
200
+ def icosiheptagonal_pyramidal
201
+ Enumerator.new do |y|
202
+ (1..Float::INFINITY).each do |delta|
203
+ y << delta * (delta + 1) * (25 * delta - 22) / 6
204
+ end
205
+ end
206
+ end
207
+
208
+ def icosioctagonal_pyramidal
209
+ Enumerator.new do |y|
210
+ (1..Float::INFINITY).each do |delta|
211
+ y << delta * (delta + 1) * (26 * delta - 23) / 6
212
+ end
213
+ end
214
+ end
215
+
216
+ def icosinonagonal_pyramidal
217
+ Enumerator.new do |y|
218
+ (1..Float::INFINITY).each do |delta|
219
+ y << delta * (delta + 1) * (27 * delta - 24) / 6
220
+ end
221
+ end
222
+ end
223
+
224
+ def triacontagonal_pyramidal
225
+ Enumerator.new do |y|
226
+ (1..Float::INFINITY).each do |delta|
227
+ y << delta * (delta + 1) * (28 * delta - 25) / 6
228
+ end
229
+ end
230
+ end
231
+
232
+ def triangular_tetrahedral
233
+ Enumerator.new do |y|
234
+ finite_set = [1, 10, 120, 1540, 7140]
235
+ (0..Float::INFINITY).each do |delta|
236
+ y << finite_set[delta % 5]
237
+ end
238
+ end
239
+ end
240
+
241
+ def triangular_square_pyramidal
242
+ Enumerator.new do |y|
243
+ finite_set = [1, 55, 91, 208_335]
244
+ (0..Float::INFINITY).each do |delta|
245
+ y << finite_set[delta % 4]
246
+ end
247
+ end
248
+ end
249
+
250
+ def square_tetrahedral
251
+ Enumerator.new do |y|
252
+ finite_set = [1, 4, 19_600]
253
+ (0..Float::INFINITY).each do |delta|
254
+ y << finite_set[delta % 3]
255
+ end
256
+ end
257
+ end
258
+
259
+ def square_square_pyramidal
260
+ Enumerator.new do |y|
261
+ finite_set = [1, 4900]
262
+ (0..Float::INFINITY).each do |delta|
263
+ y << finite_set[delta % 2]
264
+ end
265
+ end
266
+ end
267
+
268
+ def tetrahedral_square_pyramidal_number
269
+ Enumerator.new do |y|
270
+ (1..Float::INFINITY).each do
271
+ y << 1
272
+ end
273
+ end
274
+ end
275
+
276
+ def cubic
277
+ Enumerator.new do |y|
278
+ (1..Float::INFINITY).each do |delta|
279
+ y << delta**3
280
+ end
281
+ end
282
+ end
283
+
284
+ alias perfect_cube cubic
285
+
286
+ def tetrahedral
287
+ Enumerator.new do |y|
288
+ (1..Float::INFINITY).each do |delta|
289
+ y << (delta * (delta + 1) * (delta + 2)) / 6
290
+ end
291
+ end
292
+ end
293
+
294
+ alias triangular_pyramidal tetrahedral
295
+
296
+ def octahedral
297
+ Enumerator.new do |y|
298
+ (1..Float::INFINITY).each do |delta|
299
+ y << (delta * (2 * delta**2 + 1)) / 3
300
+ end
301
+ end
302
+ end
303
+
304
+ def dodecahedral
305
+ Enumerator.new do |y|
306
+ (1..Float::INFINITY).each do |delta|
307
+ y << (delta * (3 * delta - 1) * (3 * delta - 2)) / 2
308
+ end
309
+ end
310
+ end
311
+
312
+ def icosahedral
313
+ Enumerator.new do |y|
314
+ (1..Float::INFINITY).each do |delta|
315
+ y << (delta * (5 * delta**2 - 5 * delta + 2)) / 2
316
+ end
317
+ end
318
+ end
319
+
320
+ def truncated_tetrahedral
321
+ Enumerator.new do |y|
322
+ (1..Float::INFINITY).each do |delta|
323
+ y << (23 * delta**2 - 27 * delta + 10) * delta / 6
324
+ end
325
+ end
326
+ end
327
+
328
+ def truncated_cubic
329
+ Enumerator.new do |y|
330
+ (1..Float::INFINITY).each do |delta|
331
+ y << (3 * delta - 2)**3 - ((8 * (delta - 1) * delta * (delta + 1)) / 6)
332
+ end
333
+ end
334
+ end
335
+
336
+ def truncated_octahedral
337
+ Enumerator.new do |y|
338
+ (1..Float::INFINITY).each do |delta|
339
+ y << (16 * delta**3 - 33 * delta**2 + 24 * delta - 6)
340
+ end
341
+ end
342
+ end
343
+
344
+ def stella_octangula
345
+ Enumerator.new do |y|
346
+ (1..Float::INFINITY).each do |delta|
347
+ y << delta * (2 * delta**2 - 1)
348
+ end
349
+ end
350
+ end
351
+
352
+ def centered_cube
353
+ Enumerator.new do |y|
354
+ (1..Float::INFINITY).each do |delta|
355
+ y << (2 * delta - 1) * (delta**2 - delta + 1)
356
+ end
357
+ end
358
+ end
359
+
360
+ def rhombic_dodecahedral
361
+ Enumerator.new do |y|
362
+ (1..Float::INFINITY).each do |delta|
363
+ y << (2 * delta - 1) * (2 * delta**2 - 2 * delta + 1)
364
+ end
365
+ end
366
+ end
367
+
368
+ def hauy_rhombic_dodecahedral
369
+ Enumerator.new do |y|
370
+ (1..Float::INFINITY).each do |delta|
371
+ y << (2 * delta - 1) * (8 * delta**2 - 14 * delta + 7)
372
+ end
373
+ end
374
+ end
375
+
376
+ def centered_tetrahedron
377
+ Enumerator.new do |y|
378
+ (1..Float::INFINITY).each do |delta|
379
+ y << (2 * delta - 1) * ((delta**2 - delta + 3)) / 3
380
+ end
381
+ end
382
+ end
383
+
384
+ alias centered_tetrahedral centered_tetrahedron
385
+
386
+ def centered_square_pyramid
387
+ Enumerator.new do |y|
388
+ (1..Float::INFINITY).each do |delta|
389
+ y << (2 * delta - 1) * ((delta**2 - delta + 2)) / 2
390
+ end
391
+ end
392
+ end
393
+
394
+ alias centered_pyramid centered_square_pyramid
395
+
396
+ def centered_mgonal_pyramid(m)
397
+ Enumerator.new do |y|
398
+ (1..Float::INFINITY).each do |delta|
399
+ y << (m - 1) * ((delta - 1) * delta * (2 * delta - 1)) / 6 + (2 * delta - 1)
400
+ end
401
+ end
402
+ end
403
+
404
+ def centered_pentagonal_pyramid
405
+ Enumerator.new do |y|
406
+ (1..Float::INFINITY).each do |delta|
407
+ y << (2 * delta - 1) * (2 * delta**2 - 2 * delta + 3) / 3
408
+ end
409
+ end
410
+ end
411
+
412
+ def centered_hexagonal_pyramid
413
+ Enumerator.new do |y|
414
+ (1..Float::INFINITY).each do |delta|
415
+ y << (2 * delta - 1) * (5 * delta**2 - 5 * delta + 6) / 6
416
+ end
417
+ end
418
+ end
419
+
420
+ def centered_heptagonal_pyramid
421
+ Enumerator.new do |y|
422
+ (1..Float::INFINITY).each do |delta|
423
+ y << (2 * delta - 1) * (delta**2 - delta + 1)
424
+ end
425
+ end
426
+ end
427
+
428
+ def centered_octagonal_pyramid
429
+ Enumerator.new do |y|
430
+ (1..Float::INFINITY).each do |delta|
431
+ y << (2 * delta - 1) * (7 * delta**2 - 7 * delta + 6) / 6
432
+ end
433
+ end
434
+ end
435
+
436
+ def centered_octahedron
437
+ Enumerator.new do |y|
438
+ (1..Float::INFINITY).each do |delta|
439
+ y << (2 * delta - 1) * (2 * delta**2 - 2 * delta + 3) / 3
440
+ end
441
+ end
442
+ end
443
+
444
+ def centered_icosahedron
445
+ Enumerator.new do |y|
446
+ (1..Float::INFINITY).each do |delta|
447
+ y << (2 * delta - 1) * (5 * delta**2 - 5 * delta + 3) / 3
448
+ end
449
+ end
450
+ end
451
+
452
+ alias centered_cuboctahedron centered_icosahedron
453
+
454
+ def centered_dodecahedron
455
+ Enumerator.new do |y|
456
+ (1..Float::INFINITY).each do |delta|
457
+ y << (2 * delta - 1) * (3 * delta**2 - 3 * delta + 1)
458
+ end
459
+ end
460
+ end
461
+
462
+ def centered_truncated_tetrahedron
463
+ Enumerator.new do |y|
464
+ (1..Float::INFINITY).each do |delta|
465
+ y << (2 * delta - 1) * (7 * delta**2 - 7 * delta + 3) / 3
466
+ end
467
+ end
468
+ end
469
+
470
+ def centered_truncated_cube
471
+ Enumerator.new do |y|
472
+ (1..Float::INFINITY).each do |delta|
473
+ y << (2 * delta - 1) * (23 * delta**2 - 23 * delta + 3) / 3
474
+ end
475
+ end
476
+ end
477
+
478
+ def centered_truncated_octahedron
479
+ Enumerator.new do |y|
480
+ (1..Float::INFINITY).each do |delta|
481
+ y << (2 * delta - 1) * (5 * delta**2 - 5 * delta + 1)
482
+ end
483
+ end
484
+ end
485
+
486
+ def centered_mgonal_pyramidal(m)
487
+ Enumerator.new do |y|
488
+ (1..Float::INFINITY).each do |delta|
489
+ y << (m * delta**3 + delta * (6 - m)) / 6
490
+ end
491
+ end
492
+ end
493
+
494
+ def centered_triangular_pyramidal
495
+ Enumerator.new do |y|
496
+ (1..Float::INFINITY).each do |delta|
497
+ y << delta * (delta**2 + 1) / 2
498
+ end
499
+ end
500
+ end
501
+
502
+ def centered_square_pyramidal
503
+ Enumerator.new do |y|
504
+ (1..Float::INFINITY).each do |delta|
505
+ y << (2 * delta**3 + delta) / 3
506
+ end
507
+ end
508
+ end
509
+
510
+ def centered_pentagonal_pyramidal
511
+ Enumerator.new do |y|
512
+ (1..Float::INFINITY).each do |delta|
513
+ y << (5 * delta**3 + delta) / 6
514
+ end
515
+ end
516
+ end
517
+
518
+ def centered_hexagonal_pyramidal
519
+ Enumerator.new do |y|
520
+ (1..Float::INFINITY).each do |delta|
521
+ y << delta**3
522
+ end
523
+ end
524
+ end
525
+
526
+ alias hex_pyramidal centered_hexagonal_pyramidal
527
+
528
+ def centered_heptagonal_pyramidal
529
+ m = 7
530
+ Enumerator.new do |y|
531
+ (1..Float::INFINITY).each do |delta|
532
+ y << (m * delta**3 + delta * (6 - m)) / 6
533
+ end
534
+ end
535
+ end
536
+
537
+ def centered_octagonal_pyramidal
538
+ m = 8
539
+ Enumerator.new do |y|
540
+ (1..Float::INFINITY).each do |delta|
541
+ y << (m * delta**3 + delta * (6 - m)) / 6
542
+ end
543
+ end
544
+ end
545
+
546
+ def centered_nonagonal_pyramidal
547
+ m = 9
548
+ Enumerator.new do |y|
549
+ (1..Float::INFINITY).each do |delta|
550
+ y << (m * delta**3 + delta * (6 - m)) / 6
551
+ end
552
+ end
553
+ end
554
+
555
+ def centered_decagonal_pyramidal
556
+ m = 10
557
+ Enumerator.new do |y|
558
+ (1..Float::INFINITY).each do |delta|
559
+ y << (m * delta**3 + delta * (6 - m)) / 6
560
+ end
561
+ end
562
+ end
563
+
564
+ def centered_hendecagonal_pyramidal
565
+ m = 11
566
+ Enumerator.new do |y|
567
+ (1..Float::INFINITY).each do |delta|
568
+ y << (m * delta**3 + delta * (6 - m)) / 6
569
+ end
570
+ end
571
+ end
572
+
573
+ def centered_dodecagonal_pyramidal
574
+ m = 12
575
+ Enumerator.new do |y|
576
+ (1..Float::INFINITY).each do |delta|
577
+ y << (m * delta**3 + delta * (6 - m)) / 6
578
+ end
579
+ end
580
+ end
581
+
582
+ def hexagonal_prism
583
+ Enumerator.new do |y|
584
+ (1..Float::INFINITY).each do |delta|
585
+ y << delta * (3 * delta**2 - 3 * delta + 1)
586
+ end
587
+ end
588
+ end
589
+
590
+ def mgonal_prism(m)
591
+ Enumerator.new do |y|
592
+ (1..Float::INFINITY).each do |delta|
593
+ y << delta * (m * delta**2 - m * delta + 2) / 2
594
+ end
595
+ end
596
+ end
597
+
598
+ def generalized_mgonal_pyramidal(m, left_index = 0)
599
+ Enumerator.new do |y|
600
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
601
+ y << (delta * (delta + 1) * ((m - 2) * delta - m + 5)) / 6
602
+ end
603
+ end
604
+ end
605
+
606
+ def generalized_pentagonal_pyramidal(left_index = 0)
607
+ m = 5
608
+ Enumerator.new do |y|
609
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
610
+ y << (delta * (delta + 1) * ((m - 2) * delta - m + 5)) / 6
611
+ end
612
+ end
613
+ end
614
+
615
+ def generalized_hexagonal_pyramidal(left_index = 0)
616
+ m = 6
617
+ Enumerator.new do |y|
618
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
619
+ y << (delta * (delta + 1) * ((m - 2) * delta - m + 5)) / 6
620
+ end
621
+ end
622
+ end
623
+
624
+ def generalized_cubic(left_index = 0)
625
+ Enumerator.new do |y|
626
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
627
+ y << delta**3
628
+ end
629
+ end
630
+ end
631
+
632
+ def generalized_octahedral(left_index = 0)
633
+ Enumerator.new do |y|
634
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
635
+ y << (2 * delta**2 + 1) * delta / 3
636
+ end
637
+ end
638
+ end
639
+
640
+ def generalized_icosahedral(left_index = 0)
641
+ Enumerator.new do |y|
642
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
643
+ y << (5 * delta**2 - 5 * delta + 2) * delta / 2
644
+ end
645
+ end
646
+ end
647
+
648
+ def generalized_dodecahedral(left_index = 0)
649
+ Enumerator.new do |y|
650
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
651
+ y << (9 * delta**2 - 9 * delta + 2) * delta / 2
652
+ end
653
+ end
654
+ end
655
+
656
+ def generalized_centered_cube(left_index = 0)
657
+ Enumerator.new do |y|
658
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
659
+ y << (2 * delta - 1) * (delta**2 - delta + 1)
660
+ end
661
+ end
662
+ end
663
+
664
+ def generalized_centered_tetrahedron(left_index = 0)
665
+ Enumerator.new do |y|
666
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
667
+ y << (2 * delta - 1) * (delta**2 - delta + 3) / 3
668
+ end
669
+ end
670
+ end
671
+
672
+ def generalized_centered_square_pyramid(left_index = 0)
673
+ Enumerator.new do |y|
674
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
675
+ y << ((2 * delta - 1) * (delta**2 - delta + 2)) / 2
676
+ end
677
+ end
678
+ end
679
+
680
+ def generalized_rhombic_dodecahedral(left_index = 0)
681
+ Enumerator.new do |y|
682
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
683
+ y << delta**4 - (delta - 1)**4
684
+ end
685
+ end
686
+ end
687
+
688
+ def generalized_centered_mgonal_pyramidal(m, left_index = 0)
689
+ Enumerator.new do |y|
690
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
691
+ y << (m * delta**3 + delta * (6 - m)) / 6
692
+ end
693
+ end
694
+ end
695
+
696
+ def generalized_mgonal_prism(m, left_index = 0)
697
+ Enumerator.new do |y|
698
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
699
+ y << delta * (m * delta**2 - m * delta + 2) / 2
700
+ end
701
+ end
702
+ end
703
+
704
+ def generalized_hexagonal_prism(left_index = 0)
705
+ Enumerator.new do |y|
706
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
707
+ y << delta * (3 * delta**2 - 3 * delta + 1)
708
+ end
709
+ end
710
+ end
711
+ end
712
+ end