手計算が面白い                   戻る

 平方根の計算ができる電卓が、ほぼタダ同然で手に入る世の中にあって、いろいろな数
学的値が実感できない人が増えつつある。

  の値が把握されていないものだから、底辺、垂辺の長さが、1 と 2 の直角三角形を
書くと、斜辺の長さは、何も考えずに、 と自信満々に答える。相当に、2:1: の比
をもつ三角形の呪縛にはまっているという感じである。

  は、2 より小さい数なので、この3辺の組合せでは、決して斜辺の長さとはなり得ない。
小学・中学・高校において、数の値を把握する訓練の必要性を痛感する。

 例えば、中学3年で学習する「分母の有理化」は、数の値を把握するための計算なのであ
り、何も「分母に無理数があると美しくないから」という理由で有理化するわけではないので
ある。もっと詳しく言及すれば、Q()=Q[]が真の意味するところであるが...。

 ここら辺の認識が現在の中学・高校生にはないように感じられる。だから、分母に無理数
を残したままでよいというと、一様に生徒は戸惑いを覚えるようだ。いままで、機械的に分母
の有理化を行ってきたツケだろう。

 みなさんは、次の問にすぐ答えることができるだろうか?

問  ≒1.732 であることを用いて、次の数はおおよそいくら位か?

 (1)             (2)   

                               (答) (1) 0.577  (2) 2.366

 手計算で平方根、立方根を計算する方法も知られているので、もし興味をもたれたら是
非、挑戦して欲しいと思う。

 このページでは、いろいろな値を手計算で求める方法についてまとめてみたい。

 例  の値を小数第1位まで正しく求めよ。

   (解) 42<23<52 で、4< <5 より、  =4+α (0<α<1) とおけ

      る。両辺を平方して式を整理すると、 α2+8α−7=0  という2次方程式が得

      られる。このとき、10α (αの10倍を考えることにより、αの小数第1位を求める!)を X

      とおく。 α=X/10 を、さきほどの2次方程式に代入して式を整理すると、

グラフによる解法      X2+80X−700=0

 F(X)=X2+80X−700 とおくと、

     F(7)=−91<0、F(8)=4>0

 したがって、左図より、10α=X=7.・・・ となるので、

  α=0.7・・・ であることが分かる。
 

                  以上から、  ≒ 4.7・・・ となる。

 この方法を順次続ければ、平方根の値により近い小数が得られる。

 (因みに、電卓を用いれば、 ≒ 4.79583・・・ である。)

 例  の値を小数第1位まで正しく求めよ。

   この値は、関数電卓を用いれば、 =0.630929746・・・ である。関数電卓が

  なくても、小数第1位ぐらいまでは手計算で、いつも求まるようにしておきたいものだ。

   (解) 26<34 より、2<30.666・・・ だから、 <0.666・・・

      また、35<28 より、30.625<2 だから、0.625<

      したがって、0.625< <0.666・・・ となり、 ≒0.6・・・ であるこ

     とが分かる。

  この手計算で、 の小数第2位を決定することは難しい。

 220=1048576、313 =1594323 で、220<313 より、2<30.65 だから、

    0.625< <0.65 を求めるのが精一杯である。


 (追記) 上記について、当HP読者のHN「ももっこうの父」さんより投稿を頂きました。
                                      (平成25年8月30日付け)

  上記の計算で、指数を1ずつ小さくして、219=524288、312=531441で、

 219<312 より、2<30.63158 だから、 0.625< <0.632 と求まる。

 これより、 の小数第2位は、2または3ということが分かる。さらに続けて、

  246=70368744177664、329=68630377364883 で、246>329 より、

  2>30.6304 だから、 0.6304< <0.632 と求まる。

 これより、 の小数第2位は、3ということが分かる。


 (コメント) 246と329の計算は大変ですが、手計算でやってやれないことはないですね!
       ただ、この2数の組を探す方がもっと大変かも...。ももっこうの父さんに感謝し
       ます。

(追記) DD++さんからご投稿いただきました。(平成29年1月25日付け)

 log3 2 を(手計算で)求めよ、という問題について、2=3x の解をファレイ数列的に有理数
近似していけばいいのではないかということを思いつきました。

 まず、底と真数のうち小さい方の1乗と大きい方の0乗を比較します。
(2= ) 2^1 > 3^0 ( =1) …… (1)

 次に、小さい方の1乗と大きい方の1乗を比較します。
(2= ) 2^1 < 3^1 ( =3) …… (2)

以下、最後に出てきた左辺が大きい式と、最後に出てきた右辺が大きい式で辺々積をとり、
大小を判定します。

