summaryrefslogtreecommitdiffstats
path: root/moon-abe/pbc-0.5.14/gen/hilbertpoly.c
diff options
context:
space:
mode:
Diffstat (limited to 'moon-abe/pbc-0.5.14/gen/hilbertpoly.c')
-rw-r--r--moon-abe/pbc-0.5.14/gen/hilbertpoly.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/moon-abe/pbc-0.5.14/gen/hilbertpoly.c b/moon-abe/pbc-0.5.14/gen/hilbertpoly.c
new file mode 100644
index 00000000..2e73af4e
--- /dev/null
+++ b/moon-abe/pbc-0.5.14/gen/hilbertpoly.c
@@ -0,0 +1,57 @@
+// Prints Hilbert polynomials H_D(X)
+//
+// Usage: hilbertpoly [LOWER [UPPER]]
+//
+// LOWER:
+// Lower limit of D. Defaults to 3.
+// UPPER:
+// Upper limit of D. Defaults to LOWER.
+//
+// e.g. $ hilbertpoly 3 1000000
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdint.h> // for intptr_t
+#include <stdlib.h> //for atoi, exit
+#include <gmp.h>
+#include "pbc_utils.h"
+#include "pbc_hilbert.h"
+
+static void xpow(int degree) {
+ if (degree == 1) {
+ printf("X");
+ } else if (degree) {
+ printf("X^%d", degree);
+ }
+}
+
+int main(int argc, char **argv) {
+ int D = argc > 1 ? atoi(argv[1]) : 3;
+ if (D <= 0) pbc_die("D must be positive.");
+
+ int Dlimit = argc > 2 ? atoi(argv[2]) : D;
+
+ for(; D <= Dlimit; D++) {
+ mpz_t *coefflist;
+ int m = D % 4;
+ if (m == 1 || m == 2) continue;
+ printf("D = %d\n", D);
+
+ int n = pbc_hilbert(&coefflist, D);
+
+ printf(" ");
+ xpow(n - 1);
+ printf("\n");
+ int i;
+ for (i = n - 2; i >= 0; i--) {
+ if (mpz_sgn(coefflist[i]) >= 0) {
+ printf("+");
+ }
+ mpz_out_str(stdout, 0, coefflist[i]);
+ xpow(i);
+ printf("\n");
+ }
+ pbc_hilbert_free(coefflist, n);
+ }
+
+ return 0;
+}