tsujimotterさんの以下の記事に触発されてこの記事を書きました。いつも興味深い記事を投稿されているtsujimotterさんには改めて多謝です。
http://tsujimotter.hatenablog.com/embed/7-is-congruent-number
すべての辺の長さが有理数であるような直角三角形の面積になる数、それが合同数です。どんな自然数が合同数になるか、というのは基本的な問いです。そして上記の記事にあるように、例えば7, 157は合同数になります。
そして上記の記事ではそのことを確かめる二つの方法を紹介しています。一つは3辺を具体的に与えて、直角三角形になっていること及び面積を確認する方法です。もう一つの方法は、弱バーチ−スウィナートン・ダイアー(BSD)予想という予想を前提として、タンネルの定理を使って確認する方法です。
それでは実際に両方の方法で確認していきましょう。とは言っても最初の方法は、上記の記事に現れる式をMaximaに打ち込んでみるだけです。
まずは7が合同数であることの確認です。a,b,cを設定します。
(%i1) [a,b,c]:[35/12,24/5,337/60];
$$ \tag{%o1} \left[ \frac{35}{12} , \frac{24}{5} , \frac{337}{60} \right] $$
辺a,b,cを持つ三角形が直角三角であることの確認です。
(%i2) [a^2+b^2,c^2];
$$ \tag{%o2} \left[ \frac{113569}{3600} , \frac{113569}{3600} \right] $$
なるほど、このa,b,cは直角三角形の3辺でした。面積を求めると、
(%i3) a*b/2;
$$ \tag{%o3} 7 $$
ちゃんと7が出てきました。
次は157が合同数であることの確認です。まずa,b,cの値を設定します。
(%i4) a:411340519227716149383203/21666555693714761309610;
$$ \tag{%o4} \frac{411340519227716149383203}{21666555693714761309610} $$
(%i5) b:6803298487826435051217540/411340519227716149383203;
$$ \tag{%o5} \frac{6803298487826435051217540}{411340519227716149383203} $$
(%i6) c:224403517704336969924557513090674863160948472041/8912332268928859588025535178967163570016480830;
$$ \tag{%o6} \frac{224403517704336969924557513090674863160948472041}{8912332268928859588025535178967163570016480830} $$
直角三角形の3辺であることを確認します。
(%i7) a^2+b^2-c^2;
$$ \tag{%o7} 0 $$
次に面積を求めてみましょう。
(%i8) a*b/2;
$$ \tag{%o8} 157 $$
おぉ、157が出てきました。
それでは次にタンネルの定理を使って確認してみます。
(%i9) B1(x,y,z):=2*x^2+y^2+8*z^2;
$$ \tag{%o9} \mathrm{B1}\left(x , y , z\right):=8\,z^2+y^2+2\,x^2 $$
(%i10) B2(x,y,z):=2*x^2+y^2+32*z^2;
$$ \tag{%o10} \mathrm{B2}\left(x , y , z\right):=32\,z^2+y^2+2\,x^2 $$
平方因子のない正の奇数Nが与えられた時、B1(x,y,z)=Nという式の整数解の個数をC1, B2(x,y,z)=Nという式の整数解の個数をC2として求め、C1=2*C2となっているかどうか確認します。なっていればNは合同数です。このようなx,y,zの範囲はNを固定した時、下記のような有限の範囲に限定されるので、x,y,zをループで回してチェックすることが可能です(本当はもっと狭いです)。
(%i11) CGN(N):=block([L,C1,C2,zL],L:floor(sqrt(N))+1,
C1:0,C2:0,
for x:-L step 1 thru L do
for y:-L step 1 thru L do
for z:-L step 1 thru L do
(if B1(x,y,z)=N then C1:C1+1, if B2(x,y,z)=N then C2:C2+1),
return(is(C1=C2*2)))$
(%i12) compile(B1,B2,CGN);
$$ \tag{%o12} \left[ \mathrm{B1} , \mathrm{B2} , \mathrm{CGN} \right] $$
では7は合同数でしょうか。
(%i13) CGN(7);
$$ \tag{%o13} \mathbf{true} $$
そうでした。157はどうでしょう。
(%i14) CGN(157);
$$ \tag{%o14} \mathbf{true} $$
こちらも確かに合同数です。
このようにタンネルの定理を使うと、弱BSD予想を前提とすれば有限範囲の探索プログラムで、ある数が合同数かどうかを確認することができるのです。
折角なので1から99までの奇数の合同数で平方因子を持たないものをすべて求めてみましょう。
(%i15) sqrtfree(i):=apply("and",map(lambda([x],(is(second(x)=1))),ifactors(i)));
$$ \tag{%o15} \mathrm{sqrtfree}\left(i\right):=\mathrm{apply}\left(\verb|and| , \mathrm{map}\left(\lambda\left(\left[ x \right] , \mathrm{is}\left(\mathrm{second}\left(x\right)=1\right)\right) , \mathrm{ifactors}\left(i\right)\right)\right) $$
(%i16) for i:1 step 2 thru 100 do if sqrtfree(i) and CGN(i) then print(i);
5
7
13
15
21
23
29
31
37
39
41
47
53
55
61
65
69
71
77
79
85
87
93
95
(%i17)