(1)(2) の辺々で積をとって比較  (4= ) 2^2 > 3^1 ( =3) …… (3)

(3)(2) の辺々で積をとって比較  (8= ) 2^3 < 3^2 ( =9) …… (4)

(3)(4) の辺々で積をとって比較  (32= ) 2^5 > 3^3 ( =27) …… (5)

(5)(4) の辺々で積をとって比較  (256= ) 2^8 > 3^5 ( =243) …… (6)

(6)(4) の辺々で積をとって比較  (2048= ) 2^11 < 3^7 ( =2187) …… (7)

(6)(7) の辺々で積をとって比較  (524288= ) 2^19 < 3^12 ( =531441) …… (8)

(6)(8) の辺々で積をとって比較  (134217728= ) 2^27 > 3^17 ( =129140163) …… (9)

(9)(8) の辺々で積をとって比較  (70368744177664= ) 2^46 > 3^29 ( =68630377364883)

で、 3^(29/46) < 2 < 3^(12/19) が得られ、 0.6304 < 29/46 <log3 2< 12/19 < 0.6316 を見
出すことができます。

 この方法の何が嬉しいかといえば、掛け算を2回するごとに、これまでより良い不等式が必
ず手に入る点。せっかく計算したのに当てが外れてガッカリということが一切ありません。

 運悪く不等号が同じ側に連続すると(つまりlogの値が簡単な分母の有理数に近いと)収束
が非常にもたつくという欠点はありますが。

途中から必要な桁数分の有効数字にしても大丈夫と思います。

10^0 < 2^1 ( =2)
10^1 > 2^1 ( =2)
10^1 > 2^2 ( =4) ---> log[10]2 < 1/2 = 0.5
10^1 > 2^3 ( =8) ---> log[10]2 < 1/3 < 0.334
10^1 < 2^4 ( =16) ---> log[10]2 > 1/4 = 0.25
10^2 < 2^7 ( =128) ---> log[10]2 > 2/7 > 0.285
10^3 < 2^10 ( =1024) ---> log[10]2 > 3/10 = 0.3
10^4 > 2^13 ( =8192) ---> log[10]2 < 4/13 < 0.30770
10^7 > 2^23 ( =0.8389×10^7)  ---> log[10]2 < 7/23 < 0.30435
10^10 > 2^33 ( =0.8590×10^10)  ---> log[10]2 < 10/33 < 0.30304
10^13 > 2^43 ( =0.8796×10^13)  ---> log[10]2 < 13/43 < 0.30233
10^16 > 2^53 ( =0.9007×10^16)  ---> log[10]2 < 16/53 < 0.30189
10^19 > 2^63 ( =0.9223×10^19)  ---> log[10]2 < 19/63 < 0.30159
10^22 > 2^73 ( =0.9444×10^22)  ---> log[10]2 < 22/73 < 0.30137
10^25 > 2^83 ( =0.9671×10^25)  ---> log[10]2 < 25/83 < 0.30121
10^28 > 2^93 ( =0.9903×10^28)  ---> log[10]2 < 28/93 < 0.301075
10^31 < 2^103 ( =1.0141×10^31)  ---> log[10]2 > 31/103 > 0.300971
10^59 < 2^196 ( =1.0043×10^59)  ---> log[10]2 > 59/196 > 0.301020
10^87 > 2^289 ( =0.9946×10^87)  ---> log[10]2 < 87/289 < 0.3010381
10^146 > 2^485 ( =0.9989×10^146)  ---> log[10]2 < 146/485 < 0.30103092
10^205 < 2^681 ( =1.0032×10^205)  ---> log[10]2 > 205/681 > 0.30102790
10^351 < 2^1166 ( =1.0021×10^351)  ---> log[10]2 > 351/1166 > 0.30102915
10^497 < 2^1651 ( =1.0010×10^497)  ---> log[10]2 > 497/1651 > 0.30102967
10^643 ? 2^2136 ( =0.9999×10^643)  ---> log[10]2 ? 643/2136 = 0.30102996……
(今回の有効数字だと最後の大小は非常にあやしいので不採用)

で、 0.30102967 < 497/1651 < log10 2< 146/485 < 0.30103092 を得ました。

 特に、最後の 643/2136 は、仮数部分がぐっと1に近づいたので、大小は不明ですがかな
りよい近似分数になっているのではないかと考えられます。

 右の計算は収束速度の参考にやっただけで、実際は必要な行だけやれば十分です。これ
なら手計算でもなんとかなるのではないでしょうか。

 3/10 に値が近いせいで、3桁目の決定にもたつきすぎなことと、その後は一気に進行する
