- 締切済み
任意多倍長整数演算の問題
任意多倍長整数演算を行う。 int f1 ( int x , y ) { if (x == 1 ) return ( x + y ); return ( f1 ( x - 2 , y - 1 ) * 2 ); } 1) f1の停止する範囲を求め、その範囲で停止することを証明せよ。 2) 1)の範囲で、f1 ( x 、y ) の値をx、yと整数定数を元にして四則演算を用いた式で表せるか。具体的にあらわしてそれが正しいことを示すか、表せないことを示せ。 以上の問題が解けません。 どなたか、解答方法などを教えていただけないでしょうか。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- arrysthmia
- ベストアンサー率38% (442/1154)
おや、どっか違った?
- arrysthmia
- ベストアンサー率38% (442/1154)
濃厚なカテ違いの香りが… a の b 乗を pow(a, b) と書くとすれば、 f1(x,y) の値は、(y - (x-3)/2) * pow(2, (x-1)/2) かな。 Cプログラムなら、(y - x/2 - 1) * (int)(pow(2, x/2) + 0.01) というか、(y - x/2 - 1) * (1 << x/2) なんだろうけれども。 効率は度外視して、再帰処理のデモとして書くならば、 停止性に配慮して、 int f1(int x , y){ int value; if (x > 1) value = f1(x - 2, y - 1) * 2; else if (x = = 1) value = x + y; else /* エラー処理 */ ; return value; } とか?
- Tacosan
- ベストアンサー率23% (3656/15482)
1: 逆. 「x が 2の倍数」の場合には x から何回 2 を引いても 1 になるはずないので停止しない. もちろんもともと x が負のときにも停止しない. 2: ん? 「x の y乗」をどのように表すんでしょうか? 「x^y」とかければいいけど, これは「四則演算」には入りませんよね.
補足
Tacosan様 アドバイスありがとうございます。 1) すいません逆でした。。。そこまではだいたい読み取れるのですがその先が分かりませんし、それをどのように証明するかも検討がつかない状態です。 2) 四則演算ではないですが「x^y」も使えるということでお願いいたします。
- Tacosan
- ベストアンサー率23% (3656/15482)
1 は 「f1(x, y) が停止する」 iff 「x = 1」または「f1(x-2, y-1) が停止する」 だから簡単じゃね? 2 は表せないと思う. そもそも四則演算しか使えないとべき乗が表現できないし.
補足
Tacosan様 アドバイスありがとうございます。 1)ですが、僕の勉強不足だと思うのですがわかりません。。。 問題を見たところxが2の倍数でないと、永遠ループすると思うのですけど どうなのでしょうか? 2)ですが、べき乗に関してですが使えます。 おそらく2は表せるのでしょうか?
補足
arrysthmia様 アドバイスありがとうございます。 少し違う感じがしますが、わざわざ回答ありがとうございます。