When factoring numbers that have a large 2^n factor, it can be hard to eyeball just how many 2's there are. Add an option to print each prime power factor in the x^y format (omitting the exponent when it is 1).
* src/factor.c: Add --exponents option for printing in x^y format. Signed-off-by: Rasmus Villemoes <rasmus.villem...@prevas.dk> --- src/factor.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/factor.c b/src/factor.c index 66ce28b84..9095b6973 100644 --- a/src/factor.c +++ b/src/factor.c @@ -226,12 +226,16 @@ enum static struct option const long_options[] = { + {"exponents", no_argument, NULL, 'e'}, {"-debug", no_argument, NULL, DEV_DEBUG_OPTION}, {GETOPT_HELP_OPTION_DECL}, {GETOPT_VERSION_OPTION_DECL}, {NULL, 0, NULL, 0} }; +/* If true, use x^y output format. */ +static bool print_exponents; + struct factors { uintmax_t plarge[2]; /* Can have a single large factor */ @@ -2457,6 +2461,12 @@ print_factors_single (uintmax_t t1, uintmax_t t0) { lbuf_putc (' '); print_uintmaxes (0, factors.p[j]); + if (print_exponents && factors.e[j] > 1) + { + lbuf_putc ('^'); + lbuf_putint (factors.e[j], 0); + break; + } } if (factors.plarge[1]) @@ -2525,6 +2535,11 @@ print_factors (char const *input) { putchar (' '); mpz_out_str (stdout, 10, factors.p[j]); + if (print_exponents && factors.e[j] > 1) + { + printf ("^%lu", factors.e[j]); + break; + } } mp_factor_clear (&factors); @@ -2551,6 +2566,10 @@ Print the prime factors of each specified integer NUMBER. If none\n\ are specified on the command line, read them from standard input.\n\ \n\ "), stdout); + fputs ("\ + -e, --exponents print factors in the form x^y instead of repeating\n\ + the prime x y times.\n\ +", stdout); fputs (HELP_OPTION_DESCRIPTION, stdout); fputs (VERSION_OPTION_DESCRIPTION, stdout); emit_ancillary_info (PROGRAM_NAME); @@ -2593,10 +2612,14 @@ main (int argc, char **argv) atexit (lbuf_flush); int c; - while ((c = getopt_long (argc, argv, "", long_options, NULL)) != -1) + while ((c = getopt_long (argc, argv, "e", long_options, NULL)) != -1) { switch (c) { + case 'e': + print_exponents = true; + break; + case DEV_DEBUG_OPTION: dev_debug = true; break; -- 2.31.1