
1-15. 同じ働きをする論理演算式に関するアルゴリズム
本記事では、論理演算式を使用したアルゴリズムについて問題演習を通して解説します。なお、次の問題は、ド・モルガンの法則を知っていれば、正解にたどり着けます。
論理演算式とは
1. 論理演算とは?
論理演算(logical operation)とは、「真(True)」または「偽(False)」の値を操作する演算のことです。
プログラミングやアルゴリズムにおいて、条件分岐(if文など)やループ処理に欠かせません。
2. 基本的な論理演算子
論理演算には、主に次の3つの基本的な演算子があります。
AND(かつ) 論理積(&&, AND) すべての条件が「真」のときのみ「真」 OR(または) 論理和(||, OR) いずれかの条件が「真」なら「真」
NOT(否定) 論理否定(!, NOT) 「真」を「偽」に、「偽」を「真」にする
3. 真理値表(トゥルーステーブル)
論理演算の基本的な動作を、真理値表で確認してみましょう。
(1) AND(&&, AND)
例:
boolean a = true;
boolean b = false;
System.out.println(a && b); // false
(2) OR(||, OR)
例:
boolean a = true;
boolean b = false;
System.out.println(a || b); // true
(3) NOT(!, NOT)
例:
boolean a = true;
System.out.println(!a); // false
4. 実践的な使用例
(1) 条件分岐での活用
int x = 10;
if (x > 5 && x < 20) {
System.out.println("xは5より大きく20未満です");
}
このコードでは、x が 5より大きく、かつ20未満 である場合にメッセージを表示します。
(2) ループ処理での活用
int i = 0;
while (i < 10 && i % 2 == 0) {
System.out.println(i);
i += 2;
}
このコードでは、i が 10未満かつ偶数 の場合にループを続けます。
5. まとめ
論理演算 は、条件を組み合わせる際に重要。
AND(&&) は「両方が真なら真」。
OR(||) は「どちらかが真なら真」。
NOT(!) は「真と偽を反転」。
条件分岐やループ で頻繁に使用される。
ド・モルガンの法則とは
事前に、解説に用いられる記号の意味を以下に示します。
以下、それぞれの記号の読み方と意味を解説します。
1. 否定(¬)
読み方: 「ノット」または「否定」
意味:
¬A は「Aではない」という意味(Aの否定)
真 (True) の場合は偽 (False) に、偽の場合は真に変換する
例:
¬(True) → False
¬(False) → True
2. 同値(≡)
読み方: 「同値」または「等価」
意味:
左辺と右辺が常に等しいことを表す
どんな値を代入しても、両者の結果が同じになる
例:
A ≡ B は「AとBが論理的に等しい」という意味
例えば、¬(A ∧ B) ≡ (¬A) ∨ (¬B) は、どんなAとBでも両辺の結果が一致することを意味する
3. 論理積(∧)
読み方: 「アンド」または「論理積」
意味:
A ∧ B は、「AとBの両方が真 (True) のときのみ真、それ以外は偽 (False)」
プログラミングでの表記:
Java, C, Python: &&
数学的記号: ∧
例:
boolean a = true;
boolean b = false;
System.out.println(a && b); // false
4. 論理和(∨)
読み方: 「オア」または「論理和」
意味:
A ∨ B は、「AまたはBのどちらかが真 (True) のときに真、両方偽 (False) のときのみ偽」
プログラミングでの表記:
Java, C, Python: ||
数学的記号: ∨
例:
boolean a = true;
boolean b = false;
System.out.println(a || b); // true
5. まとめ
¬ ノット(否定) 真を偽に、偽を真にする
≡ 同値(等価) 両辺が論理的に等しい
∧ アンド(論理積) 両方が真なら真、それ以外は偽
∨ オア(論理和) どちらかが真なら真、両方偽なら偽
このように、それぞれの記号を理解しておくと、論理式の変形やプログラムでの条件分岐がスムーズになります。
ド・モルガンの法則について以下に示します。
ド・モルガンの法則(De Morgan's laws)は、論理演算の変形法則 であり、条件を簡潔に書き直すときに役立ちます。
1. ド・モルガンの法則の定義
ド・モルガンの法則には、次の2つの基本式があります。
NOT(A AND B) は (NOT A) OR (NOT B) に等しい
¬(A∧B)≡(¬A)∨(¬B)
(ANDの否定は、それぞれの否定のORに変換できる)
NOT(A OR B) は (NOT A) AND (NOT B) に等しい
¬(A∨B)≡(¬A)∧(¬B)
(ORの否定は、それぞれの否定のANDに変換できる)
2. アルゴリズムでの活用
ド・モルガンの法則は、条件の簡略化や逆転 に使われ、アルゴリズムの可読性や最適化に役立ちます。
(1) if 文の条件を変形
例えば、次のコードがあります。
if (!(x > 5 && y < 10)) {
System.out.println("条件が偽の場合");
}
ド・モルガンの法則を適用すると、以下のように書き換えられます。
if (x <= 5 || y >= 10) {
System.out.println("条件が偽の場合");
}
このように、条件が見やすくなる ので、バグを減らしやすくなります。
(2) ループの条件を変形
例えば、次のような while ループを考えます。
while (!(a == 0 && b == 0)) {
// 何らかの処理
}
ド・モルガンの法則を適用すると、
while (a != 0 || b != 0) {
// 何らかの処理
}
「条件を肯定形にすることで、直感的にわかりやすくなる」 のがポイントです。
4. まとめ
ド・モルガンの法則 は、条件の否定を変形する法則 で、可読性の向上や最適化に役立つ。
!(A AND B) == (!A OR !B)(AND の否定 → OR に変換)
!(A OR B) == (!A AND !B)(OR の否定 → AND に変換)
条件分岐やループ で、より分かりやすい記述にできる。
特に、if 文や while 文の条件をシンプルにするのに便利 になります。
事前知識を共通認識にしたうえで、次の問題演習をします。
問題 整数型の変数AとBがある。AとBの値にかかわらず、次の二つのアルゴリズムが同じ働きをするとき、□a に入る条件式はどれか。ここで、AND, OR, x̄ は、それぞれ論理積、論理和、Xの否定を表す。
アルゴリズム1
if (A > 0)
if (B > 0)
[手続]
endif
endif
アルゴリズム2
if ( □a )
else
[手続]
endif
選択肢
ア ( A >0) AND ( B >0)
イ ( A >0) OR ( B >0)
ウ ¬( A >0) AND ¬( B >0)
エ ¬( A >0) OR ¬( B >0)
解答 エ
アルゴリズム1は、( A >0) AND ( B >0)のときに手続きが実行されることがわかります。
一方、アルゴリズム2は、条件を満たさないときに手続きが実行されるので、( A >0) AND ( B >0)の否定が□aにはいることになります。
ド・モルガンの法則の「NOT(A AND B) は (NOT A) OR (NOT B) に等しい」から、選択肢エ の¬( A >0) OR ¬( B >0) が正解になります。
以上です。