diff --git a/src/factor.c b/src/factor.c index 97af6caae..e0374363f 100644 --- a/src/factor.c +++ b/src/factor.c @@ -227,12 +227,14 @@ const unsigned char factor_clz_tab[129] = enum { + EXP_FORM_OPTION, DEV_DEBUG_OPTION = CHAR_MAX + 1 }; static struct option const long_options[] = { {"-debug", no_argument, NULL, DEV_DEBUG_OPTION}, + {"-exp", no_argument, NULL, EXP_FORM_OPTION}, {GETOPT_HELP_OPTION_DECL}, {GETOPT_VERSION_OPTION_DECL}, {NULL, 0, NULL, 0} @@ -706,6 +708,10 @@ verify (W <= WIDE_UINT_BITS); This flag is used only in the GMP code. */ static bool dev_debug = false; +/* display prime factors in exponential form */ + +static bool exp_form = true; + /* Prove primality or run probabilistic tests. */ static bool flag_prove_primality = PROVE_PRIMALITY; @@ -2475,11 +2481,23 @@ print_factors_single (uintmax_t t1, uintmax_t t0) factor (t1, t0, &factors); for (unsigned int j = 0; j < factors.nfactors; j++) - for (unsigned int k = 0; k < factors.e[j]; k++) + { + if (exp_form && factors.e[j] > 1) { lbuf_putc (' '); print_uintmaxes (0, factors.p[j]); + lbuf_putc ('^'); + lbuf_putint (factors.e[j], 0); + } + else + { + for (unsigned int k = 0; k < factors.e[j]; k++) + { + lbuf_putc (' '); + print_uintmaxes (0, factors.p[j]); + } } + } if (factors.plarge[1]) { @@ -2526,6 +2544,8 @@ print_factors (const char *input) return false; } + puts("kaka!"); + #if HAVE_GMP devmsg ("[using arbitrary-precision arithmetic] "); mpz_t t; @@ -2537,8 +2557,18 @@ print_factors (const char *input) mp_factor (t, &factors); for (unsigned int j = 0; j < factors.nfactors; j++) - for (unsigned int k = 0; k < factors.e[j]; k++) - gmp_printf (" %Zd", factors.p[j]); + { + if (exp_form && factors.e[j] > 1) + { + gmp_printf (" %Zd", factors.p[j]); + printf("^%lud", factors.e[j]); + } + else + { + for (unsigned int k = 0; k < factors.e[j]; k++) + gmp_printf (" %Zd", factors.p[j]); + } + } mp_factor_clear (&factors); mpz_clear (t); @@ -2618,6 +2648,10 @@ main (int argc, char **argv) dev_debug = true; break; + case EXP_FORM_OPTION: + exp_form = true; + break; + case_GETOPT_HELP_CHAR; case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);