基本情報技術者 2016年 秋期 午前(科目A) 問07
問題文
整数, ()に対して、次のように定義された関数がある。の値は幾らか。ここで、はをで割った余りである。
選択肢
ア:2
イ:3(正解)
ウ:5
エ:7
最大公約数を求める再帰関数 F(x,y) の値【午前2 解説】
要点まとめ
- 結論→ この再帰的定義はユークリッドの互除法で最大公約数を計算し、F(231,15)=3になります。計算は余りを繰り返すことで必ず停止します。
- 根拠→ 定義は y=0 のとき x を返し、y>0 のとき F(y, x mod y) を呼ぶため、gcd(x,y) を求める標準的な再帰式と同一です。
- 差がつくポイント→ 途中での余り計算ミスを防ぎ、231 mod 15 = 6、15 mod 6 = 3、6 mod 3 = 0 の一連を正確に追えるかが鍵です。
正解の理由
関数の定義
はユークリッドの互除法そのものです。互除法は最大公約数 (gcd) を求めるアルゴリズムで、 が成り立ちます。したがって を求めればよく、計算すると 3 になります。
計算の流れ:
より
より
より (基底条件)
ゆえに答えは 3。
より
より (基底条件)
ゆえに答えは 3。
よくある誤解
- 「x mod y を逆に計算する」: と を取り違えると全く別の過程になりミスします。
- 「ベースケースの理解不足」: のときに を返す意味を誤解すると計算を止められません。
- 「単純な割り算ミス」:231 ÷ 15 の余りを誤って 3 や 5 にしてしまうことがよくあります。
解法ステップ
- 定義を「再帰的に余りを取ることで最大公約数を求める」互除法と認識する。
- 与えられた数で順に余りを計算する:まず を求める。
- 得られた余りが 0 になるまでステップ 2 を繰り返す(各ステップで引数を入れ替える)。
- 余りが 0 になったときのもう一方の数が答え(gcd)である。
- 本問では → → で終了、答えは 3。
選択肢別の誤答解説
- ア: 2 — 231 と 15 の共通因子として 3 が存在するため 2 は誤り。231 は奇数なので 2 は共通因子になり得ません。
- イ: 3 — 正解。上の計算列に従うと最終的に 3 が最大公約数になります。
- ウ: 5 — 15 は 5 を因子に持ちますが 231 は 5 で割り切れないため共通因子ではありません。
- エ: 7 — 231 は 7 を因子に持ちますが 15 は 7 で割り切れないため最大公約数にはなりません。
補足コラム
ユークリッドの互除法は紀元前から知られる非常に効率的な gcd アルゴリズムで、通常の整数での計算はステップ数が非常に少なく済みます。素因数分解すると 、 となり共通因子は 3 のみであることからも答えが 3 であることが確認できます。拡張ユークリッドの互除法を使えば、gcd と同時に係数を求めて線形結合 を得ることもできます。
FAQ
Q: F の定義は必ず停止しますか?
A: はい。互除法では各ステップで第2引数(余り)が前回より小さくなるため、最終的に 0 になり停止します。
A: はい。互除法では各ステップで第2引数(余り)が前回より小さくなるため、最終的に 0 になり停止します。
Q: 初期で y=0 ならどうなりますか?
A: 定義通り です。これは gcd(x,0)=x という性質に一致します。
A: 定義通り です。これは gcd(x,0)=x という性質に一致します。
Q: 再帰を使わずに求められますか?
A: ループ(反復)で同じ余り計算を行えば良く、実装上は再帰より反復が一般的に使いやすいです。
A: ループ(反復)で同じ余り計算を行えば良く、実装上は再帰より反復が一般的に使いやすいです。
関連キーワード: 最大公約数、ユークリッドの互除法、再帰、gcd、余り演算、整数論、拡張ユークリッド法

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

