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