未解決ファイルARCHIVE
FILE No.12374REOPENED

ヘキサ星人との遭遇

論理出題 kikki2010-05-30
事件概要
某サイトで8進法や2進法などでも小数を表すことが出来ることを知り、こんな問題を作ってみました。宇宙人ネタなのはオリジナル、のはず、被ってなければ。そんで鬼ごっこ問題が鬼畜だったので、今度は簡単目にo(^-^)o


これは遠い未来の話…、何処か遠くの星からヘキサ星人と名乗る宇宙人がやってきました。そして私達はやがて共同生活を営むようになり、ヘキサ星との貿易も始まるようになりました。

しかし私たちが共生するにはちょっとだけ困った問題がありました、それは「数」の数え方が異なる点です。

私達は十進法を使って数を数えています、それは両手の指の数が10本であることに由来しているそうです(だと出題者は聞いた)。

しかし彼らの両手の指の数は12本(片手に6本づつ)なので、彼らは十ニ進法を使って数を数えます。勿論、進法が異なろうが素数は素数ですし、無理数は無理数だし、円周率は円周率です。

けれども例えば7×1=7 7×2=14 7×3=21などとやっていた九九は十ニ進法では破綻しますし(7×1=7 7×2=12 7×3=19…)。金銭の計算にしても、十進法を使う我々と十ニ進法を使う彼らとでは非常に換算が面倒となっています。


問題:
勿論、ヘキサ星人は使ってる文字が違うので、我々が0〜9を使うのに対しても、全く異なる文字表現をすると思われますが、問題の便宜上のため我々の0〜9には0〜9を、10はAで、11はBで数字を表すことにします。ちょっと練習問題をやってみませう。

例えば、十ニ進法で10と書かかれた数は、十進法では12と表現出来ますし、十ニ進法での100は十進法では12^2=144と計算出来ます。

もうちょいやってみると、十ニ進法で23Aと書かれた数は、十進法では(2×12^2)+(3×12)+(10)=334と計算されます。

では十ニ進法で「0、0A」と書かれた数は、十進法だとどうなるでしょうか?解答は半角で既約分数にして答えて下さい。

例:2/111
封印された解答を開く
5/72
ヒントなす。
解説十ニ進法での0、1は 十進法で1/12。
十ニ進法での0、01は十進法で1/12^2。
なので、0、0Aは (1/12^2)×10=10/144=5/72

〜解説が…(^ω^;)特に解説することがなかった…ので以下余談〜

ちなみに十ニ進法の0、1を十進法で小数表示すると、0、08333333…。(1/12)

では逆に十進法の0、1を十ニ進法で考えてみるとかなりカオス(分数だと1/A)。進法がどうあれ有理数であり、そして有理数である限り有限の小数、あるいは循環小数で表されるものだと考えられますが、いかせん九九でやってたもと全く計算が別なので…。

ヘクタ星人と数字の遣り取りをするのであれば九九と同様にB×Bたるもの(11×11)を私達も覚えなければならないような気がします…。(ヘクタ星人達はB×Bは覚えてるのではなかろうかと。)

ちなみに出題者が紙に十ニ進法で1÷Aを筆算でやってみたところ(なんか凄く新感覚でした…。)
0、1249724972497…という循環小数が出てきたのですが合ってるのかは良く解りません(^q^)

まず1÷Aですが足りないので、小数第一位の0を持ってきて、(以下全て十ニ進表記で)10÷A=1余り2 次に20÷A=2余り4 40÷A=4余り8 80÷A=9余り6 60÷A=7余り2 でここから余り2…に循環するものだと思いますが。なんか…もう出題者も良く解らなくなってしまいました(^q^)

ちなみに16進法・8進法・2進法であればエクセルでdec2hex とか bin2oct とか oct2hex などの関数を使って計算出来るのですが、12進法なんて中途半端な問題を作ってしまったのでエクセルで計算することも出来ずorz

捜査データ

解答数
105
歴代 13481位 / 16,274
正解数
33
正解率
31%
論理カテゴリ平均 19%
評価
★★★★★
1 pt / 歴代 10795位
Good / Bad
1 / 2
評価ボタンの投票
コメント
15
証言記録
正解率
31%
縦線 = カテゴリ平均