ことが見て取れますね。log10 3 はもっと早く求まると思います。


 らすかるさんからのコメントです。(平成29年1月25日付け)

 log の手計算は以前考えたことがありますが、以下の公式を使うと効率良く精度が上げら
れます。(以下、底のない対数は自然対数です)

 y = (x-1)/(x+1) とすると、 logx = log((1+y)/(1-y)) = 2(y + y^3/3 + y^5/5 + …) なので、

x=(t+1)/t とすると、 y=1/(2t+1) となり、

 log((t+1)/t) = 2(1/(2t+1) + 1/((2t+1)^3・3) + 1/((2t+1)^5・5) + …)

 これを使って、log3 2を求めます。t が大きいほど精度が良いので、小さい t を使うのは
避け、まず、

 log(7/6)≒2{1/13+1/(13^3・3)}≒0.154150
 log(8/7)≒2{1/15+1/(15^3・3)}≒0.133531
 log(9/8)≒2{1/17+1/(17^3・3)}≒0.117783

の3つを求めると、

 log2=2{log(7/6)+log(8/7)}+log(9/8)≒0.693145
 log3=3{log(7/6)+log(8/7)}+2log(9/8)≒1.098609

より、log3 2=log2/log3≒0.693145/1.098609≒0.630930 のように求まります。

 2/(13^5・5)≒10^(-6) なので、上記のように級数2項で6桁近くの精度があります。級数を1
項増やすと精度は2桁以上上がります。もう1つ、log(10/9)を求めておけば、

 log2=2{log(7/6)+log(8/7)}+log(9/8)
 log3=3{log(7/6)+log(8/7)}+2log(9/8)
 log4=2log2
 log5=log4+log(9/8)+log(10/9)
 log6=log2+log3
 log7=log6+log(7/6)
 log8=3log2
 log9=2log3
 log10=log2+log5

のように、log2〜log10 まで求められますので、log10 2〜log10 9も算出できることになります。


 ますた〜さんからのコメントです。(平成29年1月26日付け)

 まさにオイラーの用いた方法ですね。これは試行錯誤で気付いたものなのでしょうか?そ
れとも収束が速いと何かしらの方法であらかじめ解っていたのでしょうか?収束の速さを計
算することなくはかる方法があるか以前ふと思ったこともあって気になりました。もしよけれ
ば教えてください。


 らすかるさんからのコメントです。(平成29年1月27日付け)

 オイラーの用いた方法だったのですか、それは存じませんでした。上記は試行錯誤で気付
