Skip to content

Commit ce6a70c

Browse files
committed
add multiply
1 parent 388048b commit ce6a70c

File tree

3 files changed

+48
-12
lines changed

3 files changed

+48
-12
lines changed

src/main/java/io/polypen/Monomial.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
import java.util.List;
77

88
public record Monomial(Fraction coefficient, int exponent) {
9+
10+
public static final Monomial ZERO = new Monomial(Fraction.ZERO, 0);
11+
912
public Polynomial multiply(Polynomial p) {
1013
List<Fraction> result = new ArrayList<>(p.degree() + exponent + 1);
1114
for (int i = 0; i < exponent; i++) {

src/main/java/io/polypen/Polynomial.java

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
import static io.polypen.Util.isAbsoluteOne;
99

1010
public final class Polynomial {
11+
12+
public static final Polynomial ZERO = new Polynomial(List.of(Fraction.ZERO));
13+
1114
private final List<Fraction> coefficients;
1215

1316
Polynomial(List<Fraction> coefficients) {
@@ -18,16 +21,33 @@ public static Polynomial parse(String s) {
1821
return new Polynomial(Parser.parse(s));
1922
}
2023

21-
public Polynomial add(String s) {
22-
List<Fraction> other = Parser.parse(s);
23-
int rank = Math.max(coefficients.size(), other.size());
24-
List<Fraction> r = new ArrayList<>(rank);
25-
for (int i = 0; i < rank; i++) {
26-
r.add(coefficient(i).add(i < other.size() ? other.get(i) : Fraction.ZERO));
24+
public Polynomial add(Polynomial other) {
25+
int degree = Math.max(degree(), other.degree());
26+
List<Fraction> r = new ArrayList<>(degree + 1);
27+
for (int i = 0; i <= degree; i++) {
28+
r.add(coefficient(i).add(other.coefficient(i)));
2729
}
2830
return new Polynomial(r);
2931
}
3032

33+
public Polynomial add(String s) {
34+
return add(parse(s));
35+
}
36+
37+
public Polynomial multiply(Polynomial other) {
38+
Polynomial result = ZERO;
39+
for (int i = 0; i <= degree(); i++) {
40+
Monomial m = monomial(i);
41+
Polynomial p = m.multiply(other);
42+
result = result.add(p);
43+
}
44+
return result;
45+
}
46+
47+
public Polynomial multiply(String s) {
48+
return multiply(parse(s));
49+
}
50+
3151
@Override
3252
public String toString() {
3353
List<String> result = new ArrayList<>(coefficients.size());
@@ -72,6 +92,13 @@ public Fraction coefficient(int i) {
7292
return coefficients.get(i);
7393
}
7494

95+
public Monomial monomial(int i) {
96+
if (i >= coefficients.size()) {
97+
return Monomial.ZERO;
98+
}
99+
return new Monomial(coefficients.get(i), i);
100+
}
101+
75102
public int degree() {
76103
return coefficients.size() - 1;
77104
}

src/test/java/io/polypen/PolynomialTest.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,35 @@
33
import org.apache.commons.numbers.fraction.Fraction;
44
import org.junit.jupiter.api.Test;
55

6+
import static io.polypen.Polynomial.parse;
67
import static org.junit.jupiter.api.Assertions.assertEquals;
78

89
class PolynomialTest {
910

1011
@Test
1112
void polynomialToString() {
12-
assertEquals("x^5 - x - 1", Polynomial.parse("-x + x^5 - 1").toString());
13-
assertEquals("2 x^6 - 4 x^2 - 2 x", Polynomial.parse("2x^6 - 4x^2 - 2x").toString());
13+
assertEquals("x^5 - x - 1", parse("-x + x^5 - 1").toString());
14+
assertEquals("2 x^6 - 4 x^2 - 2 x", parse("2x^6 - 4x^2 - 2x").toString());
1415
}
1516

1617
@Test
1718
void add() {
18-
assertEquals(Polynomial.parse("2x + 3"), Polynomial.parse("x + 1").add("x + 2"));
19+
assertEquals(parse("2x + 3"), parse("x + 1").add("x + 2"));
20+
}
21+
22+
@Test
23+
void multiply() {
24+
assertEquals(parse("x^2 - 1"), parse("x - 1").multiply("x + 1"));
1925
}
2026

2127
@Test
2228
void polynomialEquals() {
23-
assertEquals(Polynomial.parse("x^5 - x - 1"), Polynomial.parse("-x + x^5 - 1"));
29+
assertEquals(parse("x^5 - x - 1"), parse("-x + x^5 - 1"));
2430
}
2531

2632
@Test
2733
void monomialMultiplication() {
28-
assertEquals(Polynomial.parse("2x^6 - 4x^2 - 2x"),
29-
new Monomial(Fraction.of(2), 1).multiply(Polynomial.parse("x^5 - 2x - 1")));
34+
assertEquals(parse("2x^6 - 4x^2 - 2x"),
35+
new Monomial(Fraction.of(2), 1).multiply(parse("x^5 - 2x - 1")));
3036
}
3137
}

0 commit comments

Comments
 (0)