]> www.ginac.de Git - ginac.git/blobdiff - ginac/utils.cpp
Univariate Hensel lifting now uses upoly.
[ginac.git] / ginac / utils.cpp
index 3d9e794f1c19eaac328482f0c929b34c01b69b23..64e5cdcc91d87a3580d66a4dfe6c9d6fede353e8 100644 (file)
@@ -4,7 +4,7 @@
  *  but not of any interest to the user of the library. */
 
 /*
- *  GiNaC Copyright (C) 1999-2003 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2008 Johannes Gutenberg University Mainz, Germany
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -18,7 +18,7 @@
  *
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
 #include "ex.h"
@@ -39,13 +39,11 @@ pole_error::pole_error(const std::string& what_arg, int degree)
        : domain_error(what_arg), deg(degree) { }
 
 /** Return the degree of the pole_error exception class. */
-int pole_error::degree(void) const
+int pole_error::degree() const
 {
        return deg;
 }
 
-// some compilers (e.g. cygwin) define a macro log2, causing confusion
-#ifndef log2
 /** Integer binary logarithm */
 unsigned log2(unsigned n)
 {
@@ -54,7 +52,6 @@ unsigned log2(unsigned n)
                ++k;
        return k;
 }
-#endif
 
 
 //////////
@@ -67,303 +64,321 @@ int library_init::count = 0;
 
 // static numeric -120
 const numeric *_num_120_p;
-const numeric &_num_120 = *_num_120_p;
-const ex _ex_120 = _num_120;
+const ex _ex_120 = _ex_120;
 
 // static numeric -60
 const numeric *_num_60_p;
-const numeric &_num_60 = *_num_60_p;
-const ex _ex_60 = _num_60;
+const ex _ex_60 = _ex_60;
 
 // static numeric -48
 const numeric *_num_48_p;
-const numeric &_num_48 = *_num_48_p;
-const ex _ex_48 = _num_48;
+const ex _ex_48 = _ex_48;
 
 // static numeric -30
 const numeric *_num_30_p;
-const numeric &_num_30 = *_num_30_p;
-const ex _ex_30 = _num_30;
+const ex _ex_30 = _ex_30;
 
 // static numeric -25
 const numeric *_num_25_p;
-const numeric &_num_25 = *_num_25_p;
-const ex _ex_25 = _num_25;
+const ex _ex_25 = _ex_25;
 
 // static numeric -24
 const numeric *_num_24_p;
-const numeric &_num_24 = *_num_24_p;
-const ex _ex_24 = _num_24;
+const ex _ex_24 = _ex_24;
 
 // static numeric -20
 const numeric *_num_20_p;
-const numeric &_num_20 = *_num_20_p;
-const ex _ex_20 = _num_20;
+const ex _ex_20 = _ex_20;
 
 // static numeric -18
 const numeric *_num_18_p;
-const numeric &_num_18 = *_num_18_p;
-const ex _ex_18 = _num_18;
+const ex _ex_18 = _ex_18;
 
 // static numeric -15
 const numeric *_num_15_p;
-const numeric &_num_15 = *_num_15_p;
-const ex _ex_15 = _num_15;
+const ex _ex_15 = _ex_15;
 
 // static numeric -12
 const numeric *_num_12_p;
-const numeric &_num_12 = *_num_12_p;
-const ex _ex_12 = _num_12;
+const ex _ex_12 = _ex_12;
 
 // static numeric -11
 const numeric *_num_11_p;
-const numeric &_num_11 = *_num_11_p;
-const ex _ex_11 = _num_11;
+const ex _ex_11 = _ex_11;
 
 // static numeric -10
 const numeric *_num_10_p;
-const numeric &_num_10 = *_num_10_p;
-const ex _ex_10 = _num_10;
+const ex _ex_10 = _ex_10;
 
 // static numeric -9
 const numeric *_num_9_p;
-const numeric &_num_9 = *_num_9_p;
-const ex _ex_9 = _num_9;
+const ex _ex_9 = _ex_9;
 
 // static numeric -8
 const numeric *_num_8_p;