きました。最大約2万桁を扱う自作電卓プログラムを作るのに、いろいろな計算で収束を速く
する必要があり、logに限らず他もいろいろ考えました。


 ますた〜さんからのコメントです。(平成29年1月28日付け)

 なるほどプログラムが動機だったのですね。ありがとうございました。


 例  の値を小数第1位まで正しく求めよ。

   (解) 52<33、37<55 より、1.4< <1.5 だから、 ≒1.4・・・

 例  のおおよその値を求めよ。

   (解) 23=8≒10 だから、3 ≒ 1   よって、 ≒ 0.3・・・

       23<32<10 だから、3 <2 <1

      よって、0.45・・・< <0.5 の範囲の数であることが分かる。


 (追記) 平成25年10月26日付け

  上記の例からも分かるように、数のおおよその値を求める場合、不等式による評価だけ
 では何れ限界がくる。

  最近、Niklaus Wirth さんのHPサイト「Programming in Oberon」の14頁に、対数を求める
 プログラムが載っていることを、都立深川高校の加藤 一さんにお教えいただいた。

  次のような手順で求めるらしい。

   (1) log10x=(1/2)log102

   (2) 2≧10 ならば、 log102=1+log10(x2/10)

  以降、(1)(2)を繰り返す。

 例 実際に、このアルゴリズムで計算してみると、

   =1/22+1/25+1/26+1/28+1/212+・・・

       =0.25+0.03125+0.015625+0.0039062+0.0002441+・・・

       =0.3010253・・・・

  上記の計算から、小数第3位までは正しい値であるものと推察される。

  (参考)  ≒ 0.3010 2999 5663 9811 9521 3738 8947 2449 ・・・


 (コメント) 上記の計算を手計算で行うのは少し無理がありますが、普通の電卓で十分
       計算可能ですね!

  同様にして、 も計算してみた。

   log103=(1/2)log109=(1/4)log1081=1/4+(1/4)log108.1

       =1/4+(1/8)log1065.61=1/4+1/8+(1/8)log106.561

       =1/4+1/8+(1/16)log1043.046721

       =1/4+1/8+1/16+(1/16)log104.3046721

       =1/4+1/8+1/16+(1/32)log1018.530201

       =1/4+1/8+1/16+1/32+(1/32)log101.8530201

       =1/4+1/8+1/16+1/32+(1/64)log103.4336834

       =1/4+1/8+1/16+1/32+(1/128)log1011.790181

       =1/4+1/8+1/16+1/32+1/128+(1/128)log101.1790181

       =1/4+1/8+1/16+1/32+1/128+(1/2048)log1013.942072

       =1/4+1/8+1/16+1/32+1/128+1/2048+(1/2048)log101.3942072

       =0.25+0.125+0.0625+0.03125+0.0078125+0.0004882+・・・

       =0.4770507・・・

   上記の計算から、小数第3位までは正しい値であるものと推察される。

 (参考) log103 ≒ 0.4771 2125 4719 6624 3729 5027 9032 5512 ・・・


 (コメント) アルゴリズムは理解できたが、とっても収束が遅いような...そんな雰囲気。


 例 220 は何桁の数で、その首位の数は何か?ただし、 ≒0.3010。

  (解)  ≒ 0.3010  だから、20 ≒6.02

    よって、106<220<107 となり、7桁の数であることが分かる。

    また、0<0.02<0.3010 より、6<6.02<6+

    したがって、106<220<2・106 だから、220 の首位の数は、1 である。

    (因みに、220 =1048576 である。)

 例 (1/2)20 は小数第何位に初めて0でない数字が現れるか?また、その数字は

  何か? ただし、 ≒0.3010 、 ≒0.4771 とする。


  (解) −20 ≒ −6.02 なので、10-7<(1/2)20<10-6

    よって、小数第7位に初めて0でない数字が現れる。

    また、−6.02=−7+0.98 で、2×0.4771<0.98<1 だから、

    −7+2× <−6.02 <−6 すなわち、9・10-7<(1/2)20<10-6

   したがって、求める数は、9 である。

   (因みに、(1/2)20 =0.00000095367・・・ である。)

 例 (0.99)10 の値を小数第2位まで正しく求めよ。

  (解) 2項定理 (a+b)=a+nan-1b+n(n-1)/2an-22+・・・+b を用いて、

     (0.99)10=(1−0.01)10

           =1−10・0.01+45・0.0001−120・0.000001+・・・

            ≒0.90・・・   (第3項の45・0.0001以下急速に小さくなる!)

 例  の値を小数第3位まで正しく求めよ。

   ただし、 ≒0.3010 、 ≒0.4771 とする。


   この問題は、東北大学 理系 後期(2008)の入試問題の一部である。

  (解) 4=log102401 であるのに対して、その近くの値として

    log102400=log1024×100

           =log103+3log102+2

           =0.4771+3×0.3010+2

           =3.3801  であることに注目する。

   ここで、 log102401−log102400=log10(1+1/2400)

   ところで、 x≧0 のとき、 log(1+x)≦x が成り立つ。

   実際に、 F(x) = x−log(1+x) とおくと、

        F’(x) = 1−1/(1+x) = x/(1+x) ≧0

   であるので、 F(x) は単調に増加する。 また、 F(0) = 0 であるので、

     x≧0 のとき、 F(x) ≧ 0 となり、 log(1+x) ≦ x となる。

   このことから、 log102401−log102400

           =log10(1+1/2400)

           <log(1+1/2400)≦1/2400=0.0004166・・・

   より、 log102401<log102400+0.0004166・・・=3.3805166・・・

   すなわち、 3.3801<4<3.38052 より、

          0.845025<<0.84513

  なので、 の値を小数第3位まで正しく求めれば、 0.845 となる。


(追記) 平成20年7月30日付け

 当HPの掲示板「出会いの泉」にHN「まったりーな」さんが関数電卓について書き込みを
された。

 関数電卓が、Windows に標準で付いているということを伺って、いろいろ遊んでみた。

手持ちのカシオの関数電卓を久しぶりに引っ張り出して使ってみたら、液晶部分が黒ずんでいてひど
くガッカリした!私のお気に入りだったのに...。


 普通の電卓も関数電卓もともに32桁の表示で、かなり高性能である。これだと、もう関数
電卓を別途購入する必要は全くないですね!

 常用対数は通常4桁くらいしか覚えておらず、その先がどうなっているか興味があったの
