適当な直径の円を書きたければ circle コマンドを使えばいいが、直線との接点の座標はどうやって決めたらよいのか、いちいち計算するのがとても面倒だったのだ。しかも図はピクセル単位というかドット単位でしか描画できないのに計算結果はきれいな整数にはなってくれない。見た目ではわからないからだいたいあっていればいいのだけど計算すること自体が手間である。
もっと頭のよい方法があるはずである。ようするに今回は円周上の点との接線をうまく描けばいいのだから円周上の点の座標が綺麗な整数値になってくれる r と x と y の組み合わせを見つければ良いのである。 そこで散々頭を悩ました結果、単に r2 = x2 + y2 としたときの r, x, y の全てが整数になる組み合わせをリストアップすれば済むことに気が付いた。
しかしこのような組み合わせを簡単に見つけるのは難しい、32 + 42 = 52 のような簡単な例ならすぐに思いつくが今回のように割と x と y の比が大きめの組み合わせはどうやって調べたらいいのだろうか。
それで中高生向けの数学の本などを読んでいたら面白いのをみつけた。
隣り合った2つの奇数、たとえば 5 と 7 をとります。このとき、次のような分数の式が成り立ちます。なるほどこれは面白い。確かめてみよう。
1 1 12 - + - = -- 5 7 35この分母と分子に現れる 35 と 12 は
352 + 122 = 372となっています。したがって、35 と 12 を直角にはさむ 2辺とする直角三角形をつくることができます。
同じようなことを、他の隣り合った奇数を使ってできるでしょうか。・・・
--志賀浩二「中高一貫数学コース 数学1」(p125)
確かめるために次の python プログラムを用意。
#!/usr/bin/python
from math import *
for i in range(1,101):
if i % 2 != 0:
j = i + 2
a = 2*i+2
b = i**2 + 2*i
print " 1 1 {0:3d}".format(a)
print "--- + --- = --- {0}^2 + {1}^2 = {2}^2".format(a,b,sqrt(a**2 + b**2))
print "{0:3d} {1:3d} {2:3d} ,".format(i,j,b)
print
1 1 4
--- + --- = --- 4^2 + 3^2 = 5.0^2
1 3 3 ,
1 1 8
--- + --- = --- 8^2 + 15^2 = 17.0^2
3 5 15 ,
1 1 12
--- + --- = --- 12^2 + 35^2 = 37.0^2
5 7 35 ,
1 1 16
--- + --- = --- 16^2 + 63^2 = 65.0^2
7 9 63 ,
1 1 20
--- + --- = --- 20^2 + 99^2 = 101.0^2
9 11 99 ,
1 1 24
--- + --- = --- 24^2 + 143^2 = 145.0^2
11 13 143 ,
1 1 28
--- + --- = --- 28^2 + 195^2 = 197.0^2
13 15 195 ,
~~~中略~~~
1 1 192
--- + --- = --- 192^2 + 9215^2 = 9217.0^2
95 97 9215 ,
1 1 196
--- + --- = --- 196^2 + 9603^2 = 9605.0^2
97 99 9603 ,
1 1 200
--- + --- = --- 200^2 + 9999^2 = 10001.0^2
99 101 9999 ,
奇数というのは任意の整数 n に対して 2n - 1 となる整数だが、2n - 1 の次の奇数は 2n + 1 である。
先程の式に当てはめると
しかし、次の python プログラムを実行して r2 = x2 + y2 において r , x , y が全て整数となる組み合わせ探すと更にたくさんあることがわかる。
先程の式に当てはめると
1 1 2n + 1 + 2n - 1 4n ------- + ------- = ----------------- = ---------- 2n -1 2n + 1 (2n - 1)*(2n + 1) 4n2 - 1となり、これは
(4n)2 + (4n2 - 1)2 = 16n4 + 8n2 + 1 つまり (4n)2 + (4n2 - 1)2 = (4n2 + 1)2となるので右辺は必ず整数の2乗となるのがわかる。
#!/usr/bin/python
from math import *
for x in range(1, 101):
for y in range(1, 1001):
if x <= y and sqrt( x**2 + y**2 ) == round( sqrt( x**2 + y**2 ) , 0):
print '{0}\t{1}\t{2:.0f}'.format(x , y , sqrt(x**2+y**2))
3 4 5
5 12 13
6 8 10
7 24 25
8 15 17
9 12 15
9 40 41
10 24 26
11 60 61
12 16 20
12 35 37
13 84 85
14 48 50
15 20 25
15 36 39
15 112 113
~~~省略~~~
35 120 125
~~~省略~~~
99 132 165
99 168 195
99 440 451
99 540 549
100 105 145
100 240 260
100 495 505
100 621 629
% 35^2 + 120^2 = 125^2
% 135 + 35 =170 , 135 + 120 = 255
\begin{center}
\begin{picture}(270,280)
\put(135,135){\circle{250}}
\put(135,135){\line(7,24){35}}
\put(170,255){\line(-24,7){35}}
\put(135,135){\line(0,1){130.2}}
\put(128,127){O}
\put(128,262){h}
\put(152,262){d}
\put(128,197){r}
\put(157,195){r}
\end{picture}
\end{center}
%170-12,255+3.5 ,-7/-24, 3.5
%170-3.5,255-12 ,-24/7, 12
\put(158,258.5){\line(-7,-24){3.5}}
\put(166.5,243){\line(-24,7){12}}
こうして作ったPDFファイルが次のものである。
https://drive.google.com/file/d/0B8A5Lx3UeWQcVHVuMXFqcVFWRHM/view?usp=sharingこれでもう水平線までの距離について悩まなくて済むばかりでなく似たような図を描画するときに円の接線と接点を決めるのが楽になる。