-const numeric &_num_8 = *_num_8_p;
-const ex _ex_8 = _num_8;
+const ex _ex_8 = _ex_8;
 
 // static numeric -7
 const numeric *_num_7_p;
-const numeric &_num_7 = *_num_7_p;
-const ex _ex_7 = _num_7;
+const ex _ex_7 = _ex_7;
 
 // static numeric -6
 const numeric *_num_6_p;
-const numeric &_num_6 = *_num_6_p;
-const ex _ex_6 = _num_6;
+const ex _ex_6 = _ex_6;
 
 // static numeric -5
 const numeric *_num_5_p;
-const numeric &_num_5 = *_num_5_p;
-const ex _ex_5 = _num_5;
+const ex _ex_5 = _ex_5;
 
 // static numeric -4
 const numeric *_num_4_p;
-const numeric &_num_4 = *_num_4_p;
-const ex _ex_4 = _num_4;
+const ex _ex_4 = _ex_4;
 
 // static numeric -3
 const numeric *_num_3_p;
-const numeric &_num_3 = *_num_3_p;
-const ex _ex_3 = _num_3;
+const ex _ex_3 = _ex_3;
 
 // static numeric -2
 const numeric *_num_2_p;
-const numeric &_num_2 = *_num_2_p;
-const ex _ex_2 = _num_2;
+const ex _ex_2 = _ex_2;
 
 // static numeric -1
 const numeric *_num_1_p;
-const numeric &_num_1 = *_num_1_p;
-const ex _ex_1 = _num_1;
+const ex _ex_1 = _ex_1;
 
 // static numeric -1/2
 const numeric *_num_1_2_p;
-const numeric &_num_1_2= *_num_1_2_p;
-const ex _ex_1_2= _num_1_2;
+const ex _ex_1_2= _ex_1_2;
 
 // static numeric -1/3
 const numeric *_num_1_3_p;
-const numeric &_num_1_3= *_num_1_3_p;
-const ex _ex_1_3= _num_1_3;
+const ex _ex_1_3= _ex_1_3;
 
 // static numeric -1/4
 const numeric *_num_1_4_p;
-const numeric &_num_1_4= *_num_1_4_p;
-const ex _ex_1_4= _num_1_4;
+const ex _ex_1_4= _ex_1_4;
 
 // static numeric 0
 const numeric *_num0_p;
-const numeric &_num0 = *_num0_p;
-const ex _ex0 = _num0;
+const basic *_num0_bp;
+const ex _ex0 = _ex0;
 
 // static numeric 1/4
 const numeric *_num1_4_p;
-const numeric &_num1_4 = *_num1_4_p;
-const ex _ex1_4 = _num1_4;
+const ex _ex1_4 = _ex1_4;
 
 // static numeric 1/3
 const numeric *_num1_3_p;
-const numeric &_num1_3 = *_num1_3_p;
-const ex _ex1_3 = _num1_3;
+const ex _ex1_3 = _ex1_3;
 
 // static numeric 1/2
 const numeric *_num1_2_p;
-const numeric &_num1_2 = *_num1_2_p;
-const ex _ex1_2 = _num1_2;
+const ex _ex1_2 = _ex1_2;
 
 // static numeric 1
 const numeric *_num1_p;
-const numeric &_num1 = *_num1_p;
-const ex _ex1 = _num1;
+const ex _ex1 = _ex1;
 
 // static numeric 2
 const numeric *_num2_p;
-const numeric &_num2 = *_num2_p;
-const ex _ex2 = _num2;
+const ex _ex2 = _ex2;
 
 // static numeric 3
 const numeric *_num3_p;
-const numeric &_num3 = *_num3_p;
-const ex _ex3 = _num3;
+const ex _ex3 = _ex3;
 
 // static numeric 4
 const numeric *_num4_p;
-const numeric &_num4 = *_num4_p;
-const ex _ex4 = _num4;
+const ex _ex4 = _ex4;
 
 // static numeric 5
 const numeric *_num5_p;
-const numeric &_num5 = *_num5_p;
-const ex _ex5 = _num5;
+const ex _ex5 = _ex5;
 
 // static numeric 6
 const numeric *_num6_p;