で計算させてみた。

  log102 ≒ 0.3010 2999 5663 9811 9521 3738 8947 2449 ・・・

  log103 ≒ 0.4771 2125 4719 6624 3729 5027 9032 5512 ・・・

 掲示板で、「まったりーな」さんは、次の問題を提起された。

   3の1000乗を常用対数表を使って、近似値を求めたい

 数学Uで学ぶ手法では、次のように解かれる。

 log101000=1000×log10

通常は、log103 ≒ 0.4771 より、 log101000 ≒ 477.1 となるので、

  log10 a =0.1 となる数 a をとれば、a はだいたい 1.26〜1.58 の間の数で、

     31000 ≒ a × 10477

と書けることになる。

 このことから、31000 は、478桁の整数で、首位の数は、1 で、末位の数も 1 となる。

ここら辺が、常用対数表で求められる限界である。

 Windows に標準でついている関数電卓に出会うまでは、上記の解答で満足していた
が、「まったりーな」さんに教えていただいた関数電卓を使うとさらに詳しく調べられる。

  log103 ≒ 0.4771 2125 4719 6624 3729 5027 9032 5512 ・・・

なので、

 log101000=1000×log10

        =477.1212 5471 9662 4372 9502 7903 2551 2 ・・・

 よって、 log10 a =0.1212 5471 9662 4372 9502 7903 2551 2 ・・・

となる a の値を詳しく求めれば、31000 に関する情報も詳しくなる。

 関数電卓を用いると、

  a ≒ 1.3220 7081 9480 8066 3689 0455 2597 664 ・・・

と簡単に求められる。(「Inv」と「log」を活用すればよい!)

 このことから、怖ろしく大きい数 31000 のだいたいの様子が分かる。

 1000 ≒ 1322 0708 1948 0806 6368 9045 5259 7664 ・・・・ ・・・1

 これは、ちょっと感動ものですね...!

 こんな面倒なことをせず関数電卓を使えば、

 1000 ≒ 1322 0708 1948 0806 6368 9045 5259 7521 ・・・・ ・・・1

と出る。

 先頭から30番目以降の数に違いがあるので、ここら辺から誤差が生じているのだろう。

ちょっと、気になりますね...?

(コメント) 関数電卓は、今後私とお友達になれそうです。関数電卓のことを教えていただ
      いた「まったりーな」さんに感謝いたします。


(追記) 平成28年12月6日付け

 最近、岩手大学前期理系(平成12年度)の入試問題に、上記の話題に関連する問題が
出題されていることに気づかされた。

問題 80<81および243<250であることに注意して、

   3/10<log102<23/75、19/40<log103<12/25

であることを示せ。

(解) 210>103 より、 10log102>3 なので、 3/10<log102 が言える。

 さらに、 80<81 より、 3log102+1<4log10

 243<250 より、 5log103<3−2log102 なので、4log103<12/5−(8/5)log10

 よって、 3log102+1<12/5−(8/5)log102 より、

   (23/5)log102<12/5−1=7/5 なので、 log102<7/23

 7/23−23/75=(525−529)/(23・75)<0 なので、 7/23<23/75

 よって、 3/10<log102<7/23<23/75

 3log102+1<4log103 より、 3(3/10)+1<4log103 なので、 19/40<log10

 また、 5log103<3−2log102<3−2(3/10)=12/5 より、 log103<12/25

 よって、 19/40<log103<12/25


(コメント) 23/75=0.30666・・・ に対して、 7/23=0.3043478・・・ なので、

 問題文の評価式 3/10<log102<23/75 よりも、3/10<log102<7/23 の方が

 より厳しい評価となる。また、7/23<23/75 から、log102<23/75 を示したが、直接

に示すことも可能である。

  3log102+1<4log103 と log103<12/25 から、 3log102+1<48/25

 よって、 log102<(48/25−1)/3=23/75

 上記の計算から、確実に言えることは、 log102≒0.30・・・ であることと、

19/40=0.4775・・・ 、12/25=0.48 から、 log103≒0.4・・・ である。


(追記) 次の日本大学(1997)の問題も手計算の魅力を追求した問題である。
                                       (平成29年1月25日付け)

問題 101100の下8桁は?

(解) 2項定理より、

101^100= (100+1)^100

= 1^100 + 1001・100 + 1002・100^2 + 1003・100^3 + 1004・100^4 + ・・・

 求めるのは下位8桁なので、上の式から

 1^100 + 1001・100 + 1002・100^2 + 1003・100^3

の値を求めれば十分である。(100^4は9桁の数)

 よって、

 1^100 + 1001・100 + 1002・100^2 + 1003・100^3

= 1 + 100・10^2 + 4950・10^4 + 161700・10^6

= 161749510001

より、求める下8桁は、「49510001」である。