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]));