お茶の水女子大学 人間文化創成科学研究科 理学専攻 情報科学コース 2018年8月実施 情報基礎 問題1
标签:
Author
祭音Myyura (co-authored with GPT 5.6 SOL)
Description
次の C 言語の関数は、double 型の 行列 a, b の積を c に格納する。n はあらかじめ定義された正の整数定数とし、添字は 以上 未満とする。
void mul (double a[n][n], double b[n][n], double c[n][n]) {
int i, j, k;
double v;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
v = 0;
for (k = 0; k < n; k++) {
/* 行列積の (i, j) 要素を求めるために v を更新する */
}
c[i][j] = v;
}
}
}
- コメント行に書くべきプログラムを示せ。
- その行が実行される回数を で表せ。
a,bがともに上三角行列であるとき、零と分かっている要素に関する計算を省く関数mul2を書け。結果配列は初めすべて零とする。mul2で 要素()を求めるための掛け算の回数を で表せ。mul2全体での掛け算の回数を で表せ。mul2の計算量を で表せ。
题目描述
补全普通矩阵乘法的核心语句并计数。随后利用两个输入矩阵均为上三角矩阵这一条件,编写跳过必为零的乘法版本,求单个元素和整个程序的乘法次数及渐近复杂度。
Kai
(1)
v += a[i][k] * b[k][j];
(2)
三重ループの各添字がそれぞれ 個の値を取るので、正確な実行回数は
回である。
(3)
上三角行列では が零でない可能性があるのは 、 が零でない可能性があるのは のときだけである。したがって次のように書ける。
void mul2 (double a[n][n], double b[n][n], double c[n][n]) {
int i, j, k;
double v;
for (i = 0; i < n; i++) {
for (j = i; j < n; j++) {
v = 0;
for (k = i; k <= j; k++) {
v += a[i][k] * b[k][j];
}
c[i][j] = v;
}
}
}
の要素は初期値の零のままである。
(4)
について掛け算するので、
である。
(5)
掛け算の総数は
(6)
最高次の項は なので、
である。通常の積より定数係数は小さいが、漸近的次数は同じである。