[一つ上へ][トップへ]

学習ノート◆新井紀子・新井敏康著「計算とは何か」

●p.10

18 + 7 = (10 + 5 + 3) + 7 = 10 + 5 + (3 + 7) = 10 + 5 + 10 = (10 + 10) + 5
      (a)                (b)                (c)           (d)

(a) まず18を10と5と3に分ける。これを「10 + 5 + 3」と書くのは直感的に受け入れやすいのだけれど、
「p + q + r」という表記が、括弧を使わなくても曖昧さを伴わずに通用するのは「結合則あってこそ」である。
いまはその結合則自体の話をしているので、マジメな人がこの表記を見ると混乱するかも知れない。
そういう人は、とりあえず「10 + 5 + 3」は (10 + 5) + 3 のことだと理解しよう。
すると、上で引用した式変形は次のようになる。

18 + 7 = ((10 + 5) + 3) + 7 = (10 + 5) + (3 + 7) = (10 + 5) + 10 = (10 + 10) + 5
      (a)                  (b)                  (c)             (d)

(b) (10 + 5)を■で書けば、ここでの変形は
(■ + 3) + 7 = ■ + (3 + 7)
となり、これはまさに結合則の具体例であることが分かる。この変形では■の内部には一切手を付けていないことに注意しよう。

(c) 次に (3 + 7) が10になる。これは「たしざんかあど」で憶えた結果を使っただけだ。

(d) で、さらに ■ + 10 を変形するにあたって、いよいよ■の中身に手を入れることになる。
この過程を親切に書けば、実は

(10 + 5) + 10 = 10 + (5 + 10) = 10 + (10 + 5) = (10 + 10) + 5
            結合則          交換則     結合則

というステップを踏む必要がある。テキストでは交換則だけが挙がっているが、
【結合則に加えて、新たに】交換則が必要、という意味かと思う。

●p.12

これは単なる誤植だろうけれど、XXXXVIIII(49) + XXXXVIII(48) + XXXVIII(38) + XXXVII(37) = CLXXII(172) になると思う。テキストでは「答えはCLII」、つまり152となっている。

著者の新井紀子先生より修正予定との連絡をいただきました。

●p.33

「自然数どうしのあまりを許すわり算の筆算では,一度の操作によって,わられる数の桁がひとつ以上下がる。」

これは正しくないんじゃないかと思う。例えば 800÷27 を考えると、初めに「2」が立って、残るのは260で、3桁のままになっている。停止性のためには単に「割られる数が前より小さくなる」で良いのでは?

著者の新井紀子先生より修正予定との連絡をいただきました。

●p.38

このページの説明が僕にはまだ理解できていない。もうちょっと考えることにしよう。

●p.52

真ん中の多段の式、最後に $m_{i + k} = m_{i + 2k}$ も必要じゃないかなぁ。同様に、「どんな $q$ についても $m_{i + p} = m_{i + qk + p}$ (0 < p < k)」のところは、0 < p ≦ k ではないかと愚考中。

●p.93

そして, $f(x) = x^2$の $x = 2$における接線の方程式 $g(x)$は

$f(x) = x^2 - 2$の誤り。

$g(x)$の求め方は、ちょっと分かりにくかった。 $f(2) = 2^2 - 2 = 2$、 $f'(2) = 2 \times 2 = 4$から、接線の方程式は(4.3)を用いて \[ y - 2 = 4(x - 2) \] 整理して \[ y = 4x - 6 \] この右辺を $g(x)$と呼ぶことにして、議論が続く。

●p.100

……の瞬間に速さを変えて,Xに追いつき,

この「Xに追いつき」は、Xと同じ位置に追いつくのではなく、速さが追いつく(等しい値になる)という意味であることに注意。

●p.101、上から4行目

(ただし, $(m - 1)d \leq t \leq md$)

他の箇所では $(m - 1)d \leq t < md$となっている。

●p.101、最終行

\[ \frac{1}{2}\left( 1 - \frac{1}{n} \right)t^2 = g(t) < f(t) \]

\[ \frac{1}{2}\left( 1 - \frac{1}{n} \right)t^2 g = z(t) < f(t) \] の誤り。

●p.102

