C言語で学ぶ大学の数学 準備編「多項式の乗法」
この記事はC言語で以下のような計算をすることを目標とします。
・1変数多項式の乗法
・2変数多項式の乗法
1.1変数多項式の乗法
まずは基本となる1変数多項式の乗法から説明します。
N 次多項式 a(x)と M 次多項式 b(x)が与えられたとき、c(x)= a(x)b(x) を求めます。
c(x) の次数は高々 N+M です。まずはそのことを踏まえて多項式の次数を格納します。
int deg_a = N;
int deg_b = M;
int deg_c = deg_a + deg_b;
(高々の説明:係数が整数や有理数、実数など「整域」である場合は、多項式 0 の次数を-∞と定義すればc(x)の次数はa(x)とb(x)の次数の和に等しくなります。
しかし剰余環 Z/6Zなど、整域でない環を係数とする多項式の場合は次数の和がc(x)の次数になるとは限りません。例えばZ/6Z係数の多項式 a(x) = 2x+1, b(x) = 3x について a(x)b(x) = 3x となり次数が2より小さくなっています。)
次に係数を格納する配列変数を用意します。
float a[deg_a +1], b[deg_b +1], c[deg_c +1];
なお加法と異なり deg_c はdeg_a, deg_b の値で場合分けが生じないので、あえてdeg_cを定義せず
float a[deg_a +1], b[deg_b +1], c[deg_a +deg_b +1];
としても同じです。
変数を用意したら、a(x)とb(x)の係数を格納しておきます。
それが終わってから乗法を計算します。計算方法は案1と案2があります。n, i, j をint型の変数とします。
案1
for(n=0; n<=deg_c; n++){
c[n] = 0;
for(i=0; i<=deg_a; i++){
for(j=0; j<=deg_b; j++){
if(i+j==n) c[n] += a[i]*b[j];
}
}
}
案2
for(n=0; n<=deg_c; n++){
c[n] = 0;
for(i=0; i<=deg_a; i++){
if(n-i>=0 && n-i<=deg_b) c[n] += a[i]*b[n-i];
}
}
案1は素朴にa(x)の i 次の係数とb(x)の j 次の係数を取り出してきて、次数の合計がnに等しければ係数に加える、というものです。
案2は「i+j=n」と「j=n-i」が数学的に同値なので、変数 j を使わずに表現したものです。ただしjのとる範囲が0<=jかつj<=deg_bであるので、ifの中身にそれを反映させています。
変数が少ないぶん案2のほうが計算時間は少なく済むと思いますが、好みの問題もあるのでどちらでもいいです。
2.2変数多項式の乗法
では、今度は2変数多項式の計算をしてみます。
まずは多項式の係数を格納するための変数を定義します。まずは次数からです。
int deg_ax, deg_ay, deg_bx, deg_by;
これらに次数を代入してから、多項式の係数にあたる変数を定義します。今回はc(x,y)の次数をあえて格納しないことにします。
float a[deg_ax +1][deg_ay +1];
float b[deg_bx +1][deg_by +1];
float c[deg_ax +deg_bx +1][deg_ay +deg_by +1];
変数を用意したら、a(x,y) と b(x,y) の係数を代入しておきます。
それが終わったら、乗法を計算します。int型の変数 m, n, i, j, k, l を用意しておきます。1変数のときと同じように計算方法は案1と案2があります。
案1
for(m=0; m<=deg_ax +deg_bx; m++){
for(n=0; n<=deg_ay +deg_by; n++){
c[m][n] = 0;
for(i=0; i<=deg_ax; i++){
for(j=0; j<=deg_bx; j++){
for(k=0; k<=deg_ay; k++){
for(l=0; l<=deg_by; l++){
if(i+j==m && k+l==n) c[m][n] += a[i][k]*b[j][l];
}
}
}
}
}
}
案2
for(m=0; m<=deg_ax +deg_bx; m++){
for(n=0; n<=deg_ay +deg_by; n++){
c[m][n] = 0;
for(i=0; i<=deg_ax; i++){
for(k=0; k<=deg_ay; k++){
if(m-i>=0 && m-i<=deg_bx && n-k>=0 && n-k<=deg_by)
c[m][n] += a[i][k]*b[m-i][n-k];
}
}
}
}
1変数のときのように、a(x,y)の x^i*y^k の係数とb(x,y)の x^j*y^l の係数を取り出してきて、x と y の次数の和がそれぞれ m, n であるときに足すものが案1です。
またb(x,y) の係数に相当する変数 j, l を j = m-i, l= n-k により除去したものが案2です。
同様にして、3変数以上の場合にも多項式の乗法が計算できます。
変数が増えていくと計算時間も長くなっていくため、案2で計算することをお勧めします。
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます