5 #include <mLib/alloc.h>
6 #include <mLib/darray.h>
9 #include <mLib/report.h>
17 static int primitivep(fact_v *f, mp *p)
24 if (!gf_irreduciblep(p))
29 gfreduce_create(&r, p);
30 for (i = 0; i < DA_LEN(f); i++) {
31 x = gfreduce_exp(&r, x, MP_TWO, DA(f)[i].r);
33 MP_PRINT(" r", DA(f)[i].r);
36 if (MP_EQ(x, MP_ONE)) {
46 static int dofip(fact_v *f, unsigned m, mp **p, unsigned n, unsigned x)
50 for (i = n + 1; i < x; i++) {
51 *p = mp_setbit(*p, *p, i);
52 if (n ? dofip(f, m, p, n - 1, i) : primitivep(f, *p))
54 *p = mp_clearbit(*p, *p, i);
59 static mp *fip(fact_v *f, unsigned m)
64 p = mp_setbit(p, p, m);
66 while (!dofip(f, m, &p, n, m))
71 static void findprim(unsigned m)
74 mp *q = mp_lsl(MP_NEW, MP_ONE, m);
78 q = mp_sub(q, q, MP_ONE);
84 for (i = 0; i < DA_LEN(&f); i++) {
85 mp_writefile(DA(&f)[i].p, stdout, 10);
86 printf("^%u = ", DA(&f)[i].e);
87 mp_writefile(DA(&f)[i].n, stdout, 10);
89 mp_writefile(DA(&f)[i].r, stdout, 10);
97 for (i = m + 1; i--; ) {
107 int main(int argc, char *argv[])
111 fprintf(stderr, "Usage: %s M\n", QUIS);
114 findprim(atoi(argv[1]));