Skip to content

Commit 43dcbbd

Browse files
authored
Merge pull request #282 from Serrof/issue-280
Fix #280: add square to FiedElement
2 parents 40472e8 + 963d985 commit 43dcbbd

File tree

49 files changed

+227
-84
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+227
-84
lines changed

hipparchus-core/src/changes/changes.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ If the output is not quite correct, check for invisible trailing spaces!
4949
<title>Hipparchus Core Release Notes</title>
5050
</properties>
5151
<body>
52+
<release version="3.1" date="TBD" description="TBD.">
53+
<action dev="serrof" type="add" issue="issues/280">
54+
Add square method to FieldElement.
55+
</action>
56+
</release>
5257
<release version="3.0" date="2023-10-08" description="This is a major release.">
5358
<action dev="serrof" type="fix" issue="issues/275">
5459
UnivariateDerivative now implements Comparable.

hipparchus-core/src/main/java/org/hipparchus/CalculusFieldElement.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,12 @@ T hypot(T y)
137137
*/
138138
T rootN(int n);
139139

140+
/** {@inheritDoc} */
141+
@Override
142+
default T square() {
143+
return pow(2);
144+
}
145+
140146
/** Power operation.
141147
* @param p power to apply
142148
* @return this<sup>p</sup>

hipparchus-core/src/main/java/org/hipparchus/FieldElement.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,12 @@ public interface FieldElement<T extends FieldElement<T>> {
7474
*/
7575
T multiply(T a) throws NullArgumentException;
7676

77+
/** Compute this &times; this.
78+
* @return a new element representing this &times; this
79+
* @since 3.1
80+
*/
81+
T square() throws NullArgumentException;
82+
7783
/** Compute this &divide; a.
7884
* @param a element to divide by
7985
* @return a new element representing this &divide; a

hipparchus-core/src/main/java/org/hipparchus/analysis/differentiation/DSCompiler.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2508,7 +2508,7 @@ public <T extends CalculusFieldElement<T>> void acos(final T[] operand, final in
25082508
// as per polynomial parity, we can store coefficients of both P_(n-1) and P_n in the same array
25092509
final T[] p = MathArrays.buildArray(field, order);
25102510
p[0] = field.getOne().negate();
2511-
final T x2 = x.multiply(x);
2511+
final T x2 = x.square();
25122512
final T f = x2.subtract(1).negate().reciprocal();
25132513
T coeff = f.sqrt();
25142514
function[1] = coeff.multiply(p[0]);
@@ -2625,7 +2625,7 @@ public <T extends CalculusFieldElement<T>> void asin(final T[] operand, final in
26252625
// as per polynomial parity, we can store coefficients of both P_(n-1) and P_n in the same array
26262626
final T[] p = MathArrays.buildArray(field, order);
26272627
p[0] = field.getOne();
2628-
final T x2 = x.multiply(x);
2628+
final T x2 = x.square();
26292629
final T f = x2.subtract(1).negate().reciprocal();
26302630
T coeff = f.sqrt();
26312631
function[1] = coeff.multiply(p[0]);
@@ -2742,7 +2742,7 @@ public <T extends CalculusFieldElement<T>> void atan(final T[] operand, final in
27422742
// as per polynomial parity, we can store coefficients of both Q_(n-1) and Q_n in the same array
27432743
final T[] q = MathArrays.buildArray(field, order);
27442744
q[0] = field.getOne();
2745-
final T x2 = x.multiply(x);
2745+
final T x2 = x.square();
27462746
final T f = x2.add(1).reciprocal();
27472747
T coeff = f;
27482748
function[1] = coeff.multiply(q[0]);
@@ -3261,7 +3261,7 @@ public <T extends CalculusFieldElement<T>> void acosh(final T[] operand, final i
32613261
// as per polynomial parity, we can store coefficients of both P_(n-1) and P_n in the same array
32623262
final T[] p = MathArrays.buildArray(field, order);
32633263
p[0] = field.getOne();
3264-
final T x2 = x.multiply(x);
3264+
final T x2 = x.square();
32653265
final T f = x2.subtract(1).reciprocal();
32663266
T coeff = f.sqrt();
32673267
function[1] = coeff.multiply(p[0]);
@@ -3378,7 +3378,7 @@ public <T extends CalculusFieldElement<T>> void asinh(final T[] operand, final i
33783378
// as per polynomial parity, we can store coefficients of both P_(n-1) and P_n in the same array
33793379
final T[] p = MathArrays.buildArray(field, order);
33803380
p[0] = field.getOne();
3381-
final T x2 = x.multiply(x);
3381+
final T x2 = x.square();
33823382
final T f = x2.add(1).reciprocal();
33833383
T coeff = f.sqrt();
33843384
function[1] = coeff.multiply(p[0]);
@@ -3495,7 +3495,7 @@ public <T extends CalculusFieldElement<T>> void atanh(final T[] operand, final i
34953495
// as per polynomial parity, we can store coefficients of both Q_(n-1) and Q_n in the same array
34963496
final T[] q = MathArrays.buildArray(field, order);
34973497
q[0] = field.getOne();
3498-
final T x2 = x.multiply(x);
3498+
final T x2 = x.square();
34993499
final T f =x2.subtract(1).negate().reciprocal();
35003500
T coeff = f;
35013501
function[1] = coeff.multiply(q[0]);

hipparchus-core/src/main/java/org/hipparchus/analysis/differentiation/DerivativeStructure.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,12 @@ public DerivativeStructure multiply(final DerivativeStructure a)
250250
return result;
251251
}
252252

253+
/** {@inheritDoc} */
254+
@Override
255+
public DerivativeStructure square() {
256+
return multiply(this);
257+
}
258+
253259
/** {@inheritDoc}
254260
*/
255261
@Override