証言記録 (15)

若正解者
すちゃっと暗算させてもらいました^^
コンピュータ内での実数表現はほぼ全て2進数による少数表現ですね。
といっても、浮動小数点形式なことと、implicit one (俗にいうケチ表現)が使われていますので、バイナリデータを見てもすぐにピンとは来ないかもしれませんけど。
taka正解者
少数表記は親しみが無く、なんとか3発で^^;
ありがとうございました。
キョンシー正解者 これくらいなら一発で^^
そういやこんなのありましたね。
ちなみにVisual Studioは最大で36進数(0〜9、A〜Z)までサポートしてるらしいです。
使ったことないですけどw
残り12件の証言をすべて表示
kikki
>若さん
朝は有難うございました!
んでは 0、ABABABABABAB…を十進法で…。

>takaさん
実は僕も最近知りました(^^)。

キョンシーさん>
ところで「鬼ごっこ問題」の方は^^;?
若 問題を出されてしまっていた^^;
循環小数の分数表記化についてはやり方いろいろありますが、
比較的よくある簡単な方法で。
(以下、12進法での表記を NNN_(12) と書きます。
ただしここで各Nは12進法のディジット('0'..'B'))

n = 0.ABABAB..._(12) とすると
n × 100_(12) - n = AB.ABABAB..._(12) - 0.ABABAB..._(12)
 = n × BB_(12) = AB_(12)
∴ n = AB_(12) / BB_(12)
  = 131/143 (in decimal)

0.A1A1A1... だともう一段面白かったかな?

(ノナの問題の kikki さんのコメント内で一箇所…と言おうとしたら、直ってた^^)
kikki
若さん>
そんな方法を使うとは…(^^) 僕は等比級数の公式使うことしか思いつかなかった。

んじゃ次は…2^2010[10]は十ニ進法で表示すると何桁の数になるか? 低を10として、log2=0.301 log3=0.477 と近似して計算せよ。
キョンシー 若さんのコメント見て思った
やっぱり 0.BBBB…=1 なんですね。
若 次の問題まで出されるているとは^^;
少し間があいてしまって覗いてみてびっくりしました^^
>キョンシーさん
そうです、どんな表現をしようとも 1 は 1 なんです。

>kikkiさん
そんなに変わった方法だったかな?
どんな公式を知らなくても納得してもらいやすい形だったと思いますが。
(ただし無限の概念への納得は必要かもしれませんが)

コメントの順番を考えて、まずは正解から:
 561桁

簡単にですが多倍長精度演算ライブラリーを作りなおして検算したので確かなはずです。
解説し過ぎだということでしたら、削除キー 1234 で削除してください。
また解説に間違いがや、まどろっこしいところがありましたらご指摘ください。
(昼酒飲みながら書いてるんで、どこか間違ってそう^^;)
若 問題(2)の計算
M は 2^2010 (10進) なので、2進法で 2011 桁。
つまり N = 2 として Rn = 2011。
ここで L = 12 として Rl を求めると:
 Rl = 2011 * log(2) / log(12)

ただし出題の条件は「10を底とした対数にて計算」なので
(以下、10を底とした対数を logd と書く)
 Rl = 2011 * logd(2) / logd(12)
とし 12 = 2 * 2 * 3 から計算すると
 Rl = 2011 * logd(2) / (logd(2) + logd(2) + logd(3))
  = 2011 * 0.301 / (0.301 + 0.301 + 0.477)
  = 2011 * 0.279... = 561.069...

なお精度を高めるために2^2010を4進法にして計算してみると
 Rl = 1006 * logd(4) / logd(12)
  = 2011 * (0.301 + 0.301) / (0.301 + 0.301 + 0.477)
  = 561.2715...

いずれも 561桁を示しているが、計算順序による誤差積算と
境界域の扱いとについてさらに検証を行う必要がある。
若 そもそも位取り記数法と対数とは
上の式において、N = e (自然対数の底) とした場合、 log(N) = 1 となることから明かなように、int(log(M)+1) は基数を e とした場合の桁数を表わしている。

