Skip to content

Commit 388048b

Browse files
committed
monomial multiplication
1 parent 046756e commit 388048b

File tree

3 files changed

+37
-6
lines changed

3 files changed

+37
-6
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package io.polypen;
2+
3+
import org.apache.commons.numbers.fraction.Fraction;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
public record Monomial(Fraction coefficient, int exponent) {
9+
public Polynomial multiply(Polynomial p) {
10+
List<Fraction> result = new ArrayList<>(p.degree() + exponent + 1);
11+
for (int i = 0; i < exponent; i++) {
12+
result.add(Fraction.ZERO);
13+
}
14+
for (int i = 0; i <= p.degree(); i++) {
15+
result.add(coefficient.multiply(p.coefficient(i)));
16+
}
17+
return new Polynomial(result);
18+
}
19+
}

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
public final class Polynomial {
1111
private final List<Fraction> coefficients;
1212

13-
private Polynomial(List<Fraction> coefficients) {
13+
Polynomial(List<Fraction> coefficients) {
1414
this.coefficients = coefficients;
1515
}
1616

@@ -23,7 +23,7 @@ public Polynomial add(String s) {
2323
int rank = Math.max(coefficients.size(), other.size());
2424
List<Fraction> r = new ArrayList<>(rank);
2525
for (int i = 0; i < rank; i++) {
26-
r.add(get(i).add(i < other.size() ? other.get(i) : Fraction.ZERO));
26+
r.add(coefficient(i).add(i < other.size() ? other.get(i) : Fraction.ZERO));
2727
}
2828
return new Polynomial(r);
2929
}
@@ -41,11 +41,11 @@ public String toString() {
4141
if (i == 0) {
4242
result.add(prettySign + coefficient.abs());
4343
} else {
44-
String exponent = i == 1 ? "x" : "x^" + i;
44+
String factor = i == 1 ? "x" : "x^" + i;
4545
if (isAbsoluteOne(coefficient)) {
46-
result.add(prettySign + exponent);
46+
result.add(prettySign + factor);
4747
} else {
48-
result.add(prettySign + coefficient.abs() + " " + "x^" + i);
48+
result.add(prettySign + coefficient.abs() + " " + factor);
4949
}
5050
}
5151
}
@@ -65,10 +65,14 @@ public int hashCode() {
6565
return coefficients.hashCode();
6666
}
6767

68-
private Fraction get(int i) {
68+
public Fraction coefficient(int i) {
6969
if (i >= coefficients.size()) {
7070
return Fraction.ZERO;
7171
}
7272
return coefficients.get(i);
7373
}
74+
75+
public int degree() {
76+
return coefficients.size() - 1;
77+
}
7478
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.polypen;
22

3+
import org.apache.commons.numbers.fraction.Fraction;
34
import org.junit.jupiter.api.Test;
45

56
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -9,6 +10,7 @@ class PolynomialTest {
910
@Test
1011
void polynomialToString() {
1112
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());
1214
}
1315

1416
@Test
@@ -20,4 +22,10 @@ void add() {
2022
void polynomialEquals() {
2123
assertEquals(Polynomial.parse("x^5 - x - 1"), Polynomial.parse("-x + x^5 - 1"));
2224
}
25+
26+
@Test
27+
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")));
30+
}
2331
}

0 commit comments

Comments
 (0)