-const numeric &_num6 = *_num6_p;
-const ex _ex6 = _num6;
+const ex _ex6 = _ex6;
 
 // static numeric 7
 const numeric *_num7_p;
-const numeric &_num7 = *_num7_p;
-const ex _ex7 = _num7;
+const ex _ex7 = _ex7;
 
 // static numeric 8
 const numeric *_num8_p;
-const numeric &_num8 = *_num8_p;
-const ex _ex8 = _num8;
+const ex _ex8 = _ex8;
 
 // static numeric 9
 const numeric *_num9_p;
-const numeric &_num9 = *_num9_p;
-const ex _ex9 = _num9;
+const ex _ex9 = _ex9;
 
 // static numeric 10
 const numeric *_num10_p;
-const numeric &_num10 = *_num10_p;
-const ex _ex10 = _num10;
+const ex _ex10 = _ex10;
 
 // static numeric 11
 const numeric *_num11_p;
-const numeric &_num11 = *_num11_p;
-const ex _ex11 = _num11;
+const ex _ex11 = _ex11;
 
 // static numeric 12
 const numeric *_num12_p;
-const numeric &_num12 = *_num12_p;
-const ex _ex12 = _num12;
+const ex _ex12 = _ex12;
 
 // static numeric 15
 const numeric *_num15_p;
-const numeric &_num15 = *_num15_p;
-const ex _ex15 = _num15;
+const ex _ex15 = _ex15;
 
 // static numeric 18
 const numeric *_num18_p;
-const numeric &_num18 = *_num18_p;
-const ex _ex18 = _num18;
+const ex _ex18 = _ex18;
 
 // static numeric 20
 const numeric *_num20_p;
-const numeric &_num20 = *_num20_p;
-const ex _ex20 = _num20;
+const ex _ex20 = _ex20;
 
 // static numeric 24
 const numeric *_num24_p;
-const numeric &_num24 = *_num24_p;
-const ex _ex24 = _num24;
+const ex _ex24 = _ex24;
 
 // static numeric 25
 const numeric *_num25_p;
-const numeric &_num25 = *_num25_p;
-const ex _ex25 = _num25;
+const ex _ex25 = _ex25;
 
 // static numeric 30
 const numeric *_num30_p;
-const numeric &_num30 = *_num30_p;
-const ex _ex30 = _num30;
+const ex _ex30 = _ex30;
 
 // static numeric 48
 const numeric *_num48_p;
-const numeric &_num48 = *_num48_p;
-const ex _ex48 = _num48;
+const ex _ex48 = _ex48;
 
 // static numeric 60
 const numeric *_num60_p;
-const numeric &_num60 = *_num60_p;
-const ex _ex60 = _num60;
+const ex _ex60 = _ex60;
 
 // static numeric 120
 const numeric *_num120_p;