さらに言えば、int(log_N(M)+1) はそのままずばり N進表記での M の桁数である。
(ただしここで log_N(M) は「底をNとしたMの対数」つまり「N^(log_N(M)) = M」)

よって基数表記間での桁数の変換を行うには、対数の世界だけで計算を行うことができる。
(対数の底変換と同じような方法。)

数MのN進からL進への桁数の変換とは、
log_N(M) を log_L(M) へと変換するということである。
N進での桁数をRn、L進での桁数をRlとすると、
 Rn = int(log(M) / log(N) + 1)
 Rl = int(log(M) / log(L) + 1)
ここで境界域を無視してint()と+1をとり除くと
 Rn ≒ log(M) / log(N)
 Rl ≒ log(M) / log(L)
 ∴ Rl ≒ Rn * log(N) / log(L)
若 基数表記での桁数とは
N進表記をした場合の整数Mの桁数とは:
 int(log(M) / log(N) + 1)
ただしここで
 log(x): x の自然対数
  (上の式の中だけならば自然対数でなくとも、底は何でもいい)
 int(x): x を越えない最大の整数
  (floor function、あるいはガウス記号とも)

例えば、999、1000 はそれぞれ 10進表記で:
 int(log(999) / log(10) + 1) = int(3.99..) = 3 桁
 int(log(1000) / log(10) + 1) = int(4) = 4 桁

2^10=1024、2^10-1=1023 はそれぞれ、2進表記で:
 int(log(1023) / log(2) + 1) = int(10.99..) = 10 桁
 int(log(1024) / log(2) + 1) = int(11) = 11 桁

(境界領域での正確な桁数を出すには、logの値をceilするのではなく、
実数での植木算的に、1を足してfloorするのがポイント)
若 kikkiさんのコメント出題を勝手に整理
kikkiさんによるコメントでの発展出題2題:

 (1) 十二進法 0.ABABABABAB… を十進法の既約分数で表わせ。

 (2) 2^2010 (十進) を、十二進法で表示すると何桁の数になるか?
  ただし、底を10としてlog2=0.301, log3=0.477 と近似して計算せよ。


この下には私の解答例が書いてあります。
kikki ありがとうっす★゚+.ヽ(*。>Д<)o゚+.゚☆
561桁なのは自分の計算と一緒なんすけど、誤差の検証や「logの値をceilするのではなく、実数での植木算的に1を足してfloorする」の部分がイマイチ良く解ってなかったりする。…orz

底が12の対数取って、携帯の電卓で=560、713…。と出てきたので561桁!とやったkikki氏でした(´∀`)。もうちょっと読んでみます…。
若
logの値をceilしてはいけないのは単純な話です。
例で示したように、1000 は十進法で4桁の数ですが、log_10(1000) は丁度 3 になってしまいます。表記した際の桁数を正確に示すためには、「対数が丁度 n」の場合は n+1 となる必要があります。
よって、「1を足してfloor」という計算が必要です。

誤差については、↓に示した私の方法では、上の 1 を足して floor するという部分を取り払って計算してしまっています。例えば、以下のような時には問題になります。
 2^2 は2進法では3桁ですが 4進法では何桁?
3 * log(2) / log(4) = 1.5 ですが、1桁ではいけない。答は2桁です。
ただし、少し考えてみましたが、2進から12進への変換で、2^n丁度という数については、これが問題になることは無さそうですね。
(2^n (n>1) が 12^m (m は整数) になることは無いですから)
若 捕捉
log()の外側を +1 して floor するという方法もありますが、
log()の内側を +1 して、そのまま ceil するという方法もあります。
後者の方が(N進法において、あくまで整数を扱う限りにおいては) 扱いやすいかもしれませんね。

例:
1000 は十進法で何桁?
log_10(1000+1) = 3.000434...
故に ceil して 4桁

関連する問題

NEXT CASE

現代版推理ゲーム

未解決ファイルはこちら

▶ 未解決ファイルへ

掲載内容に問題がある場合
削除依頼・お問い合わせはこちら

▶ Googleフォーム