merge of complex-constructor branch
diff --git a/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/Complex.java b/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/Complex.java
index cfc9625..c36bea1 100644
--- a/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/Complex.java
+++ b/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/Complex.java
@@ -63,26 +63,30 @@
/** The real part. */
private final double real;
- /**
- * Create a complex number given only the real part.
- *
- * @param real Real part.
- */
- public Complex(double real) {
- this(real, 0);
- }
-
- /**
- * Create a complex number given the real and imaginary parts.
- *
- * @param real Real part.
- * @param imaginary Imaginary part.
- */
- public Complex(double real, double imaginary) {
+ private Complex(double real, double imaginary) {
this.real = real;
this.imaginary = imaginary;
}
+ /**
+ * Create a complex number given the real and imaginary parts.
+ *
+ * @param real Real part.
+ * @param imaginary Imaginary part.
+ */
+ public static Complex ofCartesian(double real, double imaginary) {
+ return new Complex(real, imaginary);
+ }
+
+ /**
+ * Create a complex number given the real part.
+ *
+ * @param real Real part.
+ */
+ public static Complex ofCartesian(double real) {
+ return new Complex(real, 0);
+ }
+
/**
* Creates a Complex from its polar representation.
*
@@ -103,7 +107,7 @@
* @param theta the argument of the complex number to create
* @return {@code Complex}
*/
- public Complex polar(double r, double theta) {
+ public static Complex ofPolar(double r, double theta) {
checkNotNegative(r);
return new Complex(r * Math.cos(theta), r * Math.sin(theta));
}
@@ -115,7 +119,7 @@
* @param x {@code double} to build the cis number
* @return {@code Complex}
*/
- public Complex cis(double x) {
+ public static Complex ofCis(double x) {
return new Complex(Math.cos(x), Math.sin(x));
}
@@ -163,7 +167,7 @@
public Complex proj() {
if (Double.isInfinite(real) ||
Double.isInfinite(imaginary)) {
- return new Complex(Double.POSITIVE_INFINITY);
+ return new Complex(Double.POSITIVE_INFINITY, 0);
} else {
return this;
}
@@ -1233,7 +1237,7 @@
// inner part
final double realPart = nthRootOfAbs * Math.cos(innerPart);
final double imaginaryPart = nthRootOfAbs * Math.sin(innerPart);
- result.add(createComplex(realPart, imaginaryPart));
+ result.add(new Complex(realPart, imaginaryPart));
innerPart += slice;
}
@@ -1241,41 +1245,6 @@
}
/**
- * Create a complex number given the real and imaginary parts.
- *
- * @param realPart Real part.
- * @param imaginaryPart Imaginary part.
- * @return a new complex number instance.
- * @see #valueOf(double, double)
- */
- protected Complex createComplex(double realPart,
- double imaginaryPart) {
- return new Complex(realPart, imaginaryPart);
- }
-
- /**
- * Create a complex number given the real and imaginary parts.
- *
- * @param realPart Real part.
- * @param imaginaryPart Imaginary part.
- * @return a Complex instance.
- */
- public static Complex valueOf(double realPart,
- double imaginaryPart) {
- return new Complex(realPart, imaginaryPart);
- }
-
- /**
- * Create a complex number given only the real part.
- *
- * @param realPart Real part.
- * @return a Complex instance.
- */
- public static Complex valueOf(double realPart) {
- return new Complex(realPart);
- }
-
- /**
* Resolve the transient fields in a deserialized Complex Object.
* Subclasses will need to override {@link #createComplex} to
* deserialize properly.
diff --git a/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/ComplexUtils.java b/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/ComplexUtils.java
index b9f758a..684d406 100644
--- a/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/ComplexUtils.java
+++ b/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/ComplexUtils.java
@@ -55,7 +55,7 @@
if (r < 0) {
throw new NegativeModulusException(r);
}
- return new Complex(r * Math.cos(theta), r * Math.sin(theta));
+ return Complex.ofCartesian(r * Math.cos(theta), r * Math.sin(theta));
}
/**
@@ -74,7 +74,7 @@
if (r[x] < 0) {
throw new NegativeModulusException(r[x]);
}
- c[x] = new Complex(r[x] * Math.cos(theta[x]), r[x] * Math.sin(theta[x]));
+ c[x] = Complex.ofCartesian(r[x] * Math.cos(theta[x]), r[x] * Math.sin(theta[x]));
}
return c;
}
@@ -126,7 +126,7 @@
* @since 1.0
*/
public static Complex extractComplexFromRealArray(double[] real, int index) {
- return new Complex(real[index]);
+ return Complex.ofCartesian(real[index]);
}
/**
@@ -140,7 +140,7 @@
* @since 1.0
*/
public static Complex extractComplexFromRealArray(float[] real, int index) {
- return new Complex(real[index]);
+ return Complex.ofCartesian(real[index]);
}
/**
@@ -154,7 +154,7 @@
* @since 1.0
*/
public static Complex extractComplexFromImaginaryArray(double[] imaginary, int index) {
- return new Complex(0, imaginary[index]);
+ return Complex.ofCartesian(0, imaginary[index]);
}
/**
@@ -168,7 +168,7 @@
* @since 1.0
*/
public static Complex extractComplexFromImaginaryArray(float[] imaginary, int index) {
- return new Complex(0, imaginary[index]);
+ return Complex.ofCartesian(0, imaginary[index]);
}
/**
@@ -232,13 +232,13 @@
* {@code index}.
*
* @param d array of interleaved complex numbers alternating real and imaginary values
- * @param index location in the array This is the location by complex number, e.g. index number 5 in the array will return {@code new Complex(d[10], d[11])}
+ * @param index location in the array This is the location by complex number, e.g. index number 5 in the array will return {@code Complex.ofCartesian(d[10], d[11])}
* @return {@code Complex}.
*
* @since 1.0
*/
public static Complex extractComplexFromInterleavedArray(double[] d, int index) {
- return new Complex(d[index * 2], d[index * 2 + 1]);
+ return Complex.ofCartesian(d[index * 2], d[index * 2 + 1]);
}
/**
@@ -252,7 +252,7 @@
* @since 1.0
*/
public static Complex extractComplexFromInterleavedArray(float[] f, int index) {
- return new Complex(f[index * 2], f[index * 2 + 1]);
+ return Complex.ofCartesian(f[index * 2], f[index * 2 + 1]);
}
/**
@@ -295,7 +295,7 @@
int index = 0;
final Complex c[] = new Complex[real.length];
for (double d : real) {
- c[index] = new Complex(d);
+ c[index] = Complex.ofCartesian(d);
index++;
}
return c;
@@ -313,7 +313,7 @@
int index = 0;
final Complex c[] = new Complex[real.length];
for (float d : real) {
- c[index] = new Complex(d);
+ c[index] = Complex.ofCartesian(d);
index++;
}
return c;
@@ -564,7 +564,7 @@
int index = 0;
final Complex c[] = new Complex[imaginary.length];
for (double d : imaginary) {
- c[index] = new Complex(0, d);
+ c[index] = Complex.ofCartesian(0, d);
index++;
}
return c;
@@ -582,7 +582,7 @@
int index = 0;
final Complex c[] = new Complex[imaginary.length];
for (float d : imaginary) {
- c[index] = new Complex(0, d);
+ c[index] = Complex.ofCartesian(0, d);
index++;
}
return c;
@@ -799,7 +799,7 @@
final int length = interleaved.length / 2;
final Complex c[] = new Complex[length];
for (int n = 0; n < length; n++) {
- c[n] = new Complex(interleaved[n * 2], interleaved[n * 2 + 1]);
+ c[n] = Complex.ofCartesian(interleaved[n * 2], interleaved[n * 2 + 1]);
}
return c;
}
@@ -817,7 +817,7 @@
final int length = interleaved.length / 2;
final Complex c[] = new Complex[length];
for (int n = 0; n < length; n++) {
- c[n] = new Complex(interleaved[n * 2], interleaved[n * 2 + 1]);
+ c[n] = Complex.ofCartesian(interleaved[n * 2], interleaved[n * 2 + 1]);
}
return c;
}
@@ -1220,14 +1220,14 @@
c = new Complex[w / 2][h];
for (int x = 0; x < w / 2; x++) {
for (int y = 0; y < h; y++) {
- c[x][y] = new Complex(i[x * 2][y], i[x * 2 + 1][y]);
+ c[x][y] = Complex.ofCartesian(i[x * 2][y], i[x * 2 + 1][y]);
}
}
} else {
c = new Complex[w][h / 2];
for (int x = 0; x < w; x++) {
for (int y = 0; y < h / 2; y++) {
- c[x][y] = new Complex(i[x][y * 2], i[x][y * 2 + 1]);
+ c[x][y] = Complex.ofCartesian(i[x][y * 2], i[x][y * 2 + 1]);
}
}
}
@@ -1271,7 +1271,7 @@
for (int x = 0; x < w / 2; x++) {
for (int y = 0; y < h; y++) {
for (int z = 0; z < d; z++) {
- c[x][y][z] = new Complex(i[x * 2][y][z], i[x * 2 + 1][y][z]);
+ c[x][y][z] = Complex.ofCartesian(i[x * 2][y][z], i[x * 2 + 1][y][z]);
}
}
}
@@ -1280,7 +1280,7 @@
for (int x = 0; x < w; x++) {
for (int y = 0; y < h / 2; y++) {
for (int z = 0; z < d; z++) {
- c[x][y][z] = new Complex(i[x][y * 2][z], i[x][y * 2 + 1][z]);
+ c[x][y][z] = Complex.ofCartesian(i[x][y * 2][z], i[x][y * 2 + 1][z]);
}
}
}
@@ -1289,7 +1289,7 @@
for (int x = 0; x < w; x++) {
for (int y = 0; y < h; y++) {
for (int z = 0; z < d / 2; z++) {
- c[x][y][z] = new Complex(i[x][y][z * 2], i[x][y][z * 2 + 1]);
+ c[x][y][z] = Complex.ofCartesian(i[x][y][z * 2], i[x][y][z * 2 + 1]);
}
}
}
@@ -1322,7 +1322,7 @@
for (int y = 0; y < h; y++) {
for (int z = 0; z < d; z++) {
for (int t = 0; t < v; t++) {
- c[x][y][z][t] = new Complex(i[x * 2][y][z][t], i[x * 2 + 1][y][z][t]);
+ c[x][y][z][t] = Complex.ofCartesian(i[x * 2][y][z][t], i[x * 2 + 1][y][z][t]);
}
}
}
@@ -1333,7 +1333,7 @@
for (int y = 0; y < h / 2; y++) {
for (int z = 0; z < d; z++) {
for (int t = 0; t < v; t++) {
- c[x][y][z][t] = new Complex(i[x][y * 2][z][t], i[x][y * 2 + 1][z][t]);
+ c[x][y][z][t] = Complex.ofCartesian(i[x][y * 2][z][t], i[x][y * 2 + 1][z][t]);
}
}
}
@@ -1344,7 +1344,7 @@
for (int y = 0; y < h; y++) {
for (int z = 0; z < d / 2; z++) {
for (int t = 0; t < v; t++) {
- c[x][y][z][t] = new Complex(i[x][y][z * 2][t], i[x][y][z * 2 + 1][t]);
+ c[x][y][z][t] = Complex.ofCartesian(i[x][y][z * 2][t], i[x][y][z * 2 + 1][t]);
}
}
}
@@ -1355,7 +1355,7 @@
for (int y = 0; y < h; y++) {
for (int z = 0; z < d; z++) {
for (int t = 0; t < v / 2; t++) {
- c[x][y][z][t] = new Complex(i[x][y][z][t * 2], i[x][y][z][t * 2 + 1]);
+ c[x][y][z][t] = Complex.ofCartesian(i[x][y][z][t * 2], i[x][y][z][t * 2 + 1]);
}
}
}
@@ -1399,14 +1399,14 @@
c = new Complex[w / 2][h];
for (int x = 0; x < w / 2; x++) {
for (int y = 0; y < h; y++) {
- c[x][y] = new Complex(i[x * 2][y], i[x * 2 + 1][y]);
+ c[x][y] = Complex.ofCartesian(i[x * 2][y], i[x * 2 + 1][y]);
}
}
} else {
c = new Complex[w][h / 2];
for (int x = 0; x < w; x++) {
for (int y = 0; y < h / 2; y++) {
- c[x][y] = new Complex(i[x][y * 2], i[x][y * 2 + 1]);
+ c[x][y] = Complex.ofCartesian(i[x][y * 2], i[x][y * 2 + 1]);
}
}
}
@@ -1450,7 +1450,7 @@
for (int x = 0; x < w/2; x ++) {
for (int y = 0; y < h; y++) {
for (int z = 0; z < d; z++) {
- c[x][y][z] = new Complex(i[x * 2][y][z], i[x * 2 + 1][y][z]);
+ c[x][y][z] = Complex.ofCartesian(i[x * 2][y][z], i[x * 2 + 1][y][z]);
}
}
}
@@ -1459,7 +1459,7 @@
for (int x = 0; x < w; x++) {
for (int y = 0; y < h/2; y ++) {
for (int z = 0; z < d; z++) {
- c[x][y][z] = new Complex(i[x][y * 2][z], i[x][y * 2 + 1][z]);
+ c[x][y][z] = Complex.ofCartesian(i[x][y * 2][z], i[x][y * 2 + 1][z]);
}
}
}
@@ -1468,7 +1468,7 @@
for (int x = 0; x < w; x++) {
for (int y = 0; y < h; y++) {
for (int z = 0; z < d/2; z++) {
- c[x][y][z] = new Complex(i[x][y][z * 2], i[x][y][z * 2 + 1]);
+ c[x][y][z] = Complex.ofCartesian(i[x][y][z * 2], i[x][y][z * 2 + 1]);
}
}
}
@@ -1506,7 +1506,7 @@
final int length = real.length;
final Complex[] c = new Complex[length];
for (int n = 0; n < length; n++) {
- c[n] = new Complex(real[n], imag[n]);
+ c[n] = Complex.ofCartesian(real[n], imag[n]);
}
return c;
}
@@ -1582,7 +1582,7 @@
final int length = real.length;
final Complex[] c = new Complex[length];
for (int n = 0; n < length; n++) {
- c[n] = new Complex(real[n], imag[n]);
+ c[n] = Complex.ofCartesian(real[n], imag[n]);
}
return c;
}
diff --git a/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/RootsOfUnity.java b/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/RootsOfUnity.java
index 89bf8d3..c3035ce 100644
--- a/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/RootsOfUnity.java
+++ b/commons-numbers-complex/src/main/java/org/apache/commons/numbers/complex/RootsOfUnity.java
@@ -65,14 +65,14 @@
double previousReal = 1;
double previousImag = 0;
- omega[0] = new Complex(previousReal, previousImag);
+ omega[0] = Complex.ofCartesian(previousReal, previousImag);
for (int i = 1; i < omegaCount; i++) {
final double real = previousReal * cosT - previousImag * sinT;
final double imag = previousReal * sinT + previousImag * cosT;
omega[i] = isCounterClockwise ?
- new Complex(real, imag) :
- new Complex(real, -imag);
+ Complex.ofCartesian(real, imag) :
+ Complex.ofCartesian(real, -imag);
previousReal = real;
previousImag = imag;