問題概略
正の有理数 (整数でない)があります。
を 4 で割り,小数第 2 位を四捨五入してから 5 を加えると のちょうど 3 倍になりました。
もとの有理数 を求めてください。
解説の pdf も作りました。きれいなレイアウトで読みたい方はこちらをどうぞ。
ガウス記号を使う
小数第 2 位を相手にするのは面倒なので 10 倍して考えます。問題設定はこうなります。
正の有理数 (整数でもよい)を 4 で割り,小数第 1 位を四捨五入してから 50 を加えると のちょうど 3 倍になる。
四捨五入した後の数は または なので,次のどちらかが成立します。
または
左辺は整数なので右辺も整数。 を整数として とおくと です。
を使って上の式を で書き直しましょう。
または
を 12 で割ったときの商と余りを , とおきます。 と から
(1)の四捨五入は切り捨てなので です。(1)(3)より
これの解は ですが,(4)をみたさないので不適。
(2)の四捨五入は切り上げなので です。(2)(3)より
になり,これは(5)をみたします。 なので
不等式で評価
小数第 2 位を四捨五入した数は で,これは小数第 1 位までの数なので 10 倍すると整数になります。
は整数です。( は整数)とおけます。
なので (, は互いに素な自然数)とおくと は 30 の約数です。
ただし は整数ではないので です。
さて, は の小数第 2 位を四捨五入した数でした。
四捨五入で最も小さくなるのは を切り捨てるときで,最も大きくなるのは を切り上げるときです。
これを と考えて(6)をみたす を探すと しかありません。これが答えです。
mathematicaで解くなら
「mathematica,四捨五入」で検索すると Round という関数がヒットしますが,これは文字通り丸め用の関数で, に対して 0 を返します。この問題には使えません。
FractionalPart で小数部分を取り出して,それが より大きいかどうかを Boole で処理しました。
他のプログラミング言語でも と の大小比較が必要だと思います。
In[]:= AbsoluteTiming[ eqn = {Floor[10 x/4] + 50 + Boole[FractionalPart[10 x/4] >= 0.5] == 30 x, x > 0}; ans = x /. Solve[eqn, x]] Out[]= {0.0174566, {11/6}}