package com.isti.traceview.jnt.FFT; /** * Supplies static methods for factoring integers needed by various FFT classes. * * @author Bruce R. Miller bruce.miller@nist.gov * Contribution of the National Institute of Standards and Technology, * not subject to copyright. * Derived from GSL (Gnu Scientific Library) * GSL's FFT Code by Brian Gough bjg@vvv.lanl.gov * Since GSL is released under * <a href="http://www.gnu.org/copyleft/gpl.html">GPL</a>, * this package must also be. */ public class Factorize { /** * Return the prime factors of n. The method first extracts any factors in * fromfactors, in order (which needn't actually be prime). Remaining * factors in increasing order follow. */ public static int[] factor(int n, int fromfactors[]) { int factors[] = new int[64]; // Cant be more than 64 factors. int nf = 0; int ntest = n; int factor; if (n <= 0) // Error case throw new Error("Number (" + n + ") must be positive integer"); /* deal with the preferred factors first */ for (int i = 0; i < fromfactors.length && ntest != 1; i++) { factor = fromfactors[i]; while ((ntest % factor) == 0) { ntest /= factor; factors[nf++] = factor; } } /* deal with any other even prime factors (there is only one) */ factor = 2; while ((ntest % factor) == 0 && (ntest != 1)) { ntest /= factor; factors[nf++] = factor; } /* deal with any other odd prime factors */ factor = 3; while (ntest != 1) { while ((ntest % factor) != 0) { factor += 2; } ntest /= factor; factors[nf++] = factor; } /* check that the factorization is correct */ int product = 1; for (int i = 0; i < nf; i++) { product *= factors[i]; } if (product != n) throw new Error("factorization failed for " + n); /* Now, make an array of the right length containing the factors... */ int f[] = new int[nf]; System.arraycopy(factors, 0, f, 0, nf); return f; } /** * Return the integer log, base 2, of n, or -1 if n is not an integral power * of 2. */ public static int log2(int n) { int log = 0; for (int k = 1; k < n; k *= 2, log++) ; if (n != (1 << log)) return -1; /* n is not a power of 2 */ return log; } }