GiNaC 1.8.10
utils.cpp
Go to the documentation of this file.
1
6/*
7 * GiNaC Copyright (C) 1999-2026 Johannes Gutenberg University Mainz, Germany
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 */
22
23#include "ex.h"
24#include "numeric.h"
25#include "utils.h"
26#include "version.h"
27
28namespace GiNaC {
29
30/* Version information buried into the library */
34
35
37pole_error::pole_error(const std::string& what_arg, int degree)
38 : domain_error(what_arg), deg(degree) { }
39
42{
43 return deg;
44}
45
47unsigned log2(unsigned n)
48{
49 unsigned k;
50 for (k = 0; n > 1; n >>= 1)
51 ++k;
52 return k;
53}
54
58const numeric
59multinomial_coefficient(const std::vector<unsigned> & p)
60{
61 numeric n = 0, d = 1;
62 for (auto & it : p) {
63 n = n.add(numeric(it));
64 d = d.mul(factorial(numeric(it)));
65 }
66 return factorial(n).div(d);
67}
68
69
73
77{
78 if (count++==0) {
79 _num_120_p = (const numeric *)&dynallocate<numeric>(-120);
80 _num_60_p = (const numeric *)&dynallocate<numeric>(-60);
81 _num_48_p = (const numeric *)&dynallocate<numeric>(-48);
82 _num_30_p = (const numeric *)&dynallocate<numeric>(-30);
83 _num_25_p = (const numeric *)&dynallocate<numeric>(-25);
84 _num_24_p = (const numeric *)&dynallocate<numeric>(-24);
85 _num_20_p = (const numeric *)&dynallocate<numeric>(-20);
86 _num_18_p = (const numeric *)&dynallocate<numeric>(-18);
87 _num_15_p = (const numeric *)&dynallocate<numeric>(-15);
88 _num_12_p = (const numeric *)&dynallocate<numeric>(-12);
89 _num_11_p = (const numeric *)&dynallocate<numeric>(-11);
90 _num_10_p = (const numeric *)&dynallocate<numeric>(-10);
91 _num_9_p = (const numeric *)&dynallocate<numeric>(-9);
92 _num_8_p = (const numeric *)&dynallocate<numeric>(-8);
93 _num_7_p = (const numeric *)&dynallocate<numeric>(-7);
94 _num_6_p = (const numeric *)&dynallocate<numeric>(-6);
95 _num_5_p = (const numeric *)&dynallocate<numeric>(-5);
96 _num_4_p = (const numeric *)&dynallocate<numeric>(-4);
97 _num_3_p = (const numeric *)&dynallocate<numeric>(-3);
98 _num_2_p = (const numeric *)&dynallocate<numeric>(-2);
99 _num_1_p = (const numeric *)&dynallocate<numeric>(-1);
100 _num_1_2_p = (const numeric *)&dynallocate<numeric>(-1,2);
101 _num_1_3_p = (const numeric *)&dynallocate<numeric>(-1,3);
102 _num_1_4_p = (const numeric *)&dynallocate<numeric>(-1,4);
103 _num0_p = (const numeric *)&dynallocate<numeric>(0);
104 _num0_bp = _num0_p; // Cf. class ex default ctor.
105 _num1_4_p = (const numeric *)&dynallocate<numeric>(1,4);
106 _num1_3_p = (const numeric *)&dynallocate<numeric>(1,3);
107 _num1_2_p = (const numeric *)&dynallocate<numeric>(1,2);
108 _num1_p = (const numeric *)&dynallocate<numeric>(1);
109 _num2_p = (const numeric *)&dynallocate<numeric>(2);
110 _num3_p = (const numeric *)&dynallocate<numeric>(3);
111 _num4_p = (const numeric *)&dynallocate<numeric>(4);
112 _num5_p = (const numeric *)&dynallocate<numeric>(5);
113 _num6_p = (const numeric *)&dynallocate<numeric>(6);
114 _num7_p = (const numeric *)&dynallocate<numeric>(7);
115 _num8_p = (const numeric *)&dynallocate<numeric>(8);
116 _num9_p = (const numeric *)&dynallocate<numeric>(9);
117 _num10_p = (const numeric *)&dynallocate<numeric>(10);
118 _num11_p = (const numeric *)&dynallocate<numeric>(11);
119 _num12_p = (const numeric *)&dynallocate<numeric>(12);
120 _num15_p = (const numeric *)&dynallocate<numeric>(15);
121 _num18_p = (const numeric *)&dynallocate<numeric>(18);
122 _num20_p = (const numeric *)&dynallocate<numeric>(20);
123 _num24_p = (const numeric *)&dynallocate<numeric>(24);
124 _num25_p = (const numeric *)&dynallocate<numeric>(25);
125 _num30_p = (const numeric *)&dynallocate<numeric>(30);
126 _num48_p = (const numeric *)&dynallocate<numeric>(48);
127 _num60_p = (const numeric *)&dynallocate<numeric>(60);
128 _num120_p = (const numeric *)&dynallocate<numeric>(120);
129
130 new((void*)&_ex_120) ex(*_num_120_p);
131 new((void*)&_ex_60) ex(*_num_60_p);
132 new((void*)&_ex_48) ex(*_num_48_p);
133 new((void*)&_ex_30) ex(*_num_30_p);
134 new((void*)&_ex_25) ex(*_num_25_p);
135 new((void*)&_ex_24) ex(*_num_24_p);
136 new((void*)&_ex_20) ex(*_num_20_p);
137 new((void*)&_ex_18) ex(*_num_18_p);
138 new((void*)&_ex_15) ex(*_num_15_p);
139 new((void*)&_ex_12) ex(*_num_12_p);
140 new((void*)&_ex_11) ex(*_num_11_p);
141 new((void*)&_ex_10) ex(*_num_10_p);
142 new((void*)&_ex_9) ex(*_num_9_p);
143 new((void*)&_ex_8) ex(*_num_8_p);
144 new((void*)&_ex_7) ex(*_num_7_p);
145 new((void*)&_ex_6) ex(*_num_6_p);
146 new((void*)&_ex_5) ex(*_num_5_p);
147 new((void*)&_ex_4) ex(*_num_4_p);
148 new((void*)&_ex_3) ex(*_num_3_p);
149 new((void*)&_ex_2) ex(*_num_2_p);
150 new((void*)&_ex_1) ex(*_num_1_p);
151 new((void*)&_ex_1_2) ex(*_num_1_2_p);
152 new((void*)&_ex_1_3) ex(*_num_1_3_p);
153 new((void*)&_ex_1_4) ex(*_num_1_4_p);
154 new((void*)&_ex0) ex(*_num0_p);
155 new((void*)&_ex1_4) ex(*_num1_4_p);
156 new((void*)&_ex1_3) ex(*_num1_3_p);
157 new((void*)&_ex1_2) ex(*_num1_2_p);
158 new((void*)&_ex1) ex(*_num1_p);
159 new((void*)&_ex2) ex(*_num2_p);
160 new((void*)&_ex3) ex(*_num3_p);
161 new((void*)&_ex4) ex(*_num4_p);
162 new((void*)&_ex5) ex(*_num5_p);
163 new((void*)&_ex6) ex(*_num6_p);
164 new((void*)&_ex7) ex(*_num7_p);
165 new((void*)&_ex8) ex(*_num8_p);
166 new((void*)&_ex9) ex(*_num9_p);
167 new((void*)&_ex10) ex(*_num10_p);
168 new((void*)&_ex11) ex(*_num11_p);
169 new((void*)&_ex12) ex(*_num12_p);
170 new((void*)&_ex15) ex(*_num15_p);
171 new((void*)&_ex18) ex(*_num18_p);
172 new((void*)&_ex20) ex(*_num20_p);
173 new((void*)&_ex24) ex(*_num24_p);
174 new((void*)&_ex25) ex(*_num25_p);
175 new((void*)&_ex30) ex(*_num30_p);
176 new((void*)&_ex48) ex(*_num48_p);
177 new((void*)&_ex60) ex(*_num60_p);
178 new((void*)&_ex120) ex(*_num120_p);
179
180 // Initialize print context class info (this is not strictly necessary
181 // but we do it anyway to make print_context_class_info::dump_hierarchy()
182 // output the whole hierarchy whether or not the classes are actually
183 // used)
184 print_context::get_class_info_static();
185 print_dflt::get_class_info_static();
186 print_latex::get_class_info_static();
187 print_python::get_class_info_static();
188 print_python_repr::get_class_info_static();
189 print_tree::get_class_info_static();
190 print_csrc::get_class_info_static();
191 print_csrc_float::get_class_info_static();
192 print_csrc_double::get_class_info_static();
193 print_csrc_cl_N::get_class_info_static();
194 }
195}
196
197
201{
202 if (--count==0) {
203 // It's really necessary to clean up, since the program
204 // lifetime might not be the same as libginac.{so,dll} one
205 // (e.g. consider // dlopen/dlsym/dlclose sequence).
206 // Let the ex dtors care for deleting the numerics!
207 _ex120.~ex();
208 _ex_120.~ex();
209 _ex60.~ex();
210 _ex_60.~ex();
211 _ex48.~ex();
212 _ex_48.~ex();
213 _ex30.~ex();
214 _ex_30.~ex();
215 _ex25.~ex();
216 _ex_25.~ex();
217 _ex24.~ex();
218 _ex_24.~ex();
219 _ex20.~ex();
220 _ex_20.~ex();
221 _ex18.~ex();
222 _ex_18.~ex();
223 _ex15.~ex();
224 _ex_15.~ex();
225 _ex12.~ex();
226 _ex_12.~ex();
227 _ex11.~ex();
228 _ex_11.~ex();
229 _ex10.~ex();
230 _ex_10.~ex();
231 _ex9.~ex();
232 _ex_9.~ex();
233 _ex8.~ex();
234 _ex_8.~ex();
235 _ex7.~ex();
236 _ex_7.~ex();
237 _ex6.~ex();
238 _ex_6.~ex();
239 _ex5.~ex();
240 _ex_5.~ex();
241 _ex4.~ex();
242 _ex_4.~ex();
243 _ex3.~ex();
244 _ex_3.~ex();
245 _ex2.~ex();
246 _ex_2.~ex();
247 _ex1.~ex();
248 _ex_1.~ex();
249 _ex1_2.~ex();
250 _ex_1_2.~ex();
251 _ex1_3.~ex();
252 _ex_1_3.~ex();
253 _ex1_4.~ex();
254 _ex_1_4.~ex();
255 _ex0.~ex();
256 }
257}
258
260
261
263// Flyweight chest of numbers is re-initialized here. Note that this works
264// because the numeric* have been dynallocated by the library_init ctor before
265// (with the first module that has a static library_init object), so the
266// assignments here only increment their refcounts.
268
269// static numeric -120
272
273// static numeric -60
276
277// static numeric -48
280
281// static numeric -30
284
285// static numeric -25
288
289// static numeric -24
292
293// static numeric -20
296
297// static numeric -18
300
301// static numeric -15
304
305// static numeric -12
308
309// static numeric -11
312
313// static numeric -10
316
317// static numeric -9
319const ex _ex_9 = ex(*_num_9_p);
320
321// static numeric -8
323const ex _ex_8 = ex(*_num_8_p);
324
325// static numeric -7
327const ex _ex_7 = ex(*_num_7_p);
328
329// static numeric -6
331const ex _ex_6 = ex(*_num_6_p);
332
333// static numeric -5
335const ex _ex_5 = ex(*_num_5_p);
336
337// static numeric -4
339const ex _ex_4 = ex(*_num_4_p);
340
341// static numeric -3
343const ex _ex_3 = ex(*_num_3_p);
344
345// static numeric -2
347const ex _ex_2 = ex(*_num_2_p);
348
349// static numeric -1
351const ex _ex_1 = ex(*_num_1_p);
352
353// static numeric -1/2
356
357// static numeric -1/3
360
361// static numeric -1/4
364
365// static numeric 0
368const ex _ex0 = ex(*_num0_p);
369
370// static numeric 1/4
373
374// static numeric 1/3
377
378// static numeric 1/2
381
382// static numeric 1
384const ex _ex1 = ex(*_num1_p);
385
386// static numeric 2
388const ex _ex2 = ex(*_num2_p);
389
390// static numeric 3
392const ex _ex3 = ex(*_num3_p);
393
394// static numeric 4
396const ex _ex4 = ex(*_num4_p);
397
398// static numeric 5
400const ex _ex5 = ex(*_num5_p);
401
402// static numeric 6
404const ex _ex6 = ex(*_num6_p);
405
406// static numeric 7
408const ex _ex7 = ex(*_num7_p);
409
410// static numeric 8
412const ex _ex8 = ex(*_num8_p);
413
414// static numeric 9
416const ex _ex9 = ex(*_num9_p);
417
418// static numeric 10
420const ex _ex10 = ex(*_num10_p);
421
422// static numeric 11
424const ex _ex11 = ex(*_num11_p);
425
426// static numeric 12
428const ex _ex12 = ex(*_num12_p);
429
430// static numeric 15
432const ex _ex15 = ex(*_num15_p);
433
434// static numeric 18
436const ex _ex18 = ex(*_num18_p);
437
438// static numeric 20
440const ex _ex20 = ex(*_num20_p);
441
442// static numeric 24
444const ex _ex24 = ex(*_num24_p);
445
446// static numeric 25
448const ex _ex25 = ex(*_num25_p);
449
450// static numeric 30
452const ex _ex30 = ex(*_num30_p);
453
454// static numeric 48
456const ex _ex48 = ex(*_num48_p);
457
458// static numeric 60
460const ex _ex60 = ex(*_num60_p);
461
462// static numeric 120
465
466// comment skeleton for header files
467
468
469// member functions
470
471 // default constructor, destructor, copy constructor and assignment operator
472 // none
473
474 // other constructors
475 // none
476
477 // functions overriding virtual functions from base classes
478 // none
479
480 // new virtual functions which can be overridden by derived classes
481 // none
482
483 // non-virtual functions in this class
484 // none
485
486// member variables
487// none
488
489
490
491// comment skeleton for implementation files
492
493
495// default constructor, destructor, copy constructor and assignment operator
497
498// public
499// protected
500
502// other constructors
504
505// public
506// none
507
509// functions overriding virtual functions from base classes
511
512// public
513// protected
514// none
515
517// new virtual functions which can be overridden by derived classes
519
520// public
521// protected
522// none
523
525// non-virtual functions in this class
527
528// public
529// protected
530// none
531
533// static member variables
535
536// protected
537// private
538// none
539
540
541} // namespace GiNaC
This class is the ABC (abstract base class) of GiNaC's class hierarchy.
Definition basic.h:104
Lightweight wrapper for GiNaC's symbolic objects.
Definition ex.h:72
library_init()
Ctor of static initialization helpers.
Definition utils.cpp:76
static int count
How many static objects were created? Only the first one must create the static flyweights on the hea...
Definition ex.h:56
static void init_unarchivers()
Definition utils.cpp:259
~library_init()
Dtor of static initialization helpers.
Definition utils.cpp:200
This class is a wrapper around CLN-numbers within the GiNaC class hierarchy.
Definition numeric.h:81
const numeric mul(const numeric &other) const
Numerical multiplication method.
Definition numeric.cpp:879
const numeric add(const numeric &other) const
Numerical addition method.
Definition numeric.cpp:863
const numeric div(const numeric &other) const
Numerical division method.
Definition numeric.cpp:889
pole_error(const std::string &what_arg, int degree)
ctor for pole_error exception class.
Definition utils.cpp:37
int degree() const
Return the degree of the pole_error exception class.
Definition utils.cpp:41
Interface to GiNaC's light-weight expression handles.
vector< int > k
Definition factor.cpp:1434
size_t n
Definition factor.cpp:1431
Definition add.cpp:35
const ex _ex_20
Definition utils.cpp:295
const numeric * _num_3_p
Definition utils.cpp:342
const numeric * _num_24_p
Definition utils.cpp:290
const ex _ex_12
Definition utils.cpp:307
const numeric * _num1_3_p
Definition utils.cpp:375
const ex _ex9
Definition utils.cpp:416
const numeric * _num_1_p
Definition utils.cpp:350
const ex _ex_120
Definition utils.cpp:271
const ex _ex2
Definition utils.cpp:388
const numeric * _num_120_p
Definition utils.cpp:270
const ex _ex_1_2
Definition utils.cpp:355
const numeric * _num_30_p
Definition utils.cpp:282
const numeric * _num6_p
Definition utils.cpp:403
const numeric * _num_1_3_p
Definition utils.cpp:358
const ex _ex1_2
Definition utils.cpp:380
const numeric * _num_1_2_p
Definition utils.cpp:354
const numeric * _num3_p
Definition utils.cpp:391
const ex _ex7
Definition utils.cpp:408
const numeric * _num_1_4_p
Definition utils.cpp:362
const numeric * _num1_2_p
Definition utils.cpp:379
const ex _ex24
Definition utils.cpp:444
const numeric * _num25_p
Definition utils.cpp:447
const ex _ex12
Definition utils.cpp:428
const ex _ex1
Definition utils.cpp:384
const numeric * _num_10_p
Definition utils.cpp:314
const ex _ex_60
Definition utils.cpp:275
const numeric * _num_8_p
Definition utils.cpp:322
const numeric * _num1_4_p
Definition utils.cpp:371
const numeric * _num_5_p
Definition utils.cpp:334
const numeric * _num24_p
Definition utils.cpp:443
const ex _ex15
Definition utils.cpp:432
const numeric * _num_11_p
Definition utils.cpp:310
const numeric * _num30_p
Definition utils.cpp:451
const ex _ex3
Definition utils.cpp:392
const numeric * _num10_p
Definition utils.cpp:419
const ex _ex6
Definition utils.cpp:404
const numeric * _num4_p
Definition utils.cpp:395
const int version_minor
Definition utils.cpp:32
const numeric * _num_12_p
Definition utils.cpp:306
const numeric * _num_2_p
Definition utils.cpp:346
const numeric * _num_9_p
Definition utils.cpp:318
const numeric * _num2_p
Definition utils.cpp:387
const ex _ex11
Definition utils.cpp:424
const ex _ex_4
Definition utils.cpp:339
const ex _ex_24
Definition utils.cpp:291
const int version_major
Definition utils.cpp:31
const ex _ex_25
Definition utils.cpp:287
const ex _ex120
Definition utils.cpp:464
const numeric * _num11_p
Definition utils.cpp:423
const numeric * _num_48_p
Definition utils.cpp:278
const numeric * _num7_p
Definition utils.cpp:407
const numeric factorial(const numeric &n)
Factorial combinatorial function.
Definition numeric.cpp:2112
const ex _ex_5
Definition utils.cpp:335
const ex _ex_1
Definition utils.cpp:351
const ex _ex_3
Definition utils.cpp:343
const numeric * _num12_p
Definition utils.cpp:427
const ex _ex20
Definition utils.cpp:440
const numeric * _num48_p
Definition utils.cpp:455
unsigned log2(unsigned n)
Integer binary logarithm.
Definition utils.cpp:47
const ex _ex30
Definition utils.cpp:452
int degree(const ex &thisex, const ex &s)
Definition ex.h:751
const numeric * _num_6_p
Definition utils.cpp:330
const ex _ex_6
Definition utils.cpp:331
const numeric * _num9_p
Definition utils.cpp:415
const basic * _num0_bp
Definition utils.cpp:367
const numeric * _num_18_p
Definition utils.cpp:298
const ex _ex_2
Definition utils.cpp:347
const ex _ex_10
Definition utils.cpp:315
const ex _ex4
Definition utils.cpp:396
const ex _ex_15
Definition utils.cpp:303
const ex _ex5
Definition utils.cpp:400
const ex _ex_7
Definition utils.cpp:327
const numeric * _num_60_p
Definition utils.cpp:274
const ex _ex25
Definition utils.cpp:448
const numeric * _num_7_p
Definition utils.cpp:326
const numeric * _num1_p
Definition utils.cpp:383
const numeric * _num8_p
Definition utils.cpp:411
const ex _ex10
Definition utils.cpp:420
const ex _ex48
Definition utils.cpp:456
const numeric * _num_15_p
Definition utils.cpp:302
const ex _ex18
Definition utils.cpp:436
const int version_micro
Definition utils.cpp:33
const ex _ex_11
Definition utils.cpp:311
const numeric * _num60_p
Definition utils.cpp:459
const ex _ex_1_4
Definition utils.cpp:363
const ex _ex60
Definition utils.cpp:460
const ex _ex1_4
Definition utils.cpp:372
const ex _ex_48
Definition utils.cpp:279
const numeric * _num_4_p
Definition utils.cpp:338
const numeric * _num15_p
Definition utils.cpp:431
const ex _ex_8
Definition utils.cpp:323
const ex _ex_1_3
Definition utils.cpp:359
const ex _ex0
Definition utils.cpp:368
const numeric * _num120_p
Definition utils.cpp:463
const ex _ex_18
Definition utils.cpp:299
const numeric * _num_20_p
Definition utils.cpp:294
const ex _ex_30
Definition utils.cpp:283
const numeric * _num_25_p
Definition utils.cpp:286
const numeric multinomial_coefficient(const std::vector< unsigned > &p)
Compute the multinomial coefficient n!/(p1!*p2!*...*pk!) where n = p1+p2+...+pk, i....
Definition utils.cpp:59
const numeric * _num20_p
Definition utils.cpp:439
const numeric * _num18_p
Definition utils.cpp:435
const ex _ex8
Definition utils.cpp:412
const ex _ex_9
Definition utils.cpp:319
const numeric * _num0_p
Definition utils.cpp:366
const numeric * _num5_p
Definition utils.cpp:399
const ex _ex1_3
Definition utils.cpp:376
Makes the interface to the underlying bignum package available.
Interface to several small and furry utilities needed within GiNaC but not of any interest to the use...
GiNaC library version information.
#define GINACLIB_MINOR_VERSION
Definition version.h:29
#define GINACLIB_MICRO_VERSION
Definition version.h:32
#define GINACLIB_MAJOR_VERSION
Definition version.h:26

This page is part of the GiNaC developer's reference. It was generated automatically by doxygen. For an introduction, see the tutorial.