行列が交代行列(歪対称行列)かどうかを判定するC++プログラムの解説
正方行列Aが、すべてのiとjについて aij = −aji を満たすとき、行列Aは「交代行列(歪対称行列)」と呼ばれます。言い換えれば、行列Aの転置行列が元の行列のマイナス倍と等しい場合(AT = −A)、その行列は交代行列であるといえます。
なお、交代行列の主対角成分は必ずすべて0になるという特徴があります。
交代行列の例
具体的な行列を見てみましょう。
A= |0 -5 4| |5 0 -1| |-4 1 0|
この行列が交代行列である理由は、すべてのiとjについて aij = −aji が成り立つからです。例えば、a12 = −5、a21 = 5 であり、a12 = −a21 という関係が成立しています。他の成分についても同様にこの条件が満たされています。
さらに、行列Aの転置行列がAのマイナス倍と一致すること(AT = −A)も確認できます。
AT= |0 5 -4| |-5 0 1| |4 -1 0| そして A= |0 -5 4| |5 0 -1| |-4 1 0|
このように AT = −A が成り立っているため、Aが交代行列であることが明確にわかります。
入力: 行数と列数を入力してください: 2 2 行列の要素を入力してください: 10 20 20 10 出力: この行列は対称行列です。 10 20 20 10
判定ロジックの解説
行列がその転置行列と等しい場合、その行列は対称行列です。
そうでない場合に、転置行列が元の行列のマイナス倍と等しければ、その行列は交代行列です。どちらの条件も満たさない場合は、対称行列でも交代行列でもありません。プログラムは判定結果に応じて適切なメッセージを出力します。
対称性・交代性の確認手順
ユーザーに対して、行列の行数と列数の入力を求めます。
行列の各要素を入力してもらい、配列「A」に格納します。変数「x」と「y」は0で初期化されます。
行列が転置行列と等しくない場合、一時変数「x」に1を代入します。
それ以外の場合で、行列のマイナス倍が転置行列と等しいときは、一時変数「y」に1を代入します。
xが0であれば行列は対称行列であり、yが1であれば行列は交代行列です。
いずれの条件も満たさない場合、その行列は対称行列でも交代行列でもありません。
最後に、判定結果を出力します。
サンプルコード
#include<iostream>
using namespace std;
int main () {
int A[10][10], i, j, m, n, x = 0, y = 0;
cout << "Enter the number of rows and columns : ";
cin >> m >> n;
cout << "Enter the matrix elements : ";
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
cin >> A[i][j];
for (i = 0; i < m; i++) {
for( j = 0; j < n; j++) {
if (A[i][j] != A[j][i])
x = 1;
else if (A[i][j] == -A[j][i])
y = 1;
}
}
if (x == 0)
cout << "The matrix is symmetric.\n ";
else if (y == 1)
cout << "The matrix is skew symmetric.\n ";
else
cout << "It is neither symmetric nor skew-symmetric.\n ";
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++)
cout << A[i][j] << " ";
cout << "\n ";
}
return 0;
}
-
Pythonで二分木が対称木(シンメトリックツリー)かどうかを判定するプログラム
ある二分木が与えられたとき、その木が対称木(シンメトリックツリー)であるかどうかを判定します。対称木とは、鏡像(左右反転した像)をとったときに元の木と完全に一致するような木のことです。例えば、左右の子部分木が互いに鏡写しの関係になっている木は対称木とみなされます。この判定を行うためのアプローチは以下の通りです。解法の考え方再帰的に処理を行う関数 solve(root, root) を呼び出します。同じノードを2つの引数として渡すのがポイントです。比較対象の2つのノード(node1 と node2)がどちらも空(None)の場合、True を返します。どちらか一方だけが空の場合、構造が一致してい
-
Pythonで与えられたグラフが2部グラフかどうかを判定するプログラム
2部グラフとは無向グラフが与えられたとき、そのグラフが2部グラフ(バイパータイトグラフ)であるかどうかを判定する方法を解説します。2部グラフとは、グラフのすべての頂点を2つの集合 A と B に分割でき、グラフ内のすべての辺 {u, v} が必ず一方の端点 u が集合 A、もう一方の端点 v が集合 B に属するようなグラフのことです。つまり、同じ集合内の頂点同士を結ぶ辺(A-A や B-B)が一切存在しないグラフです。例として、次のようなグラフを考えてみましょう。この場合、頂点 [0, 4] を集合 A に、[1, 2, 3] を集合 B に分類できます。すべての辺は A から B、または