-const numeric &_num120 = *_num120_p;
-const ex _ex120 = _num120;
+const ex _ex120 = _ex120;
 
 /** Ctor of static initialization helpers.  The fist call to this is going
  *  to initialize the library, the others do nothing. */
 library_init::library_init()
 {
        if (count++==0) {
-               _num_120_p= reinterpret_cast<const numeric*>(&((new numeric(-120))->setflag(status_flags::dynallocated)));
-               _num_60_p = reinterpret_cast<const numeric*>(&((new numeric(-60))->setflag(status_flags::dynallocated)));
-               _num_48_p = reinterpret_cast<const numeric*>(&((new numeric(-48))->setflag(status_flags::dynallocated)));
-               _num_30_p = reinterpret_cast<const numeric*>(&((new numeric(-30))->setflag(status_flags::dynallocated)));
-               _num_25_p = reinterpret_cast<const numeric*>(&((new numeric(-25))->setflag(status_flags::dynallocated)));
-               _num_24_p = reinterpret_cast<const numeric*>(&((new numeric(-24))->setflag(status_flags::dynallocated)));
-               _num_20_p = reinterpret_cast<const numeric*>(&((new numeric(-20))->setflag(status_flags::dynallocated)));
-               _num_18_p = reinterpret_cast<const numeric*>(&((new numeric(-18))->setflag(status_flags::dynallocated)));
-               _num_15_p = reinterpret_cast<const numeric*>(&((new numeric(-15))->setflag(status_flags::dynallocated)));
-               _num_12_p = reinterpret_cast<const numeric*>(&((new numeric(-12))->setflag(status_flags::dynallocated)));
-               _num_11_p = reinterpret_cast<const numeric*>(&((new numeric(-11))->setflag(status_flags::dynallocated)));
-               _num_10_p = reinterpret_cast<const numeric*>(&((new numeric(-10))->setflag(status_flags::dynallocated)));
-               _num_9_p  = reinterpret_cast<const numeric*>(&((new numeric(-9))->setflag(status_flags::dynallocated)));
-               _num_8_p  = reinterpret_cast<const numeric*>(&((new numeric(-8))->setflag(status_flags::dynallocated)));
-               _num_7_p  = reinterpret_cast<const numeric*>(&((new numeric(-7))->setflag(status_flags::dynallocated)));
-               _num_6_p  = reinterpret_cast<const numeric*>(&((new numeric(-6))->setflag(status_flags::dynallocated)));
-               _num_5_p  = reinterpret_cast<const numeric*>(&((new numeric(-5))->setflag(status_flags::dynallocated)));
-               _num_4_p  = reinterpret_cast<const numeric*>(&((new numeric(-4))->setflag(status_flags::dynallocated)));
-               _num_3_p  = reinterpret_cast<const numeric*>(&((new numeric(-3))->setflag(status_flags::dynallocated)));
-               _num_2_p  = reinterpret_cast<const numeric*>(&((new numeric(-2))->setflag(status_flags::dynallocated)));
-               _num_1_p  = reinterpret_cast<const numeric*>(&((new numeric(-1))->setflag(status_flags::dynallocated)));
-               _num_1_2_p= reinterpret_cast<const numeric*>(&((new numeric(-1,2))->setflag(status_flags::dynallocated)));
-               _num_1_3_p= reinterpret_cast<const numeric*>(&((new numeric(-1,3))->setflag(status_flags::dynallocated)));
-               _num_1_4_p= reinterpret_cast<const numeric*>(&((new numeric(-1,4))->setflag(status_flags::dynallocated)));
-               _num0_p   = reinterpret_cast<const numeric*>(&((new numeric(0))->setflag(status_flags::dynallocated)));
-               _num1_4_p = reinterpret_cast<const numeric*>(&((new numeric(1,4))->setflag(status_flags::dynallocated)));
-               _num1_3_p = reinterpret_cast<const numeric*>(&((new numeric(1,3))->setflag(status_flags::dynallocated)));
-               _num1_2_p = reinterpret_cast<const numeric*>(&((new numeric(1,2))->setflag(status_flags::dynallocated)));
-               _num1_p   = reinterpret_cast<const numeric*>(&((new numeric(1))->setflag(status_flags::dynallocated)));
-               _num2_p   = reinterpret_cast<const numeric*>(&((new numeric(2))->setflag(status_flags::dynallocated)));
-               _num3_p   = reinterpret_cast<const numeric*>(&((new numeric(3))->setflag(status_flags::dynallocated)));
-               _num4_p   = reinterpret_cast<const numeric*>(&((new numeric(4))->setflag(status_flags::dynallocated)));
-               _num5_p   = reinterpret_cast<const numeric*>(&((new numeric(5))->setflag(status_flags::dynallocated)));
-               _num6_p   = reinterpret_cast<const numeric*>(&((new numeric(6))->setflag(status_flags::dynallocated)));
-               _num7_p   = reinterpret_cast<const numeric*>(&((new numeric(7))->setflag(status_flags::dynallocated)));
-               _num8_p   = reinterpret_cast<const numeric*>(&((new numeric(8))->setflag(status_flags::dynallocated)));
-               _num9_p   = reinterpret_cast<const numeric*>(&((new numeric(9))->setflag(status_flags::dynallocated)));
-               _num10_p  = reinterpret_cast<const numeric*>(&((new numeric(10))->setflag(status_flags::dynallocated)));
-               _num11_p  = reinterpret_cast<const numeric*>(&((new numeric(11))->setflag(status_flags::dynallocated)));
-               _num12_p  = reinterpret_cast<const numeric*>(&((new numeric(12))->setflag(status_flags::dynallocated)));
-               _num15_p  = reinterpret_cast<const numeric*>(&((new numeric(15))->setflag(status_flags::dynallocated)));
-               _num18_p  = reinterpret_cast<const numeric*>(&((new numeric(18))->setflag(status_flags::dynallocated)));
-               _num20_p  = reinterpret_cast<const numeric*>(&((new numeric(20))->setflag(status_flags::dynallocated)));
-               _num24_p  = reinterpret_cast<const numeric*>(&((new numeric(24))->setflag(status_flags::dynallocated)));
-               _num25_p  = reinterpret_cast<const numeric*>(&((new numeric(25))->setflag(status_flags::dynallocated)));
-               _num30_p  = reinterpret_cast<const numeric*>(&((new numeric(30))->setflag(status_flags::dynallocated)));
-               _num48_p  = reinterpret_cast<const numeric*>(&((new numeric(48))->setflag(status_flags::dynallocated)));
-               _num60_p  = reinterpret_cast<const numeric*>(&((new numeric(60))->setflag(status_flags::dynallocated)));
-               _num120_p = reinterpret_cast<const numeric*>(&((new numeric(120))->setflag(status_flags::dynallocated)));
+               (_num_120_p = new numeric(-120))->setflag(status_flags::dynallocated);
+               (_num_60_p = new numeric(-60))->setflag(status_flags::dynallocated);
+               (_num_48_p = new numeric(-48))->setflag(status_flags::dynallocated);
+               (_num_30_p = new numeric(-30))->setflag(status_flags::dynallocated);
+               (_num_25_p = new numeric(-25))->setflag(status_flags::dynallocated);
+               (_num_24_p = new numeric(-24))->setflag(status_flags::dynallocated);
+               (_num_20_p = new numeric(-20))->setflag(status_flags::dynallocated);
+               (_num_18_p = new numeric(-18))->setflag(status_flags::dynallocated);
+               (_num_15_p = new numeric(-15))->setflag(status_flags::dynallocated);
+               (_num_12_p = new numeric(-12))->setflag(status_flags::dynallocated);
+               (_num_11_p = new numeric(-11))->setflag(status_flags::dynallocated);
+               (_num_10_p = new numeric(-10))->setflag(status_flags::dynallocated);
+               (_num_9_p = new numeric(-9))->setflag(status_flags::dynallocated);
+               (_num_8_p = new numeric(-8))->setflag(status_flags::dynallocated);
+               (_num_7_p = new numeric(-7))->setflag(status_flags::dynallocated);
+               (_num_6_p = new numeric(-6))->setflag(status_flags::dynallocated);
+               (_num_5_p = new numeric(-5))->setflag(status_flags::dynallocated);
+               (_num_4_p = new numeric(-4))->setflag(status_flags::dynallocated);
+               (_num_3_p = new numeric(-3))->setflag(status_flags::dynallocated);
+               (_num_2_p = new numeric(-2))->setflag(status_flags::dynallocated);
+               (_num_1_p = new numeric(-1))->setflag(status_flags::dynallocated);
+               (_num_1_2_p = new numeric(-1,2))->setflag(status_flags::dynallocated);
+               (_num_1_3_p = new numeric(-1,3))->setflag(status_flags::dynallocated);
+               (_num_1_4_p = new numeric(-1,4))->setflag(status_flags::dynallocated);
+               (_num0_p = new numeric(0))->setflag(status_flags::dynallocated);
+               _num0_bp  = _num0_p;  // Cf. class ex default ctor.
+               (_num1_4_p = new numeric(1,4))->setflag(status_flags::dynallocated);
+               (_num1_3_p = new numeric(1,3))->setflag(status_flags::dynallocated);
+               (_num1_2_p = new numeric(1,2))->setflag(status_flags::dynallocated);
+               (_num1_p = new numeric(1))->setflag(status_flags::dynallocated);
+               (_num2_p = new numeric(2))->setflag(status_flags::dynallocated);
+               (_num3_p = new numeric(3))->setflag(status_flags::dynallocated);
+               (_num4_p = new numeric(4))->setflag(status_flags::dynallocated);
+               (_num5_p = new numeric(5))->setflag(status_flags::dynallocated);
+               (_num6_p = new numeric(6))->setflag(status_flags::dynallocated);
+               (_num7_p = new numeric(7))->setflag(status_flags::dynallocated);
+               (_num8_p = new numeric(8))->setflag(status_flags::dynallocated);
+               (_num9_p = new numeric(9))->setflag(status_flags::dynallocated);
+               (_num10_p = new numeric(10))->setflag(status_flags::dynallocated);
+               (_num11_p = new numeric(11))->setflag(status_flags::dynallocated);
+               (_num12_p = new numeric(12))->setflag(status_flags::dynallocated);
+               (_num15_p = new numeric(15))->setflag(status_flags::dynallocated);
+               (_num18_p = new numeric(18))->setflag(status_flags::dynallocated);
+               (_num20_p = new numeric(20))->setflag(status_flags::dynallocated);
+               (_num24_p = new numeric(24))->setflag(status_flags::dynallocated);
+               (_num25_p = new numeric(25))->setflag(status_flags::dynallocated);
+               (_num30_p = new numeric(30))->setflag(status_flags::dynallocated);
+               (_num48_p = new numeric(48))->setflag(status_flags::dynallocated);
+               (_num60_p = new numeric(60))->setflag(status_flags::dynallocated);
+               (_num120_p = new numeric(120))->setflag(status_flags::dynallocated);
+
+               new((void*)&_ex_120) ex(*_num_120_p);
+               new((void*)&_ex_60) ex(*_num_60_p);
+               new((void*)&_ex_48) ex(*_num_48_p);
+               new((void*)&_ex_30) ex(*_num_30_p);
+               new((void*)&_ex_25) ex(*_num_25_p);
+               new((void*)&_ex_24) ex(*_num_24_p);
+               new((void*)&_ex_20) ex(*_num_20_p);
+               new((void*)&_ex_18) ex(*_num_18_p);
+               new((void*)&_ex_15) ex(*_num_15_p);
+               new((void*)&_ex_12) ex(*_num_12_p);
+               new((void*)&_ex_11) ex(*_num_11_p);
+               new((void*)&_ex_10) ex(*_num_10_p);
+               new((void*)&_ex_9) ex(*_num_9_p);
+               new((void*)&_ex_8) ex(*_num_8_p);
+               new((void*)&_ex_7) ex(*_num_7_p);
+               new((void*)&_ex_6) ex(*_num_6_p);
+               new((void*)&_ex_5) ex(*_num_5_p);
+               new((void*)&_ex_4) ex(*_num_4_p);
+               new((void*)&_ex_3) ex(*_num_3_p);
+               new((void*)&_ex_2) ex(*_num_2_p);
+               new((void*)&_ex_1) ex(*_num_1_p);
+               new((void*)&_ex_1_2) ex(*_num_1_2_p);
+               new((void*)&_ex_1_3) ex(*_num_1_3_p);
+               new((void*)&_ex_1_4) ex(*_num_1_4_p);
+               new((void*)&_ex0) ex(*_num0_p);
+               new((void*)&_ex1_4) ex(*_num1_4_p);
+               new((void*)&_ex1_3) ex(*_num1_3_p);
+               new((void*)&_ex1_2) ex(*_num1_2_p);
+               new((void*)&_ex1) ex(*_num1_p);
+               new((void*)&_ex2) ex(*_num2_p);
+               new((void*)&_ex3) ex(*_num3_p);
+               new((void*)&_ex4) ex(*_num4_p);
+               new((void*)&_ex5) ex(*_num5_p);
+               new((void*)&_ex6) ex(*_num6_p);
+               new((void*)&_ex7) ex(*_num7_p);
+               new((void*)&_ex8) ex(*_num8_p);
+               new((void*)&_ex9) ex(*_num9_p);
+               new((void*)&_ex10) ex(*_num10_p);
+               new((void*)&_ex11) ex(*_num11_p);
+               new((void*)&_ex12) ex(*_num12_p);
+               new((void*)&_ex15) ex(*_num15_p);
+               new((void*)&_ex18) ex(*_num18_p);
+               new((void*)&_ex20) ex(*_num20_p);
+               new((void*)&_ex24) ex(*_num24_p);
+               new((void*)&_ex25) ex(*_num25_p);
+               new((void*)&_ex30) ex(*_num30_p);
+               new((void*)&_ex48) ex(*_num48_p);
+               new((void*)&_ex60) ex(*_num60_p);
+               new((void*)&_ex120) ex(*_num120_p);
+
+               // Initialize print context class info (this is not strictly necessary
+               // but we do it anyway to make print_context_class_info::dump_hierarchy()
+               // output the whole hierarchy whether or not the classes are actually
+               // used)
+               print_context::get_class_info_static();
+               print_dflt::get_class_info_static();
+               print_latex::get_class_info_static();
+               print_python::get_class_info_static();
+               print_python_repr::get_class_info_static();
+               print_tree::get_class_info_static();
+               print_csrc::get_class_info_static();
+               print_csrc_float::get_class_info_static();
+               print_csrc_double::get_class_info_static();
+               print_csrc_cl_N::get_class_info_static();
        }
 }
 
