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,831 @@
1
+ require_relative 'utils/utils'
2
+
3
+ module FigurateNumbers
4
+ # Module containing methods for generating n-dimensional figurate number sequences.
5
+ module MultiDimensionalFigurateNumbers # rubocop:disable Metrics/ModuleLength
6
+ extend self
7
+
8
+ def pentatope
9
+ Enumerator.new do |y|
10
+ (1..Float::INFINITY).each do |delta|
11
+ y << (delta * (delta + 1) * (delta + 2) * (delta + 3)) / 24
12
+ end
13
+ end
14
+ end
15
+
16
+ alias hypertetrahedral pentatope
17
+ alias triangulotriangular pentatope
18
+
19
+ def k_dimensional_hypertetrahedron(k)
20
+ Enumerator.new do |y|
21
+ (1..Float::INFINITY).each do |delta|
22
+ y << Utils.rising_factorial(delta, k) / Utils.factorial_iter(k)
23
+ end
24
+ end
25
+ end
26
+
27
+ alias k_hypertetrahedron k_dimensional_hypertetrahedron
28
+ alias regular_k_polytopic k_dimensional_hypertetrahedron
29
+ alias figurate_numbers_of_order_k k_dimensional_hypertetrahedron
30
+
31
+ def five_dimensional_hypertetrahedron
32
+ Enumerator.new do |y|
33
+ (1..Float::INFINITY).each do |delta|
34
+ y << Utils.rising_factorial(delta, 5) / Utils.factorial_iter(5)
35
+ end
36
+ end
37
+ end
38
+
39
+ def six_dimensional_hypertetrahedron
40
+ Enumerator.new do |y|
41
+ (1..Float::INFINITY).each do |delta|
42
+ y << Utils.rising_factorial(delta, 6) / Utils.factorial_iter(6)
43
+ end
44
+ end
45
+ end
46
+
47
+ def binomial_coefficient_k_dimensional_hypertetrahedron(k)
48
+ Enumerator.new do |y|
49
+ (1..Float::INFINITY).each do |delta|
50
+ y << Utils.binomial_coefficient(delta + (k - 1), k)
51
+ end
52
+ end
53
+ end
54
+
55
+ def biquadratic
56
+ Enumerator.new do |y|
57
+ (1..Float::INFINITY).each do |delta|
58
+ y << delta**4
59
+ end
60
+ end
61
+ end
62
+
63
+ def k_dimensional_hypercube(k)
64
+ Enumerator.new do |y|
65
+ (1..Float::INFINITY).each do |delta|
66
+ y << delta**k
67
+ end
68
+ end
69
+ end
70
+
71
+ alias k_hypercube k_dimensional_hypercube
72
+
73
+ def five_dimensional_hypercube
74
+ Enumerator.new do |y|
75
+ (1..Float::INFINITY).each do |delta|
76
+ y << delta**5
77
+ end
78
+ end
79
+ end
80
+
81
+ def six_dimensional_hypercube
82
+ Enumerator.new do |y|
83
+ (1..Float::INFINITY).each do |delta|
84
+ y << delta**6
85
+ end
86
+ end
87
+ end
88
+
89
+ def hyperoctahedral
90
+ Enumerator.new do |y|
91
+ (1..Float::INFINITY).each do |delta|
92
+ y << (delta**2 * (delta**2 + 2)) / 3
93
+ end
94
+ end
95
+ end
96
+
97
+ alias hexadecachoron hyperoctahedral
98
+ alias four_cross_polytope hyperoctahedral
99
+ alias four_orthoplex hyperoctahedral
100
+
101
+ def hypericosahedral
102
+ Enumerator.new do |y|
103
+ (1..Float::INFINITY).each do |delta|
104
+ y << (delta * (145 * delta**3 - 280 * delta**2 + 179 * delta - 38)) / 6
105
+ end
106
+ end
107
+ end
108
+
109
+ alias tetraplex hypericosahedral
110
+ alias polytetrahedron hypericosahedral
111
+ alias hexacosichoron hypericosahedral
112
+
113
+ def hyperdodecahedral
114
+ Enumerator.new do |y|
115
+ (1..Float::INFINITY).each do |delta|
116
+ y << (delta * (261 * delta**3 - 504 * delta**2 + 283 * delta - 38)) / 2
117
+ end
118
+ end
119
+ end
120
+
121
+ alias hecatonicosachoron hyperdodecahedral
122
+ alias dodecaplex hyperdodecahedral
123
+ alias polydodecahedron hyperdodecahedral
124
+
125
+ def polyoctahedral
126
+ Enumerator.new do |y|
127
+ (1..Float::INFINITY).each do |delta|
128
+ y << delta**2 * (3 * delta**2 - 4 * delta + 2)
129
+ end
130
+ end
131
+ end
132
+
133
+ alias icositetrachoron polyoctahedral
134
+ alias octaplex polyoctahedral
135
+ alias hyperdiamond polyoctahedral
136
+
137
+ def four_dimensional_hyperoctahedron
138
+ Enumerator.new do |y|
139
+ (1..Float::INFINITY).each do |delta|
140
+ y << delta**2 * (delta**2 + 2) / 3
141
+ end
142
+ end
143
+ end
144
+
145
+ def five_dimensional_hyperoctahedron
146
+ Enumerator.new do |y|
147
+ (1..Float::INFINITY).each do |delta|
148
+ y << delta * (2 * delta**4 + 10 * delta**2 + 3) / 15
149
+ end
150
+ end
151
+ end
152
+
153
+ def six_dimensional_hyperoctahedron
154
+ Enumerator.new do |y|
155
+ (1..Float::INFINITY).each do |delta|
156
+ y << delta**2 * (2 * delta**4 + 20 * delta**2 + 23) / 45
157
+ end
158
+ end
159
+ end
160
+
161
+ def seven_dimensional_hyperoctahedron
162
+ Enumerator.new do |y|
163
+ (1..Float::INFINITY).each do |delta|
164
+ y << (4 * delta**6 + 70 * delta**4 + 196 * delta**2 + 45) * delta / 315
165
+ end
166
+ end
167
+ end
168
+
169
+ def eight_dimensional_hyperoctahedron
170
+ Enumerator.new do |y|
171
+ (1..Float::INFINITY).each do |delta|
172
+ y << (delta**6 + 28 * delta**4 + 154 * delta**2 + 132) * delta**2 / 315
173
+ end
174
+ end
175
+ end
176
+
177
+ def nine_dimensional_hyperoctahedron # rubocop:disable Metrics/AbcSize
178
+ Enumerator.new do |y|
179
+ (1..Float::INFINITY).each do |delta|
180
+ y << (2 * delta**8 + 84 * delta**6 + 798 * delta**4 + 1636 * delta**2 + 315) * delta / 2835
181
+ end
182
+ end
183
+ end
184
+
185
+ def ten_dimensional_hyperoctahedron # rubocop:disable Metrics/AbcSize
186
+ Enumerator.new do |y|
187
+ (1..Float::INFINITY).each do |delta|
188
+ y << (2 * delta**8 + 120 * delta**6 + 1806 * delta**4 + 7180 * delta**2 + 5067) * delta**2 / 14_175
189
+ end
190
+ end
191
+ end
192
+
193
+ def k_dimensional_hyperoctahedron(k)
194
+ Enumerator.new do |y|
195
+ (1..Float::INFINITY).each do |delta|
196
+ a = 0
197
+ (0..(k - 1)).each do |i|
198
+ a += Utils.binomial_coefficient(k - 1, i) * (Utils.rising_factorial(delta - i, k) / Utils.factorial_iter(k))
199
+ end
200
+ y << a
201
+ end
202
+ end
203
+ end
204
+
205
+ alias k_cross_polytope k_dimensional_hyperoctahedron
206
+
207
+ def four_dimensional_mgonal_pyramidal(m)
208
+ Enumerator.new do |y|
209
+ (1..Float::INFINITY).each do |delta|
210
+ y << (delta * (delta + 1) * (delta + 2) * ((m - 2) * delta - m + 6)) / 24
211
+ end
212
+ end
213
+ end
214
+
215
+ alias mgonal_pyramidal_numbers_of_the_second_order four_dimensional_mgonal_pyramidal
216
+
217
+ def four_dimensional_square_pyramidal
218
+ Enumerator.new do |y|
219
+ (1..Float::INFINITY).each do |delta|
220
+ y << (delta * (delta + 1) * (delta + 2) * ((4 - 2) * delta - 4 + 6)) / 24
221
+ end
222
+ end
223
+ end
224
+
225
+ def four_dimensional_pentagonal_pyramidal
226
+ Enumerator.new do |y|
227
+ (1..Float::INFINITY).each do |delta|
228
+ y << (delta * (delta + 1) * (delta + 2) * ((5 - 2) * delta - 5 + 6)) / 24
229
+ end
230
+ end
231
+ end
232
+
233
+ def four_dimensional_hexagonal_pyramidal
234
+ Enumerator.new do |y|
235
+ (1..Float::INFINITY).each do |delta|
236
+ y << (delta * (delta + 1) * (delta + 2) * ((6 - 2) * delta - 6 + 6)) / 24
237
+ end
238
+ end
239
+ end
240
+
241
+ def four_dimensional_heptagonal_pyramidal
242
+ Enumerator.new do |y|
243
+ (1..Float::INFINITY).each do |delta|
244
+ y << (delta * (delta + 1) * (delta + 2) * ((7 - 2) * delta - 7 + 6)) / 24
245
+ end
246
+ end
247
+ end
248
+
249
+ def four_dimensional_octagonal_pyramidal
250
+ Enumerator.new do |y|
251
+ (1..Float::INFINITY).each do |delta|
252
+ y << (delta * (delta + 1) * (delta + 2) * ((8 - 2) * delta - 8 + 6)) / 24
253
+ end
254
+ end
255
+ end
256
+
257
+ def four_dimensional_nonagonal_pyramidal
258
+ Enumerator.new do |y|
259
+ (1..Float::INFINITY).each do |delta|
260
+ y << (delta * (delta + 1) * (delta + 2) * ((9 - 2) * delta - 9 + 6)) / 24
261
+ end
262
+ end
263
+ end
264
+
265
+ def four_dimensional_decagonal_pyramidal
266
+ Enumerator.new do |y|
267
+ (1..Float::INFINITY).each do |delta|
268
+ y << (delta * (delta + 1) * (delta + 2) * ((10 - 2) * delta - 10 + 6)) / 24
269
+ end
270
+ end
271
+ end
272
+
273
+ def four_dimensional_hendecagonal_pyramidal
274
+ Enumerator.new do |y|
275
+ (1..Float::INFINITY).each do |delta|
276
+ y << (delta * (delta + 1) * (delta + 2) * ((11 - 2) * delta - 11 + 6)) / 24
277
+ end
278
+ end
279
+ end
280
+
281
+ def four_dimensional_dodecagonal_pyramidal
282
+ Enumerator.new do |y|
283
+ (1..Float::INFINITY).each do |delta|
284
+ y << (delta * (delta + 1) * (delta + 2) * ((12 - 2) * delta - 12 + 6)) / 24
285
+ end
286
+ end
287
+ end
288
+
289
+ def k_dimensional_mgonal_pyramidal(k, m)
290
+ Enumerator.new do |y|
291
+ (1..Float::INFINITY).each do |n|
292
+ y << (Utils.pseudo_pochhammer_function(n, k) * ((m - 2) * n - m + k + 2)) / Utils.factorial_iter(k)
293
+ end
294
+ end
295
+ end
296
+
297
+ alias mgonal_pyramidal_numbers_of_the_k_2_th_order k_dimensional_mgonal_pyramidal
298
+
299
+ def five_dimensional_mgonal_pyramidal(m)
300
+ Enumerator.new do |y|
301
+ (1..Float::INFINITY).each do |delta|
302
+ y << (delta * (delta + 1) * (delta + 2) * (delta + 3) * ((m - 2) * delta - m + 7)) / 120
303
+ end
304
+ end
305
+ end
306
+
307
+ def five_dimensional_square_pyramidal
308
+ Enumerator.new do |y|
309
+ k = 5
310
+ m = 4
311
+ (1..Float::INFINITY).each do |delta|
312
+ y << (Utils.pseudo_pochhammer_function(delta, k) * ((m - 2) * delta - m + k + 2)) / Utils.factorial_iter(k)
313
+ end
314
+ end
315
+ end
316
+
317
+ def five_dimensional_pentagonal_pyramidal
318
+ Enumerator.new do |y|
319
+ k = 5
320
+ m = 5
321
+ (1..Float::INFINITY).each do |delta|
322
+ y << (Utils.pseudo_pochhammer_function(delta, k) * ((m - 2) * delta - m + k + 2)) / Utils.factorial_iter(k)
323
+ end
324
+ end
325
+ end
326
+
327
+ def five_dimensional_hexagonal_pyramidal
328
+ Enumerator.new do |y|
329
+ k = 5
330
+ m = 6
331
+ (1..Float::INFINITY).each do |delta|
332
+ y << (Utils.pseudo_pochhammer_function(delta, k) * ((m - 2) * delta - m + k + 2)) / Utils.factorial_iter(k)
333
+ end
334
+ end
335
+ end
336
+
337
+ def five_dimensional_heptagonal_pyramidal
338
+ Enumerator.new do |y|
339
+ k = 5
340
+ m = 7
341
+ (1..Float::INFINITY).each do |delta|
342
+ y << (Utils.pseudo_pochhammer_function(delta, k) * ((m - 2) * delta - m + k + 2)) / Utils.factorial_iter(k)
343
+ end
344
+ end
345
+ end
346
+
347
+ def five_dimensional_octagonal_pyramidal
348
+ Enumerator.new do |y|
349
+ k = 5
350
+ m = 8
351
+ (1..Float::INFINITY).each do |delta|
352
+ y << (Utils.pseudo_pochhammer_function(delta, k) * ((m - 2) * delta - m + k + 2)) / Utils.factorial_iter(k)
353
+ end
354
+ end
355
+ end
356
+
357
+ def six_dimensional_mgonal_pyramidal(m) # rubocop:disable Metrics/AbcSize
358
+ Enumerator.new do |y|
359
+ (1..Float::INFINITY).each do |delta|
360
+ y << (delta * (delta + 1) * (delta + 2) * (delta + 3) * (delta + 4) * ((m - 2) * delta - m + 8)) / 720
361
+ end
362
+ end
363
+ end
364
+
365
+ def six_dimensional_square_pyramidal
366
+ Enumerator.new do |y|
367
+ k = 6
368
+ m = 4
369
+ (1..Float::INFINITY).each do |delta|
370
+ y << (Utils.pseudo_pochhammer_function(delta, k) * ((m - 2) * delta - m + k + 2)) / Utils.factorial_iter(k)
371
+ end
372
+ end
373
+ end
374
+
375
+ def six_dimensional_pentagonal_pyramidal
376
+ Enumerator.new do |y|
377
+ k = 6
378
+ m = 5
379
+ (1..Float::INFINITY).each do |delta|
380
+ y << (Utils.pseudo_pochhammer_function(delta, k) * ((m - 2) * delta - m + k + 2)) / Utils.factorial_iter(k)
381
+ end
382
+ end
383
+ end
384
+
385
+ def six_dimensional_hexagonal_pyramidal
386
+ Enumerator.new do |y|
387
+ k = 6
388
+ m = 6
389
+ (1..Float::INFINITY).each do |delta|
390
+ y << (Utils.pseudo_pochhammer_function(delta, k) * ((m - 2) * delta - m + k + 2)) / Utils.factorial_iter(k)
391
+ end
392
+ end
393
+ end
394
+
395
+ def six_dimensional_heptagonal_pyramidal
396
+ Enumerator.new do |y|
397
+ k = 6
398
+ m = 7
399
+ (1..Float::INFINITY).each do |delta|
400
+ y << (Utils.pseudo_pochhammer_function(delta, k) * ((m - 2) * delta - m + k + 2)) / Utils.factorial_iter(k)
401
+ end
402
+ end
403
+ end
404
+
405
+ def six_dimensional_octagonal_pyramidal
406
+ Enumerator.new do |y|
407
+ k = 6
408
+ m = 8
409
+ (1..Float::INFINITY).each do |delta|
410
+ y << (Utils.pseudo_pochhammer_function(delta, k) * ((m - 2) * delta - m + k + 2)) / Utils.factorial_iter(k)
411
+ end
412
+ end
413
+ end
414
+
415
+ def centered_biquadratic
416
+ Enumerator.new do |y|
417
+ a = 0
418
+ (1..Float::INFINITY).each do |delta|
419
+ a += delta**4 - (delta - 2)**4
420
+ y << a + 1
421
+ end
422
+ end
423
+ end
424
+
425
+ def k_dimensional_centered_hypercube(k)
426
+ Enumerator.new do |y|
427
+ (1..Float::INFINITY).each do |delta|
428
+ y << delta**k + (delta - 1)**k
429
+ end
430
+ end
431
+ end
432
+
433
+ def five_dimensional_centered_hypercube
434
+ Enumerator.new do |y|
435
+ (1..Float::INFINITY).each do |delta|
436
+ y << delta**5 + (delta - 1)**5
437
+ end
438
+ end
439
+ end
440
+
441
+ def six_dimensional_centered_hypercube
442
+ Enumerator.new do |y|
443
+ (1..Float::INFINITY).each do |delta|
444
+ y << delta**6 + (delta - 1)**6
445
+ end
446
+ end
447
+ end
448
+
449
+ def centered_polytope
450
+ Enumerator.new do |y|
451
+ (1..Float::INFINITY).each do |delta|
452
+ y << (5 * delta**4 - 10 * delta**3 + 55 * delta**2 - 50 * delta + 24) / 24
453
+ end
454
+ end
455
+ end
456
+
457
+ def helper_centered_hypertetrahedron(k, n)
458
+ return 1 if n == 1
459
+
460
+ t = Utils.binomial_coefficient(k + 1, k)
461
+ return t if n == 2
462
+
463
+ tau = 0
464
+ (0..k - 1).each do |i|
465
+ tau += Utils.binomial_coefficient(k + 1, k - i) * Utils.binomial_coefficient(n - 2, i)
466
+ end
467
+ tau
468
+ end
469
+
470
+ def acc_helper_centered_hypertetrahedron(k, n)
471
+ a = 0
472
+ (1..n).each do |j|
473
+ a += helper_centered_hypertetrahedron(k, j)
474
+ end
475
+ a
476
+ end
477
+
478
+ private_class_method :helper_centered_hypertetrahedron
479
+ private_class_method :acc_helper_centered_hypertetrahedron
480
+
481
+ def k_dimensional_centered_hypertetrahedron(k)
482
+ Enumerator.new do |y|
483
+ (1..Float::INFINITY).each do |n|
484
+ y << acc_helper_centered_hypertetrahedron(k, n)
485
+ end
486
+ end
487
+ end
488
+
489
+ def five_dimensional_centered_hypertetrahedron
490
+ Enumerator.new do |y|
491
+ (1..Float::INFINITY).each do |n|
492
+ y << acc_helper_centered_hypertetrahedron(5, n)
493
+ end
494
+ end
495
+ end
496
+
497
+ def six_dimensional_centered_hypertetrahedron
498
+ Enumerator.new do |y|
499
+ (1..Float::INFINITY).each do |n|
500
+ y << acc_helper_centered_hypertetrahedron(6, n)
501
+ end
502
+ end
503
+ end
504
+
505
+ def centered_hyperoctahedral
506
+ Enumerator.new do |y|
507
+ (1..Float::INFINITY).each do |delta|
508
+ y << (2 * delta**4 - 4 * delta**3 + 10 * delta**2 - 8 * delta + 3) / 3
509
+ end
510
+ end
511
+ end
512
+
513
+ alias orthoplex centered_hyperoctahedral
514
+
515
+ def nexus(k)
516
+ Enumerator.new do |y|
517
+ (0..Float::INFINITY).each do |delta|
518
+ y << (delta + 1)**(k + 1) - delta**(k + 1)
519
+ end
520
+ end
521
+ end
522
+
523
+ def ext_int_double_summation(k, n) # rubocop:disable Metrics/AbcSize
524
+ t = ((2**1) * Utils.binomial_coefficient(k, 1) * Utils.binomial_coefficient(1, 0))
525
+ a = 0
526
+ (1..(n - 1)).each do |j|
527
+ (0..(k - 1)).each do |i|
528
+ a += (2**(1 + i)) * Utils.binomial_coefficient(k, 1 + i) * Utils.binomial_coefficient(j, i)
529
+ end
530
+ end
531
+ (1 + t + a)
532
+ end
533
+
534
+ private_class_method :ext_int_double_summation
535
+
536
+ def k_dimensional_centered_hyperoctahedron(k)
537
+ Enumerator.new do |y|
538
+ y << 1
539
+ (1..Float::INFINITY).each do |n|
540
+ y << ext_int_double_summation(k, n)
541
+ end
542
+ end
543
+ end
544
+
545
+ def five_dimensional_centered_hyperoctahedron
546
+ Enumerator.new do |y|
547
+ y << 1
548
+ (1..Float::INFINITY).each do |n|
549
+ y << ext_int_double_summation(5, n)
550
+ end
551
+ end
552
+ end
553
+
554
+ def six_dimensional_centered_hyperoctahedron
555
+ Enumerator.new do |y|
556
+ y << 1
557
+ (1..Float::INFINITY).each do |n|
558
+ y << ext_int_double_summation(6, n)
559
+ end
560
+ end
561
+ end
562
+
563
+ def generalized_pentatope(left_index = 0)
564
+ Enumerator.new do |y|
565
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
566
+ y << delta * (delta + 1) * (delta + 2) * (delta + 3) / 24
567
+ end
568
+ end
569
+ end
570
+
571
+ def generalized_k_dimensional_hypertetrahedron(k, left_index = 0)
572
+ Enumerator.new do |y|
573
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
574
+ y << Utils.rising_factorial(delta, k) / Utils.factorial_iter(k)
575
+ end
576
+ end
577
+ end
578
+
579
+ def generalized_biquadratic(left_index = 0)
580
+ Enumerator.new do |y|
581
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
582
+ y << delta**4
583
+ end
584
+ end
585
+ end
586
+
587
+ def generalized_k_dimensional_hypercube(k = 5, left_index = 0)
588
+ Enumerator.new do |y|
589
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
590
+ y << delta**k
591
+ end
592
+ end
593
+ end
594
+
595
+ def generalized_hyperoctahedral(left_index = 0)
596
+ Enumerator.new do |y|
597
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
598
+ y << (delta**2 * (delta**2 + 2)) / 3
599
+ end
600
+ end
601
+ end
602
+
603
+ def generalized_k_dimensional_hyperoctahedron(k = 5, left_index = 0)
604
+ Enumerator.new do |y|
605
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
606
+ a = 0
607
+ (0..(k - 1)).each do |i|
608
+ a += Utils.binomial_coefficient(k - 1, i) * (Utils.rising_factorial(delta - i, k) / Utils.factorial_iter(k))
609
+ end
610
+ y << a
611
+ end
612
+ end
613
+ end
614
+
615
+ def generalized_hyperdodecahedral(left_index = 0)
616
+ Enumerator.new do |y|
617
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
618
+ y << (delta * (261 * delta**3 - 504 * delta**2 + 283 * delta - 38)) / 2
619
+ end
620
+ end
621
+ end
622
+
623
+ def generalized_hypericosahedral(left_index = 0)
624
+ Enumerator.new do |y|
625
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
626
+ y << (delta * (145 * delta**3 - 280 * delta**2 + 179 * delta - 38)) / 6
627
+ end
628
+ end
629
+ end
630
+
631
+ def generalized_polyoctahedral(left_index = 0)
632
+ Enumerator.new do |y|
633
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
634
+ y << delta**2 * (3 * delta**2 - 4 * delta + 2)
635
+ end
636
+ end
637
+ end
638
+
639
+ def generalized_k_dimensional_mgonal_pyramidal(k, m, left_index = 0)
640
+ Enumerator.new do |y|
641
+ ((-1 * left_index.abs)..Float::INFINITY).each do |n|
642
+ y << (Utils.pseudo_pochhammer_function(n, k) * ((m - 2) * n - m + k + 2)) / Utils.factorial_iter(k)
643
+ end
644
+ end
645
+ end
646
+
647
+ def generalized_k_dimensional_centered_hypercube(k, left_index = 0)
648
+ Enumerator.new do |y|
649
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
650
+ y << delta**k + (delta - 1)**k
651
+ end
652
+ end
653
+ end
654
+
655
+ def gen_acc_helper_centered_hypertetrahedron(k, n)
656
+ a = 0
657
+ (1..n.abs).each do |j|
658
+ a += helper_centered_hypertetrahedron(k, j)
659
+ end
660
+ n > 0 ? a : -a
661
+ end
662
+
663
+ private_class_method :gen_acc_helper_centered_hypertetrahedron
664
+
665
+ def generalized_k_dimensional_centered_hypertetrahedron(k, left_index = 0)
666
+ Enumerator.new do |y|
667
+ ((-1 * left_index.abs)..Float::INFINITY).each do |n|
668
+ y << gen_acc_helper_centered_hypertetrahedron(k, n)
669
+ end
670
+ end
671
+ end
672
+
673
+ def gen_ext_int_double_summation(k, n) # rubocop:disable Metrics/AbcSize
674
+ is_positive_n = n
675
+ n = n.abs
676
+ t = (2 * Utils.binomial_coefficient(k, 1) * Utils.binomial_coefficient(1, 0))
677
+ a = 0
678
+ (1..(n - 1)).each do |j|
679
+ (0..(k - 1)).each do |i|
680
+ a += (2**(1 + i)) * Utils.binomial_coefficient(k, 1 + i) * Utils.binomial_coefficient(j, i)
681
+ end
682
+ end
683
+ is_positive_n > 0 ? (1 + t + a) : (1 + t + a) * -1
684
+ end
685
+
686
+ private_class_method :gen_ext_int_double_summation
687
+
688
+ def generalized_k_dimensional_centered_hyperoctahedron(k, left_index = 0)
689
+ Enumerator.new do |y|
690
+ ((-1 * left_index.abs)..Float::INFINITY).each do |n|
691
+ y << 1 if n == 1
692
+ y << gen_ext_int_double_summation(k, n) if n != 0
693
+ end
694
+ end
695
+ end
696
+
697
+ def generalized_nexus(k, left_index = 0)
698
+ Enumerator.new do |y|
699
+ ((-1 * left_index.abs)..Float::INFINITY).each do |delta|
700
+ y << (delta + 1)**(k + 1) - delta**(k + 1)
701
+ end
702
+ end
703
+ end
704
+
705
+ require 'prime'
706
+
707
+ def cuban_numbers
708
+ Enumerator.new do |y|
709
+ (1..Float::INFINITY).each do |delta|
710
+ y << (delta + 1)**3 - delta**3
711
+ end
712
+ end
713
+ end
714
+
715
+ alias cuban_prime_numbers cuban_numbers
716
+
717
+ def helper_quartan_numbers(delta)
718
+ seq = [2]
719
+ (1..delta).each do |x|
720
+ (x + 1..delta).each do |y|
721
+ q = x**4 + y**4
722
+ seq << q if Prime.prime?(q)
723
+ end
724
+ end
725
+ seq.sort
726
+ end
727
+
728
+ private_class_method :helper_quartan_numbers
729
+
730
+ def quartan_numbers
731
+ Enumerator.new do |y|
732
+ (1..Float::INFINITY).each do |delta|
733
+ y << helper_quartan_numbers(delta)[delta - 1]
734
+ end
735
+ end
736
+ end
737
+
738
+ def pell_numbers
739
+ pell_numbers = [0, 1]
740
+ Enumerator.new do |y|
741
+ y << 0
742
+ y << 1
743
+ (2..Float::INFINITY).each do |delta|
744
+ y << pell_numbers[delta] = 2 * pell_numbers[delta - 1] + pell_numbers[delta - 2]
745
+ end
746
+ end
747
+ end
748
+
749
+ def prime_number?(p)
750
+ (2..Math.sqrt(p)).none? do |delta|
751
+ p % delta == 0 # rubocop:disable Style/NumericPredicate
752
+ end
753
+ end
754
+
755
+ def helper_carmichael_number_math_def(n)
756
+ return if prime_number?(n)
757
+
758
+ (2..(n - 1)).each do |a|
759
+ next unless n.gcd(a) == 1
760
+ return nil if a.pow(n - 1, n) != 1
761
+ end
762
+ n
763
+ end
764
+
765
+ def helper_carmichael_number(n)
766
+ return if Prime.prime?(n)
767
+
768
+ is_carmichael = (2..Math.sqrt(n)).none? do |a|
769
+ n.gcd(a) == 1 && a.pow(n - 1, n) != 1
770
+ end
771
+ is_carmichael ? n : nil
772
+ end
773
+
774
+ private_class_method :prime_number?
775
+ private_class_method :helper_carmichael_number_math_def
776
+ private_class_method :helper_carmichael_number
777
+
778
+ def carmichael_numbers
779
+ Enumerator.new do |y|
780
+ (561..Float::INFINITY).each do |delta|
781
+ num_seq = helper_carmichael_number(delta)
782
+ y << num_seq unless num_seq.nil?
783
+ end
784
+ end
785
+ end
786
+
787
+ def helper_stern_prime_numbers(delta)
788
+ prime_list = Prime.first(delta)
789
+ q = prime_list[-1]
790
+ b = 1
791
+ while (2 * b**2) < q
792
+ prime_list[0..-2].each do |p|
793
+ return nil if q == p + (2 * b**2)
794
+ end
795
+ b += 1
796
+ end
797
+ q
798
+ end
799
+
800
+ private_class_method :helper_stern_prime_numbers
801
+
802
+ def stern_prime_numbers(infty = false) # rubocop:disable Style/OptionalBooleanParameter
803
+ Enumerator.new do |y|
804
+ max_term = infty == false ? 238 : float::INFINITY
805
+ (1..max_term).each do |delta|
806
+ num_seq = helper_stern_prime_numbers(delta)
807
+ y << num_seq unless num_seq.nil?
808
+ end
809
+ end
810
+ end
811
+
812
+ def helper_apocalyptic_numbers(delta)
813
+ search_666 = (2**delta).to_s # rubocop:disable Naming/VariableNumber
814
+ len_666 = search_666.length - 1 # rubocop:disable Naming/VariableNumber
815
+ (0..len_666).each do |index|
816
+ return delta if search_666[index, 3] == '666' && search_666[index + 1] == '6' && search_666[index + 2] == '6'
817
+ end
818
+ nil
819
+ end
820
+
821
+ private_class_method :helper_apocalyptic_numbers
822
+
823
+ def apocalyptic_numbers
824
+ Enumerator.new do |y|
825
+ (157..Float::INFINITY).each do |delta|
826
+ y << helper_apocalyptic_numbers(delta) unless helper_apocalyptic_numbers(delta).nil?
827
+ end
828
+ end
829
+ end
830
+ end
831
+ end