package com.frinika.util.math;
/** Supplies static methods for factoring integers needed by various FFT classes.
*
* @author Bruce R. Miller bruce.miller@nist.gov
* @author Contribution of the National Institute of Standards and Technology,
* @author not subject to copyright.
* @author Derived from GSL (Gnu Scientific Library)
* @author GSL's FFT Code by Brian Gough bjg@vvv.lanl.gov
* @author Since GSL is released under
* @author <H HREF="http://www.gnu.org/copyleft/gpl.html">GPL</A>,
* @author 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 final static int[] factor(final int n, final 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 */
if (fromfactors != null) {
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.*/
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;
}
}