@@ -373,21 +388,72 @@ library_init::library_init()
 library_init::~library_init()
 {
        if (--count==0) {
-               // In theory, we would have to clean up here.  But since we were
-               // only initializing memory in the ctor and that memory is reclaimed
-               // anyways by the OS when the program exits, we skip this.
+               // It's really necessary to clean up, since the program
+               // lifetime might not be the same as libginac.{so,dll} one
+               // (e.g. consider // dlopen/dlsym/dlclose sequence).
+               delete _num120_p;
+               delete _num_120_p;
+               delete _num60_p;
+               delete _num_60_p;
+               delete _num48_p;
+               delete _num_48_p;
+               delete _num30_p;
+               delete _num_30_p;
+               delete _num25_p;
+               delete _num_25_p;
+               delete _num24_p;
+               delete _num_24_p;
+               delete _num20_p;
+               delete _num_20_p;
+               delete _num18_p;
+               delete _num_18_p;
+               delete _num15_p;
+               delete _num_15_p;
+               delete _num12_p;
+               delete _num_12_p;
+               delete _num11_p;
+               delete _num_11_p;
+               delete _num10_p;
+               delete _num_10_p;
+               delete _num9_p;
+               delete _num_9_p;
+               delete _num8_p;
+               delete _num_8_p;
+               delete _num7_p;
+               delete _num_7_p;
+               delete _num6_p;
+               delete _num_6_p;
+               delete _num5_p;
+               delete _num_5_p;
+               delete _num4_p;
+               delete _num_4_p;
+               delete _num3_p;
+               delete _num_3_p;
+               delete _num2_p;
+               delete _num_2_p;
+               delete _num1_p;
+               delete _num_1_p;
+               delete _num1_2_p;
+               delete _num_1_2_p;
+               delete _num1_3_p;
+               delete _num_1_3_p;
+               delete _num1_4_p;
+               delete _num_1_4_p;
+               delete _num0_p;
        }
 }
 
+void library_init::init_unarchivers() { }
+
 // comment skeleton for header files
 
 
 // member functions
 
-       // default ctor, dtor, copy ctor, assignment operator and helpers
+       // default constructor, destructor, copy constructor and assignment operator
        // none
 
-       // other ctors
+       // other constructors
        // none
 
        // functions overriding virtual functions from base classes
@@ -408,14 +474,14 @@ library_init::~library_init()
 
 
 //////////
-// default ctor, dtor, copy ctor, assignment operator and helpers
+// default constructor, destructor, copy constructor and assignment operator
 //////////
 
 // public
 // protected
 
 //////////
-// other ctors
+// other constructors
 //////////
 
 // public