今回は複素数の割り算を実装します。
なお和、差、積については以前の記事で実装してます
今回使う複素数の構造体と積の関数はこちらで実装したものなのでぜひご覧ください。
コードの実装
はい作っていきましょう
複素数の割り算は共役な複素数を分母分子にかけてあげればできますね
共役な複素数を返す関数
complex conju(complex x){
x.i = -x.i;
return x;
}
シンプルですね
割り算を行う関数
complex divi(complex x, complex y){
complex s;
complex c;
double m = y.r * y.r + y.i * y.i;
s = conju(y);
c = multi(x,s);
c.r /= m;
c.i /= m;
return c;
}
分母の
もとの複素数×共役な複素数
の部分は複素数の掛け算を使わなくて良いですね。
分子は複素数の掛け算の関数を用いました。
最後に分子の実部虚部を分母で割ってあげればおkです。
全体のコード
#include <stdio.h>
typedef struct complex{
double r;
double i;
}complex;
complex add(complex x, complex y){
complex z;
z.r = x.r + y.r;
z.i = x.i + y.i;
return z;
}
complex sub(complex x, complex y){
complex z;
z.r = x.r - y.r;
z.i = x.i - y.i;
return z;
}
complex multi(complex x, complex y){
complex z;
z.r = x.r * y.r - x.i * y.i;
z.i = x.r * y.i + x.i * y.r;
return z;
}
complex conju(complex x){
x.i = -x.i;
return x;
}
complex divi(complex x, complex y){
complex s;
complex c;
double m = y.r * y.r + y.i * y.i;
s = conju(y);
c = multi(x,s);
c.r /= m;
c.i /= m;
return c;
}
int main(int argc, const char * argv[]) {
complex a,b;
a.r=1; a.i=3;
b.r=2; b.i=6;
complex c;
c = add(a,b);
printf("a = %f + %fi\n",a.r,a.i);
printf("b = %f + %fi\n",b.r,b.i);
printf("a + b = %f+%fi\n",add(a,b).r,add(a,b).i);
printf("a - b = %f+%fi\n",sub(a,b).r,sub(a,b).i);
printf("a * b = %f+%fi\n",multi(a,b).r,multi(a,b).i);
printf("a / b = %f+%fi\n",divi(a,b).r,divi(a,b).i);
return 0;
}
前回のものと合わせときました。
今回はここまで
ではまた、
コメント