\[ f(t) < y(t) = \frac{1}{2}\left( 1 + \frac{1}{n} \right)t^2g = \sum_{m = 1}^{n} m\delta^2 g \]

$y(t)$の計算は右から左に向かって行なわれていることに注意。

●p.102の図4.9、およびp.103の図4.10

$z(t) \leq f(t)$となっている/ $f(t) \leq y(t)$となっている

本文では等号が付いていない。

●p.103、下のほう

振り返ってみると,小さい $t$の変化 $\delta = \frac{t}{n}$での $f(t)$の変化 $f'(md)$を寄せ集めて, $d$を小さくして

$d$と $\delta$が混在していて分かりにくかった。全部 $\delta$と読み替えて問題なさそう。

●p.111、上から3行目

簡単のため以下 $a = 0$の場合について,

突然 $a$が出てきて意味が取れないが、おそらく $x = 0$のまわりでの展開(つまりマクローリン展開)を考える、ということだろう。

●p.113、下から1/3あたり

\[ p_n^{(k)}(x) = a_k k! + \sum_{i = k + 1}^{n} \frac{a_i i!}{k!} x^{i - k} \]

$\sum$内の分母は $k!$ではなく $(i - k)!$。 $x = 0$のときはいずれ $\sum$はゼロになるため、その後の議論には影響しない。

●p.116、下から2行目

\[ \cdots + \frac{\cos x}{5!}x^5 + \cdots \]

$\cos x$→ $\cos 0$。

●p.119

よって, $\sin 1$の小数第6位までは $0.841549$となります。

数表を見ると、 $\sin 1 = 0.841470985$となっているので、どこかで計算を誤っている。

最後の不等式 $0.84154917 < \sin 1 < 0.84154973$は、 $5.6 \times 10^{-7}$ の幅があり、「 $\sin 1$は $0.84154945 \pm 2.8 \times 10^{-7}$の範囲に収まる」と言い換えられる。この $0.84154945$は、それ以前にある

\[ 0.84154965 - 2 \times 10^{-7} \leq \sum_{k = 0}^4 (-1)^k \frac{1}{(2k + 1)!} \leq 0.84154965 + 2 \times 10^{-7} \]

という不等式の最左辺に相当している。しかし正しく評価するためには、最右辺のほうも用いる必要があるのではないだろうか。すなわち、 $\sin 1$は $0.84154965 \pm 2 \times 10^{-7} \pm 2.8 \times 10^{-7}$ (複号同順)の範囲に収まる、とするのが正しいと思われる。

ところが、そもそもこの $0.84154965$がどのようにして得られたのか分からない。文脈からは、前頁で小数第8位を切り上げた $1/n!$の値を用いて $1 - \frac{1}{3!} + \frac{1}{5!} - \frac{1}{7!} + \frac{1}{9!}$を計算したものが入ると思われるが、それで求めれば $0.8414710$になる。結局、$\sin 1$は $0.8414710 \pm 4.8 \times 10^{-7}$の範囲内、すなわち $0.84147052 < \sin 1 < 0.84147148$と評価され、小数第7位を四捨五入した値は $0.841471$であるという、正しい結果が得られる。

小数第8位で切り上げたため,$2 \times 10^{-7}$を超えませんから,

ここは誤っていないが、ちょっと難しい。小数第8位を切り上げると、真の値に比べて $10^{-7}$未満の範囲で値が増大してしまう恐れがある。すなわち、たとえば $1/3!$なら $0.1666667 - 10^{-7} < 1/3! \leq 0.1666667$と書ける。 $1/3!$は $\sin$の展開ではマイナスの項として現れるので、下のように書き換えておく。他の項も同様にして、 \[ - 0.1666667\ \ \ \ \ \ \ \ \ \leq - \frac{1}{3!} < - 0.1666667 + 10^{-7} \] \[ + 0.0083334 - 10^{-7} < + \frac{1}{5!} \leq + 0.0083334 \] \[ - 0.0001985\ \ \ \ \ \ \ \ \ \leq - \frac{1}{7!} < - 0.0001985 + 10^{-7} \] \[ + 0.0000028 - 10^{-7} < + \frac{1}{9!} \leq + 0.0000028 \] これらを辺々合計して $1$を加えれば \[ 0.8414710 - 2 \times 10^{-7} < 1 - \frac{1}{3!} + \frac{1}{5!} - \frac{1}{7!} + \frac{1}{9!} < 0.8414710 + 2 \times 10^{-7} \] が得られる。

