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.
- checksums.yaml +4 -4
- data/README.md +54 -395
- data/lib/figurate_numbers/multidimensional_figurate_numbers.rb +831 -0
- data/lib/figurate_numbers/p_adic_utils/p_adic_utils.rb +27 -0
- data/lib/figurate_numbers/plane_figurate_numbers.rb +653 -0
- data/lib/figurate_numbers/space_figurate_numbers.rb +712 -0
- data/lib/figurate_numbers/utils/utils.rb +38 -0
- data/lib/figurate_numbers/version.rb +5 -0
- data/lib/figurate_numbers.rb +11 -2229
- metadata +10 -7
@@ -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
|