ITパスポート 2026年 問85
問題文
関数isPrimeは、引数として与えられた正の整数が、素数であればtrueを、素数でなければfalseを戻り値とする。例えば、関数isPrimeをisPrime(2)として呼び出したときの戻り値はtrueである。プログラム中のa、bに入れる字句の適切な組合せはどれか。
〔プログラム〕
○論理型: isPrime(整数型: num)
整数型: div ← 2
if (numが2 [ a ])
return false
else
while (numがdiv [ b ])
if (num ÷ divの余りが0と等しい)
return false
else
div ← div + 1
endif
endwhile
return true
endif

選択肢
ア:
イ:
ウ:
エ:(正解)
🔒 解説は解答すると表示されます
素数判定アルゴリズム【ITパスポート解説】
正解の理由
問題の目的は「引数numが素数(1と自分自身以外に約数を持たない正の整数)かどうか」を判定することです。プログラムの流れは次の通りです。
- divを2で初期化し、2から順に割り算していく(割り切れれば素数でない)。
- 割り切れる数が見つからなければ素数と判定する。
このアルゴリズムで、if節の条件(a)は「2未満の数(1や0など)は素数ではない」と判定して早くfalseを返すために使います。したがってaは「より小さい(2より小さい)」が正しいです。一方、ループ条件(b)は「divがnumより小さい間(つまりdiv = 2,3,...,num-1)だけ調べる」必要があるため、bは「より大きい(numがdivより大きい)」が正しいです。
以上より、aが「より小さい」、bが「より大きい」である組合せ、すなわち選択肢の エ が正解です。
解法ステップ
- 素数の定義を確認する:1より大きく、自分自身と1以外に約数がない整数。
- 早期判定(if節)で2未満の数を弾く:
- 0や1は素数でないのでfalseを返すべき。
- 2は素数なのでここで弾かない(ifがfalseである必要がある)。
- ループで2から順に割り算を試す(divを2から始めて、num-1まで試す):
- もし余りが0()なら合成数(素数でない)だからfalse。
- 最後まで割り切れるものがなければtrue(素数)。
- 条件を満たす文字列を当てはめる:a = 「より小さい」、b = 「より大きい」。
選択肢別の誤答解説
-
ア(a: 以下、b: と等しい)
aが「以下(≤)」だとnum = 2のときifが真になり、2のときfalseを返してしまいます。これは問題文の「isPrime(2) の戻り値がtrue」と矛盾します。bが「と等しい(=)」だとwhileがほとんど実行されず、正しく判定できません。 -
イ(a: 以下、b: より大きい)
aの「以下(≤)」が誤りのため不適。num = 2のとき誤ってfalseを返します。 -
ウ(a: より小さい、b: と等しい)
aは正しい(2未満を弾く)が、bが「と等しい」だとwhile (num == div) の意味になり、通常ループが実行されず正しい判定ができません(divは2で固定され、numが2のときのみ真になります)。 -
エ(a: より小さい、b: より大きい)
aが「numが2より小さいときfalse」を意味し1や0を弾けます。bが「numがdivより大きい(num > div)」であればdivが2からnum-1まで回り、約数を正しく検査できます。したがって処理が意図通りになります(正解)。
よくある誤解
- 「2を特別扱いするのは不要」
2は最小の素数なので、特にifで2を弾いてしまうと誤判定になります。2は素数として残す必要があります。 - 「ループ条件を <= にすれば良い」と思うミス
div ≤ numとするとdiv = numのときも調べてしまい、必ず最後にnum % num == 0となり誤って合成数扱い(false)になるのでダメです。 - 「divを2以外から始めると早く判定できる」と考える誤り
例えば奇数だけ調べる高速化は可能ですが、その前に2の扱い(偶数かどうか)を別に処理するなど注意が必要です。
補足コラム
より効率的な方法:
- divを2からnum-1まで調べると計算量は で大きな数に不向きです。改善策としてdivの上限を (numの平方根)にすれば十分です。理由は、もしnum = a × bと分解できるなら、どちらか一方は だからです。
具体的なループ条件は「div × div ≤ num(またはdiv ≤ √num)」にすればよいです。 - さらに速くするにはエラトステネスの篩(ふるい)や確率的素数判定(ミラー–ラビンなど)がありますが、初学者はまず基本的な割り算ループの考え方を押さえましょう。
簡単な実装例(Python):
def isPrime(num: int) -> bool:
if num < 2: # 2 より小さい -> 素数ではない
return False
div = 2
while num > div: # div が num より小さい間(2..num-1)を調べる
if num % div == 0:
return False
div += 1
return True
FAQ
Q: なぜ1は素数ではないのですか?
A: 素数は「1と自分自身以外に約数を持たない」整数です。1は約数の数が1個しかなく定義に合わないため、素数としません(数学上の取り決めです)。
A: 素数は「1と自分自身以外に約数を持たない」整数です。1は約数の数が1個しかなく定義に合わないため、素数としません(数学上の取り決めです)。
Q: numが2のときはどう動くのですか?
A: aの条件が「より小さい(num < 2)」ならfalseになりelseに進みます。div = 2のときwhile (num > div) はfalse(2 > 2は偽)でループに入らず、そのままreturn trueとなり2は素数と判定されます。
A: aの条件が「より小さい(num < 2)」ならfalseになりelseに進みます。div = 2のときwhile (num > div) はfalse(2 > 2は偽)でループに入らず、そのままreturn trueとなり2は素数と判定されます。
Q: 負の数や0はどう扱うべきですか?
A: ここでは「正の整数が引数」とあるので対象外ですが、実装では負の数や0を最初に弾してfalseを返すのが安全です。
A: ここでは「正の整数が引数」とあるので対象外ですが、実装では負の数や0を最初に弾してfalseを返すのが安全です。
関連キーワード: 素数判定、mod(余り演算)、ループ条件、平方根判定、アルゴリズム最適化

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

