+ unsigned k;
+ for (k = 0; n > 1; n >>= 1) ++k;
+ return k;
+}
+#endif
+
+/** Compare two pointers (just to establish some sort of canonical order).
+ * @return -1, 0, or 1 */
+int compare_pointers(const void * a, const void * b)
+{
+ if (a<b) {
+ return -1;
+ } else if (a>b) {
+ return 1;
+ }
+ return 0;
+}
+
+//////////
+// `construct on first use' chest of numbers
+//////////
+
+// numeric -120
+const numeric & _num_120(void)
+{
+ const static ex e = ex(numeric(-120));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_120(void)
+{
+ static ex * e = new ex(_num_120());
+ return *e;
+}
+
+// numeric -60
+const numeric & _num_60(void)
+{
+ const static ex e = ex(numeric(-60));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_60(void)
+{
+ static ex * e = new ex(_num_60());
+ return *e;
+}
+
+// numeric -48
+const numeric & _num_48(void)
+{
+ const static ex e = ex(numeric(-48));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_48(void)
+{
+ static ex * e = new ex(_num_48());
+ return *e;
+}
+
+// numeric -30
+const numeric & _num_30(void)
+{
+ const static ex e = ex(numeric(-30));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_30(void)
+{
+ static ex * e = new ex(_num_30());
+ return *e;
+}
+
+// numeric -25
+const numeric & _num_25(void)
+{
+ const static ex e = ex(numeric(-25));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_25(void)
+{
+ static ex * e = new ex(_num_25());
+ return *e;
+}
+
+// numeric -24
+const numeric & _num_24(void)
+{
+ const static ex e = ex(numeric(-24));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_24(void)
+{
+ static ex * e = new ex(_num_24());
+ return *e;
+}
+
+// numeric -20
+const numeric & _num_20(void)
+{
+ const static ex e = ex(numeric(-20));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_20(void)
+{
+ static ex * e = new ex(_num_20());
+ return *e;
+}
+
+// numeric -18
+const numeric & _num_18(void)
+{
+ const static ex e = ex(numeric(-18));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_18(void)
+{
+ static ex * e = new ex(_num_18());
+ return *e;
+}
+
+// numeric -15
+const numeric & _num_15(void)
+{
+ const static ex e = ex(numeric(-15));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_15(void)
+{
+ static ex * e = new ex(_num_15());
+ return *e;
+}
+
+// numeric -12
+const numeric & _num_12(void)
+{
+ const static ex e = ex(numeric(-12));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_12(void)
+{
+ static ex * e = new ex(_num_12());
+ return *e;
+}
+
+// numeric -11
+const numeric & _num_11(void)
+{
+ const static ex e = ex(numeric(-11));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_11(void)
+{
+ static ex * e = new ex(_num_11());
+ return *e;
+}
+
+// numeric -10
+const numeric & _num_10(void)
+{
+ const static ex e = ex(numeric(-10));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_10(void)
+{
+ static ex * e = new ex(_num_10());
+ return *e;
+}
+
+// numeric -9
+const numeric & _num_9(void)
+{
+ const static ex e = ex(numeric(-9));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_9(void)
+{
+ static ex * e = new ex(_num_9());
+ return *e;
+}
+
+// numeric -8
+const numeric & _num_8(void)
+{
+ const static ex e = ex(numeric(-8));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_8(void)
+{
+ static ex * e = new ex(_num_8());
+ return *e;
+}
+
+// numeric -7
+const numeric & _num_7(void)
+{
+ const static ex e = ex(numeric(-7));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_7(void)
+{
+ static ex * e = new ex(_num_7());
+ return *e;
+}
+
+// numeric -6
+const numeric & _num_6(void)
+{
+ const static ex e = ex(numeric(-6));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_6(void)
+{
+ static ex * e = new ex(_num_6());
+ return *e;
+}
+
+// numeric -5
+const numeric & _num_5(void)
+{
+ const static ex e = ex(numeric(-5));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_5(void)
+{
+ static ex * e = new ex(_num_5());
+ return *e;
+}
+
+// numeric -4
+const numeric & _num_4(void)
+{
+ const static ex e = ex(numeric(-4));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_4(void)
+{
+ static ex * e = new ex(_num_4());
+ return *e;
+}
+
+// numeric -3
+const numeric & _num_3(void)
+{
+ const static ex e = ex(numeric(-3));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_3(void)
+{
+ static ex * e = new ex(_num_3());
+ return *e;
+}
+
+// numeric -2
+const numeric & _num_2(void)
+{
+ const static ex e = ex(numeric(-2));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_2(void)
+{
+ static ex * e = new ex(_num_2());
+ return *e;
+}
+
+// numeric -1
+const numeric & _num_1(void)
+{
+ const static ex e = ex(numeric(-1));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_1(void)
+{
+ static ex * e = new ex(_num_1());
+ return *e;
+}
+
+// numeric -1/2
+const numeric & _num_1_2(void)
+{
+ const static ex e = ex(numeric(-1,2));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_1_2(void)
+{
+ static ex * e = new ex(_num_1_2());
+ return *e;
+}
+
+// numeric -1/3
+const numeric & _num_1_3(void)
+{
+ const static ex e = ex(numeric(-1,3));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_1_3(void)
+{
+ static ex * e = new ex(_num_1_3());
+ return *e;
+}
+
+// numeric -1/4
+const numeric & _num_1_4(void)
+{
+ const static ex e = ex(numeric(-1,4));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex_1_4(void)
+{
+ static ex * e = new ex(_num_1_4());
+ return *e;
+}
+
+// numeric 0
+const numeric & _num0(void)
+{
+ const static ex e = ex(numeric(0));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex0(void)
+{
+ static ex * e = new ex(_num0());
+ return *e;
+}
+
+// numeric 1/4
+const numeric & _num1_4(void)
+{
+ const static ex e = ex(numeric(1,4));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex1_4(void)
+{
+ static ex * e = new ex(_num1_4());
+ return *e;
+}
+
+// numeric 1/3
+const numeric & _num1_3(void)
+{
+ const static ex e = ex(numeric(1,3));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex1_3(void)
+{
+ static ex * e = new ex(_num1_3());
+ return *e;
+}
+
+// numeric 1/2
+const numeric & _num1_2(void)
+{
+ const static ex e = ex(numeric(1,2));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex1_2(void)
+{
+ static ex * e = new ex(_num1_2());
+ return *e;
+}
+
+// numeric 1
+const numeric & _num1(void)
+{
+ const static ex e = ex(numeric(1));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex1(void)
+{
+ static ex * e = new ex(_num1());
+ return *e;
+}
+
+// numeric 2
+const numeric & _num2(void)
+{
+ const static ex e = ex(numeric(2));
+ const static numeric * n = static_cast<const numeric *>(e.bp);
+ return *n;
+}
+
+const ex & _ex2(void)
+{
+ static ex * e = new ex(_num2());
+ return *e;