跳到主要内容

名古屋大学 情報学研究科 知能システム学専攻 2024年8月実施 プログラミング

Author

祭音Myyura

Description

整数を要素とする行列を扱う Python プログラムについて考える。 2 ページ以降に掲載のプログラムは,20~48 行目の関数 proc を再帰的に呼び出しながら処理を行う。 プログラム中の変数 は行列を扱う変数であり,以降の設問では行列 A と記載する。 また, は行数 ,列数 からなる行列とし,以下で示す数式においては 列の要素を )のように同じアルファベットのイタリック体に添え字を組み合わせて表記する。以下の問いに答えよ。 ただし,行列 の内容を答える際は [] を省略しても構わない。

  1. 21 行目のコードが初めて実行された際に標準出力に表示される行列 の内容を答えよ。

  2. 27 行目は,行列 に対して, 行と 行の要素をすべて入れ替える処理である。【ア】,【イ】に入れるべき適切なコードを答えよ。

  3. 28 行目は,行列 に対して, 列と 列の要素をすべて入れ替える処理である。【ウ】,【エ】に入れるべき適切なコードを答えよ。

  4. 31~32 行目は以下の処理をプログラムとして実装したものである。ここで,s と r はプログラム中の変数にそれぞれ対応する。また,← は代入を表し, は x を超えない最大の整数を表す。 は,n の値を 1 から N まで変化させて処理を行うことを表す。【オ】~【キ】に入れるべき適切なコードを答えよ。

  1. 35~36 行目は以下の処理をプログラムとして実装したものである。ここで,s と c はプログラム中の変数にそれぞれ対応する。【ク】~【コ】に入れるべき適切なコードを答えよ。
  1. 21 行目のコードが 2 度目に実行された際に標準出力に表示される行列 A の内容を答えよ。

  2. プログラムが最後まで実行される間に標準出力に表示される行列 A の内容をすべて答えよ。

  3. 38 行目に指定されている条件じょうけんの True を次式に変更したい(式中の s はプログラム中の変数に対応する)。ただし, は x の絶対値を表す。

このとき,38 行目を以下のように変更するとすると,【サ】に入れるべき適切なコードを答えよ。

if 【サ】:

また,変更後のプログラムを最後まで実行したときに標準出力に表示される行列 A の内容をすべて答えよ。

プログラム

import numpy as np

def search(A, s):
R = np.abs(A[s:,s:])
idx, rmin = (-1,-1), 1000000000
for r in range(R.shape[0]):
for c in range(R.shape[1]):
if R[r,c] > 0 and R[r,c] < rmin:
idx, rmin = (s+r,s+c), R[r,c]
return idx

def check(A, s):
tmp = A[s+1:,s+1:]
for r in range(tmp.shape[0]):
for c in range(tmp.shape[1]):
if tmp[r, c] % A[s, s] != 0:
return (s+r+1, s+c+1, tmp[r, c] // A[s, s])
return (-1, 0, 0)

def proc(A, s):
print(A) # 21

i, j = search(A, s)
if i < 0:
return A

A[] = A[] # 27
A[] = A[] # 28

for r in range(s+1, A.shape[0]):
k = 【オ】
A[] -= 【キ】

for c in range(s+1, A.shape[1]):
k = 【ク】
A[] -= 【コ】

if True:
rr, cc, qq = check(A, s)
if rr >= 0:
A[rr, :] += A[s, :]
A[:, cc] -= qq * A[:, s]
else:
if A[s, s] < 0:
A[s, :] *= -1
return proc(A, s+1)

return proc(A, s)

A = np.array([3, 1, 3, 1, -1, 3, 3, 3, 0], dtype=int).reshape(3,3)
A = proc(A, 0)

Kai

1.

[[ 3 1 3]
[ 1 -1 3]
[ 3 3 0]]

2.

ア: [s, i], :
イ: [i, s], :

3.

ウ: :, [s, j]
エ: :, [j, s]

4.

オ: A[r, s] // A[s, s]
カ: r, :
キ: A[s, :] * k

5.

ク: A[s, c] // A[s, s]
ケ: :, c
コ: A[:, s] * k

6.

[[ 1 0 0]
[ 0 4 6]
[ 0 -6 -9]]

7.

[[ 3 1 3]
[ 1 -1 3]
[ 3 3 0]]

[[ 1 0 0]
[ 0 4 6]
[ 0 -6 -9]]

[[1 0 0]
[0 4 2]
[0 6 3]]

[[1 0 0]
[0 2 0]
[0 1 0]]

8.

サ: np.sum(np.abs(A[s+1:, s])) + np.sum(np.abs(A[s, s+1:])) == 0

変更後のプログラムを最後まで実行したときの出力は次のとおりである。

[[ 3 1 3]
[ 1 -1 3]
[ 3 3 0]]

[[ 1 0 0]
[ 0 4 6]
[ 0 -6 -9]]

[[1 0 0]
[0 4 2]
[0 2 1]]

[[1 0 0]
[0 1 0]
[0 0 0]]