多項式どうしを掛け算した結果を表示するプログラムを作っているのですが、思い通りに出来ません。
例えば、p1 = 3x^2 + 2x + 1、p3 = 3x^2 + 7x + 5、p4 = p1*p3とすると、結果が p4 = 3x^4 + 5x^3 + 18x^2 + 11x +5となります。この結果をよく見てみると、getMultipledメソッドにおける始めのループ処理では、p3の定数項の5とp1の各項との乗算が出来ていることが分かります。しかし、それ以降のループでは全てp3の項の係数を1として計算されているようです(2ループ目では7xの7を係数として計算がなされるはずです)。なぜこのような結果になってしまうのかがよく分かりません。もし分かれば教えてください。よろしくお願いします。ソースコードは以下の通りです。
public class Polynomial { int[] co; // 係数(coefficient)の配列 Polynomial() { co = new int[1]; co[0] = 0; } Polynomial(int[] co) { this.co = co; } Polynomial(int k2, int k1, int k0) { co = new int[3]; co[0] = k0; // 定数項 (0次の係数) co[1] = k1; // 1次の係数 co[2] = k2; // 2次の係数 } Polynomial getShifted(Polynomial poly, int num) { if (num < 1) return poly; int dim = co.length + num; int[] shiftedCo = new int[dim]; for (int i = 0; i < poly.co.length; i++) { shiftedCo[i + num] = co[i]; } for (int i = 0; i < num; i++) { shiftedCo[i] = 0; } return new Polynomial(shiftedCo); } Polynomial getMultiplied(Polynomial poly , int k){ int[] mul = new int[poly.co.length]; for(int i = 0; i < poly.co.length; i++){ mul[i] = 0; } for(int i = 0; i < poly.co.length; i++){ mul[i] = k*poly.co[i]; } return new Polynomial(mul); } public String toString() { StringBuffer sb = new StringBuffer(); for (int i = co.length - 1; i >= 2; i--) { sb.append(co[i]); sb.append("x^"); sb.append(i); sb.append(" + "); } sb.append(co[1] + "x" + " + " + co[0]); return new String(sb); // sb.toString() でも OK } Polynomial getAdded(Polynomial poly) { int dim = (this.co.length > poly.co.length) ? this.co.length : poly.co.length; int[] addedCo = new int[dim]; for (int i = 0; i < dim; i++) { addedCo[i] = 0; } for (int i = 0; i < this.co.length; i++) { addedCo[i] += this.co[i]; } for (int i = 0; i < poly.co.length; i++) { addedCo[i] += poly.co[i]; } return new Polynomial(addedCo); } static Polynomial plus(Polynomial left, Polynomial right) { int dim = (left.co.length > right.co.length) ? left.co.length : right.co.length; int[] retPolyCo = new int[dim]; for (int i = 0; i < dim; i++) { retPolyCo[i] = 0; } for (int i = 0; i < left.co.length; i++) { retPolyCo[i] += left.co[i]; } for (int i = 0; i < right.co.length; i++) { retPolyCo[i] += right.co[i]; } return new Polynomial(retPolyCo); } Polynomial getMultiplied(Polynomial poly){ int dim = (this.co.length - 1)+(poly.co.length -1); int[] dimCo = new int[dim]; Polynomial mul = new Polynomial(dimCo); Polynomial addedCo = new Polynomial(dimCo); for(int i = 0; i < poly.co.length; i++){ mul = getMultiplied(this , poly.co[i]); mul = getShifted(mul , i); addedCo = plus(mul, addedCo); } return addedCo; } public static void main(String[] args){ Polynomial p1 = new Polynomial(3, 2, 1); int[] co = {4, 5}; Polynomial p2 = new Polynomial(co); System.out.println("p1 = " + p1); System.out.println("p2 = " + p2); System.out.println("p1 + p2 = " + Polynomial.plus(p1, p2)); Polynomial p3 = p1.getAdded(p2); System.out.println("p1 = " + p1); System.out.println("p3 = " + p3); Polynomial p4 = p1.getMultiplied(p3); System.out.println("p4 = " + p4); System.out.println("p1 = " + p1); System.out.println("p3 = " + p3); System.out.println(p3.co[1]); } }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/21 03:29
2020/10/21 05:08