●p.121

\[ 2.7182819 - 7 \times 10^{-7} < \sum_{k = 0}^{9} \frac{1}{k!} < 2.7182819 \] が成り立ちます。さらに \[ 0 < \varepsilon_9 < \frac{3}{10!} < 8.4 \times 10^{-7} \] であることから, \[ 2.7182803 < e < 2.7182828 \]

初めの不等式を整理すると \[ 2.7182812 < \sum_{k = 0}^{9} \frac{1}{k!} < 2.7182819 \] これに $\varepsilon_9$を考慮するが、今回は $\varepsilon_9 > 0$であることが書かれている。正数ばかりを加えていくために、途中で打ち切れば必ず真の値よりも小さく出るからである。 \[ 0 < \varepsilon_9 (< 8.4 \times 10^{-7}) < 9 \times 10^{-7} \] を、上で得られた不等式に加えれば \[ 2.7182812 < e < 2.7182828 \] となり、最左辺は動かないはずであるが、なぜか $9 \times 10^{-7}$が差し引かれている。

●p.123

$\alpha$は自然数ではありませんから自然数 $n$をひいても $\alpha - n$はゼロにはならないことに注意すると,

(未解決疑問) $\alpha - n$がゼロになると、どんな不都合があるのだろうか。たとえば $f(x) = (1 + x)^3$のとき、 \[ f^{(1)}(x) = 3 \cdot (1 + x)^{2} \] \[ f^{(2)}(x) = 3 \cdot 2 \cdot (1 + x)^{1} = 6(1 + x) \] \[ f^{(3)}(x) = 3 \cdot 2 \cdot 1 \cdot(1 + x)^{0} = 6 \] \[ f^{(4)}(x) = 3 \cdot 2 \cdot 1 \cdot 0 \cdot (1 + x)^{-1} = 0 \] \[ f^{(5)}(x) = 3 \cdot 2 \cdot 1 \cdot 0 \cdot (-1) \cdot (1 + x)^{-2} = 0 \] と、きちんと求まると思う。 $x = - 1$を定義域から外さないといけないからか?とも考えたけれど、それは $\alpha - n \leq 0$のすべてに言えることだから、ゼロだけ回避できても意味ないか……。

●p.138~p.140

82400を15750で割った余りは3750ではなく3650。82400を82500に直せば、その後の計算は正しくなる。

●p.188

\[ \sin 1^{\circ} \times \cos 1^{\circ} = 0.0174965 \]

いくつかの電卓で計算すると 0.0174497484 になった。

\[ \pi - \log 52 = 1.42558931 \]

この $\log$は(他の箇所と異なり)常用対数( $\log_{10}$)の意味。

●p.192~

l(エル)は「消されずに残っている項の左端の番号」、cは「現在比較中の隣接2項のうち左側のほうの番号」、dは「これから右に移動する項の番号」と考えればよい。

アルゴリズムの全体像としては、次のようにイメージするとよい。すなわち、左端からcを走らせてスキャンし、降順になっているところは邪魔されずに進めるが、そうでないところにぶち当たると、然るべき処理をしたうえで、再び左端からスキャンし直す。最後まで走りきれば終了となる。

実際にCで書いてみた。

#include <stdio.h>

int main(void){

	int k[] = {6, 7, 6}, l = sizeof(k) / sizeof(int) - 1;
	int c, d, i, temp;

	while(1){
		c = l;

		while(c > 0 && k[c] > k[c - 1])
			c--;
		
		if(c == 0){
			for(i = l; i >= 0; i--)
				printf("%d ", k[i]);
			return 0;
		}

		/* c > 0 && k[c] <= k[c - 1] */
		
		if(k[c] < k[c - 1]){
			temp = k[c];
			k[c] = k[c - 1];
			k[c - 1] = temp;
		} else{
			for(d = c + 1; d <= l; d++)
				k[d - 1] = k[d];
			l--;
		}
	}
}