diff options
author | RubbaBoy <[email protected]> | 2020-07-06 02:33:28 -0400 |
---|---|---|
committer | Phil Burk <[email protected]> | 2020-10-30 11:19:34 -0700 |
commit | 46888fae6eb7b1dd386f7af7d101ead99ae61981 (patch) | |
tree | 8969bbfd68d2fb5c0d8b86da49ec2eca230a72ab /src/com/softsynth/math | |
parent | c51e92e813dd481603de078f0778e1f75db2ab05 (diff) |
Restructured project, added gradle, JUnit, logger, and more
Added Gradle (and removed ant), modernized testing via the JUnit framework, moved standalone examples from the tests directory to a separate module, removed sparsely used Java logger and replaced it with SLF4J. More work could be done, however this is a great start to greatly improving the health of the codebase.
Diffstat (limited to 'src/com/softsynth/math')
-rw-r--r-- | src/com/softsynth/math/AudioMath.java | 84 | ||||
-rw-r--r-- | src/com/softsynth/math/ChebyshevPolynomial.java | 45 | ||||
-rw-r--r-- | src/com/softsynth/math/FourierMath.java | 254 | ||||
-rw-r--r-- | src/com/softsynth/math/JustRatio.java | 47 | ||||
-rw-r--r-- | src/com/softsynth/math/Polynomial.java | 253 | ||||
-rw-r--r-- | src/com/softsynth/math/PolynomialTableData.java | 64 | ||||
-rw-r--r-- | src/com/softsynth/math/PrimeFactors.java | 244 |
7 files changed, 0 insertions, 991 deletions
diff --git a/src/com/softsynth/math/AudioMath.java b/src/com/softsynth/math/AudioMath.java deleted file mode 100644 index 6d5ab07..0000000 --- a/src/com/softsynth/math/AudioMath.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 1998 Phil Burk, Mobileer Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.softsynth.math; - -/** - * Miscellaneous math functions useful in Audio - * - * @author (C) 1998 Phil Burk - */ -public class AudioMath { - // use scalar to convert natural log to log_base_10 - private final static double a2dScalar = 20.0 / Math.log(10.0); - public static final int CONCERT_A_PITCH = 69; - public static final double CONCERT_A_FREQUENCY = 440.0; - private static double mConcertAFrequency = CONCERT_A_FREQUENCY; - - /** - * Convert amplitude to decibels. 1.0 is zero dB. 0.5 is -6.02 dB. - */ - public static double amplitudeToDecibels(double amplitude) { - double db = Math.log(amplitude) * a2dScalar; - return db; - } - - /** - * Convert decibels to amplitude. Zero dB is 1.0 and -6.02 dB is 0.5. - */ - public static double decibelsToAmplitude(double decibels) { - double amp = Math.pow(10.0, decibels / 20.0); - return amp; - } - - /** - * Calculate MIDI pitch based on frequency in Hertz. Middle C is 60.0. - */ - public static double frequencyToPitch(double frequency) { - return CONCERT_A_PITCH + 12 * Math.log(frequency / mConcertAFrequency) / Math.log(2.0); - } - - /** - * Calculate frequency in Hertz based on MIDI pitch. Middle C is 60.0. You can use fractional - * pitches so 60.5 would give you a pitch half way between C and C#. - */ - public static double pitchToFrequency(double pitch) { - return mConcertAFrequency * Math.pow(2.0, ((pitch - CONCERT_A_PITCH) * (1.0 / 12.0))); - } - - /** - * This can be used to globally adjust the tuning in JSyn from Concert A at 440.0 Hz to - * a slightly different frequency. Some orchestras use a higher frequency, eg. 441.0. - * This value will be used by pitchToFrequency() and frequencyToPitch(). - * - * @param concertAFrequency - */ - public static void setConcertAFrequency(double concertAFrequency) { - mConcertAFrequency = concertAFrequency; - } - - public static double getConcertAFrequency() { - return mConcertAFrequency; - } - - /** Convert a delta value in semitones to a frequency multiplier. - * @param semitones - * @return scaler For example 2.0 for an input of 12.0 semitones. - */ - public static double semitonesToFrequencyScaler(double semitones) { - return Math.pow(2.0, semitones / 12.0); - } -} diff --git a/src/com/softsynth/math/ChebyshevPolynomial.java b/src/com/softsynth/math/ChebyshevPolynomial.java deleted file mode 100644 index bc0e854..0000000 --- a/src/com/softsynth/math/ChebyshevPolynomial.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 1997 Phil Burk, Mobileer Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.softsynth.math; - -/** - * ChebyshevPolynomial<br> - * Used to generate data for waveshaping table oscillators. - * - * @author Nick Didkovsky (C) 1997 Phil Burk and Nick Didkovsky - */ - -public class ChebyshevPolynomial { - static final Polynomial twoX = new Polynomial(2, 0); - static final Polynomial one = new Polynomial(1); - static final Polynomial oneX = new Polynomial(1, 0); - - /** - * Calculates Chebyshev polynomial of specified integer order. Recursively generated using - * relation Tk+1(x) = 2xTk(x) - Tk-1(x) - * - * @return Chebyshev polynomial of specified order - */ - public static Polynomial T(int order) { - if (order == 0) - return one; - else if (order == 1) - return oneX; - else - return Polynomial.minus(Polynomial.mult(T(order - 1), (twoX)), T(order - 2)); - } -} diff --git a/src/com/softsynth/math/FourierMath.java b/src/com/softsynth/math/FourierMath.java deleted file mode 100644 index d133d7f..0000000 --- a/src/com/softsynth/math/FourierMath.java +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright 2009 Phil Burk, Mobileer Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.softsynth.math; - -//Simple Fast Fourier Transform. -public class FourierMath { - static private final int MAX_SIZE_LOG_2 = 16; - static BitReverseTable[] reverseTables = new BitReverseTable[MAX_SIZE_LOG_2]; - static DoubleSineTable[] sineTables = new DoubleSineTable[MAX_SIZE_LOG_2]; - static FloatSineTable[] floatSineTables = new FloatSineTable[MAX_SIZE_LOG_2]; - - private static class DoubleSineTable { - double[] sineValues; - - DoubleSineTable(int numBits) { - int len = 1 << numBits; - sineValues = new double[1 << numBits]; - for (int i = 0; i < len; i++) { - sineValues[i] = Math.sin((i * Math.PI * 2.0) / len); - } - } - } - - private static double[] getDoubleSineTable(int n) { - DoubleSineTable sineTable = sineTables[n]; - if (sineTable == null) { - sineTable = new DoubleSineTable(n); - sineTables[n] = sineTable; - } - return sineTable.sineValues; - } - - private static class FloatSineTable { - float[] sineValues; - - FloatSineTable(int numBits) { - int len = 1 << numBits; - sineValues = new float[1 << numBits]; - for (int i = 0; i < len; i++) { - sineValues[i] = (float) Math.sin((i * Math.PI * 2.0) / len); - } - } - } - - private static float[] getFloatSineTable(int n) { - FloatSineTable sineTable = floatSineTables[n]; - if (sineTable == null) { - sineTable = new FloatSineTable(n); - floatSineTables[n] = sineTable; - } - return sineTable.sineValues; - } - - private static class BitReverseTable { - int[] reversedBits; - - BitReverseTable(int numBits) { - reversedBits = new int[1 << numBits]; - for (int i = 0; i < reversedBits.length; i++) { - reversedBits[i] = reverseBits(i, numBits); - } - } - - static int reverseBits(int index, int numBits) { - int i, rev; - - for (i = rev = 0; i < numBits; i++) { - rev = (rev << 1) | (index & 1); - index >>= 1; - } - - return rev; - } - } - - private static int[] getReverseTable(int n) { - BitReverseTable reverseTable = reverseTables[n]; - if (reverseTable == null) { - reverseTable = new BitReverseTable(n); - reverseTables[n] = reverseTable; - } - return reverseTable.reversedBits; - } - - /** - * Calculate the amplitude of the sine wave associated with each bin of a complex FFT result. - * - * @param ar - * @param ai - * @param magnitudes - */ - public static void calculateMagnitudes(double ar[], double ai[], double[] magnitudes) { - for (int i = 0; i < magnitudes.length; ++i) { - magnitudes[i] = Math.sqrt((ar[i] * ar[i]) + (ai[i] * ai[i])); - } - } - - /** - * Calculate the amplitude of the sine wave associated with each bin of a complex FFT result. - * - * @param ar - * @param ai - * @param magnitudes - */ - public static void calculateMagnitudes(float ar[], float ai[], float[] magnitudes) { - for (int i = 0; i < magnitudes.length; ++i) { - magnitudes[i] = (float) Math.sqrt((ar[i] * ar[i]) + (ai[i] * ai[i])); - } - } - - public static void transform(int sign, int n, double ar[], double ai[]) { - double scale = (sign > 0) ? (2.0 / n) : (0.5); - - int numBits = FourierMath.numBits(n); - int[] reverseTable = getReverseTable(numBits); - double[] sineTable = getDoubleSineTable(numBits); - int mask = n - 1; - int cosineOffset = n / 4; // phase offset between cos and sin - - int i, j; - for (i = 0; i < n; i++) { - j = reverseTable[i]; - if (j >= i) { - double tempr = ar[j] * scale; - double tempi = ai[j] * scale; - ar[j] = ar[i] * scale; - ai[j] = ai[i] * scale; - ar[i] = tempr; - ai[i] = tempi; - } - } - - int mmax, stride; - int numerator = sign * n; - for (mmax = 1, stride = 2 * mmax; mmax < n; mmax = stride, stride = 2 * mmax) { - int phase = 0; - int phaseIncrement = numerator / (2 * mmax); - for (int m = 0; m < mmax; ++m) { - double wr = sineTable[(phase + cosineOffset) & mask]; // cosine - double wi = sineTable[phase]; - - for (i = m; i < n; i += stride) { - j = i + mmax; - double tr = (wr * ar[j]) - (wi * ai[j]); - double ti = (wr * ai[j]) + (wi * ar[j]); - ar[j] = ar[i] - tr; - ai[j] = ai[i] - ti; - ar[i] += tr; - ai[i] += ti; - } - - phase = (phase + phaseIncrement) & mask; - } - mmax = stride; - } - } - - public static void transform(int sign, int n, float ar[], float ai[]) { - float scale = (sign > 0) ? (2.0f / n) : (0.5f); - - int numBits = FourierMath.numBits(n); - int[] reverseTable = getReverseTable(numBits); - float[] sineTable = getFloatSineTable(numBits); - int mask = n - 1; - int cosineOffset = n / 4; // phase offset between cos and sin - - int i, j; - for (i = 0; i < n; i++) { - j = reverseTable[i]; - if (j >= i) { - float tempr = ar[j] * scale; - float tempi = ai[j] * scale; - ar[j] = ar[i] * scale; - ai[j] = ai[i] * scale; - ar[i] = tempr; - ai[i] = tempi; - } - } - - int mmax, stride; - int numerator = sign * n; - for (mmax = 1, stride = 2 * mmax; mmax < n; mmax = stride, stride = 2 * mmax) { - int phase = 0; - int phaseIncrement = numerator / (2 * mmax); - for (int m = 0; m < mmax; ++m) { - float wr = sineTable[(phase + cosineOffset) & mask]; // cosine - float wi = sineTable[phase]; - - for (i = m; i < n; i += stride) { - j = i + mmax; - float tr = (wr * ar[j]) - (wi * ai[j]); - float ti = (wr * ai[j]) + (wi * ar[j]); - ar[j] = ar[i] - tr; - ai[j] = ai[i] - ti; - ar[i] += tr; - ai[i] += ti; - } - - phase = (phase + phaseIncrement) & mask; - } - mmax = stride; - } - } - - /** - * Calculate log2(n) - * - * @param powerOf2 must be a power of two, for example 512 or 1024 - * @return for example, 9 for an input value of 512 - */ - public static int numBits(int powerOf2) { - int i; - assert ((powerOf2 & (powerOf2 - 1)) == 0); // is it a power of 2? - for (i = -1; powerOf2 > 0; powerOf2 = powerOf2 >> 1, i++) - ; - return i; - } - - /** - * Calculate an FFT in place, modifying the input arrays. - * - * @param n - * @param ar - * @param ai - */ - public static void fft(int n, double ar[], double ai[]) { - transform(1, n, ar, ai); // TODO -1 or 1 - } - - /** - * Calculate an inverse FFT in place, modifying the input arrays. - * - * @param n - * @param ar - * @param ai - */ - public static void ifft(int n, double ar[], double ai[]) { - transform(-1, n, ar, ai); // TODO -1 or 1 - } -} diff --git a/src/com/softsynth/math/JustRatio.java b/src/com/softsynth/math/JustRatio.java deleted file mode 100644 index f4070b4..0000000 --- a/src/com/softsynth/math/JustRatio.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2009 Phil Burk, Mobileer Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.softsynth.math; - -public class JustRatio { - public long numerator; - public long denominator; - - public JustRatio(long numerator, long denominator) { - this.numerator = numerator; - this.denominator = denominator; - } - - public JustRatio(int numerator, int denominator) { - this.numerator = numerator; - this.denominator = denominator; - } - - public double getValue() { - return (double) numerator / denominator; - } - - public void invert() { - long temp = denominator; - denominator = numerator; - numerator = temp; - } - - @Override - public String toString() { - return numerator + "/" + denominator; - } -} diff --git a/src/com/softsynth/math/Polynomial.java b/src/com/softsynth/math/Polynomial.java deleted file mode 100644 index 5f29f38..0000000 --- a/src/com/softsynth/math/Polynomial.java +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright 1997 Phil Burk, Mobileer Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.softsynth.math; - -import java.util.Vector; - -/** - * Polynomial<br> - * Implement polynomial using Vector as coefficient holder. Element index is power of X, value at a - * given index is coefficient.<br> - * <br> - * - * @author Nick Didkovsky, (C) 1997 Phil Burk and Nick Didkovsky - */ - -public class Polynomial { - - private final Vector terms; - - class DoubleHolder { - double value; - - public DoubleHolder(double val) { - value = val; - } - - public double get() { - return value; - } - - public void set(double val) { - value = val; - } - } - - /** create a polynomial with no terms */ - public Polynomial() { - terms = new Vector(); - } - - /** create a polynomial with one term of specified constant */ - public Polynomial(double c0) { - this(); - appendTerm(c0); - } - - /** create a polynomial with two terms with specified coefficients */ - public Polynomial(double c1, double c0) { - this(c0); - appendTerm(c1); - } - - /** create a polynomial with specified coefficients */ - public Polynomial(double c2, double c1, double c0) { - this(c1, c0); - appendTerm(c2); - } - - /** create a polynomial with specified coefficients */ - public Polynomial(double c3, double c2, double c1, double c0) { - this(c2, c1, c0); - appendTerm(c3); - } - - /** create a polynomial with specified coefficients */ - public Polynomial(double c4, double c3, double c2, double c1, double c0) { - this(c3, c2, c1, c0); - appendTerm(c4); - } - - /** - * Append a term with specified coefficient. Power will be next available order (ie if the - * polynomial is of order 2, appendTerm will supply the coefficient for x^3 - */ - public void appendTerm(double coefficient) { - terms.addElement(new DoubleHolder(coefficient)); - } - - /** Set the coefficient of given term */ - public void setTerm(double coefficient, int power) { - // If setting a term greater than the current order of the polynomial, pad with zero terms - int size = terms.size(); - if (power >= size) { - for (int i = 0; i < (power - size + 1); i++) { - appendTerm(0); - } - } - ((DoubleHolder) terms.elementAt(power)).set(coefficient); - } - - /** - * Add the coefficient of given term to the specified coefficient. ex. addTerm(3, 1) add 3x to a - * polynomial, addTerm(4, 3) adds 4x^3 - */ - public void addTerm(double coefficient, int power) { - setTerm(coefficient + get(power), power); - } - - /** @return coefficient of nth term (first term=0) */ - public double get(int power) { - if (power >= terms.size()) - return 0.0; - else - return ((DoubleHolder) terms.elementAt(power)).get(); - } - - /** @return number of terms in this polynomial */ - public int size() { - return terms.size(); - } - - /** - * Add two polynomials together - * - * @return new Polynomial that is the sum of p1 and p2 - */ - public static Polynomial plus(Polynomial p1, Polynomial p2) { - Polynomial sum = new Polynomial(); - for (int i = 0; i < Math.max(p1.size(), p2.size()); i++) { - sum.appendTerm(p1.get(i) + p2.get(i)); - } - return sum; - } - - /** - * Subtract polynomial from another. (First arg - Second arg) - * - * @return new Polynomial p1 - p2 - */ - public static Polynomial minus(Polynomial p1, Polynomial p2) { - Polynomial sum = new Polynomial(); - for (int i = 0; i < Math.max(p1.size(), p2.size()); i++) { - sum.appendTerm(p1.get(i) - p2.get(i)); - } - return sum; - } - - /** - * Multiply two Polynomials - * - * @return new Polynomial that is the product p1 * p2 - */ - - public static Polynomial mult(Polynomial p1, Polynomial p2) { - Polynomial product = new Polynomial(); - for (int i = 0; i < p1.size(); i++) { - for (int j = 0; j < p2.size(); j++) { - product.addTerm(p1.get(i) * p2.get(j), i + j); - } - } - return product; - } - - /** - * Multiply a Polynomial by a scaler - * - * @return new Polynomial that is the product p1 * p2 - */ - - public static Polynomial mult(double scaler, Polynomial p1) { - Polynomial product = new Polynomial(); - for (int i = 0; i < p1.size(); i++) { - product.appendTerm(p1.get(i) * scaler); - } - return product; - } - - /** Evaluate this polynomial for x */ - public double evaluate(double x) { - double result = 0.0; - for (int i = 0; i < terms.size(); i++) { - result += get(i) * Math.pow(x, i); - } - return result; - } - - @Override - public String toString() { - String s = ""; - if (size() == 0) - s = "empty polynomial"; - boolean somethingPrinted = false; - for (int i = size() - 1; i >= 0; i--) { - if (get(i) != 0.0) { - if (somethingPrinted) - s += " + "; - String coeff = ""; - // if (get(i) == (int)(get(i))) - // coeff = (int)(get(i)) + ""; - if ((get(i) != 1.0) || (i == 0)) - coeff += get(i); - if (i == 0) - s += coeff; - else { - String power = ""; - if (i != 1) - power = "^" + i; - s += coeff + "x" + power; - } - somethingPrinted = true; - } - } - return s; - } - - public static void main(String args[]) { - Polynomial p1 = new Polynomial(); - System.out.println("p1=" + p1); - Polynomial p2 = new Polynomial(3); - System.out.println("p2=" + p2); - Polynomial p3 = new Polynomial(2, 3); - System.out.println("p3=" + p3); - Polynomial p4 = new Polynomial(1, 2, 3); - System.out.println("p4=" + p4); - System.out.println("p4*5=" + Polynomial.mult(5.0, p4)); - - System.out.println(p4.evaluate(10)); - - System.out.println(Polynomial.plus(p4, p1)); - System.out.println(Polynomial.minus(p4, p3)); - p4.setTerm(12.2, 5); - System.out.println(p4); - p4.addTerm(0.8, 5); - System.out.println(p4); - p4.addTerm(0.8, 7); - System.out.println(p4); - System.out.println(Polynomial.mult(p3, p2)); - System.out.println(Polynomial.mult(p3, p3)); - System.out.println(Polynomial.mult(p2, p2)); - - Polynomial t2 = new Polynomial(2, 0, -1); // 2x^2-1, Chebyshev Polynomial of order 2 - Polynomial t3 = new Polynomial(4, 0, -3, 0); // 4x^3-3x, Chebyshev Polynomial of order 3 - // Calculate Chebyshev Polynomial of order 4 from relation Tk+1(x) = 2xTk(x) - Tk-1(x) - Polynomial t4 = Polynomial.minus(Polynomial.mult(t3, (new Polynomial(2, 0))), t2); - System.out.println(t2 + "\n" + t3 + "\n" + t4); - // com.softsynth.jmsl.util - - } -} diff --git a/src/com/softsynth/math/PolynomialTableData.java b/src/com/softsynth/math/PolynomialTableData.java deleted file mode 100644 index 676c77c..0000000 --- a/src/com/softsynth/math/PolynomialTableData.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 1997 Phil Burk, Mobileer Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.softsynth.math; - -/** - * PolynomialTableData<br> - * Provides an array of double[] containing data generated by a polynomial.<br> - * This is typically used with ChebyshevPolynomial. Input to Polynomial is -1..1, output is -1..1. - * - * @author Nick Didkovsky (C) 1997 Phil Burk and Nick Didkovsky - * @see ChebyshevPolynomial - * @see Polynomial - */ - -public class PolynomialTableData { - - double[] data; - Polynomial polynomial; - - /** - * Constructor which fills double[numFrames] with Polynomial data -1..1<br> - * Note that any Polynomial can plug in here, just make sure output is -1..1 when input ranges - * from -1..1 - */ - public PolynomialTableData(Polynomial polynomial, int numFrames) { - data = new double[numFrames]; - this.polynomial = polynomial; - buildData(); - } - - public double[] getData() { - return data; - } - - void buildData() { - double xInterval = 2.0 / (data.length - 1); // FIXED, added "- 1" - double x; - for (int i = 0; i < data.length; i++) { - x = i * xInterval - 1.0; - data[i] = polynomial.evaluate(x); - // System.out.println("x = " + x + ", p(x) = " + data[i] ); - } - - } - - public static void main(String args[]) { - PolynomialTableData chebData = new PolynomialTableData(ChebyshevPolynomial.T(2), 8); - } - -} diff --git a/src/com/softsynth/math/PrimeFactors.java b/src/com/softsynth/math/PrimeFactors.java deleted file mode 100644 index 06c0d55..0000000 --- a/src/com/softsynth/math/PrimeFactors.java +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright 2011 Phil Burk, Mobileer Inc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.softsynth.math; - -import java.util.ArrayList; - -/** - * Tool for factoring primes and prime ratios. This class contains a static array of primes - * generated using the Sieve of Eratosthenes. - * - * @author Phil Burk (C) 2011 Mobileer Inc - */ -public class PrimeFactors { - private static final int SIEVE_SIZE = 1000; - private static int[] primes; - private final int[] factors; - - static { - // Use Sieve of Eratosthenes to fill Prime table - boolean[] sieve = new boolean[SIEVE_SIZE]; - ArrayList<Integer> primeList = new ArrayList<Integer>(); - int i = 2; - while (i < (SIEVE_SIZE / 2)) { - if (!sieve[i]) { - primeList.add(i); - int multiple = 2 * i; - while (multiple < SIEVE_SIZE) { - sieve[multiple] = true; - multiple += i; - } - } - i += 1; - } - primes = primeListToArray(primeList); - } - - private static int[] primeListToArray(ArrayList<Integer> primeList) { - int[] primes = new int[primeList.size()]; - for (int i = 0; i < primes.length; i++) { - primes[i] = primeList.get(i); - } - return primes; - } - - public PrimeFactors(int[] factors) { - this.factors = factors; - } - - public PrimeFactors(int numerator, int denominator) { - int[] topFactors = factor(numerator); - int[] bottomFactors = factor(denominator); - factors = subtract(topFactors, bottomFactors); - } - - public PrimeFactors subtract(PrimeFactors pf) { - return new PrimeFactors(subtract(factors, pf.factors)); - } - - public PrimeFactors add(PrimeFactors pf) { - return new PrimeFactors(add(factors, pf.factors)); - } - - public static int[] subtract(int[] factorsA, int[] factorsB) { - int max; - int min; - if (factorsA.length > factorsB.length) { - max = factorsA.length; - min = factorsB.length; - } else { - - min = factorsA.length; - max = factorsB.length; - } - ArrayList<Integer> primeList = new ArrayList<Integer>(); - int i; - for (i = 0; i < min; i++) { - primeList.add(factorsA[i] - factorsB[i]); - } - if (factorsA.length > factorsB.length) { - for (; i < max; i++) { - primeList.add(factorsA[i]); - } - } else { - for (; i < max; i++) { - primeList.add(0 - factorsB[i]); - } - } - trimPrimeList(primeList); - return primeListToArray(primeList); - } - - public static int[] add(int[] factorsA, int[] factorsB) { - int max; - int min; - if (factorsA.length > factorsB.length) { - max = factorsA.length; - min = factorsB.length; - } else { - min = factorsA.length; - max = factorsB.length; - } - ArrayList<Integer> primeList = new ArrayList<Integer>(); - int i; - for (i = 0; i < min; i++) { - primeList.add(factorsA[i] + factorsB[i]); - } - if (factorsA.length > factorsB.length) { - for (; i < max; i++) { - primeList.add(factorsA[i]); - } - } else if (factorsB.length > factorsA.length) { - for (; i < max; i++) { - primeList.add(factorsB[i]); - } - } - trimPrimeList(primeList); - return primeListToArray(primeList); - } - - private static void trimPrimeList(ArrayList<Integer> primeList) { - int i; - // trim zero factors off end. - for (i = primeList.size() - 1; i >= 0; i--) { - if (primeList.get(i) == 0) { - primeList.remove(i); - } else { - break; - } - } - } - - public static int[] factor(int n) { - ArrayList<Integer> primeList = new ArrayList<Integer>(); - int i = 0; - int p = primes[i]; - int exponent = 0; - while (n > 1) { - // does the prime number divide evenly into n? - int d = n / p; - int m = d * p; - if (m == n) { - n = d; - exponent += 1; - } else { - primeList.add(exponent); - exponent = 0; - i += 1; - p = primes[i]; - } - } - if (exponent > 0) { - primeList.add(exponent); - } - return primeListToArray(primeList); - } - - /** - * Get prime from table. - * - * - * @param n Warning: Do not exceed getPrimeCount()-1. - * @return Nth prime number, the 0th prime is 2 - */ - public static int getPrime(int n) { - return primes[n]; - } - - /** - * @return the number of primes stored in the table - */ - public static int getPrimeCount() { - return primes.length; - } - - public JustRatio getJustRatio() { - long n = 1; - long d = 1; - for (int i = 0; i < factors.length; i++) { - int exponent = factors[i]; - int p = primes[i]; - if (exponent > 0) { - for (int k = 0; k < exponent; k++) { - n = n * p; - } - } else if (exponent < 0) { - exponent = 0 - exponent; - for (int k = 0; k < exponent; k++) { - d = d * p; - } - } - } - return new JustRatio(n, d); - } - - public int[] getFactors() { - return factors.clone(); - } - - @Override - public String toString() { - StringBuffer buffer = new StringBuffer(); - printFactors(buffer, 1); - buffer.append("/"); - printFactors(buffer, -1); - return buffer.toString(); - } - - private void printFactors(StringBuffer buffer, int sign) { - boolean gotSome = false; - for (int i = 0; i < factors.length; i++) { - int pf = factors[i] * sign; - if (pf > 0) { - if (gotSome) - buffer.append('*'); - int prime = primes[i]; - if (pf == 1) { - buffer.append("" + prime); - } else if (pf == 2) { - buffer.append(prime + "*" + prime); - } else if (pf > 2) { - buffer.append("(" + prime + "^" + pf + ")"); - } - gotSome = true; - } - } - if (!gotSome) { - buffer.append("1"); - } - } -} |