C言語で学ぶ大学の数学 準備編「多項式の加法」

この記事はC言語で以下のような計算をすることを目標とします。


・1変数多項式の加法

・2変数多項式の加法



1.1変数多項式の加法


まずは基本となる1変数多項式の加法から説明します。

N 次多項式 a(x)と M 次多項式 b(x)が与えられたとき、c(x)= a(x)+b(x) を求めます。

最初に a(x)と b(x)の次数を変数に格納します。そのための変数deg_aとdeg_bを用意します。


int deg_a = N;

int deg_b = M;


次数N, Mはscanfで代入してもいいですが、やり方はここでは省略します。

次にc(x)の次数を考えます。N≧Mとすると、c(x)= a(x)+b(x)の次数は N です。

(高々というのは、例えばa(x)= x^2+1, b(x)= -x^2とするとc(x)= 1 なので、次数がNより小さくなるときもある、という意味です)

このように実際には次数が小さくなる場合もありますが、面倒なのでNとMの大きいほうを選ぶこととします。


int deg_c;

if(deg_a > deg_b) deg_c = deg_a;

else deg_c = deg_b;


次に多項式の係数を格納する変数を用意します。前回説明したとおり、[]内の数字は次数より1だけ大きく取ります。


float a[deg_a +1], b[deg_b +1], c[deg_c +1];


そしてscanfなどを使い、a[]とb[]に値を代入します。たとえばa[]に代入するには、int型の変数 n を用意しておき、


for(n=0; n<=deg_a; n++){

 printf("coefficient of x^%d of a(x) =",n);

 scanf("%f", &a[n]);

}


とします。

ここから加法を計算します。

あらかじめint型の変数 n を用意しておきます。そして次のように計算します。


for(n=0; n<=deg_c; n++){

 c[n] = 0;

 if(n<=deg_a) c[n] += a[n];

 if(n<=deg_b) c[n] += b[n];

}


2行目はc[n]を初期化しています。

3行目のifの中身(n<=deg_a)は、deg_a < deg_cの場合を想定しています。

どういうことかというと、deg_a < deg_c であるときは、n がdeg_a(今の場合はN)より大きい値のときに、存在しない変数 a[n]を足してしまうのを防ぐためです。

4行目は同様に、deg_b < deg_cの場合を想定してifを使っています。


加法はこのようにして計算できます。

なお、多項式の次数の上限があらかじめ決められているような場合はもっと簡単に表せます。

たとえば3次までの多項式だけを考えるときは


float a[4],b[4],c[4];


と宣言して、


for(n=0; n<=3; n++){

 c[n] = a[n] + b[n];

}


とすれば良いです。c[n]の初期化が要らず、ifも必要ないのでシンプルです。

次数の上限が決まっているような場合は特殊と思われるかもしれませんが、その方が便利になる応用例を今後紹介する予定です。



2.2変数多項式の加法


では、今度は2変数多項式の計算をしてみます。

2変数多項式 a(x,y)と b(x,y)が与えられたとき、c(x,y)= a(x,y)+b(x,y) を求めます。最初に a(x,y)と b(x,y)のx,yについての次数を変数に格納します。そのための変数を用意します。


int deg_ax, deg_ay, deg_bx, deg_by;


deg_ax, deg_ayはa(x,y)のx,yそれぞれの最高次数です。deg_bx, deg_byはb(x,y)のx,yそれぞれの最高次数です。

deg_ax, deg_ay, deg_bx, deg_byに次数を代入したら、c(x,y)の最高次数 deg_cx, deg_cyを決定します。やり方は1変数のときと同様です。


int deg_cx, deg_cy;

if(deg_ax > deg_bx) deg_cx = deg_ax;

else deg_cx = deg_bx;

if(deg_ay > deg_by) deg_cy = deg_ay;

else deg_cy = deg_by;


それから多項式の係数にあたる変数を定義します。


float a[deg_ax +1][deg_ay +1];

float b[deg_bx +1][deg_by +1];

float c[deg_cx +1][deg_cy +1];


ここから加法を計算します。

あらかじめint型の変数 m,n を用意しておきます。そして次のように計算します。


for(m=0; m<=deg_cx; m++){

for(n=0; n<=deg_cy; n++){

 c[m][n] = 0;

 if(m<=deg_ax && n<=deg_ay) c[m][n] += a[m][n];

 if(m<=deg_bx && n<=deg_by) c[m][n] += b[m][n];

}

}


変数が増えたことでifの中身が1変数のときから増えています。ですが役割は同じようなものです。

2変数の場合も次数の上限が決まっている場合にはシンプルなソースコードが書けますが、ここでは省略します。


ここまで説明したことを使えば、2変数多項式の加法がC言語で実行できます。

同じようにして、3変数や4変数でも計算できます。


ですが、例えば「scanfで変数の数 n を読み取り、n 変数の多項式の加法を計算する」ことはこの方法ではうまくいきません。

配列変数の引数の数をうまく制御できないからです。つまりa[5][3][3]などの[]の数はソースコードを書く時点で決める必要があります。


次の記事では多項式の乗法を計算する方法を説明します。



  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る