figurate_numbers 1.3.0 → 1.4.0
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 +305 -283
- data/lib/figurate_numbers/multidimensional_figurate_numbers.rb +842 -0
- data/lib/figurate_numbers/plane_figurate_numbers.rb +627 -0
- data/lib/figurate_numbers/space_figurate_numbers.rb +720 -0
- data/lib/figurate_numbers/utils/utils.rb +38 -0
- data/lib/figurate_numbers/version.rb +3 -0
- data/lib/figurate_numbers.rb +10 -2226
- metadata +9 -4
@@ -0,0 +1,842 @@
|
|
1
|
+
require_relative 'utils/utils'
|
2
|
+
|
3
|
+
module MultiDimensionalFigurateNumbers
|
4
|
+
extend self
|
5
|
+
|
6
|
+
def pentatope
|
7
|
+
Enumerator.new do |y|
|
8
|
+
(1..Float::INFINITY).each do |delta|
|
9
|
+
y << (delta * (delta + 1) * (delta + 2) * (delta + 3)) / 24
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
alias_method :hypertetrahedral, :pentatope
|
15
|
+
alias_method :triangulotriangular, :pentatope
|
16
|
+
|
17
|
+
|
18
|
+
def k_dimensional_hypertetrahedron(k)
|
19
|
+
Enumerator.new do |y|
|
20
|
+
(1..Float::INFINITY).each do |delta|
|
21
|
+
y << Utils.rising_factorial(delta, k) / Utils.factorial_iter(k)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
alias_method :k_hypertetrahedron, :k_dimensional_hypertetrahedron
|
27
|
+
alias_method :regular_k_polytopic, :k_dimensional_hypertetrahedron
|
28
|
+
alias_method :figurate_numbers_of_order_k, :k_dimensional_hypertetrahedron
|
29
|
+
|
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_method :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_method :hexadecachoron, :hyperoctahedral
|
98
|
+
alias_method :four_cross_polytope, :hyperoctahedral
|
99
|
+
alias_method :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_method :tetraplex, :hypericosahedral
|
110
|
+
alias_method :polytetrahedron, :hypericosahedral
|
111
|
+
alias_method :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_method :hecatonicosachoron, :hyperdodecahedral
|
122
|
+
alias_method :dodecaplex, :hyperdodecahedral
|
123
|
+
alias_method :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_method :icositetrachoron, :polyoctahedral
|
134
|
+
alias_method :octaplex, :polyoctahedral
|
135
|
+
alias_method :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
|
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
|
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 / 14175
|
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_method :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_method :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_method :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)
|
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
|
+
t = Utils.binomial_coefficient(k + 1, k)
|
460
|
+
return t if n == 2
|
461
|
+
tau = 0
|
462
|
+
(0..k-1).each do |i|
|
463
|
+
tau += Utils.binomial_coefficient(k + 1, k - i) * Utils.binomial_coefficient(n - 2, i)
|
464
|
+
end
|
465
|
+
tau
|
466
|
+
end
|
467
|
+
|
468
|
+
def acc_helper_centered_hypertetrahedron(k, n)
|
469
|
+
a = 0
|
470
|
+
(1..n).each do |j|
|
471
|
+
a += helper_centered_hypertetrahedron(k, j)
|
472
|
+
end
|
473
|
+
a
|
474
|
+
end
|
475
|
+
|
476
|
+
private_class_method :helper_centered_hypertetrahedron
|
477
|
+
private_class_method :acc_helper_centered_hypertetrahedron
|
478
|
+
|
479
|
+
def k_dimensional_centered_hypertetrahedron(k)
|
480
|
+
Enumerator.new do |y|
|
481
|
+
(1..Float::INFINITY).each do |n|
|
482
|
+
y << acc_helper_centered_hypertetrahedron(k, n)
|
483
|
+
end
|
484
|
+
end
|
485
|
+
end
|
486
|
+
|
487
|
+
def five_dimensional_centered_hypertetrahedron
|
488
|
+
Enumerator.new do |y|
|
489
|
+
(1..Float::INFINITY).each do |n|
|
490
|
+
y << acc_helper_centered_hypertetrahedron(5, n)
|
491
|
+
end
|
492
|
+
end
|
493
|
+
end
|
494
|
+
|
495
|
+
def six_dimensional_centered_hypertetrahedron
|
496
|
+
Enumerator.new do |y|
|
497
|
+
(1..Float::INFINITY).each do |n|
|
498
|
+
y << acc_helper_centered_hypertetrahedron(6, n)
|
499
|
+
end
|
500
|
+
end
|
501
|
+
end
|
502
|
+
|
503
|
+
def centered_hyperoctahedral
|
504
|
+
Enumerator.new do |y|
|
505
|
+
(1..Float::INFINITY).each do |delta|
|
506
|
+
y << (2 * delta**4 - 4 * delta**3 + 10 * delta**2 - 8 * delta + 3) / 3
|
507
|
+
end
|
508
|
+
end
|
509
|
+
end
|
510
|
+
|
511
|
+
alias_method :orthoplex, :centered_hyperoctahedral
|
512
|
+
|
513
|
+
def nexus(k)
|
514
|
+
Enumerator.new do |y|
|
515
|
+
(0..Float::INFINITY).each do |delta|
|
516
|
+
y << (delta + 1)**(k + 1) - delta**(k + 1)
|
517
|
+
end
|
518
|
+
end
|
519
|
+
end
|
520
|
+
|
521
|
+
def ext_int_double_summation(k, n)
|
522
|
+
t = ((2**(1)) * Utils.binomial_coefficient(k, 1) * Utils.binomial_coefficient(1, 0))
|
523
|
+
a = 0
|
524
|
+
(1..(n - 1)).each do |j|
|
525
|
+
(0..(k - 1)).each do |i|
|
526
|
+
a += (2**(1 + i)) * Utils.binomial_coefficient(k, 1 + i) * Utils.binomial_coefficient(j, i)
|
527
|
+
end
|
528
|
+
end
|
529
|
+
(1 + t + a)
|
530
|
+
end
|
531
|
+
|
532
|
+
private_class_method :ext_int_double_summation
|
533
|
+
|
534
|
+
def k_dimensional_centered_hyperoctahedron(k)
|
535
|
+
Enumerator.new do |y|
|
536
|
+
y << 1
|
537
|
+
(1..Float::INFINITY).each do |n|
|
538
|
+
y << ext_int_double_summation(k, n)
|
539
|
+
end
|
540
|
+
end
|
541
|
+
end
|
542
|
+
|
543
|
+
def five_dimensional_centered_hyperoctahedron
|
544
|
+
Enumerator.new do |y|
|
545
|
+
y << 1
|
546
|
+
(1..Float::INFINITY).each do |n|
|
547
|
+
y << ext_int_double_summation(5, n)
|
548
|
+
end
|
549
|
+
end
|
550
|
+
end
|
551
|
+
|
552
|
+
def six_dimensional_centered_hyperoctahedron
|
553
|
+
Enumerator.new do |y|
|
554
|
+
y << 1
|
555
|
+
(1..Float::INFINITY).each do |n|
|
556
|
+
y << ext_int_double_summation(6, n)
|
557
|
+
end
|
558
|
+
end
|
559
|
+
end
|
560
|
+
|
561
|
+
def generalized_pentatope(left_index = 0)
|
562
|
+
Enumerator.new do |y|
|
563
|
+
((-1 * left_index.abs)..Float::INFINITY).each do |delta|
|
564
|
+
y << delta * (delta + 1) * (delta + 2) * (delta + 3) / 24
|
565
|
+
end
|
566
|
+
end
|
567
|
+
end
|
568
|
+
|
569
|
+
def generalized_k_dimensional_hypertetrahedron(k, left_index = 0)
|
570
|
+
Enumerator.new do |y|
|
571
|
+
((-1 * left_index.abs)..Float::INFINITY).each do |delta|
|
572
|
+
y << Utils.rising_factorial(delta, k) / Utils.factorial_iter(k)
|
573
|
+
end
|
574
|
+
end
|
575
|
+
end
|
576
|
+
|
577
|
+
def generalized_biquadratic(left_index = 0)
|
578
|
+
Enumerator.new do |y|
|
579
|
+
((-1 * left_index.abs)..Float::INFINITY).each do |delta|
|
580
|
+
y << delta**4
|
581
|
+
end
|
582
|
+
end
|
583
|
+
end
|
584
|
+
|
585
|
+
def generalized_k_dimensional_hypercube(k = 5, left_index = 0)
|
586
|
+
Enumerator.new do |y|
|
587
|
+
((-1 * left_index.abs)..Float::INFINITY).each do |delta|
|
588
|
+
y << delta**k
|
589
|
+
end
|
590
|
+
end
|
591
|
+
end
|
592
|
+
|
593
|
+
def generalized_hyperoctahedral(left_index = 0)
|
594
|
+
Enumerator.new do |y|
|
595
|
+
((-1 * left_index.abs)..Float::INFINITY).each do |delta|
|
596
|
+
y << (delta**2 * (delta**2 + 2)) / 3
|
597
|
+
end
|
598
|
+
end
|
599
|
+
end
|
600
|
+
|
601
|
+
def generalized_k_dimensional_hyperoctahedron(k = 5, left_index = 0)
|
602
|
+
Enumerator.new do |y|
|
603
|
+
((-1 * left_index.abs)..Float::INFINITY).each do |delta|
|
604
|
+
a = 0
|
605
|
+
(0..(k - 1)).each do |i|
|
606
|
+
a += Utils.binomial_coefficient(k - 1, i) * (Utils.rising_factorial(delta - i, k) / Utils.factorial_iter(k))
|
607
|
+
end
|
608
|
+
y << a
|
609
|
+
end
|
610
|
+
end
|
611
|
+
end
|
612
|
+
|
613
|
+
def generalized_hyperdodecahedral(left_index = 0)
|
614
|
+
Enumerator.new do |y|
|
615
|
+
((-1 * left_index.abs)..Float::INFINITY).each do |delta|
|
616
|
+
y << (delta * (261 * delta**3 - 504 * delta**2 + 283 * delta - 38)) / 2
|
617
|
+
end
|
618
|
+
end
|
619
|
+
end
|
620
|
+
|
621
|
+
def generalized_hypericosahedral(left_index = 0)
|
622
|
+
Enumerator.new do |y|
|
623
|
+
((-1 * left_index.abs)..Float::INFINITY).each do |delta|
|
624
|
+
y << (delta * (145 * delta ** 3 - 280 * delta**2 + 179 * delta - 38)) / 6
|
625
|
+
end
|
626
|
+
end
|
627
|
+
end
|
628
|
+
|
629
|
+
def generalized_polyoctahedral(left_index = 0)
|
630
|
+
Enumerator.new do |y|
|
631
|
+
((-1 * left_index.abs)..Float::INFINITY).each do |delta|
|
632
|
+
y << delta**2 * (3 * delta**2 - 4 * delta + 2)
|
633
|
+
end
|
634
|
+
end
|
635
|
+
end
|
636
|
+
|
637
|
+
def generalized_k_dimensional_mgonal_pyramidal(k, m, left_index = 0)
|
638
|
+
Enumerator.new do |y|
|
639
|
+
((-1 * left_index.abs)..Float::INFINITY).each do |n|
|
640
|
+
y << (Utils.pseudo_pochhammer_function(n, k) * ((m - 2) * n - m + k + 2)) / Utils.factorial_iter(k)
|
641
|
+
end
|
642
|
+
end
|
643
|
+
end
|
644
|
+
|
645
|
+
def generalized_k_dimensional_centered_hypercube(k, left_index = 0)
|
646
|
+
Enumerator.new do |y|
|
647
|
+
((-1 * left_index.abs)..Float::INFINITY).each do |delta|
|
648
|
+
y << delta**k + (delta - 1)**k
|
649
|
+
end
|
650
|
+
end
|
651
|
+
end
|
652
|
+
|
653
|
+
def gen_acc_helper_centered_hypertetrahedron(k, n)
|
654
|
+
a = 0
|
655
|
+
(1..n.abs).each do |j|
|
656
|
+
a += helper_centered_hypertetrahedron(k, j)
|
657
|
+
end
|
658
|
+
n > 0 ? a : -a
|
659
|
+
end
|
660
|
+
|
661
|
+
private_class_method :gen_acc_helper_centered_hypertetrahedron
|
662
|
+
|
663
|
+
def generalized_k_dimensional_centered_hypertetrahedron(k, left_index = 0)
|
664
|
+
Enumerator.new do |y|
|
665
|
+
((-1 * left_index.abs)..Float::INFINITY).each do |n|
|
666
|
+
y << gen_acc_helper_centered_hypertetrahedron(k, n)
|
667
|
+
end
|
668
|
+
end
|
669
|
+
end
|
670
|
+
|
671
|
+
def gen_ext_int_double_summation(k, n)
|
672
|
+
is_positive_n = n
|
673
|
+
n = n.abs
|
674
|
+
t = ((2) * Utils.binomial_coefficient(k, 1) * Utils.binomial_coefficient(1, 0))
|
675
|
+
a = 0
|
676
|
+
(1..(n - 1)).each do |j|
|
677
|
+
(0..(k - 1)).each do |i|
|
678
|
+
a += (2**(1 + i)) * Utils.binomial_coefficient(k, 1 + i) * Utils.binomial_coefficient(j, i)
|
679
|
+
end
|
680
|
+
end
|
681
|
+
is_positive_n > 0 ? (1 + t + a) : (1 + t + a) * -1
|
682
|
+
end
|
683
|
+
|
684
|
+
private_class_method :gen_ext_int_double_summation
|
685
|
+
|
686
|
+
def generalized_k_dimensional_centered_hyperoctahedron(k, left_index = 0)
|
687
|
+
Enumerator.new do |y|
|
688
|
+
((-1 * left_index.abs)..Float::INFINITY).each do |n|
|
689
|
+
y << 1 if n == 1
|
690
|
+
y << gen_ext_int_double_summation(k, n) if n != 0
|
691
|
+
end
|
692
|
+
end
|
693
|
+
end
|
694
|
+
|
695
|
+
def generalized_nexus(k, left_index = 0)
|
696
|
+
Enumerator.new do |y|
|
697
|
+
((-1 * left_index.abs)..Float::INFINITY).each do |delta|
|
698
|
+
y << (delta + 1)**(k + 1) - delta**(k + 1)
|
699
|
+
end
|
700
|
+
end
|
701
|
+
end
|
702
|
+
|
703
|
+
require 'prime'
|
704
|
+
|
705
|
+
def cuban_numbers
|
706
|
+
Enumerator.new do |y|
|
707
|
+
(1..Float::INFINITY).each do |delta|
|
708
|
+
y << (delta + 1)**3 - delta**3
|
709
|
+
end
|
710
|
+
end
|
711
|
+
end
|
712
|
+
|
713
|
+
alias_method :cuban_prime_numbers, :cuban_numbers
|
714
|
+
|
715
|
+
def helper_quartan_numbers(delta)
|
716
|
+
seq = [2]
|
717
|
+
(1..delta).each do |x|
|
718
|
+
(x + 1..delta).each do |y|
|
719
|
+
q = x**4 + y**4
|
720
|
+
seq << q if Prime.prime?(q)
|
721
|
+
end
|
722
|
+
end
|
723
|
+
seq.sort
|
724
|
+
end
|
725
|
+
|
726
|
+
private_class_method :helper_quartan_numbers
|
727
|
+
|
728
|
+
def quartan_numbers
|
729
|
+
Enumerator.new do |y|
|
730
|
+
(1..Float::INFINITY).each do |delta|
|
731
|
+
y << helper_quartan_numbers(delta)[delta - 1]
|
732
|
+
end
|
733
|
+
end
|
734
|
+
end
|
735
|
+
|
736
|
+
def pell_numbers
|
737
|
+
pell_numbers = [0, 1]
|
738
|
+
Enumerator.new do |y|
|
739
|
+
y << 0
|
740
|
+
y << 1
|
741
|
+
(2..Float::INFINITY).each do |delta|
|
742
|
+
y << pell_numbers[delta] = 2 * pell_numbers[delta - 1] + pell_numbers[delta - 2]
|
743
|
+
end
|
744
|
+
end
|
745
|
+
end
|
746
|
+
|
747
|
+
def is_prime_number(p)
|
748
|
+
(2..Math.sqrt(p)).none? do |delta|
|
749
|
+
p % delta == 0
|
750
|
+
end
|
751
|
+
end
|
752
|
+
|
753
|
+
def helper_carmichael_number_math_def(n)
|
754
|
+
if !is_prime_number(n)
|
755
|
+
(2..(n - 1)).each do |a|
|
756
|
+
if n.gcd(a) == 1
|
757
|
+
if (a.pow(n - 1, n)) != 1
|
758
|
+
return nil
|
759
|
+
end
|
760
|
+
end
|
761
|
+
end
|
762
|
+
n
|
763
|
+
end
|
764
|
+
end
|
765
|
+
|
766
|
+
def helper_carmichael_number(n)
|
767
|
+
if !Prime.prime?(n)
|
768
|
+
(2..(Math.sqrt(n))).each do |a|
|
769
|
+
if (n).gcd(a) == 1
|
770
|
+
return if (a.pow(n - 1, n)) != 1
|
771
|
+
end
|
772
|
+
end
|
773
|
+
n
|
774
|
+
end
|
775
|
+
end
|
776
|
+
|
777
|
+
private_class_method :is_prime_number
|
778
|
+
private_class_method :helper_carmichael_number_math_def
|
779
|
+
private_class_method :helper_carmichael_number
|
780
|
+
|
781
|
+
def carmichael_numbers
|
782
|
+
Enumerator.new do |y|
|
783
|
+
(561..Float::INFINITY).each do |delta|
|
784
|
+
num_seq = helper_carmichael_number(delta)
|
785
|
+
if num_seq != nil
|
786
|
+
y << num_seq
|
787
|
+
end
|
788
|
+
end
|
789
|
+
end
|
790
|
+
end
|
791
|
+
|
792
|
+
def helper_stern_prime_numbers(delta)
|
793
|
+
prime_list = Prime.first(delta)
|
794
|
+
q = prime_list[-1]
|
795
|
+
b = 1
|
796
|
+
while (2 * b**2) < q
|
797
|
+
prime_list[0..-2].each do |p|
|
798
|
+
if q == p + (2 * b**2)
|
799
|
+
return nil
|
800
|
+
end
|
801
|
+
end
|
802
|
+
b += 1
|
803
|
+
end
|
804
|
+
q
|
805
|
+
end
|
806
|
+
|
807
|
+
private_class_method :helper_stern_prime_numbers
|
808
|
+
|
809
|
+
def stern_prime_numbers(infty = false)
|
810
|
+
Enumerator.new do |y|
|
811
|
+
max_term = infty == false ? 238 : float::INFINITY
|
812
|
+
(1..max_term).each do |delta|
|
813
|
+
num_seq = helper_stern_prime_numbers(delta)
|
814
|
+
if num_seq != nil
|
815
|
+
y << num_seq
|
816
|
+
end
|
817
|
+
end
|
818
|
+
end
|
819
|
+
end
|
820
|
+
|
821
|
+
def helper_apocalyptic_numbers(delta)
|
822
|
+
search_666 = (2**delta).to_s
|
823
|
+
len_666 = search_666.length - 1
|
824
|
+
(0..len_666).each do |index|
|
825
|
+
if search_666[index, 3] == '666' && search_666[index + 1] == '6' && search_666[index + 2] == '6'
|
826
|
+
return delta
|
827
|
+
end
|
828
|
+
end
|
829
|
+
nil
|
830
|
+
end
|
831
|
+
|
832
|
+
private_class_method :helper_apocalyptic_numbers
|
833
|
+
|
834
|
+
def apocalyptic_numbers
|
835
|
+
Enumerator.new do |y|
|
836
|
+
(157..Float::INFINITY).each do |delta|
|
837
|
+
y << helper_apocalyptic_numbers(delta) if helper_apocalyptic_numbers(delta) != nil
|
838
|
+
end
|
839
|
+
end
|
840
|
+
end
|
841
|
+
|
842
|
+
end
|