0

多項式の係数を表すベクトルに整数を格納するメンバー関数を持つPolynomialクラスがあります。現在、非メンバー関数get_vectを使用して 2 つの多項式を掛け合わせようとしていますが、実際のベクトルの掛け算では行き詰まります。Multiplyこれまでのところ、私が持っているものは以下のとおりです。

Polynomial Multiply(const Polynomial & poly1, const Polynomial & poly2)
{
    vector<int> Poly1 = poly1.get_vect();
    vector<int> Poly2 = poly2.get_vect();
    vector<int> Poly3;

    if( Poly1.size() < Poly2.size() )
    {
        for(size_t i = 0 ; Poly2.size()-Poly1.size() ; ++i )
        {
            Poly2.push_back(0);
        }
    }
    else if( Poly1.size() > Poly2.size() )
    {
        for(size_t i = 0 ; Poly1.size()-Poly2.size() ; ++i )
        {
            Poly1.push_back(0);
        }
    }

    return Poly3;
}

以下のパターンに従う必要があることがわかります。

ここに画像の説明を入力

4

1 に答える 1

3

わかりました。私が問題を正しく理解していれば、とで表される多項式間の多項式乗算から得られる係数を保持するPoly3になりたいと思います。vector<int>Poly1Poly2

この要求では暗黙のうちに、3 つの多項式はすべて 1 つの変数の多項式であり、各係数はその変数のべき乗の増加の前にある係数を表します。すなわち。{ 4, 5, 6, 7 }4 + 5x + 6x 2 + 7x 3に対応します。

もしそうなら、多項式がそれほど大きくない限り、実際の乗算はそれほど難しくありません。おおよそ次のようなコードが必要です。

    Poly3.resize(Poly1.size() + Poly2.size() - 1, 0);  // Make the output big enough; init to 0

    for (size_t i = 0; i != Poly1.size(); i++)
        for (size_t j = 0; j != Poly2.size(); j++)
            Poly3[i+j] += Poly1[i] * Poly2[j];

の結果はとPoly3の積になるはずです。 Poly1Poly2

エッジ条件を忘れた可能性は十分にあります。ここでコメントを見て、どこで行ったかを指摘します。それまでの間、いくつかのテストを行ったところ、正しい出力が得られたようです。

かなり大きな多項式がある場合は、数学ライブラリを調べて乗算を処理することをお勧めします。しかし、約 20 ~ 30 用語未満の場合はどうでしょうか。あなたのコードがこの多項式評価に大きく依存していない限り、これがボトルネックになることはないと思います。

于 2013-08-10T05:53:23.837 に答える