hipparchus-core/src/main/java/org/hipparchus/analysis/differentiation/FieldDerivativeStructure.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,12 @@ public FieldDerivativeStructure<T> multiply(final FieldDerivativeStructure<T> a)
258258
return result;
259259
}
260260

261+
/** {@inheritDoc} */
262+
@Override
263+
public FieldDerivativeStructure<T> square() {
264+
return multiply(this);
265+
}
266+
261267
/** '&divide;' operator.
262268
* @param a right hand side parameter of the operator
263269
* @return this&divide;a

hipparchus-core/src/main/java/org/hipparchus/analysis/differentiation/FieldGradient.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,16 @@ public FieldGradient<T> multiply(final FieldGradient<T> a) {
330330
return result;
331331
}
332332

333+
/** {@inheritDoc} */
334+
@Override
335+
public FieldGradient<T> square() {
336+
final FieldGradient<T> result = newInstance(value.square());
337+
for (int i = 0; i < grad.length; ++i) {
338+
result.grad[i] = grad[i].multiply(value).multiply(2);
339+
}
340+
return result;
341+
}
342+
333343
/** '&divide;' operator.
334344
* @param a right hand side parameter of the operator
335345
* @return this&divide;a
@@ -580,7 +590,7 @@ public FieldGradient<T> sqrt() {
580590
@Override
581591
public FieldGradient<T> cbrt() {
582592
final T c = FastMath.cbrt(value);
583-
return compose(c, c.multiply(c).multiply(3).reciprocal());
593+
return compose(c, c.square().multiply(3).reciprocal());
584594
}
585595

586596
/** {@inheritDoc} */
@@ -721,25 +731,25 @@ public FieldGradient<T> tan() {
721731
/** {@inheritDoc} */
722732
@Override
723733
public FieldGradient<T> acos() {
724-
return compose(FastMath.acos(value), value.multiply(value).negate().add(1).sqrt().reciprocal().negate());
734+
return compose(FastMath.acos(value), value.square().negate().add(1).sqrt().reciprocal().negate());
725735
}
726736

727737
/** {@inheritDoc} */
728738
@Override
729739
public FieldGradient<T> asin() {
730-
return compose(FastMath.asin(value), value.multiply(value).negate().add(1).sqrt().reciprocal());
740+
return compose(FastMath.asin(value), value.square().negate().add(1).sqrt().reciprocal());
731741
}
732742

733743
/** {@inheritDoc} */
734744
@Override
735745
public FieldGradient<T> atan() {
736-
return compose(FastMath.atan(value), value.multiply(value).add(1).reciprocal());
746+
return compose(FastMath.atan(value), value.square().add(1).reciprocal());
737747
}
738748

739749
/** {@inheritDoc} */
740750
@Override
741751
public FieldGradient<T> atan2(final FieldGradient<T> x) {
742-
final T inv = value.multiply(value).add(x.value.multiply(x.value)).reciprocal();
752+
final T inv = value.square().add(x.value.multiply(x.value)).reciprocal();
743753
final FieldGradient<T> result = newInstance(FastMath.atan2(value, x.value));
744754
final T xValueInv = x.value.multiply(inv);
745755
final T mValueInv = value.negate().multiply(inv);
@@ -784,19 +794,19 @@ public FieldGradient<T> tanh() {
784794
/** {@inheritDoc} */
785795
@Override
786796
public FieldGradient<T> acosh() {
787-
return compose(FastMath.acosh(value), value.multiply(value).subtract(1).sqrt().reciprocal());
797+
return compose(FastMath.acosh(value), value.square().subtract(1).sqrt().reciprocal());
788798
}
789799

790800
/** {@inheritDoc} */
791801
@Override
792802
public FieldGradient<T> asinh() {
793-
return compose(FastMath.asinh(value), value.multiply(value).add(1).sqrt().reciprocal());
803+
return compose(FastMath.asinh(value), value.square().add(1).sqrt().reciprocal());
794804
}
795805

796806
/** {@inheritDoc} */
797807
@Override
798808
public FieldGradient<T> atanh() {
799-
return compose(FastMath.atanh(value), value.multiply(value).negate().add(1).reciprocal());
809+
return compose(FastMath.atanh(value), value.square().negate().add(1).reciprocal());
800810
}
801811

802812
/** {@inheritDoc} */

hipparchus-core/src/main/java/org/hipparchus/analysis/differentiation/FieldUnivariateDerivative1.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,12 @@ public FieldUnivariateDerivative1<T> multiply(final FieldUnivariateDerivative1<T
218218
a.f0.linearCombination(f1, a.f0, f0, a.f1));
219219
}
220220

221+
/** {@inheritDoc} */
222+
@Override
223+
public FieldUnivariateDerivative1<T> square() {
224+
return multiply(this);
225+
}
226+
221227
/** '&divide;' operator.
222228
* @param a right hand side parameter of the operator
223229
* @return this&divide;a
@@ -441,7 +447,7 @@ public FieldUnivariateDerivative1<T> sqrt() {
441447
@Override
442448
public FieldUnivariateDerivative1<T> cbrt() {
443449
final T c = FastMath.cbrt(f0);
444-
return compose(c, c.multiply(c).multiply(3).reciprocal());
450+
return compose(c, c.square().multiply(3).reciprocal());
445451
}
446452

447453
/** {@inheritDoc} */

hipparchus-core/src/main/java/org/hipparchus/analysis/differentiation/FieldUnivariateDerivative2.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,12 @@ public FieldUnivariateDerivative2<T> multiply(final FieldUnivariateDerivative2<T
236236
a.f0.linearCombination(f2, a.f0, f1.add(f1), a.f1, f0, a.f2));
237237
}
238238

239+
/** {@inheritDoc} */
240+
@Override
241+
public FieldUnivariateDerivative2<T> square() {
242+
return multiply(this);
243+
}
244+
239245
/** '&divide;' operator.
240246
* @param a right hand side parameter of the operator
241247
* @return this&divide;a
@@ -484,7 +490,7 @@ public FieldUnivariateDerivative2<T> sqrt() {
484490
@Override
485491
public FieldUnivariateDerivative2<T> cbrt() {
486492
final T c = FastMath.cbrt(f0);
487-
final T c2 = c.multiply(c);
493+
final T c2 = c.square();
488494
return compose(c, c2.multiply(3).reciprocal(), c2.multiply(-4.5).multiply(f0).reciprocal());
489495
}
490496

@@ -498,7 +504,7 @@ public FieldUnivariateDerivative2<T> rootN(final int n) {
498504
} else {
499505
final T r = FastMath.pow(f0, 1.0 / n);
500506
final T z = FastMath.pow(r, n - 1).multiply(n);
501-
return compose(r, z.reciprocal(), z.multiply(z).multiply(r).reciprocal().multiply(1 -n));
507+
return compose(r, z.reciprocal(), z.square().multiply(r).reciprocal().multiply(1 -n));
502508
}
503509
}
504510

hipparchus-core/src/main/java/org/hipparchus/analysis/differentiation/Gradient.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import java.io.Serializable;
2020
import java.util.Arrays;
2121

22-
import org.hipparchus.CalculusFieldElement;
2322
import org.hipparchus.exception.LocalizedCoreFormats;
2423
import org.hipparchus.exception.MathIllegalArgumentException;
2524
import org.hipparchus.util.FastMath;
@@ -54,7 +53,7 @@
5453
* @see FieldGradient
5554
* @since 1.7
5655
*/
57-
public class Gradient implements Derivative<Gradient>, CalculusFieldElement<Gradient>, Serializable {
56+
public class Gradient implements Derivative<Gradient>, Serializable {
5857

5958
/** Serializable UID. */
6059
private static final long serialVersionUID = 20200520L;
@@ -274,6 +273,16 @@ public Gradient multiply(final Gradient a) {
274273
return result;
275274
}
276275

276+
/** {@inheritDoc} */
277+
@Override
278+
public Gradient square() {
279+
final Gradient result = newInstance(value * value);
280+
for (int i = 0; i < grad.length; ++i) {
281+
result.grad[i] = 2 * grad[i] * value;
282+
}
283+
return result;
284+
}
285+
277286
/** {@inheritDoc} */
278287
@Override
279288
public Gradient divide(final double a) {

0 commit comments

Comments
 (0)